From 87d5ca03f7dcc4b59024d29b96eba856d7138a50 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Fri, 26 Jun 2015 07:05:41 -0400 Subject: [PATCH] added methods to show cache; tests moved to pvaClientTestCPP; doxygen changes --- Doxyfile | 2 +- Makefile | 5 - .../{pvClientCPP.html => pvaClientCPP.html} | 30 +- documentation/pvaClientCPP_20150626.html | 199 ++++++ documentation/pvaClientOverview.html | 6 +- exampleDatabasePvaClient.zip | Bin 21637 -> 0 bytes src/pvaClient.cpp | 87 ++- src/pvaClient.h | 596 +++++++----------- src/pvaClientChannel.cpp | 46 ++ src/pvaClientGet.cpp | 4 +- src/pvaClientMonitorData.cpp | 36 ++ src/pvaClientMultiDouble.h | 18 +- src/pvaClientNTMultiChannel.h | 21 +- test/Makefile | 13 - test/configure/CONFIG | 29 - test/configure/CONFIG_SITE | 27 - test/configure/ExampleRELEASE.local | 7 - test/configure/Makefile | 8 - test/configure/RELEASE | 41 -- test/configure/RULES | 6 - test/configure/RULES.ioc | 2 - test/configure/RULES_DIRS | 2 - test/configure/RULES_TOP | 3 - test/src/Makefile | 57 -- test/src/pvaClientAllTests.c | 31 - test/src/pvaClientTestGetData.cpp | 155 ----- test/src/pvaClientTestMonitorData.cpp | 153 ----- test/src/pvaClientTestMultiDouble.cpp | 156 ----- test/src/pvaClientTestNTMultiChannel.cpp | 132 ---- test/src/pvaClientTestPutData.cpp | 229 ------- test/src/pvaClientTestPutGet.cpp | 70 -- test/src/pvaClientTestPutGetMonitor.cpp | 89 --- 32 files changed, 605 insertions(+), 1655 deletions(-) rename documentation/{pvClientCPP.html => pvaClientCPP.html} (91%) create mode 100644 documentation/pvaClientCPP_20150626.html delete mode 100644 exampleDatabasePvaClient.zip delete mode 100644 test/Makefile delete mode 100644 test/configure/CONFIG delete mode 100644 test/configure/CONFIG_SITE delete mode 100644 test/configure/ExampleRELEASE.local delete mode 100644 test/configure/Makefile delete mode 100644 test/configure/RELEASE delete mode 100644 test/configure/RULES delete mode 100644 test/configure/RULES.ioc delete mode 100644 test/configure/RULES_DIRS delete mode 100644 test/configure/RULES_TOP delete mode 100644 test/src/Makefile delete mode 100644 test/src/pvaClientAllTests.c delete mode 100644 test/src/pvaClientTestGetData.cpp delete mode 100644 test/src/pvaClientTestMonitorData.cpp delete mode 100644 test/src/pvaClientTestMultiDouble.cpp delete mode 100644 test/src/pvaClientTestNTMultiChannel.cpp delete mode 100644 test/src/pvaClientTestPutData.cpp delete mode 100644 test/src/pvaClientTestPutGet.cpp delete mode 100644 test/src/pvaClientTestPutGetMonitor.cpp diff --git a/Doxyfile b/Doxyfile index 5873374..baf5873 100644 --- a/Doxyfile +++ b/Doxyfile @@ -169,7 +169,7 @@ SHORT_NAMES = NO # description.) # The default value is: NO. -JAVADOC_AUTOBRIEF = NO +JAVADOC_AUTOBRIEF = YES # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If diff --git a/Makefile b/Makefile index 7fa0aed..fa4edd0 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,8 @@ TOP = . include $(TOP)/configure/CONFIG DIRS := $(DIRS) $(filter-out $(DIRS), configure) DIRS := $(DIRS) $(filter-out $(DIRS), src) -DIRS := $(DIRS) $(filter-out $(DIRS), test) DIRS := $(DIRS) $(filter-out $(DIRS), example) -EMBEDDED_TOPS := $(EMBEDDED_TOPS) $(filter-out $(EMBEDDED_TOPS), test) EMBEDDED_TOPS := $(EMBEDDED_TOPS) $(filter-out $(EMBEDDED_TOPS), example) define DIR_template @@ -19,7 +17,4 @@ define EMB_template endef $(foreach dir, $(EMBEDDED_TOPS),$(eval $(call EMB_template,$(dir)))) -#exampleDatabase_DEPEND_DIRS += test -#examplePowerSupply_DEPEND_DIRS += test - include $(TOP)/configure/RULES_TOP diff --git a/documentation/pvClientCPP.html b/documentation/pvaClientCPP.html similarity index 91% rename from documentation/pvClientCPP.html rename to documentation/pvaClientCPP.html index 2050a6e..529daec 100644 --- a/documentation/pvClientCPP.html +++ b/documentation/pvaClientCPP.html @@ -28,14 +28,16 @@

EPICS pvaClientCPP

EPICS V4 Working Group, Working Draft, -29-May-2015

+26-June-2015
This version:
pvaClientCPP.html
Latest version:
-
Still under revision
+
pvaClientCPP_20150626.html +
Previous version:
easyPVA_20150609.html @@ -56,7 +58,6 @@ software support for high speed controls network communications used in EPICS ve pvAccess provides a callback based interface, which can be hard to use. pvaClient provides an interface that does not require callbacks even for monitors.

-p> pvaClientChannel provides many "convenience" methods to directly get and put scalar and scalarArray data types. Additional methods provide access to the full features of pvAccess. @@ -110,15 +111,20 @@ href="./html/index.html">doxygenDoc

Example Database

-

The examples and tests require that an example pvAccess server is runnimg. -This distribution has a file exampleDatabasePvaClient.zip. +

The examples require that an example pvAccess server is runnimg. +To get the test database go to:

+pvaClientTestCPP/database.zip + +Then select "raw file" and You will be able to download the zip file. +

When unzipped this is used to create an example IOC database.

After unzipping the file:

-cd configure
+cd database/configure
 cp ExampleRELEASE.local RELEASE.local
 edit RELEASE.local
 cd ..
@@ -126,19 +132,13 @@ make
 cd iocBoot/exampleDatabase
 ../../bin/<arch:>/exampleDatabase st.cmd
 
-

Testing

-

The tests will fail unless the example database is running.

-

Once it is running:

-
-make runtests
-

Examples

-

Examples are in directory pvaExample/src. +

Examples are in directory example/src. An example of how to run them is:

 mrk> pwd
-/home/epicsv4/pvAccessCPP/pvaExample
-mrk> bin/linux-x86_64/examplepvaClientGet 
+/home/epicsv4/pvaClientCPP/example
+mrk> bin/linux-x86_64/examplePvaClientGet 
 

The following is a brief description of each example. In order to understand each example it diff --git a/documentation/pvaClientCPP_20150626.html b/documentation/pvaClientCPP_20150626.html new file mode 100644 index 0000000..529daec --- /dev/null +++ b/documentation/pvaClientCPP_20150626.html @@ -0,0 +1,199 @@ + + + + + + EPICS pva + + + + + + + + + + + +

+

EPICS pvaClientCPP

+ +

EPICS V4 Working Group, Working Draft, +26-June-2015

+
+
This version:
+
pvaClientCPP.html +
+
Latest version:
+
pvaClientCPP_20150626.html +
+
Previous version:
+
easyPVA_20150609.html +
+
Editors:
+
Marty Kraimer, BNL
+
+ +

Abstract

+ +

pvaClient is a software library that provides to an EPICS client programmer, a friendly +client side programming interface to the data of an EPICS based control system. It is intended +for such uses as rapid development of ad hoc programs by controls engineers, or to provide +scientists a way to directly develop analytical applications.

+ +

Specifically, pvaClient provides a synchronous interface for pvAccess, which is the +software support for high speed controls network communications used in EPICS version 4. +pvAccess provides a callback based interface, which can be hard to use. +pvaClient provides an interface that does not require callbacks even for monitors. +

+pvaClientChannel provides many "convenience" methods to directly get and put +scalar and scalarArray data types. +Additional methods provide access to the full features of pvAccess. +

+

+pvaClientMultiChannel provides access to data from multiple channels. +It can be used directly by a client or via pvaClientMultiDouble or pvaClientNTMultiChannel. +pvaClientMultiDouble allows the client to get and put data to multiple channels. +But each channel must have a value field that is a numeric scalar. +pvaClientNTMultiChannel allows the client to get and put data to multiple channels. +Each channel must have a value field. +The data for the channels is presented via normative type NTMultiChannel. +

+ +

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial + Control System.

+ + + +

Status of this Document and of the pvaClient Software

+ +

pvaClientCPP is ready for use.

+ +
+ +
+

Table of Contents

+
+ + +
+
+ +

Introduction

+ +

pvaClient is a synchronous API for accessing PVData via PVAccess. It provides +an interface to many of the features provided by pvData and pvAccess.

+ +

This document describes the layout of the source files in this project.

+

+A user overview is available via +pvaClientOverview.html + +

+

+Doxygen documentation is available at +doxygenDoc + +

+

Example Database

+

The examples require that an example pvAccess server is runnimg. +To get the test database go to:

+pvaClientTestCPP/database.zip + +Then select "raw file" and You will be able to download the zip file. +

+When unzipped this is used to create an example IOC database. +

+

+After unzipping the file: +

+
+cd database/configure
+cp ExampleRELEASE.local RELEASE.local
+edit RELEASE.local
+cd ..
+make
+cd iocBoot/exampleDatabase
+../../bin/<arch:>/exampleDatabase st.cmd
+
+

Examples

+

Examples are in directory example/src. +An example of how to run them is:

+
+mrk> pwd
+/home/epicsv4/pvaClientCPP/example
+mrk> bin/linux-x86_64/examplePvaClientGet 
+
+

The following is a brief description of each example. +In order to understand each example it +helps to also look at the source for the example.

+

examplePvaClientGet

+

This has a number of examples:

+
+
exampleDouble
+
+ This shows two methods for getting data from a channel that has a numeric + scalar value field. +
+
exampleDoubleArray
+
+ This shows two methods for getting data from a channel that has a + double array value field. +
+
exampleCADouble
+
+ This is like exampleDouble except it uses provider ca. +
+
exampleCADoubleArray
+
+ This is like exampleDoubleArray except it uses provider ca. +
+
examplePowerSupply
+
+ This is an example of getting data from a channel that does not + have a value field. +
+
+

examplePvaClientMonitor

+

This is an example of creating a monitor on a channel. +It monitors a channel that models a powerSupply, i. e. it is not a "standard" record. +It does not have a value field. +

+

After starting the example a change can be made to the powerSupply by issuing:

+
+pvput -r "power.value,voltage.value" examplePowerSupply 6 6
+
+

examplePvaClientPut

+

This example gets and puts to channel exampleDouble.

+

examplePvaClientProcess

+

This example makes a process request to channel exampleDouble.

+

helloWorldPutGet

+

This is an example of issuing a channelPutGet.

+

examplePvaClientMultiDouble

+

This is an example of issuing gets and puts to multiple channels where each +channel has a numeric scalar value field.

+

examplePvaClientNTMultiChannel

+

This is an example of using NDMultiChannel to obtain data from multiple channels. +

+

helloWorldRPC

+

This is an example of issuing a channelRPC request. +It does not use pva.

+
+ + diff --git a/documentation/pvaClientOverview.html b/documentation/pvaClientOverview.html index cc6e5b7..76c1a1b 100644 --- a/documentation/pvaClientOverview.html +++ b/documentation/pvaClientOverview.html @@ -84,8 +84,8 @@ PvaClientProcessPtr process = channel->createProcess(); process->process(); -

pvaExample includes a number of examples.

-

pva does not provide support for:

+

pvClientCPP/example includes a number of examples.

+

pvaClient does not provide support for:

ChannelArray
TBD
@@ -103,7 +103,7 @@ PvaClientPtr pva = PvaClient::create();

PvaClient has methods to create instances of PvaClientChannel. The client can specify the provider name or use the default provider. -The client can manage it's own channels or can let pva cache channels. +The client can manage it's own channels or can let pvaClient cache channels. An example of using the cached method is:

 PvaClientChannelPtr pvaChannel = pva->channel("exampleDouble");
diff --git a/exampleDatabasePvaClient.zip b/exampleDatabasePvaClient.zip
deleted file mode 100644
index 4aac82fdc4129bbd774b62920bf0892958640bf2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 21637
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

diff --git a/src/pvaClient.cpp b/src/pvaClient.cpp
index c88533c..ebee3d4 100644
--- a/src/pvaClient.cpp
+++ b/src/pvaClient.cpp
@@ -78,32 +78,67 @@ public:
     void destroy() {
        pvaClientChannelMap.clear();
     }
-    PvaClientChannelPtr getChannel(string const & channelName);
+    PvaClientChannelPtr getChannel(
+        string const & channelName,
+        string const & providerName);
     void addChannel(PvaClientChannelPtr const & pvaClientChannel);
-    void removeChannel(string const & channelName);
+    void removeChannel(string const & channelName,string const & providerName);
+    void showCache();
+    size_t cacheSize();
 private:
     map pvaClientChannelMap;
 };
    
-PvaClientChannelPtr PvaClientChannelCache::getChannel(string const & channelName)
+PvaClientChannelPtr PvaClientChannelCache::getChannel(
+    string const & channelName,
+    string const & providerName)
 {
-    map::iterator iter = pvaClientChannelMap.find(channelName);
+    string name = channelName + providerName;
+    map::iterator iter = pvaClientChannelMap.find(name);
     if(iter!=pvaClientChannelMap.end()) return iter->second;
     return PvaClientChannelPtr();
 }
 
 void PvaClientChannelCache::addChannel(PvaClientChannelPtr const & pvaClientChannel)
 {
+     Channel::shared_pointer channel = pvaClientChannel->getChannel();
+     string name = channel->getChannelName()
+         + channel->getProvider()->getProviderName();
      pvaClientChannelMap.insert(std::pair(
-         pvaClientChannel->getChannelName(),pvaClientChannel));
+         name,pvaClientChannel));
 }
 
-void PvaClientChannelCache::removeChannel(string const & channelName)
+void PvaClientChannelCache::removeChannel(
+        string const & channelName,
+        string const & providerName)
 {
-    map::iterator iter = pvaClientChannelMap.find(channelName);
+    string name = channelName + providerName;
+    map::iterator iter = pvaClientChannelMap.find(name);
     if(iter!=pvaClientChannelMap.end()) pvaClientChannelMap.erase(iter);
 }
 
+void PvaClientChannelCache::showCache()
+{
+    map::iterator iter;
+    for(iter = pvaClientChannelMap.begin(); iter != pvaClientChannelMap.end(); ++iter)
+    {
+         PvaClientChannelPtr pvaChannel = iter->second;
+         Channel::shared_pointer channel = pvaChannel->getChannel();
+         string channelName = channel->getChannelName();
+         string providerName = channel->getProvider()->getProviderName();
+         cout << "channel " << channelName << " provider " << providerName << endl;
+         cout << "  get and put cacheSize " << pvaChannel->cacheSize() << endl;
+         pvaChannel->showCache();
+    }
+    
+}
+
+size_t PvaClientChannelCache::cacheSize()
+{
+    return pvaClientChannelMap.size();
+
+}
+
 using namespace epics::pvaClient::pvaClientPvt;
 
 PvaClientPtr PvaClient::create()
@@ -149,6 +184,10 @@ void PvaClient::destroy()
 string PvaClient:: getRequesterName()
 {
     static string name("pvaClient");
+    RequesterPtr req = requester.lock();
+    if(req) {
+         return req->getRequesterName();
+    }
     return name;
 }
 
@@ -156,6 +195,11 @@ void  PvaClient::message(
         string const & message,
         MessageType messageType)
 {
+    RequesterPtr req = requester.lock();
+    if(req) {
+         req->message(message,messageType);
+         return;
+    }
     cout << getMessageTypeName(messageType) << " " << message << endl;
 }
 
@@ -164,7 +208,8 @@ PvaClientChannelPtr PvaClient::channel(
         std::string const & providerName,
         double timeOut)
 {
-    PvaClientChannelPtr pvaClientChannel = pvaClientChannelCache->getChannel(channelName);
+    PvaClientChannelPtr pvaClientChannel = 
+        pvaClientChannelCache->getChannel(channelName,providerName);
     if(pvaClientChannel) return pvaClientChannel;
     pvaClientChannel = createChannel(channelName,providerName);
     pvaClientChannel->connect(timeOut);
@@ -172,16 +217,32 @@ PvaClientChannelPtr PvaClient::channel(
     return pvaClientChannel;
 }
 
-PvaClientChannelPtr PvaClient::createChannel(string const & channelName)
-{
-     return PvaClientChannel::create(getPtrSelf(),channelName);
-}
-
 PvaClientChannelPtr PvaClient::createChannel(string const & channelName, string const & providerName)
 {
      return PvaClientChannel::create(getPtrSelf(),channelName,providerName);
 }
 
+void PvaClient::setRequester(RequesterPtr const & requester)
+{
+    this->requester = requester;
+}
+
+void PvaClient::clearRequester()
+{
+    requester = Requester::weak_pointer();
+}
+
+void PvaClient::showCache()
+{
+    pvaClientChannelCache->showCache();
+}
+
+
+size_t PvaClient::cacheSize()
+{
+    return pvaClientChannelCache->cacheSize();
+}
+
 PvaClientMultiChannelPtr PvaClient::createMultiChannel(
     epics::pvData::PVStringArrayPtr const & channelNames)
 {
diff --git a/src/pvaClient.h b/src/pvaClient.h
index b79db45..620acaf 100644
--- a/src/pvaClient.h
+++ b/src/pvaClient.h
@@ -101,17 +101,15 @@ public:
      * Destructor
      */
     ~PvaClient();
-    /**
-     * @brief Create an instance of PvaClient
+    /** Create an instance of PvaClient
      * @return shared_ptr to new instance.
      */
     static PvaClientPtr create();
-    /** @brief get the requester name.
+    /** Get the requester name.
      * @return The name.
      */
     std::string getRequesterName();
-    /**
-     * @brief A new message.
+    /** A new message.
      * If a requester is set then it is called otherwise message is displayed
      * on standard out.
      * @param message The message.
@@ -120,12 +118,11 @@ public:
     void message(
         std::string const & message,
         epics::pvData::MessageType messageType);
-    /**
-     * @brief Destroy all the channels and multiChannels.
+    /** Destroy all the channels and multiChannels.
      */
     void destroy();
-    /**
-     * @brief get a cached channel or create and connect to a new channel.
+    /** Get a cached channel or create and connect to a new channel.
+     *
      * The provider is pvaClient. The timeout is 5 seconds.
      * If connection can not be made an exception is thrown.
      * @param channelName The channelName.
@@ -133,8 +130,7 @@ public:
      */
     PvaClientChannelPtr channel(std::string const & channelName)
     { return channel(channelName,"pva", 5.0); }
-    /**
-     * @brief get a cached channel or create and connect to a new channel.
+    /** Get a cached channel or create and connect to a new channel.
      * If connection can not be made an exception is thrown.
      * @param channelName The channelName.
      * @return The interface.
@@ -143,14 +139,13 @@ public:
         std::string const & channelName,
         std::string const &providerName,
         double timeOut);
-    /**
-     * @brief Create an PvaClientChannel. The provider is pvaClient.
+    /** Create an PvaClientChannel. The provider is pvaClient.
      * @param channelName The channelName.
      * @return The interface.
      */
-    PvaClientChannelPtr createChannel(std::string const & channelName);
-    /**
-     * @brief Create an PvaClientChannel with the specified provider.
+    PvaClientChannelPtr createChannel(std::string const & channelName)
+    { return createChannel(channelName,"pva");}
+    /** Create an PvaClientChannel with the specified provider.
      * @param channelName The channelName.
      * @param providerName The provider.
      * @return The interface or null if the provider does not exist.
@@ -158,15 +153,28 @@ public:
     PvaClientChannelPtr createChannel(
        std::string const & channelName,
        std::string const & providerName);
-    /**
-     * @brief Create an PvaClientMultiChannel. The provider is pvAccess.
+    
+    /** Set a requester.
+     * The default is for PvaClient to handle messages by printing to System.out.
+     * @param requester The requester.
+     */
+    void setRequester(epics::pvData::RequesterPtr const & requester);
+    /** Clear the requester. PvaClient will handle messages.
+     */
+    void clearRequester();
+    /** Show the list of cached channels.
+     */
+    void showCache();
+     /** Get the number of cached channels.
+     */
+    size_t cacheSize();
+    /** Create an PvaClientMultiChannel. The provider is pvAccess.
      * @param channelName The channelName array.
      * @return The interface.
      */
     PvaClientMultiChannelPtr createMultiChannel(
         epics::pvData::PVStringArrayPtr const & channelNames);
-    /**
-     * @brief Create an PvaClientMultiChannel with the specified provider.
+    /** Create an PvaClientMultiChannel with the specified provider.
      * @param channelName The channelName array.
      * @param providerName The provider.
      * @return The interface.
@@ -174,18 +182,7 @@ public:
     PvaClientMultiChannelPtr createMultiChannel(
         epics::pvData::PVStringArrayPtr const & channelNames,
         std::string const & providerName);
-    /**
-     * @brief Set a requester.
-     * The default is for PvaClient to handle messages by printing to System.out.
-     * @param requester The requester.
-     */
-    void setRequester(epics::pvData::RequesterPtr const & requester);
-    /**
-     * @brief Clear the requester. PvaClient will handle messages.
-     */
-    void clearRequester();
-    /**
-     * @brief get shared pointer to this
+    /** Get shared pointer to this
      */
     PvaClientPtr getPtrSelf()
     {
@@ -209,8 +206,7 @@ typedef std::tr1::shared_ptr PvaClientGetCachePtr;
 class PvaClientPutCache;
 typedef std::tr1::shared_ptr PvaClientPutCachePtr;
 class ChannelRequesterImpl;
-/**
- * @brief An easy to use alternative to directly calling the Channel methods of pvAccess.
+/** An easy to use alternative to directly calling the Channel methods of pvAccess.
  *
  * @author mrk
  */
@@ -219,18 +215,7 @@ class epicsShareClass PvaClientChannel :
 {
 public:
     POINTER_DEFINITIONS(PvaClientChannel);
-    /**
-     * @brief Create a PvaClientChannel.
-     * @param pvaClient Interface to PvaClient
-     * @param channelName The name of the channel.
-     * @return The interface.
-     */
-    static PvaClientChannelPtr create(
-        PvaClientPtr const &pvaClient,
-        std::string const & channelName)
-        {return create(pvaClient,channelName,"pva");}
-    /**
-     * @brief Create a PvaClientChannel.
+    /** Create a PvaClientChannel.
      * @param channelName The name of the channel.
      * @param providerName The name of the provider.
      * @return The interface to the PvaClientStructure.
@@ -240,144 +225,119 @@ public:
          std::string const & channelName,
          std::string const & providerName);
     ~PvaClientChannel();
-    /**
-     * @brief Destroy the pvAccess connection.
+    /** Destroy the pvAccess connection.
      */
     void destroy();
-    /**
-     * @brief Get the name of the channel to which PvaClientChannel is connected.
+    /** Get the name of the channel to which PvaClientChannel is connected.
      * @return The channel name.
      */
     std::string getChannelName();
-    /**
-     * @brief Get the the channel to which PvaClientChannel is connected.
+    /** Get the the channel to which PvaClientChannel is connected.
      * @return The channel interface.
      */
     epics::pvAccess::Channel::shared_pointer getChannel();
-    /**
-     * @brief Connect to the channel.
+    /** Connect to the channel.
      * This calls issueConnect and waitConnect.
      * An exception is thrown if connect fails.
      * @param timeout The time to wait for connecting to the channel.
      */
     void connect(double timeout=5.0);
-    /**
-     * @brief Issue a connect request and return immediately.
+    /** Issue a connect request and return immediately.
      */
     void issueConnect();
-    /**
-     * @brief Wait until the connection completes or for timeout.
+    /** Wait until the connection completes or for timeout.
      * @param timeout The time in second to wait.
      * @return status.
      */
     epics::pvData::Status waitConnect(double timeout);
-    /**
-     * @brief Calls the next method with subField = "";
+    /** Calls the next method with subField = "";
      * @return The interface.
      */
     PvaClientFieldPtr createField();
-    /**
-     * @brief Create an PvaClientField for the specified subField.
+    /** Create an PvaClientField for the specified subField.
      * @param subField The syntax for subField is defined in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientFieldPtr createField(std::string const & subField);
-    /**
-     * @brief Calls the next method with request = "";
+    /** Calls the next method with request = "";
      * @return The interface.
      */
     PvaClientProcessPtr createProcess();
-    /**
-     * @brief First call createRequest as implemented by pvDataJava and then calls the next method.
+    /** First call createRequest as implemented by pvDataJava and then calls the next method.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientProcessPtr createProcess(std::string const & request);
-    /**
-     * @brief Creates an PvaClientProcess. 
+    /** Creates an PvaClientProcess. 
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientProcessPtr createProcess(epics::pvData::PVStructurePtr const &  pvRequest);
-    /**
-     * @brief Call the next method with request =  "field(value,alarm,timeStamp)" 
+    /** Call the next method with request =  "field(value,alarm,timeStamp)" 
      * @return The interface.
      */
     PvaClientGetPtr get();
-    /**
-     * @brief get a cached PvaClientGet or create and connect to a new PvaClientGet.
+    /** Get a cached PvaClientGet or create and connect to a new PvaClientGet.
      * Then call it's get method.
      * If connection can not be made an exception is thrown.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientGetPtr get(std::string const & request);
-    /**
-     * @brief Call the next method with request =  "field(value,alarm,timeStamp)" 
+    /** Call the next method with request =  "field(value,alarm,timeStamp)" 
      * @return The interface.
      */
     PvaClientGetPtr createGet();
-    /**
-     * @brief First call createRequest as implemented by pvDataJava and then call the next method.
+    /** First call createRequest as implemented by pvDataJava and then call the next method.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientGetPtr createGet(std::string const & request);
-    /**
-     * @brief Creates an PvaClientGet.
+    /** Creates an PvaClientGet.
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientGetPtr createGet(epics::pvData::PVStructurePtr const &  pvRequest);
-    /**
-     * @brief Call the next method with request =  "field(value)" 
+    /** Call the next method with request =  "field(value)" 
      * @return The interface.
      */
     PvaClientPutPtr put();
-    /**
-     *  @brief get a cached PvaClientPut or create and connect to a new PvaClientPut.
+    /** get a cached PvaClientPut or create and connect to a new PvaClientPut.
      *  Then call it's get method.
      *  If connection can not be made an exception is thrown.
      *  @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientPutPtr put(std::string const & request);
-    /**
-     *  @brief Call the next method with request = "field(value)" 
+    /** Call the next method with request = "field(value)" 
      * @return The interface.
      */
     PvaClientPutPtr createPut();
-    /**
-     * @brief First call createRequest as implemented by pvDataJava and then calls the next method.
+    /** First call createRequest as implemented by pvDataJava and then calls the next method.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientPutPtr createPut(std::string const & request);
-    /**
-     * @brief Create an PvaClientPut.
+    /** Create an PvaClientPut.
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientPutPtr createPut(epics::pvData::PVStructurePtr const & pvRequest);
-    /**
-     *  @brief Call the next method with request = "record[process=true]putField(argument)getField(result)".
+    /** Call the next method with request = "record[process=true]putField(argument)getField(result)".
      * @return The interface.
      */
     PvaClientPutGetPtr createPutGet();
-    /**
-     * @brief First call createRequest as implemented by pvDataJava and then calls the next method.
+    /** First call createRequest as implemented by pvDataJava and then calls the next method.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientPutGetPtr createPutGet(std::string const & request);
-    /**
-     * @brief Create an PvaClientPutGet.
+    /** Create an PvaClientPutGet.
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientPutGetPtr createPutGet(epics::pvData::PVStructurePtr const & pvRequest);
-    /**
-     * @brief Call createRPC(PVStructure(null))
+    /** Call createRPC(PVStructure(null))
      * @return The interface.
      */
     PvaClientRPCPtr createRPC();
@@ -387,51 +347,43 @@ public:
      * @return The interface.
      */
     PvaClientRPCPtr createRPC(std::string const & request);
-    /**
-     * @brief Create an PvaClientRPC.
+    /** Create an PvaClientRPC.
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientRPCPtr createRPC(epics::pvData::PVStructurePtr const & pvRequest);
-    /**
-     * @brief Call the next method with request = "field(value)";
+    /** Call the next method with request = "field(value)";
      * @return The interface.
      */
     PvaClientArrayPtr createArray();
-    /**
-     * @brief First call createRequest as implemented by pvDataJava and then calls the next method.
+    /** First call createRequest as implemented by pvDataJava and then call the next method.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientArrayPtr createArray(std::string const & request);
-    /**
-     * @brief Create an PvaClientArray.
+    /** Create an PvaClientArray.
      * @param pvRequest The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientArrayPtr createArray(epics::pvData::PVStructurePtr const &  pvRequest);
-    /**
-     * @brief Call the next method with request =  "field(value,alarm,timeStamp)" 
+    /** Call the next method with request =  "field(value,alarm,timeStamp)" 
      * @return The interface.
      */
     PvaClientMonitorPtr monitor();
-    /**
-     * @brief get a cached PvaClientMonitor or create and connect to a new PvaClientMonitor.
+    /** Get a cached PvaClientMonitor or create and connect to a new PvaClientMonitor.
      * Then call it's start method.
      * If connection can not be made an exception is thrown.
      * @param request The request as described in package org.epics.pvdata.copy
      * @return The interface.
      */
     PvaClientMonitorPtr monitor(std::string const & request);
-    /**
-      * @brief Call the next method with request =  "field(value,alarm,timeStamp)" 
+    /** Call the next method with request =  "field(value,alarm,timeStamp)" 
       * @param pvaClientMonitorRequester The client callback.
       * @return The interface.
       */
     PvaClientMonitorPtr monitor(PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester);
 
-    /**
-     * @brief get a cached PvaClientMonitor or create and connect to a new PvaClientMonitor.
+    /** get a cached PvaClientMonitor or create and connect to a new PvaClientMonitor.
      * Then call it's start method.
      * If connection can not be made an exception is thrown.
      * @param request The request as described in package org.epics.pvdata.copy
@@ -441,8 +393,7 @@ public:
     PvaClientMonitorPtr monitor(
         std::string const & request,
         PvaClientMonitorRequesterPtr const & pvaClientMonitorRequester);
-    /**
-     * @brief Call the next method with request = "field(value.alarm,timeStamp)" 
+    /** Call the next method with request = "field(value.alarm,timeStamp)" 
      * @return The interface.
      */
     PvaClientMonitorPtr createMonitor();
@@ -452,12 +403,17 @@ public:
      * @return The interface.
      */
     PvaClientMonitorPtr createMonitor(std::string const & request);
-    /**
-     * @brief Create an PvaClientMonitor.
+    /** Create an PvaClientMonitor.
      * @param pvRequest  The syntax of pvRequest is described in package org.epics.pvdata.copy.
      * @return The interface.
      */
     PvaClientMonitorPtr createMonitor(epics::pvData::PVStructurePtr const &  pvRequest);
+     /** Show the list of cached gets and puts.
+     */
+    void showCache();
+     /** Get the number of cached gets and puts.
+     */
+    size_t cacheSize();
     PvaClientChannelPtr getPtrSelf()
     {
         return shared_from_this();
@@ -497,67 +453,58 @@ private:
     friend class ChannelRequesterImpl;
 };
 
-/**
- * @brief This is a class that holds data returned by PvaClientGet or PvaClientPutGet
+/** This is a class that holds data returned by PvaClientGet or PvaClientPutGet
  *
  */
 class epicsShareClass PvaClientGetData
 {
 public:
     POINTER_DEFINITIONS(PvaClientGetData);
-    /**
-     * @brief Factory method for creating an instance of PvaClientGetData.
+    /** Factory method for creating an instance of PvaClientGetData.
      */
     static PvaClientGetDataPtr create(epics::pvData::StructureConstPtr const & structure);
     ~PvaClientGetData() {}
-    /**
-     * @brief Set a prefix for throw messages.
+    /** Set a prefix for throw messages.
      * @param value The prefix.
      */
     void setMessagePrefix(std::string const & value);
-   /** @brief Get the structure.
-    * @return the structure.
+   /** Get the structure.
     */
    epics::pvData::StructureConstPtr getStructure();
-   /** @brief Get the pvStructure.
+   /** Get the pvStructure.
     * @return the pvStructure.
     */
    epics::pvData::PVStructurePtr getPVStructure();
-   /** @brief Get the BitSet for the pvStructure
+   /** Get the BitSet for the pvStructure
     * This shows which fields have changed value.
     * @return The bitSet
     */
    epics::pvData::BitSetPtr getBitSet();
-   /** @brief show the fields that have changed.
+   /** Show the fields that have changed.
     * @param out The stream that shows the changed fields.
     * @return The stream that was input
     */
    std::ostream & showChanged(std::ostream & out);
-    /**
-     * @brief New data is present.
+    /** New data is present.
      * @param pvStructureFrom The new data.
      * @param bitSetFrom the bitSet showing which values have changed.
      */
     void setData(
         epics::pvData::PVStructurePtr const & pvStructureFrom,
         epics::pvData::BitSetPtr const & bitSetFrom);
-    /**
-     * @brief Is there a top level field named value.
+    /** Is there a top level field named value.
      * @return The answer.
      */
     bool hasValue();
-    /**
-     * @brief Is the value field a scalar?
+    /** Is the value field a scalar?
      * @return The answer.
      */
     bool isValueScalar();
-    /**
-     * @brief Is the value field a scalar array?
+    /** Is the value field a scalar array?
      * @return The answer.
      */
     bool isValueScalarArray();
-    /**
-     * @brief Return the interface to the value field.
+    /** Get the interface to the value field.
      * @return The interface. an excetion is thrown if a value field does not exist.
      */
     epics::pvData::PVFieldPtr getValue();
@@ -567,51 +514,43 @@ public:
      * An exception is thown if no scalar value field.
      */
     epics::pvData::PVScalarPtr getScalarValue();
-    /**
-     * @brief Return the interface to an array value field.
+    /** Getthe interface to an array value field.
      * @return The interface.
      * An exception is thown if no array value field.
      */
     std::tr1::shared_ptr getArrayValue();
-    /**
-     * @brief Return the interface to a scalar array value field.
+    /** Get the interface to a scalar array value field.
      * @return Return the interface.
      * An exception is thown if no scalar array value field.
      */
     std::tr1::shared_ptr getScalarArrayValue();
-    /**
-     * @brief Get the value as a double.
+    /** Get the value as a double.
      * If value is not a numeric scalar an exception is thrown.
      * @return The value.
      */
     double getDouble();
-    /**
-     * @brief Get the value as a string.
+    /** Get the value as a string.
      * If value is not a scalar an exception is thrown
      * @return The value.
      */
     std::string getString();
-    /**
-     * @brief Get the value as a double array.
+    /** Get the value as a double array.
      * If the value is not a numeric array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getDoubleArray();
-    /**
-     * @brief Get the value as a string array.
+    /** Get the value as a string array.
      * If the value is not a string array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getStringArray();
-    /**
-     * @brief Get the alarm.
+    /** Get the alarm.
      * If the pvStructure as an alarm field it's values are returned.
-     * If no then alarm shows that not alarm defined.
+     * If no then alarm shows that no alarm defined.
      * @return The alarm.
      */
     epics::pvData::Alarm getAlarm();
-    /**
-     * @brief Get the timeStamp.
+    /** Get the timeStamp.
      * If the pvStructure as a timeStamp field, it's values are returned.
      * If no then all fields are 0.
      * @return The timeStamp.
@@ -631,129 +570,111 @@ private:
 };
 
 class PvaClientPostHandlerPvt; // private to PvaClientPutData
-/**
- * @brief This is a class that holds data given to  by PvaClientPut or PvaClientPutGet
+/** This is a class that holds data given to  by PvaClientPut or PvaClientPutGet
  *
  */
 class epicsShareClass PvaClientPutData
 {
 public:
     POINTER_DEFINITIONS(PvaClientPutData);
-    /**
-     * @brief Factory method for creating an instance of PvaClientPutData.
+    /** Factory method for creating an instance of PvaClientPutData.
      */
     static PvaClientPutDataPtr create(epics::pvData::StructureConstPtr const & structure);
     ~PvaClientPutData() {}
-    /**
-     * @brief Set a prefix for throw messages.
+    /** Set a prefix for throw messages.
      * @param value The prefix.
      */
     void setMessagePrefix(std::string const & value);
-   /** @brief Get the structure.
+   /** Get the structure.
     * @return the structure.
     */
    epics::pvData::StructureConstPtr getStructure();
-    /** @brief Get the pvStructure.
+    /** Get the pvStructure.
      * @return the pvStructure.
      */
     epics::pvData::PVStructurePtr getPVStructure();
-    /** @brief Get the BitSet for the pvStructure
+    /**  Get the BitSet for the pvStructure
      * This shows which fields have changed value.
      * @return The bitSet
      */
     epics::pvData::BitSetPtr getBitSet();
-    /** @brief show the fields that have changed.
+    /**  Show the fields that have changed.
      * @param out The stream that shows the changed fields.
      * @return The stream that was input
      */
     std::ostream & showChanged(std::ostream & out);
     /**
-     * @brief Is there a top level field named value.
+     * Is there a top level field named value.
      * @return The answer.
      */
     bool hasValue();
-    /**
-     * @brief Is the value field a scalar?
+    /** Is the value field a scalar?
      * @return The answer.
      */
     bool isValueScalar();
-    /**
-     * @brief Is the value field a scalar array?
+    /** Is the value field a scalar array?
      * @return The answer.
      */
     bool isValueScalarArray();
-    /**
-     * @brief Return the interface to the value field.
+    /** Get the interface to the value field.
      * @return The interface. an excetion is thrown if a value field does not exist.
      */
     epics::pvData::PVFieldPtr getValue();
-    /**
-     * @brief Return the interface to a scalar value field.
+    /** Get the interface to a scalar value field.
      * @return The interface for a scalar value field.
      * An exception is thown if no scalar value field.
      */
     epics::pvData::PVScalarPtr getScalarValue();
-    /**
-     * @brief Return the interface to an array value field.
+    /** Get the interface to an array value field.
      * @return The interface.
      * An exception is thown if no array value field.
      */
     std::tr1::shared_ptr getArrayValue();
-    /**
-     * @brief Return the interface to a scalar array value field.
+    /** Get the interface to a scalar array value field.
      * @return Return the interface.
      * An exception is thown if no scalar array value field.
      */
     std::tr1::shared_ptr getScalarArrayValue();
-    /**
-     * @brief Get the value as a double.
+    /** Get the value as a double.
      * If value is not a numeric scalar an exception is thrown.
      * @return The value.
      */
     double getDouble();
-    /**
-     * @brief Get the value as a string.
+    /** Get the value as a string.
      * If value is not a string an exception is thrown
      * @return The value.
      */
     std::string getString();
-    /**
-     * @brief Get the value as a double array.
+    /** Get the value as a double array.
      * If the value is not a numeric array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getDoubleArray();
-    /**
-     * @brief Get the value as a string array.
+    /** Get the value as a string array.
      * If the value is not a string array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getStringArray();
-    /**
-     * Put the value as a double.
+    /** Put the value as a double.
      * An exception is also thrown if the actualy type can cause an overflow.
      * If value is not a numeric scalar an exception is thrown.
      */
     void putDouble(double value);
-    /**
-     * Put the value as a string.
+    /** Put the value as a string.
      * If value is not a  scalar an exception is thrown.
      */
     void putString(std::string const & value);
-    /**
-     * Copy the array to the value field.
+    /** Copy the array to the value field.
      * If the value field is not a double array field an exception is thrown.
      * @param value The place where data is copied.
      */
     void putDoubleArray(epics::pvData::shared_vector const & value);
-    /**
-     * Copy array to the value field.
+    /** Copy array to the value field.
      * If the value field is not a string array field an exception is thrown.
      * @param value data source
      */
     void putStringArray(epics::pvData::shared_vector const & value);
-    /**
-     * Copy array to the value field.
+    /** Copy array to the value field.
      * If the value field is not a scalarArray field an exception is thrown.
      * @param value data source
      */
@@ -774,7 +695,7 @@ private:
 };
 
 /**
- * @brief This is a class that holds data returned by PvaClientMonitor
+ * This is a class that holds data returned by PvaClientMonitor
  *
  */
 class epicsShareClass PvaClientMonitorData
@@ -786,35 +707,34 @@ public:
      */
     static PvaClientMonitorDataPtr create(epics::pvData::StructureConstPtr const & structure);
     ~PvaClientMonitorData() {}
-    /**
-     * @brief Set a prefix for throw messages.
+    /** Set a prefix for throw messages.
      * @param value The prefix.
      */
     void setMessagePrefix(std::string const & value);
-   /** @brief Get the structure.
+   /**  Get the structure.
     * @return the structure.
     */
    epics::pvData::StructureConstPtr getStructure();
-    /** @brief Get the pvStructure.
+    /**  Get the pvStructure.
      * @return the pvStructure.
      */
     epics::pvData::PVStructurePtr getPVStructure();
-    /** @brief Get the BitSet for the pvStructure
+    /**  Get the BitSet for the pvStructure
      * This shows which fields have changed value.
      * @return The bitSet
      */
     epics::pvData::BitSetPtr getChangedBitSet();
-    /** @brief Get the overrun BitSet for the pvStructure
+    /** Get the overrun BitSet for the pvStructure
      * This shows which fields have had more than one change.
      * @return The bitSet
      */
     epics::pvData::BitSetPtr getOverrunBitSet();
-    /** @brief show the fields that have changed.
+    /** Show the fields that have changed.
      * @param out The stream that shows the changed fields.
      * @return The stream that was input
      */
     std::ostream & showChanged(std::ostream & out);
-    /** @brief show the fields that have overrun.
+    /** Show the fields that have overrun.
      * @param out The stream that shows the overrun fields.
      * @return The stream that was input
      */
@@ -824,78 +744,65 @@ public:
      * @param monitorElement The new data.
      */
     void setData(epics::pvData::MonitorElementPtr const & monitorElement);
-    /**
-     * @brief Is there a top level field named value.
+    /** Is there a top level field named value.
      * @return The answer.
      */
     bool hasValue();
-    /**
-     * @brief Is the value field a scalar?
+    /** Is the value field a scalar?
      * @return The answer.
      */
     bool isValueScalar();
-    /**
-     * @brief Is the value field a scalar array?
+    /** Is the value field a scalar array?
      * @return The answer.
      */
     bool isValueScalarArray();
-    /**
-     * @brief Return the interface to the value field.
+    /** Get the interface to the value field.
      * @return The interface. an excetion is thrown if a value field does not exist.
      */
     epics::pvData::PVFieldPtr getValue();
-    /**
-     * @brief Return the interface to a scalar value field.
+    /** Get the interface to a scalar value field.
      * @return The interface for a scalar value field.
      * An exception is thown if no scalar value field.
      */
     epics::pvData::PVScalarPtr getScalarValue();
-    /**
-     * @brief Return the interface to an array value field.
+    /** Get the interface to an array value field.
      * @return The interface.
      * An exception is thown if no array value field.
      */
     std::tr1::shared_ptr getArrayValue();
-    /**
-     * @brief Return the interface to a scalar array value field.
+    /** Get the interface to a scalar array value field.
      * @return Return the interface.
      * An exception is thown if no scalar array value field.
      */
     std::tr1::shared_ptr getScalarArrayValue();
-    /**
-     * @brief Get the value as a double.
+    /** Get the value as a double.
      * If value is not a numeric scalar an exception is thrown.
      * @return The value.
      */
     double getDouble();
-    /**
-     * @brief Get the value as a string.
+    /** Get the value as a string.
      * If value is not a scalar an exception is thrown
      * @return The value.
      */
     std::string getString();
-    /**
-     * @brief Get the value as a double array.
+    /** Get the value as a double array.
      * If the value is not a numeric array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getDoubleArray();
-    /**
-     * @brief Get the value as a string array.
+    /** Get the value as a string array.
      * If the value is not a string array an exception is thrown.
      * @return The value.
      */
     epics::pvData::shared_vector  getStringArray();
-    /**
-     * @brief Get the alarm.
+    /** Get the alarm.
      * If the pvStructure as an alarm field it's values are returned.
      * If no then alarm shows that not alarm defined.
      * @return The alarm.
      */
     epics::pvData::Alarm getAlarm();
-    /**
-     * @brief Get the timeStamp.
-     * If the pvStructure as a timeStamp field, it's values are returned.
+    /** Get the timeStamp.
+     * If the pvStructure has a timeStamp field, it's values are returned.
      * If no then all fields are 0.
      * @return The timeStamp.
      */
@@ -917,7 +824,7 @@ private:
 
 class ChannelProcessRequesterImpl; // private to PvaClientProcess
 /**
- * @brief An easy to use alternative to ChannelProcess.
+ * An easy to use alternative to ChannelProcess.
  *
  * @author mrk
  */
@@ -925,8 +832,7 @@ class epicsShareClass PvaClientProcess
 {
 public:
     POINTER_DEFINITIONS(PvaClientProcess);
-    /**
-     * @brief Create a PvaClientProcess.
+    /** Create a PvaClientProcess.
      * @param &pvaClient Interface to PvaClient
      * @param pvaClientChannel Interface to PvaClientChannel
      * @param channel Interface to Channel
@@ -939,40 +845,32 @@ public:
         epics::pvAccess::Channel::shared_pointer const & channel,
         epics::pvData::PVStructurePtr const &pvRequest
     );
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientProcess();
-    /** 
-     * @brief destroy an resources used.
+    /** Destroy all resources used.
      */
     void destroy();
-    /**
-     * @brief call issueConnect and then waitConnect.
+    /** Call issueConnect and then waitConnect.
      * An exception is thrown if connect fails.
      */
     void connect();
-    /**
-     * @brief create the channelProcess connection to the channel.
+    /** Issue the channelProcess connection to the channel.
      * This can only be called once.
      */
     void issueConnect();
-    /**
-     * @brief wait until the channelProcess connection to the channel is complete.
+    /** Wait until the channelProcess connection to the channel is complete.
      * @return status;
      */
     epics::pvData::Status waitConnect();
-    /**
-     * @brief Call issueProcess and then waitProcess.
+    /** Call issueProcess and then waitProcess.
      * An exception is thrown if get fails.
      */
     void process();
-    /**
-     * @brief Issue a get and return immediately.
+    /** Issue a process and return immediately.
      */
     void issueProcess();
-    /**
-     * @brief Wait until get completes.
+    /** Wait until process completes.
      * @return status.
      */
     epics::pvData::Status waitProcess();
@@ -1017,7 +915,7 @@ private:
 
 class ChannelGetRequesterImpl; // private to PvaClientGet
 /**
- * @brief An easy to use alternative to ChannelGet.
+ * An easy to use alternative to ChannelGet.
  *
  * @author mrk
  */
@@ -1025,8 +923,7 @@ class epicsShareClass PvaClientGet
 {
 public:
     POINTER_DEFINITIONS(PvaClientGet);
-    /**
-     * @brief Create a PvaClientGet.
+    /** Create a PvaClientGet.
      * @param &pvaClient Interface to PvaClient
      * @param pvaClientChannel Interface to PvaClientChannel
      * @param channel Interface to Channel
@@ -1039,16 +936,14 @@ public:
         epics::pvAccess::Channel::shared_pointer const & channel,
         epics::pvData::PVStructurePtr const &pvRequest
     );
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientGet();
     /** 
      * @brief destroy an resources used.
      */
     void destroy();
-    /**
-     * @brief call issueConnect and then waitConnect.
+    /** Call issueConnect and then waitConnect.
      * An exception is thrown if connect fails.
      */
     void connect();
@@ -1057,22 +952,18 @@ public:
      * This can only be called once.
      */
     void issueConnect();
-    /**
-     * @brief wait until the channelGet connection to the channel is complete.
+    /** Wait until the channelGet connection to the channel is complete.
      * @return status;
      */
     epics::pvData::Status waitConnect();
-    /**
-     * @brief Call issueGet and then waitGet.
+    /** Call issueGet and then waitGet.
      * An exception is thrown if get fails.
      */
     void get();
-    /**
-     * @brief Issue a get and return immediately.
+    /** Issue a get and return immediately.
      */
     void issueGet();
-    /**
-     * @brief Wait until get completes.
+    /** Wait until get completes.
      * @return status;
      */
     epics::pvData::Status waitGet();
@@ -1126,7 +1017,7 @@ private:
 
 class ChannelPutRequesterImpl; // private to PvaClientPut
 /**
- * @brief An easy to use alternative to ChannelPut.
+ * An easy to use alternative to ChannelPut.
  *
  * @author mrk
  */
@@ -1134,8 +1025,7 @@ class epicsShareClass PvaClientPut
 {
 public:
     POINTER_DEFINITIONS(PvaClientPut);
-    /**
-     * @brief Create a PvaClientPut.
+    /** Create a PvaClientPut.
      * @param &pvaClient Interface to PvaClient
      * @param pvaClientChannel Interface to PvaClientChannel
      * @param channel Interface to Channel
@@ -1148,54 +1038,44 @@ public:
         epics::pvAccess::Channel::shared_pointer const & channel,
         epics::pvData::PVStructurePtr const &pvRequest
     );
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientPut();
     /** 
-     * @brief destroy an resources used.
+     * @brief destroy all resources used.
      */
     void destroy();
-    /**
-     * @brief call issueConnect and then waitConnect.
+    /** Call issueConnect and then waitConnect.
      * An exception is thrown if connect fails.
      */
     void connect();
-    /**
-     * @brief create the channelPut connection to the channel.
+    /** Issue the channelPut connection to the channel.
      * This can only be called once.
      */
     void issueConnect();
-    /**
-     * @brief wait until the channelPut connection to the channel is complete.
+    /** Wait until the channelPut connection to the channel is complete.
      * @return status;
      */
     epics::pvData::Status waitConnect();
-    /**
-     * @brief Call issueGet and then waitGet.
+    /** Call issueGet and then waitGet.
      * An exception is thrown if get fails.
      */
     void get();
-    /**
-     * @brief Issue a get and return immediately.
+    /** Issue a get and return immediately.
      */
     void issueGet();
-    /**
-     * @brief Wait until get completes.
+    /** Wait until get completes.
      * @return status
      */
     epics::pvData::Status waitGet();
-    /**
-     * @brief Call issuePut and then waitPut.
+    /** Call issuePut and then waitPut.
      * An exception is thrown if get fails.
      */
     void put();
-    /**
-     * @brief Issue a put and return immediately.
+    /** Issue a put and return immediately.
      */
     void issuePut();
-    /**
-     * @brief Wait until put completes.
+    /** Wait until put completes.
      * @return status
      */
     epics::pvData::Status waitPut();
@@ -1251,8 +1131,7 @@ private :
 };
 
 class ChannelPutGetRequesterImpl; // private to PvaClientPutGet
-/**
- * @brief An easy to use alternative to ChannelPutGet.
+/** An easy to use alternative to ChannelPutGet.
  *
  * @author mrk
  */
@@ -1260,8 +1139,7 @@ class epicsShareClass PvaClientPutGet
 {
 public:
     POINTER_DEFINITIONS(PvaClientPutGet);
-    /**
-     * @brief Create a PvaClientPutGet.
+    /** Create a PvaClientPutGet.
      * @param &pvaClient Interface to PvaClient
      * @param pvaClientChannel Interface to PvaClientChannel
      * @param channel Interface to Channel
@@ -1274,81 +1152,65 @@ public:
         epics::pvAccess::Channel::shared_pointer const & channel,
         epics::pvData::PVStructurePtr const &pvRequest
     );
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientPutGet();
-    /** 
-     * @brief destroy an resources used.
+    /** Destroy all resources used.
      */
     void destroy();
-    /**
-     * @brief call issueConnect and then waitConnect.
+    /** Call issueConnect and then waitConnect.
      * An exception is thrown if connect fails.
      */
     void connect();
-    /**
-     * @brief create the channelPutGet connection to the channel.
+    /** Issue the channelPutGet connection to the channel.
      * This can only be called once.
      * An exception is thrown if connect fails.
      */
     void issueConnect();
-    /**
-     * @brief wait until the channelPutGet connection to the channel is complete.
+    /** Wait until the channelPutGet connection to the channel is complete.
      * @return status;
      */
     epics::pvData::Status waitConnect();
-    /**
-     * @brief Call issuePutGet and then waitPutGet.
+    /** Call issuePutGet and then waitPutGet.
      * An exception is thrown if putGet fails.
      */
     void putGet();
-    /**
-     * @brief Issue a putGet and return immediately.
+    /** Issue a putGet and return immediately.
      */
     void issuePutGet();
-    /**
-     * @brief Wait until putGet completes.
+    /** Wait until putGet completes.
      * If failure getStatus can be called to get reason.
      * @return status
      */
     epics::pvData::Status waitPutGet();
-    /**
-     * @brief Call issueGet and then waitGetGet.
+    /** Call issueGet and then waitGetGet.
      * An exception is thrown if get fails.
      */
     void getGet();
-    /**
-     * @brief Issue a getGet and return immediately.
+    /** Issue a getGet and return immediately.
      */
     void issueGetGet();
-    /**
-     * @brief Wait until getGet completes.
+    /** Wait until getGet completes.
      * If failure getStatus can be called to get reason.
      * @return status
      */
     epics::pvData::Status waitGetGet();
-    /**
-     * @brief Call issuePut and then waitGetPut.
+    /** Call issuePut and then waitGetPut.
      * An exception is thrown if getPut fails.
      */
     void getPut();
-    /**
-     * @brief Issue a getPut and return immediately.
+    /** Issue a getPut and return immediately.
      */
     void issueGetPut();
-    /**
-     * @brief Wait until getPut completes.
+    /** Wait until getPut completes.
      * @return status
      */
     epics::pvData::Status waitGetPut();
-    /**
-     * @brief Get the put data.
+    /** Get the put data.
      * @return The interface.
      */
     PvaClientPutDataPtr getPutData();   
-    /**
-     * @brief Get the get data.
+    /** Get the get data.
      * @return The interface.
      */
     PvaClientGetDataPtr getGetData();   
@@ -1410,26 +1272,24 @@ private :
 
 class ChannelMonitorRequester; // private to PvaClientMonitor
 /**
- * @brief Optional client callback.
+ * Optional client callback.
  *
  */
 class epicsShareClass PvaClientMonitorRequester
 {
 public:
     POINTER_DEFINITIONS(PvaClientMonitorRequester);
-    /**
-     * @brief destructor
+    /** Destructor
      */
     virtual ~PvaClientMonitorRequester(){}
-    /**
-     * @brief A monitor event has occurred.
+    /** A monitor event has occurred.
      * @param monitor The PvaClientMonitor that received the event.
      */
     virtual void event(PvaClientMonitorPtr monitor) = 0;
 };
 
 /**
- * @brief An easy to use alternative to Monitor.
+ * An easy to use alternative to Monitor.
  *
  */
 class epicsShareClass PvaClientMonitor :
@@ -1437,8 +1297,7 @@ class epicsShareClass PvaClientMonitor :
 {
 public:
     POINTER_DEFINITIONS(PvaClientMonitor);
-    /**
-     * @brief Create a PvaClientMonitor.
+    /** Create a PvaClientMonitor.
      * @param &pvaClient Interface to PvaClient
      * @param pvaClientChannel Interface to PvaClientChannel
      * @param channel Interface to Channel
@@ -1451,67 +1310,54 @@ public:
         epics::pvAccess::Channel::shared_pointer const & channel,
         epics::pvData::PVStructurePtr const &pvRequest
     );
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientMonitor();
-    /** 
-     * @brief destroy an resources used.
+    /** Destroy all resources used.
      */
     void destroy();
-    /**
-     * @brief call issueConnect and then waitConnect.
+    /** Call issueConnect and then waitConnect.
      * An exception is thrown if connect fails.
      */
     void connect();
-    /**
-     * @brief create the channelMonitor connection to the channel.
+    /** Issue the channelMonitor connection to the channel.
      * This can only be called once.
      * An exception is thrown if connect fails.
      */
     void issueConnect();
-    /**
-     * @brief wait until the channelMonitor connection to the channel is complete.
+    /** Wait until the channelMonitor connection to the channel is complete.
      * @return status;
      */
     epics::pvData::Status waitConnect();
-    /**
-     * @brief Set a user callback.
+    /** Set a user callback.
      * @param pvaClientMonitorrRequester The requester which must be implemented by the caller.
      */
     void setRequester(PvaClientMonitorRequesterPtr const & pvaClientMonitorrRequester);
-    /**
-     * @brief Start monitoring.
+    /** Start monitoring.
      */
     void start();
-    /**
-     * @brief Stop monitoring.
+    /** Stop monitoring.
      */
     void stop();
-    /**
-     * @brief poll for a monitor event.
+    /** Poll for a monitor event.
      * The data will be in PvaClientData.
      * @return (false,true) means event (did not, did) occur.
      */
     bool poll();
-    /**
-     * @brief wait for a monitor event.
+    /** Wait for a monitor event.
      * The data will be in PvaClientData.
      * @param secondsToWait Time to wait for event.
      * @return (false,true) means event (did not, did) occur.
      */
     bool waitEvent(double secondsToWait = 0.0);
-    /**
-     * @brief Release the monitorElement returned by poll
+    /** Release the monitorElement returned by poll
      */
     void releaseEvent();
-    /**
-     * @brief The data in which monitor events are placed.
+    /** The data in which monitor events are placed.
      * @return The interface.
      */
     PvaClientMonitorDataPtr getData();   
-    /**
-     * @brief get shared pointer to this
+    /** Get shared pointer to this
      */
     PvaClientMonitorPtr getPtrSelf()
     {
@@ -1558,7 +1404,7 @@ private:
 };
 
 /**
- * @brief Provides access to multiple channels.
+ * Provides access to multiple channels.
  *
  * @author mrk
  */
@@ -1567,8 +1413,7 @@ class epicsShareClass PvaClientMultiChannel :
 {
 public:
     POINTER_DEFINITIONS(PvaClientMultiChannel);
-    /**
-     * @brief Create a PvaClientMultiChannel.
+    /** Create a PvaClientMultiChannel.
      * @param channelNames The name. of the channel..
      * @param providerName The name of the provider.
      * @return The interface to the PvaClientStructure.
@@ -1578,17 +1423,14 @@ public:
          epics::pvData::PVStringArrayPtr const & channelNames,
          std::string const & providerName = "pva");
     ~PvaClientMultiChannel();
-    /**
-     * @brief Destroy the pvAccess connection.
+    /** Destroy the pvAccess connection.
      */
     void destroy();
-    /**
-     * @brief Get the channelNames.
+    /** Get the channelNames.
      * @return The names.
      */
     epics::pvData::PVStringArrayPtr getChannelNames();
-    /**
-     * @brief Connect to the channel.
+    /** Connect to the channels.
      * This calls issueConnect and waitConnect.
      * An exception is thrown if connect fails.
      * @param timeout The time to wait for connecting to the channel.
@@ -1598,33 +1440,27 @@ public:
     epics::pvData::Status connect(
        double timeout=5,
        size_t maxNotConnected=0);
-    /**
-     * Are all channels connected?
+    /** Are all channels connected?
      * @return if all are connected.
      */
     bool allConnected();
-    /**
-     * Has a connection state change occured?
+    /** Has a connection state change occured?
      * @return (true, false) if (at least one, no) channel has changed state.
      */
     bool connectionChange();
-    /**
-     * Get the connection state of each channel.
+    /** Get the connection state of each channel.
      * @return The state of each channel.
      */
     epics::pvData::PVBooleanArrayPtr getIsConnected();
-    /**
-     * Get the pvaClientChannelArray.
+    /** Get the pvaClientChannelArray.
      * @return The weak shared pointer.
      */
     PvaClientChannelArrayWPtr getPvaClientChannelArray();
-    /**
-     * Get pvaClient.
+    /** Get pvaClient.
      * @return The weak shared pointer.
      */
     PvaClient::weak_pointer getPvaClient();
-    /**
-     * Get the shared pointer to self.
+    /** Get the shared pointer to self.
      * @return The shared pointer.
      */
     PvaClientMultiChannelPtr getPtrSelf()
diff --git a/src/pvaClientChannel.cpp b/src/pvaClientChannel.cpp
index 57a3328..b0d0eb9 100644
--- a/src/pvaClientChannel.cpp
+++ b/src/pvaClientChannel.cpp
@@ -36,6 +36,8 @@ public:
     }
     PvaClientGetPtr getGet(string const & request);
     void addGet(string const & request,PvaClientGetPtr const & pvaClientGet);
+    void showCache();
+    size_t cacheSize();
 private:
     map pvaClientGetMap;
 };
@@ -58,6 +60,20 @@ void PvaClientGetCache::addGet(string const & request,PvaClientGetPtr const & pv
          request,pvaClientGet));
 }
 
+void PvaClientGetCache::showCache()
+{
+    map::iterator iter;
+    for(iter = pvaClientGetMap.begin(); iter != pvaClientGetMap.end(); ++iter)
+    {
+         cout << "        " << iter->first << endl;
+    }
+}
+
+size_t PvaClientGetCache::cacheSize()
+{
+    return pvaClientGetMap.size();
+
+}
 
 class PvaClientPutCache
 {
@@ -69,6 +85,8 @@ public:
     }
     PvaClientPutPtr getPut(string const & request);
     void addPut(string const & request,PvaClientPutPtr const & pvaClientPut);
+    void showCache();
+    size_t cacheSize();
 private:
     map pvaClientPutMap;
 };
@@ -91,6 +109,21 @@ void PvaClientPutCache::addPut(string const & request,PvaClientPutPtr const & pv
          request,pvaClientPut));
 }
 
+void PvaClientPutCache::showCache()
+{
+    map::iterator iter;
+    for(iter = pvaClientPutMap.begin(); iter != pvaClientPutMap.end(); ++iter)
+    {
+         cout << "        " << iter->first << endl;
+    }
+}
+
+size_t PvaClientPutCache::cacheSize()
+{
+    return pvaClientPutMap.size();
+
+}
+
 class ChannelRequesterImpl : public ChannelRequester
 {
      PvaClientChannel *pvaClientChannel;
@@ -482,6 +515,19 @@ PvaClientMonitorPtr  PvaClientChannel::createMonitor(PVStructurePtr const &  pvR
     return PvaClientMonitor::create(yyy,getPtrSelf(),channel,pvRequest);
 }
 
+void PvaClientChannel::showCache()
+{
+     cout << "    pvaClientGet" << endl;
+     pvaClientGetCache->showCache();
+     cout << "    pvaClientPut" << endl;
+     pvaClientPutCache->showCache();
+}
+
+size_t PvaClientChannel::cacheSize()
+{
+    return pvaClientGetCache->cacheSize() + pvaClientPutCache->cacheSize();
+}
+
 
 PvaClientChannelPtr PvaClientChannel::create(
    PvaClientPtr const &pvaClient,
diff --git a/src/pvaClientGet.cpp b/src/pvaClientGet.cpp
index bc8653d..e2d4492 100644
--- a/src/pvaClientGet.cpp
+++ b/src/pvaClientGet.cpp
@@ -169,7 +169,7 @@ Status PvaClientGet::waitConnect()
         return Status::Ok;
     }
     connectState = connectIdle;
-    return Status(Status::STATUSTYPE_ERROR,channelGetConnectStatus.getMessage());
+    return channelGetConnectStatus;
 }
 
 void PvaClientGet::get()
@@ -209,7 +209,7 @@ Status PvaClientGet::waitGet()
     if(channelGetStatus.isOK()) {
         return Status::Ok;
     }
-    return Status(Status::STATUSTYPE_ERROR,channelGetStatus.getMessage());
+    return channelGetStatus;
 }
 PvaClientGetDataPtr PvaClientGet::getData()
 {
diff --git a/src/pvaClientMonitorData.cpp b/src/pvaClientMonitorData.cpp
index 768ffad..e6fb86b 100644
--- a/src/pvaClientMonitorData.cpp
+++ b/src/pvaClientMonitorData.cpp
@@ -38,6 +38,8 @@ static string noArray("value is not an array");
 static string noScalarArray("value is not a scalarArray");
 static string notDoubleArray("value is not a doubleArray");
 static string notStringArray("value is not a stringArray");
+static string noAlarm("no alarm");
+static string noTimeStamp("no timeStamp");
 
 PvaClientMonitorDataPtr PvaClientMonitorData::create(StructureConstPtr const & structure)
 {
@@ -223,4 +225,38 @@ shared_vector PvaClientMonitorData::getStringArray()
 
 }
 
+Alarm PvaClientMonitorData::getAlarm()
+{
+   if(!pvStructure) {
+        throw std::runtime_error(messagePrefix + noAlarm);
+   }
+   PVStructurePtr pvs = pvStructure->getSubField("alarm");
+   if(!pvs) throw std::runtime_error(messagePrefix + noAlarm);
+   pvAlarm.attach(pvs);
+   if(pvAlarm.isAttached()) {
+       Alarm alarm;
+       pvAlarm.get(alarm);
+       pvAlarm.detach();
+       return alarm;
+   }
+   throw std::runtime_error(messagePrefix + noAlarm);
+}
+
+TimeStamp PvaClientMonitorData::getTimeStamp()
+{
+   if(!pvStructure) {
+        throw std::runtime_error(messagePrefix + noTimeStamp);
+   }
+   PVStructurePtr pvs = pvStructure->getSubField("timeStamp");
+   if(!pvs) throw std::runtime_error(messagePrefix + noTimeStamp);
+   pvTimeStamp.attach(pvs);
+   if(pvTimeStamp.isAttached()) {
+       TimeStamp timeStamp;
+       pvTimeStamp.get(timeStamp);
+       pvTimeStamp.detach();
+       return timeStamp;
+   }
+   throw std::runtime_error(messagePrefix + noTimeStamp);
+}
+
 }}
diff --git a/src/pvaClientMultiDouble.h b/src/pvaClientMultiDouble.h
index 028f923..b71fcd2 100644
--- a/src/pvaClientMultiDouble.h
+++ b/src/pvaClientMultiDouble.h
@@ -23,8 +23,7 @@ namespace epics { namespace pvaClient {
 class PvaClientMultiDouble;
 typedef std::tr1::shared_ptr PvaClientMultiDoublePtr;
 
-/**
- * @brief Support for multiple channels where each channel has a value field that is a scalar double.
+/** Support for multiple channels where each channel has a value field that is a scalar double.
  * If any problems arise an exception is thrown.
  *
  * @author mrk
@@ -33,8 +32,7 @@ class epicsShareClass PvaClientMultiDouble
 {
 public:
     POINTER_DEFINITIONS(PvaClientMultiDouble);
-    /**
-     * @brief Create a PvaClientMultiDouble.
+    /** Create a PvaClientMultiDouble.
      * @param &pvaClient Interface to PvaClient
      * @param channelName PVStringArray of channelNames.
      * @param timeout The timeout in seconds for connecting.
@@ -46,21 +44,17 @@ public:
         epics::pvData::PVStringArrayPtr const & channelName,
         double timeout = 5.0,
         std::string const & providerName = "pva");
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientMultiDouble();
-    /** 
-     * @brief destroy any resources used.
+    /** Destroy all resources used.
      */
     void destroy();
-    /** 
-     * @brief get the value of all the channels.
+    /** Get the value of all the channels.
      * @return The data.
      */
     epics::pvData::shared_vector get();
-    /** 
-     * @brief put a new value to each  channel.
+    /** Put a new value to each  channel.
      * @param value The data.
      */
     void put(epics::pvData::shared_vector const &value);
diff --git a/src/pvaClientNTMultiChannel.h b/src/pvaClientNTMultiChannel.h
index aee1ff0..4732a87 100644
--- a/src/pvaClientNTMultiChannel.h
+++ b/src/pvaClientNTMultiChannel.h
@@ -23,8 +23,7 @@ namespace epics { namespace pvaClient {
 class PvaClientNTMultiChannel;
 typedef std::tr1::shared_ptr PvaClientNTMultiChannelPtr;
 
-/**
- * @brief Support for multiple channels where each channel has a value field that
+/** Support for multiple channels where each channel has a value field that
  * is a scalar, scalarArray, or enumerated structure.
  * The data is provided via normativeType NTMultiChannel.
  * If any problems arise an exception is thrown.
@@ -35,8 +34,7 @@ class epicsShareClass PvaClientNTMultiChannel
 {
 public:
     POINTER_DEFINITIONS(PvaClientNTMultiChannel);
-    /**
-     * @brief Create a PvaClientNTMultiChannel.
+    /** Create a PvaClientNTMultiChannel.
      * @param &pvaClient Interface to PvaClient
      * @param channelName PVStringArray of channelNames.
      * @param structure valid NTMultiChannel structure.
@@ -50,26 +48,21 @@ public:
         epics::pvData::StructureConstPtr const & structure,
         double timeout = 5.0,
         std::string const & providerName = "pva");
-    /**
-     * @brief destructor
+    /** Destructor
      */
     ~PvaClientNTMultiChannel();
-    /** 
-     * @brief destroy any resources used.
+    /** Destroy all resources used.
      */
     void destroy();
-    /** 
-     * @brief get the value of all the channels.
+    /** Get the value of all the channels.
      * @return The data.
      */
     epics::nt::NTMultiChannelPtr get();
-    /** 
-     * @brief put a new value to each  channel.
+    /** Put a new value to each  channel.
      * @param value The data.
      */
     void put(epics::nt::NTMultiChannelPtr const &value);
-    /** 
-     * @brief Get the PvaClientMultiChannel.
+    /** Get the PvaClientMultiChannel.
      * @return The interface.
      */
     PvaClientMultiChannelPtr getPvaClientMultiChannel();
diff --git a/test/Makefile b/test/Makefile
deleted file mode 100644
index 0a9fd57..0000000
--- a/test/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-# Makefile at top of application tree
-
-TOP = .
-include $(TOP)/configure/CONFIG
-
-DIRS += configure
-
-DIRS += src
-src_DEPEND_DIRS = configure
-
-include $(TOP)/configure/RULES_TOP
-
-
diff --git a/test/configure/CONFIG b/test/configure/CONFIG
deleted file mode 100644
index c1a4703..0000000
--- a/test/configure/CONFIG
+++ /dev/null
@@ -1,29 +0,0 @@
-# CONFIG - Load build configuration data
-#
-# Do not make changes to this file!
-
-# Allow user to override where the build rules come from
-RULES = $(EPICS_BASE)
-
-# RELEASE files point to other application tops
-include $(TOP)/configure/RELEASE
--include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).Common
-ifdef T_A
--include $(TOP)/configure/RELEASE.Common.$(T_A)
--include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).$(T_A)
-endif
-
-CONFIG = $(RULES)/configure
-include $(CONFIG)/CONFIG
-
-# Override the Base definition:
-INSTALL_LOCATION = $(TOP)
-
-# CONFIG_SITE files contain other build configuration settings
-include $(TOP)/configure/CONFIG_SITE
--include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).Common
-ifdef T_A
- -include $(TOP)/configure/CONFIG_SITE.Common.$(T_A)
- -include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
-endif
-
diff --git a/test/configure/CONFIG_SITE b/test/configure/CONFIG_SITE
deleted file mode 100644
index 6648852..0000000
--- a/test/configure/CONFIG_SITE
+++ /dev/null
@@ -1,27 +0,0 @@
-# CONFIG_SITE
-
-# Make any application-specific changes to the EPICS build
-#   configuration variables in this file.
-#
-# Host/target specific settings can be specified in files named
-#   CONFIG_SITE.$(EPICS_HOST_ARCH).Common
-#   CONFIG_SITE.Common.$(T_A)
-#   CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
-
-# CHECK_RELEASE controls the consistency checking of the support
-#   applications pointed to by the RELEASE* files.
-# Normally CHECK_RELEASE should be set to YES.
-# Set CHECK_RELEASE to NO to disable checking completely.
-# Set CHECK_RELEASE to WARN to perform consistency checking but
-#   continue building anyway if conflicts are found.
-CHECK_RELEASE = WARN
-
-# To install files into a location other than $(TOP) define
-#   INSTALL_LOCATION here.
-#INSTALL_LOCATION=
-
-INSTALL_INCLUDE = $(INSTALL_LOCATION)/include/pv
-USR_INCLUDES += -I $(INSTALL_LOCATION)/include
-
--include $(TOP)/../../CONFIG_SITE.local
--include $(TOP)/../configure/CONFIG_SITE.local
diff --git a/test/configure/ExampleRELEASE.local b/test/configure/ExampleRELEASE.local
deleted file mode 100644
index c94e3be..0000000
--- a/test/configure/ExampleRELEASE.local
+++ /dev/null
@@ -1,7 +0,0 @@
-EPICS_BASE=/home/install/epics/base
-TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
-EPICSV4HOME=/home/hg
-PVCOMMON=${EPICSV4HOME}/pvCommonCPP
-PVDATA=${EPICSV4HOME}/pvDataCPP
-PVACCESS=${EPICSV4HOME}/pvAccessCPP
-EASYPVA==${EPICSV4HOME}/easyPVACPP
diff --git a/test/configure/Makefile b/test/configure/Makefile
deleted file mode 100644
index 9254309..0000000
--- a/test/configure/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-TOP=..
-
-include $(TOP)/configure/CONFIG
-
-TARGETS = $(CONFIG_TARGETS)
-CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS)))
-
-include $(TOP)/configure/RULES
diff --git a/test/configure/RELEASE b/test/configure/RELEASE
deleted file mode 100644
index 56e5b8b..0000000
--- a/test/configure/RELEASE
+++ /dev/null
@@ -1,41 +0,0 @@
-# pvDatabaseCPP/example RELEASE - Location of external support modules
-#
-# IF YOU CHANGE this file or any file it includes you must
-# subsequently do a "gnumake rebuild" in the application's
-# top level directory.
-#
-# The build process does not check dependencies against files
-# that are outside this application, thus you should also do a
-# "gnumake rebuild" in the top level directory after EPICS_BASE
-# or any other external module pointed to below is rebuilt.
-#
-# Host- or target-specific settings can be given in files named
-#  RELEASE.$(EPICS_HOST_ARCH).Common
-#  RELEASE.Common.$(T_A)
-#  RELEASE.$(EPICS_HOST_ARCH).$(T_A)
-
-# EPICS V4 Developers: Do not edit the locations in this file!
-#
-# Create a file RELEASE.local pointing to your PVASRV, PVACCESS,
-# PVDATA, PVCOMMON and EPICS_BASE build directories, e.g.
-#   PVASRV   = /path/to/epics/pvaSrvCPP
-#   PVACCESS = /path/to/epics/pvAccessCPP
-#   PVDATA   = /path/to/epics/pvDataCPP
-#   PVCOMMON = /path/to/epics/pvCommonCPP
-#   EPICS_BASE = /path/to/epics/base
-
-# If this example is built in a directory under pvDatabaseCPP,
-# use the following definitions:
-
-EASYPVA = $(TOP)/..
-
--include $(TOP)/../configure/RELEASE.local
--include $(TOP)/../../RELEASE.local
-
-# If you copied this example from pvDatabaseCPP to be built as a
-# standalone TOP, adjust and use the following definitions:
-
-#EASYPVA = /path/to/epics/easyPVACPP
-
-#-include $(TOP)/../RELEASE.local
-#-include $(TOP)/configure/RELEASE.local
diff --git a/test/configure/RULES b/test/configure/RULES
deleted file mode 100644
index 6d56e14..0000000
--- a/test/configure/RULES
+++ /dev/null
@@ -1,6 +0,0 @@
-# RULES
-
-include $(CONFIG)/RULES
-
-# Library should be rebuilt because LIBOBJS may have changed.
-$(LIBNAME): ../Makefile
diff --git a/test/configure/RULES.ioc b/test/configure/RULES.ioc
deleted file mode 100644
index 901987c..0000000
--- a/test/configure/RULES.ioc
+++ /dev/null
@@ -1,2 +0,0 @@
-#RULES.ioc
-include $(CONFIG)/RULES.ioc
diff --git a/test/configure/RULES_DIRS b/test/configure/RULES_DIRS
deleted file mode 100644
index 3ba269d..0000000
--- a/test/configure/RULES_DIRS
+++ /dev/null
@@ -1,2 +0,0 @@
-#RULES_DIRS
-include $(CONFIG)/RULES_DIRS
diff --git a/test/configure/RULES_TOP b/test/configure/RULES_TOP
deleted file mode 100644
index d09d668..0000000
--- a/test/configure/RULES_TOP
+++ /dev/null
@@ -1,3 +0,0 @@
-#RULES_TOP
-include $(CONFIG)/RULES_TOP
-
diff --git a/test/src/Makefile b/test/src/Makefile
deleted file mode 100644
index 48feea6..0000000
--- a/test/src/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# Makefile for the pvAccess tests
-
-TOP = ..
-include $(TOP)/configure/CONFIG
-
-TESTPROD_HOST += pvaClientTestPutData
-pvaClientTestPutData_SRCS = pvaClientTestPutData 
-testHarness_SRCS += pvaClientTestPutData.cpp 
-TESTS += pvaClientTestPutData
-
-TESTPROD_HOST += pvaClientTestGetData
-pvaClientTestGetData_SRCS = pvaClientTestGetData 
-testHarness_SRCS += pvaClientTestGetData.cpp 
-TESTS += pvaClientTestGetData
-
-TESTPROD_HOST += pvaClientTestMonitorData
-pvaClientTestMonitorData_SRCS = pvaClientTestMonitorData 
-testHarness_SRCS += pvaClientTestMonitorData.cpp 
-TESTS += pvaClientTestMonitorData
-
-TESTPROD_HOST += pvaClientTestPutGetMonitor
-pvaClientTestPutGetMonitor_SRCS = pvaClientTestPutGetMonitor 
-testHarness_SRCS += pvaClientTestPutGetMonitor.cpp 
-TESTS += pvaClientTestPutGetMonitor
-
-TESTPROD_HOST += pvaClientTestPutGet
-pvaClientTestPutGet_SRCS = pvaClientTestPutGet
-testHarness_SRCS += pvaClientTestPutGet.cpp 
-TESTS += pvaClientTestPutGet
-
-TESTPROD_HOST += pvaClientTestMultiDouble
-pvaClientTestMultiDouble_SRCS = pvaClientTestMultiDouble
-testHarness_SRCS += pvaClientTestMultiDouble.cpp 
-TESTS += pvaClientTestMultiDouble
-
-TESTPROD_HOST += pvaClientTestNTMultiChannel
-pvaClientTestNTMultiChannel_SRCS = pvaClientTestNTMultiChannel
-testHarness_SRCS += pvaClientTestNTMultiChannel.cpp 
-TESTS += pvaClientTestNTMultiChannel
-
-
-PROD_LIBS += pvaClient pvAccess pvData nt Com
-
-testHarness_SRCS += pvaClientAllTests.c
-
-PROD_vxWorks = vxTestHarness
-vxTestHarness_SRCS += $(testHarness_SRCS)
-TESTSPEC_vxWorks = vxTestHarness.$(MUNCH_SUFFIX); pvaClientAllTests
-
-PROD_RTEMS += rtemsTestHarness
-rtemsTestHarness_SRCS += rtemsTestHarness.c rtemsConfig.c
-rtemsTestHarness_SRCS += $(testHarness_SRCS)
-TESTSPEC_RTEMS = rtemsTestHarness.$(MUNCH_SUFFIX); pvaClientAllTests
-
-TESTSCRIPTS_HOST += $(TESTS:%=%.t)
-
-include $(TOP)/configure/RULES
diff --git a/test/src/pvaClientAllTests.c b/test/src/pvaClientAllTests.c
deleted file mode 100644
index 347da3f..0000000
--- a/test/src/pvaClientAllTests.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Run pvaClient tests as a batch.
- *
- * Do *not* include performance measurements here, they don't help to
- * prove functionality (which is the point of this convenience routine).
- */
-
-#include 
-#include 
-#include 
-
-int pvaClientTestGetData(void);
-int pvaClientTestPutData(void);
-int pvaClientTestMonitorData(void);
-int pvaClientTestPutGetMonitor(void);
-int pvaClientTestPutGet(void);
-int pvaClientTestMultiDouble(void);
-int pvaClientTestNTMultiChannel(void);
-
-void easyAllTests(void)
-{
-    testHarness();
-    runTest(pvaClientTestGetData);
-    runTest(pvaClientTestPutData);
-    runTest(pvaClientTestMonitorData);
-    runTest(pvaClientTestPutMonitor);
-    runTest(pvaClientTestPut);
-    runTest(pvaClientTestMultiDouble);
-    runTest(pvaClientTestNTMultiChannel);
-}
-
diff --git a/test/src/pvaClientTestGetData.cpp b/test/src/pvaClientTestGetData.cpp
deleted file mode 100644
index dab4403..0000000
--- a/test/src/pvaClientTestGetData.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*pvaClientTestGetData.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-static PvaClientPtr pvaClient = PvaClient::create();
-static FieldCreatePtr fieldCreate = getFieldCreate();
-static StandardFieldPtr standardField = getStandardField();
-static PVDataCreatePtr pvDataCreate = getPVDataCreate();
-
-
-void testDouble()
-{
-    cout << "\nstarting testDouble\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            add("value",pvDouble) ->
-            createStructure();
-
-    PvaClientGetDataPtr pvaData = PvaClientGetData::create(structure);
-    PVStructurePtr pvStructure = pvDataCreate->createPVStructure(pvaData->getStructure());
-    BitSetPtr bitSet = BitSetPtr(new BitSet(pvStructure->getNumberFields()));
-    pvaData->setData(pvStructure,bitSet);
-    PVDoublePtr pvDouble = pvStructure->getSubField("value");
-    size_t valueOffset = pvDouble->getFieldOffset();
-    BitSetPtr change = pvaData->getBitSet();
-    pvDouble->put(5.0);
-    change->set(pvDouble->getFieldOffset());
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==true,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==false,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getScalarValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getArrayValue();
-    } catch (std::runtime_error e) {
-        cout << "getArrayValue " << e.what() << endl;
-    }
-    try {
-        pvaData->getScalarArrayValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarArrayValue " << e.what() << endl;
-    }
-    cout << "as double " << pvaData->getDouble() << endl;
-    cout << "as string " << pvaData->getString() << endl;
-    try {
-        shared_vector value = pvaData->getDoubleArray();
-    } catch (std::runtime_error e) {
-        cout << " getDoubleArray " << e.what() << endl;
-    }
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-}
-
-void testDoubleArray()
-{
-    cout << "\nstarting testDoubleArray\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            addArray("value",pvDouble) ->
-            createStructure();
-
-    PvaClientGetDataPtr pvaData = PvaClientGetData::create(structure);
-    PVStructurePtr pvStructure = pvDataCreate->createPVStructure(pvaData->getStructure());
-    BitSetPtr bitSet = BitSetPtr(new BitSet(pvStructure->getNumberFields()));
-    pvaData->setData(pvStructure,bitSet);
-    PVDoubleArrayPtr pvalue = pvaData->getPVStructure()->getSubField("value");
-    BitSetPtr change = pvaData->getBitSet();
-    size_t valueOffset = pvalue->getFieldOffset();
-    size_t len = 5;
-    shared_vector value(len);
-    for(size_t i=0; ireplace(freeze(value));
-    change->set(valueOffset);
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==false,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==true,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getArrayValue()) result = true;
-    testOk(result==true,"getArrayValue");
-    result = false;
-    if(pvaData->getScalarArrayValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getScalarValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarValue " << e.what() << endl;
-    }
-    try {
-        cout << "as double " << pvaData->getDouble() << endl;
-    } catch (std::runtime_error e) {
-        cout << " getDouble " << e.what() << endl;
-    }
-    try {
-        string val = pvaData->getString();
-    } catch (std::runtime_error e) {
-        cout << " getString " << e.what() << endl;
-    }
-    cout << "as doubleArray " << pvaData->getDoubleArray() << endl;
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-}
-
-MAIN(pvaClientTestGetData)
-{
-    cout << "\nstarting pvaClientTestGetData\n";
-    testPlan(15);
-    testDouble();
-    testDoubleArray();
-    return 0;
-}
-
diff --git a/test/src/pvaClientTestMonitorData.cpp b/test/src/pvaClientTestMonitorData.cpp
deleted file mode 100644
index a299563..0000000
--- a/test/src/pvaClientTestMonitorData.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-/*pvaClientTestMonitorData.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-static PvaClientPtr pvaClient = PvaClient::create();
-static FieldCreatePtr fieldCreate = getFieldCreate();
-static StandardFieldPtr standardField = getStandardField();
-static PVDataCreatePtr pvDataCreate = getPVDataCreate();
-
-
-void testDouble()
-{
-    cout << "\nstarting testDouble\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            add("value",pvDouble) ->
-            createStructure();
-
-    PvaClientMonitorDataPtr pvaData = PvaClientMonitorData::create(structure);
-    MonitorElementPtr monitorElement(new MonitorElement(pvDataCreate->createPVStructure(pvaData->getStructure())));
-    pvaData->setData(monitorElement);
-    PVDoublePtr pvDouble = pvaData->getPVStructure()->getSubField("value");
-    size_t valueOffset = pvDouble->getFieldOffset();
-    BitSetPtr change = pvaData->getChangedBitSet();
-    pvDouble->put(5.0);
-    change->set(pvDouble->getFieldOffset());
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==true,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==false,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getScalarValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getArrayValue();
-    } catch (std::runtime_error e) {
-        cout << "getArrayValue " << e.what() << endl;
-    }
-    try {
-        pvaData->getScalarArrayValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarArrayValue " << e.what() << endl;
-    }
-    cout << "as double " << pvaData->getDouble() << endl;
-    cout << "as string " << pvaData->getString() << endl;
-    try {
-        shared_vector value = pvaData->getDoubleArray();
-    } catch (std::runtime_error e) {
-        cout << " getDoubleArray " << e.what() << endl;
-    }
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-}
-
-void testDoubleArray()
-{
-    cout << "\nstarting testDoubleArray\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            addArray("value",pvDouble) ->
-            createStructure();
-
-    PvaClientMonitorDataPtr pvaData = PvaClientMonitorData::create(structure);
-    MonitorElementPtr monitorElement(new MonitorElement(pvDataCreate->createPVStructure(pvaData->getStructure())));
-    pvaData->setData(monitorElement);
-    PVDoubleArrayPtr pvalue = pvaData->getPVStructure()->getSubField("value");
-    BitSetPtr change = pvaData->getChangedBitSet();
-    size_t valueOffset = pvalue->getFieldOffset();
-    size_t len = 5;
-    shared_vector value(len);
-    for(size_t i=0; ireplace(freeze(value));
-    change->set(valueOffset);
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==false,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==true,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getArrayValue()) result = true;
-    testOk(result==true,"getArrayValue");
-    result = false;
-    if(pvaData->getScalarArrayValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getScalarValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarValue " << e.what() << endl;
-    }
-    try {
-        cout << "as double " << pvaData->getDouble() << endl;
-    } catch (std::runtime_error e) {
-        cout << " getDouble " << e.what() << endl;
-    }
-    try {
-        string val = pvaData->getString();
-    } catch (std::runtime_error e) {
-        cout << " getString " << e.what() << endl;
-    }
-    cout << "as doubleArray " << pvaData->getDoubleArray() << endl;
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-}
-
-MAIN(pvaClientTestMonitorData)
-{
-    cout << "\nstarting pvaClientTestMonitorData\n";
-    testPlan(15);
-    testDouble();
-    testDoubleArray();
-    return 0;
-}
-
diff --git a/test/src/pvaClientTestMultiDouble.cpp b/test/src/pvaClientTestMultiDouble.cpp
deleted file mode 100644
index 6735500..0000000
--- a/test/src/pvaClientTestMultiDouble.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*pvaClientTestMultiDouble.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-
-static void testGood(PvaClientPtr const &pvaClient)
-{
-    bool isOk = true;
-    cout << "\nstarting testGood\n";
-    try {
-        PvaClientPtr pvaClient(PvaClient::create());
-        size_t num = 5;
-        shared_vector channelNames(num);
-        channelNames[0] = "exampleDouble01";
-        channelNames[1] = "exampleDouble02";
-        channelNames[2] = "exampleDouble03";
-        channelNames[3] = "exampleDouble04";
-        channelNames[4] = "exampleDouble05";
-        PVStringArrayPtr pvNames =
-            getPVDataCreate()->createPVScalarArray();
-        pvNames->replace(freeze(channelNames));
-        PvaClientMultiDoublePtr multiDouble(PvaClientMultiDouble::create(pvaClient,pvNames));
-        shared_vector data = multiDouble->get();
-        cout << "initial " << data << endl;
-        for(size_t i=0; iput(data);
-        data =  multiDouble->get();
-        cout << "final " << data << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-        isOk = false;
-    }
-    testOk(isOk==true,"all channels double");
-}
-
-static void testGoodMixed(PvaClientPtr const &pvaClient)
-{
-    bool isOk = true;
-    cout << "\nstarting testGoodMixed\n";
-    try {
-        PvaClientPtr pvaClient(PvaClient::create());
-        size_t num = 5;
-        shared_vector channelNames(num);
-        channelNames[0] = "exampleByte";
-        channelNames[1] = "exampleShort";
-        channelNames[2] = "exampleInt";
-        channelNames[3] = "exampleFloat";
-        channelNames[4] = "exampleDouble";
-        PVStringArrayPtr pvNames =
-            getPVDataCreate()->createPVScalarArray();
-        pvNames->replace(freeze(channelNames));
-        PvaClientMultiDoublePtr multiDouble(PvaClientMultiDouble::create(pvaClient,pvNames));
-        shared_vector data = multiDouble->get();
-        cout << "initial " << data << endl;
-        for(size_t i=0; iput(data);
-        data =  multiDouble->get();
-        cout << "final " << data << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-        isOk = false;
-    }
-    testOk(isOk==true,"channels mixed type");
-}
-
-static void testChannelNotExist(PvaClientPtr const &pvaClient)
-{
-    bool isOk = true;
-    cout << "\nstarting testChannelNotExist\n";
-    try {
-        PvaClientPtr pvaClient(PvaClient::create());
-        size_t num = 5;
-        shared_vector channelNames(num);
-        channelNames[0] = "exampleDouble01";
-        channelNames[1] = "exampleDouble02";
-        channelNames[2] = "exampleDouble03";
-        channelNames[3] = "NoneExistChannel";
-        channelNames[4] = "exampleDouble05";
-        PVStringArrayPtr pvNames =
-            getPVDataCreate()->createPVScalarArray();
-        pvNames->replace(freeze(channelNames));
-        PvaClientMultiDoublePtr multiDouble(PvaClientMultiDouble::create(pvaClient,pvNames));
-        shared_vector data = multiDouble->get();
-        cout << "initial " << data << endl;
-        for(size_t i=0; iput(data);
-        data =  multiDouble->get();
-        cout << "final " << data << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-        isOk = false;
-    }
-    testOk(isOk==false,"channel not exist");
-}
-
-static void testNonNumeric(PvaClientPtr const &pvaClient)
-{
-    bool isOk = true;
-    cout << "\nstarting testNonNumeric\n";
-    try {
-        PvaClientPtr pvaClient(PvaClient::create());
-        size_t num = 5;
-        shared_vector channelNames(num);
-        channelNames[0] = "exampleDouble01";
-        channelNames[1] = "exampleDouble02";
-        channelNames[2] = "exampleDouble03";
-        channelNames[3] = "exampleDouble04";
-        channelNames[4] = "exampleDouble05Array";
-        PVStringArrayPtr pvNames =
-            getPVDataCreate()->createPVScalarArray();
-        pvNames->replace(freeze(channelNames));
-        PvaClientMultiDoublePtr multiDouble(PvaClientMultiDouble::create(pvaClient,pvNames));
-        shared_vector data = multiDouble->get();
-        cout << "initial " << data << endl;
-        for(size_t i=0; iput(data);
-        data =  multiDouble->get();
-        cout << "final " << data << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-        isOk = false;
-    }
-    testOk(isOk==false,"channel not numeric");
-}
-
-MAIN(pvaClientTestMultiDouble)
-{
-    cout << "\nstarting pvaClientTestMultiDouble\n";
-    testPlan(4);
-    PvaClientPtr pvaClient = PvaClient::create();
-    testGood(pvaClient);
-    testGoodMixed(pvaClient);
-    testChannelNotExist(pvaClient);
-    testNonNumeric(pvaClient);
-    cout << "done\n";
-    return 0;
-}
diff --git a/test/src/pvaClientTestNTMultiChannel.cpp b/test/src/pvaClientTestNTMultiChannel.cpp
deleted file mode 100644
index 7b222ce..0000000
--- a/test/src/pvaClientTestNTMultiChannel.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*pvaClientTestNTMultiChannel.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-using namespace epics::nt;
-using std::tr1::static_pointer_cast;
-
-
-static void testGood(PvaClientPtr const &pvaClient)
-{
-    PVDataCreatePtr pvDataCreate(getPVDataCreate());
-    bool isOk = true;
-    cout << "\nstarting testGood\n";
-    try {
-        PvaClientPtr pvaClient(PvaClient::create());
-        size_t num = 5;
-        shared_vector channelNames(num);
-        channelNames[0] = "exampleDouble";
-        channelNames[1] = "exampleDoubleArray";
-        channelNames[2] = "exampleString";
-        channelNames[3] = "exampleBoolean";
-        channelNames[4] = "exampleEnum";
-        PVStringArrayPtr pvNames = pvDataCreate->
-            createPVScalarArray();
-        pvNames->replace(freeze(channelNames));
-        NTMultiChannelBuilderPtr builder = NTMultiChannel::createBuilder();
-        StructureConstPtr structure = builder->
-            addTimeStamp()->
-            addSeverity() ->
-            addStatus() ->
-            addMessage() ->
-            addSecondsPastEpoch() ->
-            addNanoseconds() ->
-            addUserTag() ->
-            createStructure();
-         PvaClientNTMultiChannelPtr multi = PvaClientNTMultiChannel::create(
-             pvaClient,pvNames,structure);
-         NTMultiChannelPtr nt = multi->get();
-         for(size_t numtimes=0; numtimes<3; ++numtimes) {
-             PVUnionArrayPtr pvValue = nt->getPVStructure()->
-                 getSubField("value");
-             cout << "initial\n" << nt->getPVStructure() << endl;
-             shared_vector valueVector = pvValue->reuse();
-             for(size_t i=0; iget();
-                 Type type = pvField->getField()->getType();
-                 if(type==scalar) {
-                     PVScalarPtr pvScalar = static_pointer_cast(pvField);
-                     ScalarType scalarType = pvScalar->getScalar()->getScalarType();
-                     if(ScalarTypeFunc::isNumeric(scalarType)) {
-                         double oldValue = pvScalar->getAs();
-                         oldValue++;
-                         pvScalar->putFrom(oldValue);
-                     } else if(scalarType==pvString) {
-                         PVStringPtr pv = static_pointer_cast(pvField);
-                         string val = pv->get();
-                         val += " added";
-                         pv->put(val);
-                     } else if(scalarType==pvBoolean) {
-                         PVBooleanPtr pv = static_pointer_cast(pvField);
-                         bool val = pv->get();
-                         pv->put(!val);
-                     }
-                 } else if(type==scalarArray) {
-                     PVScalarArrayPtr pv =
-                          static_pointer_cast(pvField);
-                     ScalarType scalarType = pv->getScalarArray()->getElementType();
-                     if(scalarType==pvDouble) {
-                           PVDoubleArrayPtr pvd = static_pointer_cast(pv);
-                           shared_vector valvec = pvd->reuse();
-                           if(valvec.capacity()==0) {
-                                valvec.resize(4);
-                                for(size_t i=0; ireplace(freeze(valvec));
-                      }
-                  } else if(type==epics::pvData::structure) {
-                      PVStructurePtr pvStructure = static_pointer_cast(pvField);
-                      PVIntPtr pv = pvStructure->getSubField("index");
-                      if(pv) {
-                          PVStringArrayPtr choices = pvStructure->getSubField("choices");
-                          if(choices) {
-                               int32 nchoices = choices->getLength();
-                               int32 oldval = pv->get();
-                               int32 newval = (oldval==nchoices) ? 0 : ++oldval;
-                               pv->put(newval);
-                          }
-                      }
-                 }
-             }
-             pvValue->replace(freeze(valueVector));
-             multi->put(nt);
-             nt = multi->get();
-         }
-         cout << "final\n" << nt->getPVStructure() << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-        isOk = false;
-    }
-    testOk(isOk==true,"no problems");
-}
-
-
-MAIN(pvaClientTestNTMultiChannel)
-{
-    cout << "\nstarting pvaClientTestNTMultiChannel\n";
-    testPlan(1);
-    PvaClientPtr pvaClient = PvaClient::create();
-    testGood(pvaClient);
-    cout << "done\n";
-    return 0;
-}
diff --git a/test/src/pvaClientTestPutData.cpp b/test/src/pvaClientTestPutData.cpp
deleted file mode 100644
index 72d20fc..0000000
--- a/test/src/pvaClientTestPutData.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*pvaClientTestPutData.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-static PvaClientPtr pvaClient = PvaClient::create();
-static FieldCreatePtr fieldCreate = getFieldCreate();
-static StandardFieldPtr standardField = getStandardField();
-static PVDataCreatePtr pvDataCreate = getPVDataCreate();
-
-static void testPostPut()
-{
-    cout << "\nstarting testPostPut\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            addNestedStructure("power") ->
-               add("value",pvDouble) ->
-               add("alarm",standardField->alarm()) ->
-               endNested()->
-            addNestedStructure("voltage") ->
-               add("value",pvDouble) ->
-               add("alarm",standardField->alarm()) ->
-               endNested()->
-            addNestedStructure("current") ->
-               add("value",pvDouble) ->
-               add("alarm",standardField->alarm()) ->
-               endNested()->
-            createStructure();
-
-    PvaClientPutDataPtr pvaData = PvaClientPutData::create(structure);
-    PVStructurePtr pvStructure = pvaData->getPVStructure();
-    BitSetPtr change = pvaData->getBitSet();
-    PVDoublePtr powerValue = pvStructure->getSubField("power.value");
-    PVDoublePtr voltageValue = pvStructure->getSubField("voltage.value");
-    PVDoublePtr currentValue = pvStructure->getSubField("current.value");
-    size_t powerOffset = powerValue->getFieldOffset();
-    size_t voltageOffset = voltageValue->getFieldOffset();
-    size_t currentOffset = currentValue->getFieldOffset();
-    change->clear();
-    powerValue->put(1.0);
-    voltageValue->put(2.0);
-    currentValue->put(.5);
-    cout << "changed\n";
-    cout  << pvaData->showChanged(cout) << endl;
-    testOk(change->cardinality()==3,"num set bits 3");
-    testOk(change->get(powerOffset)==true,"power changed");
-    testOk(change->get(voltageOffset)==true,"voltage changed");
-    testOk(change->get(currentOffset)==true,"current changed");
-}
-
-void testDouble()
-{
-    cout << "\nstarting testDouble\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            add("value",pvDouble) ->
-            createStructure();
-
-    PvaClientPutDataPtr pvaData = PvaClientPutData::create(structure);
-    PVDoublePtr pvDouble = pvaData->getPVStructure()->getSubField("value");
-    pvDouble->put(5.0);
-    BitSetPtr change = pvaData->getBitSet();
-    size_t valueOffset = pvDouble->getFieldOffset();
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==true,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==false,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getScalarValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getArrayValue();
-    } catch (std::runtime_error e) {
-        cout << "getArrayValue " << e.what() << endl;
-    }
-    try {
-        pvaData->getScalarArrayValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarArrayValue " << e.what() << endl;
-    }
-    cout << "as double " << pvaData->getDouble() << endl;
-    cout << "as string " << pvaData->getString() << endl;
-    try {
-        shared_vector value = pvaData->getDoubleArray();
-    } catch (std::runtime_error e) {
-        cout << " getDoubleArray " << e.what() << endl;
-    }
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-    pvaData->putDouble(5.0);
-    pvaData->putString("1e5");
-    try {
-        size_t len = 2;
-        shared_vector val(len);
-        for(size_t i=0; iputDoubleArray(freeze(val));
-    } catch (std::runtime_error e) {
-        cout << " putDoubleArray " << e.what() << endl;
-    }
-    try {
-        size_t len = 2;
-        shared_vector val(len);
-        val[0] = "one"; val[1] = "two";
-        pvaData->putStringArray(freeze(val));
-    } catch (std::runtime_error e) {
-        cout << " putStringArray " << e.what() << endl;
-    }
-}
-
-void testDoubleArray()
-{
-    cout << "\nstarting testDoubleArray\n";
-    StructureConstPtr structure =
-       fieldCreate->createFieldBuilder()->
-            add("alarm",standardField->alarm()) ->
-            add("timeStamp",standardField->timeStamp()) ->
-            addArray("value",pvDouble) ->
-            createStructure();
-
-    PvaClientPutDataPtr pvaData = PvaClientPutData::create(structure);
-    PVDoubleArrayPtr pvalue = pvaData->getPVStructure()->getSubField("value");
-    size_t len = 5;
-    shared_vector value(len);
-    for(size_t i=0; ireplace(freeze(value));
-    BitSetPtr change = pvaData->getBitSet();
-    size_t valueOffset = pvalue->getFieldOffset();
-    testOk(change->cardinality()==1,"num set bits 1");
-    testOk(change->get(valueOffset)==true,"value changed");
-    testOk(pvaData->hasValue()==true,"hasValue");
-    testOk(pvaData->isValueScalar()==false,"isValueScalar");
-    testOk(pvaData->isValueScalarArray()==true,"isValueScalarArray");
-    bool result;
-    result = false;
-    if(pvaData->getValue()) result = true;
-    testOk(result==true,"getValue");
-    result = false;
-    if(pvaData->getArrayValue()) result = true;
-    testOk(result==true,"getArrayValue");
-    result = false;
-    if(pvaData->getScalarArrayValue()) result = true;
-    testOk(result==true,"getScalarValue");
-    try {
-        pvaData->getScalarValue();
-    } catch (std::runtime_error e) {
-        cout << " getScalarValue " << e.what() << endl;
-    }
-    try {
-        cout << "as double " << pvaData->getDouble() << endl;
-    } catch (std::runtime_error e) {
-        cout << " getDouble " << e.what() << endl;
-    }
-    try {
-        string val = pvaData->getString();
-    } catch (std::runtime_error e) {
-        cout << " getString " << e.what() << endl;
-    }
-    cout << "as doubleArray " << pvaData->getDoubleArray() << endl;
-    try {
-        shared_vector value = pvaData->getStringArray();
-    } catch (std::runtime_error e) {
-        cout << " getStringArray " << e.what() << endl;
-    }
-    try {
-        pvaData->putDouble(5.0);
-    } catch (std::runtime_error e) {
-        cout << " putDouble " << e.what() << endl;
-    }
-    try {
-        pvaData->putString("1e5");
-    } catch (std::runtime_error e) {
-        cout << " putString " << e.what() << endl;
-    }
-    value = shared_vector(len);
-    for(size_t i=0; iputDoubleArray(freeze(value));
-    cout << "as doubleArray " << pvaData->getDoubleArray() << endl;
-    try {
-        size_t len = 2;
-        shared_vector val(len);
-        val[0] = "one"; val[1] = "two";
-        pvaData->putStringArray(freeze(val));
-        cout << "as stringArray " << val << endl;
-    } catch (std::runtime_error e) {
-        cout << " putStringArray " << e.what() << endl;
-    }
-}
-
-MAIN(pvaClientTestPutData)
-{
-    cout << "\nstarting pvaClientTestPutData\n";
-    testPlan(19);
-    testPostPut();
-    testDouble();
-    testDoubleArray();
-    return 0;
-}
diff --git a/test/src/pvaClientTestPutGet.cpp b/test/src/pvaClientTestPutGet.cpp
deleted file mode 100644
index eb08007..0000000
--- a/test/src/pvaClientTestPutGet.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*pvaClientTestPutGet.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-
-static void example(PvaClientPtr const &pvaClient)
-{
-    cout << "\nstarting channelPutGet example\n";
-    try {
-cout << "calling createChannel\n";
-        PvaClientChannelPtr pvaChannel = pvaClient->createChannel("examplePowerSupply");
-cout << "calling connect\n";
-        pvaChannel->connect(2.0);
-        testOk(true==true,"connected");
-cout << "calling createPutGet\n";
-        PvaClientPutGetPtr putGet = pvaChannel->createPutGet(
-            "putField(power.value,voltage.value)getField()");
-cout << "calling getPutData\n";
-        PvaClientPutDataPtr putData = putGet->getPutData();
-        testOk(true==true,"put connected");
-        PVStructurePtr pvStructure = putData->getPVStructure();
-        PVDoublePtr power = pvStructure->getSubField("power.value");
-        PVDoublePtr voltage = pvStructure->getSubField("voltage.value");
-        power->put(5.0);
-        voltage->put(5.0);
-        putGet->putGet();
-        PvaClientGetDataPtr getData = putGet->getGetData();
-        pvStructure = getData->getPVStructure();
-        BitSetPtr bitSet = getData->getBitSet();
-        cout << "changed " << getData->showChanged(cout) << endl;
-        cout << "bitSet " << *bitSet << endl;
-        power->put(6.0);
-        putGet->putGet();
-        pvStructure = getData->getPVStructure();
-        bitSet = getData->getBitSet();
-        cout << "changed " << getData->showChanged(cout) << endl;
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-    }
-}
-
-
-MAIN(pvaClientTestPutGet)
-{
-    cout << "\nstarting pvaClientTestPutGet\n";
-    testPlan(2);
-    PvaClientPtr pvaClient = PvaClient::create();
-    example(pvaClient);
-    cout << "done\n";
-    return 0;
-}
diff --git a/test/src/pvaClientTestPutGetMonitor.cpp b/test/src/pvaClientTestPutGetMonitor.cpp
deleted file mode 100644
index 88386c6..0000000
--- a/test/src/pvaClientTestPutGetMonitor.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-/*pvaClientTestPutGetMonitor.cpp */
-/**
- * Copyright - See the COPYRIGHT that is included with this distribution.
- * EPICS pvData is distributed subject to a Software License Agreement found
- * in file LICENSE that is included with this distribution.
- */
-/**
- * @author mrk
- */
-
-/* Author: Marty Kraimer */
-
-#include 
-
-#include 
-#include 
-#include 
-
-using namespace std;
-using namespace epics::pvData;
-using namespace epics::pvAccess;
-using namespace epics::pvaClient;
-
-
-class MyMonitor : public PvaClientMonitorRequester
-{
-public:
-     MyMonitor() {}
-     virtual ~MyMonitor() {}
-     virtual void event(PvaClientMonitorPtr monitor)
-     {
-         while(true) {
-            if(!monitor->poll()) return;
-            PvaClientMonitorDataPtr pvaData = monitor->getData();
-            cout << "changed\n";
-            pvaData->showChanged(cout);
-            cout << "overrun\n";
-            pvaData->showOverrun(cout);
-            monitor->releaseEvent();
-            
-         }
-     }
-};
-
-static void exampleDouble(PvaClientPtr const &pvaClient)
-{
-    cout << "\nstarting exampleDouble\n";
-    try {
-        cout << "long way\n";
-        PvaClientChannelPtr pvaChannel = pvaClient->createChannel("exampleDouble");
-        pvaChannel->connect(2.0);
-        testOk(true==true,"connected");
-        PvaClientPutPtr put = pvaChannel->createPut();
-        PvaClientPutDataPtr putData = put->getData();
-        testOk(true==true,"put connected");
-        PvaClientGetPtr get = pvaChannel->createGet();
-        PvaClientGetDataPtr getData = get->getData();
-        testOk(true==true,"get connected");
-        PvaClientMonitorRequesterPtr requester(new MyMonitor());
-        PvaClientMonitorPtr monitor = pvaChannel->monitor(requester);
-        testOk(true==true,"monitor connected");
-        double out;
-        double in;
-        for(size_t i=0 ; i< 5; ++i) {
-             out = i;
-             putData->putDouble(out);
-             put->put();
-             get->get();
-             in = getData->getDouble();
-             cout << "out " << out << " in " << in << endl;
-        }
-        PvaClientProcessPtr process = pvaChannel->createProcess();
-        process->connect();
-        process->process();
-    } catch (std::runtime_error e) {
-        cout << "exception " << e.what() << endl;
-    }
-}
-
-
-MAIN(pvaClientTestPutGetMonitor)
-{
-    cout << "\nstarting pvaClientTestPutGetMonitor\n";
-    testPlan(4);
-    PvaClientPtr pvaClient = PvaClient::create();
-    exampleDouble(pvaClient);
-    cout << "done\n";
-    return 0;
-}