From d9595aa612654c031c7a75f4992ec9259349ddeb Mon Sep 17 00:00:00 2001
From: wierenga <sdos@astron.nl>
Date: Fri, 12 May 2006 12:29:40 +0000
Subject: [PATCH] BugID: 646 Introducing new AllRegisterState register to keep
 track of the update status of all hardware registers.

---
 MAC/APL/PIC/RSPDriver/src/BSWrite.cc          |   4 +-
 MAC/APL/PIC/RSPDriver/src/BWWrite.cc          |  14 +-
 MAC/APL/PIC/RSPDriver/src/BstRead.cc          |   6 +-
 MAC/APL/PIC/RSPDriver/src/CDOWrite.cc         |   9 +-
 MAC/APL/PIC/RSPDriver/src/Cache.cc            |  76 +------
 MAC/APL/PIC/RSPDriver/src/Cache.h             |  30 +--
 MAC/APL/PIC/RSPDriver/src/RCUProtocolWrite.cc |   4 +-
 MAC/APL/PIC/RSPDriver/src/RCUResultRead.cc    |   4 +-
 MAC/APL/PIC/RSPDriver/src/RCUWrite.cc         |   8 +-
 MAC/APL/PIC/RSPDriver/src/RSUWrite.cc         |   5 +-
 MAC/APL/PIC/RSPDriver/src/SSRead.cc           |   6 +-
 MAC/APL/PIC/RSPDriver/src/SSWrite.cc          |   6 +-
 MAC/APL/PIC/RSPDriver/src/SetClocksCmd.cc     |   4 +-
 MAC/APL/PIC/RSPDriver/src/SetRCUCmd.cc        |   6 +-
 MAC/APL/PIC/RSPDriver/src/SetRSUCmd.cc        |   2 +-
 MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc         |   4 +-
 MAC/APL/PIC/RSPDriver/src/SetWeightsCmd.cc    |   4 +-
 MAC/APL/PIC/RSPDriver/src/SstRead.cc          |   8 +-
 MAC/APL/PIC/RSPDriver/src/StatusRead.cc       |   6 +-
 MAC/APL/PIC/RSPDriver/src/TDSProtocolWrite.cc |   4 +-
 MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc    |   8 +-
 MAC/APL/PIC/RSPDriver/src/UpdClocksCmd.cc     |   2 +-
 MAC/APL/PIC/RSPDriver/src/VersionsRead.cc     |   2 +-
 MAC/APL/PIC/RSPDriver/src/WGWrite.cc          |   4 +-
 MAC/APL/PIC/RSPDriver/src/XstRead.cc          |   8 +-
 MAC/APL/PIC/RSPDriver/test/EPAStub.cc         |  70 +------
 .../APL/RSP_Protocol/AllRegisterState.h       | 194 ++++++++++++++++++
 .../include/APL/RSP_Protocol/MEPHeader.h      |   2 +-
 .../include/APL/RSP_Protocol/Makefile.am      |   1 +
 .../PIC/RSP_Protocol/src/AllRegisterState.cc  |  94 +++++++++
 MAC/APL/PIC/RSP_Protocol/src/Makefile.am      |   1 +
 .../PIC/RSP_Protocol/src/RSP_Protocol.prot    | 112 ++++++++++
 .../include/APL/RTCCommon/Marshalling.h       |   8 +-
 .../include/APL/RTCCommon/RegisterState.h     |  47 ++++-
 34 files changed, 529 insertions(+), 234 deletions(-)
 create mode 100644 MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h
 create mode 100644 MAC/APL/PIC/RSP_Protocol/src/AllRegisterState.cc

diff --git a/MAC/APL/PIC/RSPDriver/src/BSWrite.cc b/MAC/APL/PIC/RSPDriver/src/BSWrite.cc
index bd390456492..cafd856f287 100644
--- a/MAC/APL/PIC/RSPDriver/src/BSWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BSWrite.cc
@@ -49,7 +49,7 @@ BSWrite::~BSWrite()
 void BSWrite::sendrequest()
 {
   // skip update if the neither of the RCU's settings have been modified
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getBSState().get((getBoardId() * StationSettings::instance()->nrBlps()) + m_blp))
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().bs().get((getBoardId() * StationSettings::instance()->nrBlps()) + m_blp))
   {
     setContinue(true);
     return;
@@ -91,7 +91,7 @@ GCFEvent::TResult BSWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   }
 
   // change state to indicate that it has been applied in the hardware
-  Cache::getInstance().getBSState().confirmed((getBoardId() * StationSettings::instance()->nrBlps()) + m_blp);
+  Cache::getInstance().getState().bs().confirmed((getBoardId() * StationSettings::instance()->nrBlps()) + m_blp);
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
index f58790e6e77..6d8ef93b5e5 100644
--- a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
@@ -208,18 +208,22 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getBFState().modified(global_blp * MEPHeader::N_PHASEPOL + m_regid);
+    Cache::getInstance().getState().bf().modified(global_blp * MEPHeader::N_PHASEPOL + m_regid);
 
     LOG_ERROR("BWWrite::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
 
   } else {
 
-    // only mark confirmed when the last fragment has been received OK
-    if ((BF_N_FRAGMENTS - 1) == getCurrentIndex()) {
-      Cache::getInstance().getBFState().confirmed(global_blp * MEPHeader::N_PHASEPOL + m_regid);
+    //
+    // This code assumed that BF_N_FRAGMENTS == 2
+    // First fragment transitions state to applied.
+    // Second (and last) fragment transitions state to confirmed.
+    //
+    if (0 == getCurrentIndex() % BF_N_FRAGMENTS) {
+      Cache::getInstance().getState().bf().applied(global_blp * MEPHeader::N_PHASEPOL + m_regid);
     } else {
-      Cache::getInstance().getBFState().applied(global_blp * MEPHeader::N_PHASEPOL + m_regid);
+      Cache::getInstance().getState().bf().confirmed(global_blp * MEPHeader::N_PHASEPOL + m_regid);
     }
 
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/BstRead.cc b/MAC/APL/PIC/RSPDriver/src/BstRead.cc
index 9d60a75d504..0044e9920b0 100644
--- a/MAC/APL/PIC/RSPDriver/src/BstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BstRead.cc
@@ -51,7 +51,7 @@ void BstRead::sendrequest()
 {
   EPAReadEvent bstread;
 
-  Cache::getInstance().getBstState().modified(getBoardId());
+  Cache::getInstance().getState().bst().modified(getBoardId());
 
   bstread.hdr.set(MEPHeader::BST_POWER_HDR, MEPHeader::DST_RSP,
 		  MEPHeader::READ, MEPHeader::BST_POWER_SIZE);
@@ -100,7 +100,7 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getBstState().applied(getBoardId());
+    Cache::getInstance().getState().bst().applied(getBoardId());
     LOG_ERROR("BstRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
@@ -133,7 +133,7 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   cache(getBoardId() * 2 + 1, fragment_range) =
     convert_uint32_to_double(stats(Range::all(), 1));
   
-  Cache::getInstance().getBstState().confirmed(getBoardId());
+  Cache::getInstance().getState().bst().confirmed(getBoardId());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
index fd4ff668d04..8e92e341371 100644
--- a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
@@ -137,7 +137,7 @@ uint16 CDOWrite::compute_ip_checksum(void* addr, int count)
 void CDOWrite::sendrequest()
 {
   // skip update if the CDO settings have not been modified
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getCDOState().get(getBoardId()))
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().cdo().get(getBoardId()))
   {
     setContinue(true);
     return;
@@ -198,8 +198,11 @@ GCFEvent::TResult CDOWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*
     return GCFEvent::NOT_HANDLED;
   }
 
-  if ((N_CDO_REGISTERS-1) == getCurrentIndex()) {
-    Cache::getInstance().getCDOState().confirmed(getBoardId());
+  if (0 == getCurrentIndex()) {
+    Cache::getInstance().getState().cdo().applied(getBoardId());
+  }
+  if (1 == getCurrentIndex()) {
+    Cache::getInstance().getState().cdo().confirmed(getBoardId());
   }
   
   return GCFEvent::HANDLED;
diff --git a/MAC/APL/PIC/RSPDriver/src/Cache.cc b/MAC/APL/PIC/RSPDriver/src/Cache.cc
index 922c77a8bba..97ab5d2ac03 100644
--- a/MAC/APL/PIC/RSPDriver/src/Cache.cc
+++ b/MAC/APL/PIC/RSPDriver/src/Cache.cc
@@ -258,47 +258,9 @@ Cache::Cache() : m_front(0), m_back(0)
   m_front = new CacheBuffer(this); ASSERT(m_front);
   m_back = new CacheBuffer(this);  ASSERT(m_back);
 
-  //
-  // Make sure initial settings are sent
-  //
-  getSysState().resize(StationSettings::instance()->nrRspBoards());
-  getSysState().modified();
-
-  getBFState().resize(StationSettings::instance()->nrRcus() * MEPHeader::N_PHASE); // XR, XI, YR, YI
-  getBFState().modified();
-
-  getSSState().resize(StationSettings::instance()->nrBlps());
-  getSSState().modified();
-
-  getRCUSettingsState().resize(StationSettings::instance()->nrRcus());
-  getRCUSettingsState().modified();
-
-  getRCUProtocolState().resize(StationSettings::instance()->nrRcus());
-  getRCUProtocolState().modified();
-
-  getRSUClearState().resize(StationSettings::instance()->nrRspBoards());
-  getRSUClearState().modified();
-
-  getDIAGWGSettingsState().resize(StationSettings::instance()->nrRcus());
-  getDIAGWGSettingsState().modified();
-
-  getSstState().resize(StationSettings::instance()->nrBlps());
-  getSstState().modified();
-
-  getBstState().resize(StationSettings::instance()->nrRspBoards());
-  getBstState().modified();
-
-  getXstState().resize(StationSettings::instance()->nrRspBoards());
-  getXstState().modified();
-
-  getCDOState().resize(StationSettings::instance()->nrRspBoards());
-  getCDOState().modified();
-
-  getBSState().resize(StationSettings::instance()->nrBlps());
-  getBSState().modified();
-
-  getTDSState().resize(StationSettings::instance()->nrRspBoards());
-  getTDSState().modified();
+  getState().init(StationSettings::instance()->nrRspBoards(),
+		  StationSettings::instance()->nrBlps(),
+		  StationSettings::instance()->nrRcus());
 }
 
 Cache::~Cache()
@@ -310,35 +272,9 @@ Cache::~Cache()
 void Cache::swapBuffers()
 {
   // clear modified flags on back buffer
-  getSysState().clear();
-  getBFState().clear();
-  getSSState().clear();
-  getRCUSettingsState().clear();
-  getRCUProtocolState().clear();
-  getRSUClearState().clear();
-  getDIAGWGSettingsState().clear();
-  getSstState().clear();
-  getBstState().clear();
-  getXstState().clear();
-  getCDOState().clear();
-  getBSState().clear();
-  getTDSState().clear();
-
-#if 1
-  cout << "System Status     "; getSysState().print(cout);
-  cout << "BF                "; getBFState().print(cout);
-  cout << "Subband Selection "; getSSState().print(cout);
-  cout << "RCUSettings       "; getRCUSettingsState().print(cout);
-  cout << "RCUProtocol       "; getRCUProtocolState().print(cout);
-  cout << "RSUClear          "; getRSUClearState().print(cout);
-  cout << "DIAGWGSettings    "; getDIAGWGSettingsState().print(cout);
-  cout << "SubbandStats      "; getSstState().print(cout);
-  cout << "BeamletStats      "; getBstState().print(cout);
-  cout << "XCorrelationStats "; getXstState().print(cout);
-  cout << "CDO               "; getCDOState().print(cout);
-  cout << "BS                "; getBSState().print(cout);
-  cout << "TDS               "; getTDSState().print(cout);
-#endif
+  getState().clear();
+
+  getState().print(cout);
 
   CacheBuffer *tmp = m_front;
   m_front = m_back;
diff --git a/MAC/APL/PIC/RSPDriver/src/Cache.h b/MAC/APL/PIC/RSPDriver/src/Cache.h
index 1aadacaf915..6af88ec9e89 100644
--- a/MAC/APL/PIC/RSPDriver/src/Cache.h
+++ b/MAC/APL/PIC/RSPDriver/src/Cache.h
@@ -25,7 +25,7 @@
 #ifndef CACHE_H_
 #define CACHE_H_
 
-#include <APL/RTCCommon/RegisterState.h>
+#include <APL/RSP_Protocol/AllRegisterState.h>
 #include <APL/RSP_Protocol/RSP_Protocol.ph>
 #include <blitz/array.h>
 #include <Common/LofarTypes.h>
@@ -122,19 +122,7 @@ namespace LOFAR {
       /**
        * Get register states.
        */
-      RTC::RegisterState& getSysState()              { return sys_state; }
-      RTC::RegisterState& getBFState()               { return bf_state; }
-      RTC::RegisterState& getSSState()               { return ss_state; }
-      RTC::RegisterState& getRCUSettingsState()      { return rcusettings_state; }
-      RTC::RegisterState& getRCUProtocolState()      { return rcuprotocol_state; }
-      RTC::RegisterState& getRSUClearState()         { return rsuclear_state; }
-      RTC::RegisterState& getDIAGWGSettingsState()   { return diagwgsettings_state; }
-      RTC::RegisterState& getSstState()              { return sst_state; }
-      RTC::RegisterState& getBstState()              { return bst_state; }
-      RTC::RegisterState& getXstState()              { return xst_state; }
-      RTC::RegisterState& getCDOState()              { return cdo_state; }
-      RTC::RegisterState& getBSState()               { return bs_state; }
-      RTC::RegisterState& getTDSState()              { return tds_state; }
+      AllRegisterState& getState() { return m_allstate; }
 
     private:
 
@@ -146,19 +134,7 @@ namespace LOFAR {
       /**
        * Keep register update state.
        */
-      RTC::RegisterState sys_state;            // RSR state
-      RTC::RegisterState bf_state;             // BF weights state
-      RTC::RegisterState ss_state;             // SS state
-      RTC::RegisterState rcusettings_state;    // RCU settings state
-      RTC::RegisterState rcuprotocol_state;    // RCU protocol state
-      RTC::RegisterState rsuclear_state;       // RSU clear state
-      RTC::RegisterState diagwgsettings_state; // DIAG WG settings state
-      RTC::RegisterState sst_state;            // SST state
-      RTC::RegisterState bst_state;            // BST state
-      RTC::RegisterState xst_state;            // XST State
-      RTC::RegisterState cdo_state;            // CDO state
-      RTC::RegisterState bs_state;             // BS register state
-      RTC::RegisterState tds_state;            // TDS register state (Clock board)
+      AllRegisterState m_allstate; // communication status of all register
 
       /*@{*/
       /**
diff --git a/MAC/APL/PIC/RSPDriver/src/RCUProtocolWrite.cc b/MAC/APL/PIC/RSPDriver/src/RCUProtocolWrite.cc
index 77adbc03cc2..3f1ac6270d8 100644
--- a/MAC/APL/PIC/RSPDriver/src/RCUProtocolWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RCUProtocolWrite.cc
@@ -81,7 +81,7 @@ void RCUProtocolWrite::sendrequest()
   uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard() * MEPHeader::N_POL) + (getCurrentIndex() / N_WRITES);
 
   // skip update if the RCU settings have not been modified
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getRCUProtocolState().get(global_rcu)) {
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().rcuprotocol().get(global_rcu)) {
     setContinue(true);
     return;
   }
@@ -163,7 +163,7 @@ GCFEvent::TResult RCUProtocolWrite::handleack(GCFEvent& event, GCFPortInterface&
     // Mark modification as applied when write of RCU result register has completed
 
     uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrRcusPerBoard()) + (getCurrentIndex() / N_WRITES);
-    Cache::getInstance().getRCUProtocolState().applied(global_rcu);
+    Cache::getInstance().getState().rcuprotocol().applied(global_rcu);
 
   }
   
diff --git a/MAC/APL/PIC/RSPDriver/src/RCUResultRead.cc b/MAC/APL/PIC/RSPDriver/src/RCUResultRead.cc
index 18ab9454894..2da3d21ab7e 100644
--- a/MAC/APL/PIC/RSPDriver/src/RCUResultRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RCUResultRead.cc
@@ -56,7 +56,7 @@ void RCUResultRead::sendrequest()
   uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard() * MEPHeader::N_POL) + getCurrentIndex();
 
   // skip update if the RCU settings have not been applied yet
-  if (RTC::RegisterState::APPLIED != Cache::getInstance().getRCUProtocolState().get(global_rcu))
+  if (RTC::RegisterState::APPLIED != Cache::getInstance().getState().rcuprotocol().get(global_rcu))
   {
     setContinue(true);
     return;
@@ -106,7 +106,7 @@ GCFEvent::TResult RCUResultRead::handleack(GCFEvent& event, GCFPortInterface& /*
   memcpy(RCUProtocolWrite::i2c_result + 1, &control, 3);
 
   if (0 == memcmp(RCUProtocolWrite::i2c_result, ack.result, sizeof(RCUProtocolWrite::i2c_result))) {
-    Cache::getInstance().getRCUProtocolState().confirmed(global_rcu);
+    Cache::getInstance().getState().rcuprotocol().confirmed(global_rcu);
   } else {
     LOG_ERROR("RCUResultRead::handleack: unexpected I2C result response");
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/RCUWrite.cc b/MAC/APL/PIC/RSPDriver/src/RCUWrite.cc
index 887dacf6902..f190ba21d03 100644
--- a/MAC/APL/PIC/RSPDriver/src/RCUWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RCUWrite.cc
@@ -51,8 +51,8 @@ void RCUWrite::sendrequest()
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + getCurrentIndex();
 
   // skip update if the neither of the RCU's settings have been modified
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getRCUSettingsState().get(global_blp * 2)
-      && RTC::RegisterState::MODIFIED != Cache::getInstance().getRCUSettingsState().get(global_blp * 2 + 1)) {
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().rcusettings().get(global_blp * 2)
+      && RTC::RegisterState::MODIFIED != Cache::getInstance().getState().rcusettings().get(global_blp * 2 + 1)) {
     setContinue(true);
     return;
   }
@@ -97,8 +97,8 @@ GCFEvent::TResult RCUWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*
 
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + getCurrentIndex();
 
-  Cache::getInstance().getRCUSettingsState().confirmed(global_blp * 2);
-  Cache::getInstance().getRCUSettingsState().confirmed(global_blp * 2 + 1);
+  Cache::getInstance().getState().rcusettings().confirmed(global_blp * 2);
+  Cache::getInstance().getState().rcusettings().confirmed(global_blp * 2 + 1);
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc b/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc
index 726f7337abf..d4f7bf63f9d 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc
@@ -62,7 +62,7 @@ void RSUWrite::sendrequest()
   reset.hdr.set(MEPHeader::RSU_RESET_HDR);
 
   // cache modified?
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getRSUClearState().get(getBoardId())) {
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().rsuclear().get(getBoardId())) {
     setContinue(true);
     return;
   }
@@ -73,7 +73,6 @@ void RSUWrite::sendrequest()
   else if (s()(getBoardId()).getClear())	reset.reset = g_RSU_RESET_CLEAR;
   else if (s()(getBoardId()).getReset())	reset.reset = g_RSU_RESET_RESET;
   else {
-    Cache::getInstance().getRSUClearState().confirmed(getBoardId());
     setContinue(true);
     return;
   }
@@ -103,7 +102,7 @@ GCFEvent::TResult RSUWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*
     return GCFEvent::NOT_HANDLED;
   }
 
-  Cache::getInstance().getRSUClearState().confirmed(getBoardId());
+  Cache::getInstance().getState().rsuclear().confirmed(getBoardId());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/SSRead.cc b/MAC/APL/PIC/RSPDriver/src/SSRead.cc
index 4fd90997641..9fcb60b969f 100644
--- a/MAC/APL/PIC/RSPDriver/src/SSRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SSRead.cc
@@ -50,7 +50,7 @@ SSRead::~SSRead()
 void SSRead::sendrequest()
 {
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + getCurrentIndex();
-  Cache::getInstance().getSSState().modified(global_blp);
+  Cache::getInstance().getState().ss().modified(global_blp);
 
   EPAReadEvent ssread;
   ssread.hdr.set(MEPHeader::SS_SELECT_HDR, 1 << getCurrentIndex(),
@@ -79,7 +79,7 @@ GCFEvent::TResult SSRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/)
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + getCurrentIndex();
   if (!ss.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getSSState().applied(global_blp);
+    Cache::getInstance().getState().ss().applied(global_blp);
     LOG_ERROR("SSRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
@@ -115,7 +115,7 @@ GCFEvent::TResult SSRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/)
       = subbands(Range::all(), 1); // y
   }
 
-  Cache::getInstance().getSSState().confirmed(global_blp);
+  Cache::getInstance().getState().ss().confirmed(global_blp);
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/SSWrite.cc b/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
index df687651e3c..7ecdf28fbbf 100644
--- a/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
@@ -58,7 +58,7 @@ void SSWrite::sendrequest()
 			 global_blp));
 
   // mark modified
-  Cache::getInstance().getSSState().modified(global_blp);
+  Cache::getInstance().getState().ss().modified(global_blp);
     
   // send subband select message
   EPASsSelectEvent ss;
@@ -96,13 +96,13 @@ GCFEvent::TResult SSWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getSSState().applied(global_blp);
+    Cache::getInstance().getState().ss().applied(global_blp);
 
     LOG_ERROR("SSWrite::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
 
-  Cache::getInstance().getSSState().confirmed(global_blp);
+  Cache::getInstance().getState().ss().confirmed(global_blp);
   
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/SetClocksCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetClocksCmd.cc
index e5039100dc5..e77ae13a5ca 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetClocksCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetClocksCmd.cc
@@ -64,9 +64,9 @@ void SetClocksCmd::apply(CacheBuffer& cache, bool setModFlag)
 {
   cache.getClock() = m_event->clock;
   if (setModFlag) {
-    cache.getCache().getBSState().modified();
+    cache.getCache().getState().bs().modified();
   }
-  cache.getCache().getTDSState().modified();
+  cache.getCache().getState().tds().modified();
 }
 
 void SetClocksCmd::complete(CacheBuffer& /*cache*/)
diff --git a/MAC/APL/PIC/RSPDriver/src/SetRCUCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetRCUCmd.cc
index 59c4c20e32d..82dc5b77f45 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetRCUCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetRCUCmd.cc
@@ -70,10 +70,10 @@ void SetRCUCmd::apply(CacheBuffer& cache, bool setModFlag)
       cache.getRCUSettings()()(cache_rcu) = m_event->settings()(0);
       if (setModFlag) {
 	// reset BS if needed
-	cache.getCache().getBSState().modified(cache_rcu / MEPHeader::N_POL);
+	cache.getCache().getState().bs().modified(cache_rcu / MEPHeader::N_POL);
 
-        cache.getCache().getRCUSettingsState().modified(cache_rcu);
-        cache.getCache().getRCUProtocolState().modified(cache_rcu);
+        cache.getCache().getState().rcusettings().modified(cache_rcu);
+        cache.getCache().getState().rcuprotocol().modified(cache_rcu);
       }
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/SetRSUCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetRSUCmd.cc
index bd9301157a7..3e9b52416af 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetRSUCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetRSUCmd.cc
@@ -70,7 +70,7 @@ void SetRSUCmd::apply(CacheBuffer& cache, bool setModFlag)
       cache.getRSUSettings()()(cache_rsp) = m_event->settings()(0);
 
       if (setModFlag) {
-	cache.getCache().getRSUClearState().modified(cache_rsp);
+	cache.getCache().getState().rsuclear().modified(cache_rsp);
       }
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
index ad23c4b5c75..0ca8016eccc 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
@@ -69,9 +69,9 @@ void SetWGCmd::apply(CacheBuffer& cache, bool setModFlag)
 
       if (setModFlag) {
 	// reset BS if needed
-	cache.getCache().getBSState().modified(cache_rcu / MEPHeader::N_POL);
+	cache.getCache().getState().bs().modified(cache_rcu / MEPHeader::N_POL);
 
-	cache.getCache().getDIAGWGSettingsState().modified(cache_rcu);
+	cache.getCache().getState().diagwgsettings().modified(cache_rcu);
       }
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/SetWeightsCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetWeightsCmd.cc
index b81b5b05705..6525d0ac188 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetWeightsCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetWeightsCmd.cc
@@ -90,8 +90,8 @@ void SetWeightsCmd::apply(CacheBuffer& cache, bool setModFlag)
 	m_event->weights()(0, input_rcu, Range::all());
 
       if (setModFlag) {
-	cache.getCache().getBFState().modified(cache_rcu * MEPHeader::N_PHASE);
-	cache.getCache().getBFState().modified(cache_rcu * MEPHeader::N_PHASE + 1);
+	cache.getCache().getState().bf().modified(cache_rcu * MEPHeader::N_PHASE);
+	cache.getCache().getState().bf().modified(cache_rcu * MEPHeader::N_PHASE + 1);
       }
 
       input_rcu++;
diff --git a/MAC/APL/PIC/RSPDriver/src/SstRead.cc b/MAC/APL/PIC/RSPDriver/src/SstRead.cc
index d436b32e1bc..6b2483e71ec 100644
--- a/MAC/APL/PIC/RSPDriver/src/SstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SstRead.cc
@@ -54,7 +54,7 @@ void SstRead::sendrequest()
   EPAReadEvent sstread;
 
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (getCurrentIndex() / SST_N_FRAGMENTS);
-  Cache::getInstance().getSstState().modified(global_blp);
+  Cache::getInstance().getState().sst().modified(global_blp);
 
   uint16 byteoffset = (getCurrentIndex() % SST_N_FRAGMENTS) * MEPHeader::FRAGMENT_SIZE;
 
@@ -107,7 +107,7 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getSstState().applied(global_blp);
+    Cache::getInstance().getState().sst().applied(global_blp);
     LOG_ERROR("SstRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
@@ -124,7 +124,7 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   
   if (MEPHeader::SST_POWER != ack.hdr.m_fields.addr.regid)
   {
-    Cache::getInstance().getSstState().applied(global_blp);
+    Cache::getInstance().getState().sst().applied(global_blp);
     LOG_ERROR("invalid sst ack");
     return GCFEvent::HANDLED;
   }
@@ -142,7 +142,7 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   // y-pol subband statistics: copy and convert to double
   cache(global_blp * 2 + 1, fragment_range) = convert_uint32_to_double(stats(Range::all(), 1));
   
-  Cache::getInstance().getSstState().confirmed(global_blp);
+  Cache::getInstance().getState().sst().confirmed(global_blp);
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/StatusRead.cc b/MAC/APL/PIC/RSPDriver/src/StatusRead.cc
index 61251c07212..4b7916443f6 100644
--- a/MAC/APL/PIC/RSPDriver/src/StatusRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/StatusRead.cc
@@ -51,7 +51,7 @@ StatusRead::~StatusRead()
 
 void StatusRead::sendrequest()
 {
-  Cache::getInstance().getXstState().modified(getBoardId());
+  Cache::getInstance().getState().sys().modified(getBoardId());
 
   // send read status request to check status of the write
   EPAReadEvent rspstatus;
@@ -78,7 +78,7 @@ GCFEvent::TResult StatusRead::handleack(GCFEvent& event, GCFPortInterface& /*por
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getXstState().applied(getBoardId());
+    Cache::getInstance().getState().sys().applied(getBoardId());
     LOG_ERROR("StatusRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
@@ -110,7 +110,7 @@ GCFEvent::TResult StatusRead::handleack(GCFEvent& event, GCFPortInterface& /*por
       LOG_WARN(formatString("RSP[%02d]: slice_count mismatch", getBoardId()));
     }
 
-  Cache::getInstance().getXstState().confirmed(getBoardId());
+  Cache::getInstance().getState().sys().confirmed(getBoardId());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/TDSProtocolWrite.cc b/MAC/APL/PIC/RSPDriver/src/TDSProtocolWrite.cc
index 24965a8278e..c6ed5bd8928 100644
--- a/MAC/APL/PIC/RSPDriver/src/TDSProtocolWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/TDSProtocolWrite.cc
@@ -145,7 +145,7 @@ void TDSProtocolWrite::sendrequest()
   void* buf = 0;
 
   // skip update if the Clocks settings have not been modified
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getTDSState().get(getBoardId()))
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().tds().get(getBoardId()))
   {
     setContinue(true);
     return;
@@ -221,7 +221,7 @@ GCFEvent::TResult TDSProtocolWrite::handleack(GCFEvent& event, GCFPortInterface&
   // Mark register modification as applied
   // Still needs to be confirmed by TDSRegisterRead
   if (0 == m_remaining) {
-    Cache::getInstance().getTDSState().applied(getBoardId());
+    Cache::getInstance().getState().tds().applied(getBoardId());
   }
 
   return GCFEvent::HANDLED;
diff --git a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
index 51ae77352dc..316ed51caec 100644
--- a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
@@ -53,7 +53,7 @@ TDSResultRead::~TDSResultRead()
 void TDSResultRead::sendrequest()
 {
   // skip update if the Clocks settings have not been modified
-  if (RTC::RegisterState::APPLIED != Cache::getInstance().getTDSState().get(getBoardId()))
+  if (RTC::RegisterState::APPLIED != Cache::getInstance().getState().tds().get(getBoardId()))
   {
     setContinue(true);
     return;
@@ -133,7 +133,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /*
     printbin(ack.result, sizeof(tds_160MHz_result));
     idiff = imemcmp(tds_160MHz_result, ack.result, sizeof(tds_160MHz_result));
     if (-1 == idiff) {
-      Cache::getInstance().getTDSState().confirmed(getBoardId());
+      Cache::getInstance().getState().tds().confirmed(getBoardId());
     } else {
       LOG_ERROR(formatString("TDSResultRead::handleack (160MHz): unexpected I2C result response, first mismatch @ %d", idiff));
     }
@@ -144,7 +144,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /*
     printbin(ack.result, sizeof(tds_200MHz_result));
     idiff = imemcmp(tds_200MHz_result, ack.result, sizeof(tds_200MHz_result));
     if (-1 == idiff) {
-      Cache::getInstance().getTDSState().confirmed(getBoardId());
+      Cache::getInstance().getState().tds().confirmed(getBoardId());
     } else {
       LOG_ERROR(formatString("TDSResultRead::handleack (200MHz): unexpected I2C result response, first mismatch @ %d", idiff));
     }
@@ -155,7 +155,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /*
     printbin(ack.result, sizeof(tds_off_result));
     idiff = imemcmp(tds_off_result, ack.result, sizeof(tds_off_result));
     if (-1 == idiff) {
-      Cache::getInstance().getTDSState().confirmed(getBoardId());
+      Cache::getInstance().getState().tds().confirmed(getBoardId());
     } else {
       LOG_ERROR(formatString("TDSResultRead::handleack (OFF): unexpected I2C result response, first mismatch @ %d", idiff));
     }
diff --git a/MAC/APL/PIC/RSPDriver/src/UpdClocksCmd.cc b/MAC/APL/PIC/RSPDriver/src/UpdClocksCmd.cc
index 50b457b8a12..93f87ca31bd 100644
--- a/MAC/APL/PIC/RSPDriver/src/UpdClocksCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/UpdClocksCmd.cc
@@ -73,7 +73,7 @@ void UpdClocksCmd::complete(CacheBuffer& cache)
   // only send ack if clock setting has been applied to all boards
   bool sendack = true;
   for (int cache_rsp = 0; cache_rsp < StationSettings::instance()->nrRspBoards(); cache_rsp++) {
-    if (RTC::RegisterState::APPLIED != cache.getCache().getTDSState().get(cache_rsp)) {
+    if (RTC::RegisterState::APPLIED != cache.getCache().getState().tds().get(cache_rsp)) {
       sendack = false;
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/VersionsRead.cc b/MAC/APL/PIC/RSPDriver/src/VersionsRead.cc
index d57f17063d0..13987a7edd3 100644
--- a/MAC/APL/PIC/RSPDriver/src/VersionsRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/VersionsRead.cc
@@ -60,7 +60,7 @@ void VersionsRead::sendrequest_status()
   // intentionally left empty
 }
 
-GCFEvent::TResult VersionsRead::handleack(GCFEvent& event, GCFPortInterface& port)
+GCFEvent::TResult VersionsRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/)
 {
   if (EPA_RSR_VERSION != event.signal)
   {
diff --git a/MAC/APL/PIC/RSPDriver/src/WGWrite.cc b/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
index c2787509b44..aeef57eada1 100644
--- a/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
@@ -55,7 +55,7 @@ void WGWrite::sendrequest()
 {
   uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard() * MEPHeader::N_POL) + (getCurrentIndex() / N_REGISTERS);
 
-  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getDIAGWGSettingsState().get(global_rcu)) {
+  if (RTC::RegisterState::MODIFIED != Cache::getInstance().getState().diagwgsettings().get(global_rcu)) {
     setContinue(true);
     return;
   }
@@ -145,7 +145,7 @@ GCFEvent::TResult WGWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   }
   
   // change state to indicate that it has been applied in the hardware
-  Cache::getInstance().getDIAGWGSettingsState().confirmed(getCurrentIndex() / N_REGISTERS);
+  Cache::getInstance().getState().diagwgsettings().confirmed(getCurrentIndex() / N_REGISTERS);
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/XstRead.cc b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
index a8fd89d61cf..35f28c74992 100644
--- a/MAC/APL/PIC/RSPDriver/src/XstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
@@ -60,7 +60,7 @@ void XstRead::sendrequest()
   //
   uint16 offset = GET_CONFIG("RSPDriver.XST_FIRST_RSP_BOARD", i) * MEPHeader::XLET_SIZE;
 
-  Cache::getInstance().getXstState().modified(getBoardId());
+  Cache::getInstance().getState().xst().modified(getBoardId());
 
   if (m_regid < MEPHeader::XST_STATS || m_regid >= MEPHeader::XST_NR_STATS)
   {
@@ -155,14 +155,14 @@ GCFEvent::TResult XstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getXstState().applied(getBoardId());
+    Cache::getInstance().getState().xst().applied(getBoardId());
     LOG_ERROR("XstRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
 
   if (ack.hdr.m_fields.addr.regid >= MEPHeader::XST_NR_STATS)
   {
-    Cache::getInstance().getXstState().applied(getBoardId());
+    Cache::getInstance().getState().xst().applied(getBoardId());
     LOG_ERROR("invalid xst ack");
     return GCFEvent::HANDLED;
   }
@@ -193,7 +193,7 @@ GCFEvent::TResult XstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   cache(rcu % MEPHeader::N_POL, 0, rcu / MEPHeader::N_POL, dst_range) = convert_cuint32_to_cdouble(xststats(Range::all(), 0));
   cache(rcu % MEPHeader::N_POL, 1, rcu / MEPHeader::N_POL, dst_range) = convert_cuint32_to_cdouble(xststats(Range::all(), 1));
 
-  Cache::getInstance().getXstState().confirmed(getBoardId());
+  Cache::getInstance().getState().xst().confirmed(getBoardId());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
index 67a0f734e6b..c2d0bc3b2c7 100644
--- a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
+++ b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
@@ -133,71 +133,11 @@ EPAStub::EPAStub(string name)
   m_reg[MEPHeader::CDO][MEPHeader::CDO_SETTINGS].size  = MEPHeader::CDO_SETTINGS_SIZE;
   m_reg[MEPHeader::CDO][MEPHeader::CDO_HEADER].addr    = new char[MEPHeader::CDO_HEADER_SIZE];
   m_reg[MEPHeader::CDO][MEPHeader::CDO_HEADER].size    = MEPHeader::CDO_HEADER_SIZE;
-
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y0].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y0].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y1].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y1].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y2].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y2].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0X3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_0Y3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1X3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_1Y3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2X3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_2Y3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3X3].size       = MEPHeader::XST_STATS_SIZE;
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y3].addr       = new char[MEPHeader::XST_STATS_SIZE];
-  m_reg[MEPHeader::XST][MEPHeader::XST_3Y3].size       = MEPHeader::XST_STATS_SIZE;
+  
+  for (int i = 0; i < MEPHeader::XST_NR_STATS; i++) {
+    m_reg[MEPHeader::XST][i].addr = new char[MEPHeader::XST_STATS_SIZE];
+    m_reg[MEPHeader::XST][i].size = MEPHeader::XST_STATS_SIZE;
+  }
 
   m_reg[MEPHeader::BS][MEPHeader::BS_NOF_SAMPLES_PER_SYNC].addr  = new char[MEPHeader::BS_NOF_SAMPLES_PER_SYNC_SIZE * GET_CONFIG("EPAStub.N_BLPS", i)];
   m_reg[MEPHeader::BS][MEPHeader::BS_NOF_SAMPLES_PER_SYNC].size  = MEPHeader::BS_NOF_SAMPLES_PER_SYNC_SIZE;
diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h
new file mode 100644
index 00000000000..7ba63305830
--- /dev/null
+++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h
@@ -0,0 +1,194 @@
+//#  -*- mode: c++ -*-
+//#
+//#  AllRegisterState.h: class that can contain the communication/update status of all register.
+//#
+//#  Copyright (C) 2002-2004
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#ifndef ALLREGISTERSTATE_H_
+#define ALLREGISTERSTATE_H_
+
+#include <blitz/array.h>
+#include <Common/LofarTypes.h>
+#include <APL/RSP_Protocol/MEPHeader.h>
+#include <APL/RTCCommon/RegisterState.h>
+#include <iostream>
+
+namespace LOFAR {
+  namespace RSP_Protocol {
+
+    /**
+     * This class is used to contain the RegisterState of all registers.
+     *
+     * It is used in the following events:
+     * GETREGISTERSTATEACK
+     * UPDREGISTERSTATE
+     *
+     */
+    class AllRegisterState
+      {
+      public:
+
+	/**
+	 * Constructors for a AllRegisterState object.
+	 */
+	AllRegisterState() : m_nrcus(0) {}
+
+	/* Destructor for AllRegisterState. */
+	virtual ~AllRegisterState() {}
+
+      public:
+
+	void init(int nrRspBoards, int nrBlps, int nrRcus) {
+
+	  m_nrcus = nrRcus;
+
+	  //
+	  // resize to appropriate size and mark modified
+	  // to force initial update
+	  //
+	  sys_state.resize(nrRspBoards);
+	  sys_state.modified();
+
+	  bf_state.resize(nrRcus * EPA_Protocol::MEPHeader::N_PHASE); // XR, XI, YR, YI
+	  bf_state.modified();
+
+	  ss_state.resize(nrBlps);
+	  ss_state.modified();
+
+	  rcusettings_state.resize(nrRcus);
+	  rcusettings_state.modified();
+
+	  rcuprotocol_state.resize(nrRcus);
+	  rcuprotocol_state.modified();
+
+	  rsuclear_state.resize(nrRspBoards);
+	  rsuclear_state.clear();
+
+	  diagwgsettings_state.resize(nrRcus);
+	  diagwgsettings_state.modified();
+
+	  sst_state.resize(nrBlps);
+	  sst_state.modified();
+
+	  bst_state.resize(nrRspBoards);
+	  bst_state.modified();
+
+	  xst_state.resize(nrRspBoards);
+	  xst_state.modified();
+
+	  cdo_state.resize(nrRspBoards);
+	  cdo_state.modified();
+
+	  bs_state.resize(nrBlps);
+	  bs_state.modified();
+
+	  tds_state.resize(nrRspBoards);
+	  tds_state.modified();
+	}
+
+	void clear() {
+	  sys_state.clear();
+	  bf_state.clear();
+	  ss_state.clear();
+	  rcusettings_state.clear();
+	  rcuprotocol_state.clear();
+	  rsuclear_state.clear();
+	  diagwgsettings_state.clear();
+	  sst_state.clear();
+	  bst_state.clear();
+	  xst_state.clear();
+	  cdo_state.clear();
+	  bs_state.clear();
+	  tds_state.clear();
+	}
+
+	void print(std::ostream& out) const {
+	  out << "                  ";
+	  for (int i = 0; i < m_nrcus * EPA_Protocol::MEPHeader::N_POL; i++) {
+	    out << (i % 10);
+	  }
+	  out << endl;
+	  out << "System Status     "; sys_state.print(out);
+	  out << "BF                "; bf_state.print(out);
+	  out << "Subband Selection "; ss_state.print(out);
+	  out << "RCUSettings       "; rcusettings_state.print(out);
+	  out << "RCUProtocol       "; rcuprotocol_state.print(out);
+	  out << "RSUClear          "; rsuclear_state.print(out);
+	  out << "DIAGWGSettings    "; diagwgsettings_state.print(out);
+	  out << "SubbandStats      "; sst_state.print(out);
+	  out << "BeamletStats      "; bst_state.print(out);
+	  out << "XCorrelationStats "; xst_state.print(out);
+	  out << "CDO               "; cdo_state.print(out);
+	  out << "BS                "; bs_state.print(out);
+	  out << "TDS               "; tds_state.print(out);
+	  out << endl;
+	}
+
+	/*@{*/
+	/**
+	 * marshalling methods
+	 */
+	unsigned int getSize();
+	unsigned int pack  (void* buffer);
+	unsigned int unpack(void *buffer);
+	/*@}*/
+
+      public:
+	/*@{*/
+	/**
+	 * Accessor methods
+	 */
+	RTC::RegisterState& sys()            { return sys_state; }
+	RTC::RegisterState& bf()             { return bf_state; }
+	RTC::RegisterState& ss()             { return ss_state; }
+	RTC::RegisterState& rcusettings()    { return rcusettings_state; }
+	RTC::RegisterState& rcuprotocol()    { return rcuprotocol_state; }
+	RTC::RegisterState& rsuclear()       { return rsuclear_state; }
+	RTC::RegisterState& diagwgsettings() { return diagwgsettings_state; }
+	RTC::RegisterState& sst()            { return sst_state; }
+	RTC::RegisterState& bst()            { return bst_state; }
+	RTC::RegisterState& xst()            { return xst_state; }
+	RTC::RegisterState& cdo()            { return cdo_state; }
+	RTC::RegisterState& bs()            { return bs_state; }
+	RTC::RegisterState& tds()            { return tds_state; }
+	/*@}*/
+
+      private:
+	RTC::RegisterState sys_state;            // RSR state
+	RTC::RegisterState bf_state;             // BF weights state
+	RTC::RegisterState ss_state;             // SS state
+	RTC::RegisterState rcusettings_state;    // RCU settings state
+	RTC::RegisterState rcuprotocol_state;    // RCU protocol state
+	RTC::RegisterState rsuclear_state;       // RSU clear state
+	RTC::RegisterState diagwgsettings_state; // DIAG WG settings state
+	RTC::RegisterState sst_state;            // SST state
+	RTC::RegisterState bst_state;            // BST state
+	RTC::RegisterState xst_state;            // XST State
+	RTC::RegisterState cdo_state;            // CDO state
+	RTC::RegisterState bs_state;             // BS register state
+	RTC::RegisterState tds_state;            // TDS register state (Clock board)
+
+	int m_nrcus;
+      };
+  };
+}; // namespace LOFAR
+
+#endif /* ALLREGISTERSTATE_H_ */
diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h
index 02502f9d028..121d4f3ca2e 100644
--- a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h
+++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h
@@ -195,7 +195,7 @@ namespace LOFAR {
        */
       static const uint8 TBB_CONTROL      = 0x00;
 
-      static const int MAX_REGID          = XST_3Y3; // XST_3Y3
+      static const int MAX_REGID          = XST_NR_STATS - 1;
 
       /*@}*/
 
diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Makefile.am b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Makefile.am
index 0f3fbd3db1d..623f956af4d 100644
--- a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Makefile.am
+++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Makefile.am
@@ -10,6 +10,7 @@ INSTHDRS = \
 	Versions.h \
 	WGSettings.h \
 	XCStatistics.h \
+	AllRegisterState.h \
 	MEPHeader.h \
 	MEPData.h
 
diff --git a/MAC/APL/PIC/RSP_Protocol/src/AllRegisterState.cc b/MAC/APL/PIC/RSP_Protocol/src/AllRegisterState.cc
new file mode 100644
index 00000000000..1d64bdacf86
--- /dev/null
+++ b/MAC/APL/PIC/RSP_Protocol/src/AllRegisterState.cc
@@ -0,0 +1,94 @@
+//#  AllRegisterState.h: implementation of the AllRegisterState class
+//#
+//#  Copyright (C) 2002-2004
+//#  ASTRON (Netherlands Foundation for Research in Astronomy)
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//#  This program is free software; you can redistribute it and/or modify
+//#  it under the terms of the GNU General Public License as published by
+//#  the Free Software Foundation; either version 2 of the License, or
+//#  (at your option) any later version.
+//#
+//#  This program is distributed in the hope that it will be useful,
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//#  GNU General Public License for more details.
+//#
+//#  You should have received a copy of the GNU General Public License
+//#  along with this program; if not, write to the Free Software
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//#  $Id$
+
+#include <lofar_config.h>
+#include <Common/LofarLogger.h>
+
+#include <APL/RSP_Protocol/AllRegisterState.h>
+#include <APL/RTCCommon/Marshalling.h>
+
+using namespace std;
+using namespace blitz;
+using namespace LOFAR;
+using namespace RSP_Protocol;
+
+unsigned int AllRegisterState::getSize()
+{
+  return
+      sys_state.getSize()
+    + bf_state.getSize()
+    + ss_state.getSize()
+    + rcusettings_state.getSize()
+    + rcuprotocol_state.getSize()
+    + rsuclear_state.getSize()
+    + diagwgsettings_state.getSize()
+    + sst_state.getSize()
+    + bst_state.getSize()
+    + xst_state.getSize()
+    + cdo_state.getSize()
+    + bs_state.getSize()
+    + tds_state.getSize();
+}
+
+unsigned int AllRegisterState::pack  (void* buffer)
+{
+  unsigned int offset = 0;
+
+  offset = 
+      sys_state.pack(buffer)
+    + bf_state.pack(buffer)
+    + ss_state.pack(buffer)
+    + rcusettings_state.pack(buffer)
+    + rcuprotocol_state.pack(buffer)
+    + rsuclear_state.pack(buffer)
+    + diagwgsettings_state.pack(buffer)
+    + sst_state.pack(buffer)
+    + bst_state.pack(buffer)
+    + xst_state.pack(buffer)
+    + cdo_state.pack(buffer)
+    + bs_state.pack(buffer)
+    + tds_state.pack(buffer);
+
+  return offset;
+}
+
+unsigned int AllRegisterState::unpack(void *buffer)
+{
+  unsigned int offset = 0;
+
+  offset = 
+      sys_state.unpack(buffer)
+    + bf_state.unpack(buffer)
+    + ss_state.unpack(buffer)
+    + rcusettings_state.unpack(buffer)
+    + rcuprotocol_state.unpack(buffer)
+    + rsuclear_state.unpack(buffer)
+    + diagwgsettings_state.unpack(buffer)
+    + sst_state.unpack(buffer)
+    + bst_state.unpack(buffer)
+    + xst_state.unpack(buffer)
+    + cdo_state.unpack(buffer)
+    + bs_state.unpack(buffer)
+    + tds_state.unpack(buffer);
+
+  return offset;
+}
diff --git a/MAC/APL/PIC/RSP_Protocol/src/Makefile.am b/MAC/APL/PIC/RSP_Protocol/src/Makefile.am
index 3520eb6de9d..4151494b7b1 100644
--- a/MAC/APL/PIC/RSP_Protocol/src/Makefile.am
+++ b/MAC/APL/PIC/RSP_Protocol/src/Makefile.am
@@ -42,6 +42,7 @@ librsp_protocol_la_SOURCES = \
 	Versions.cc \
 	WGSettings.cc \
 	XCStatistics.cc \
+	AllRegisterState.cc \
 	MEPHeader.cc \
 	MEPData.cc
 
diff --git a/MAC/APL/PIC/RSP_Protocol/src/RSP_Protocol.prot b/MAC/APL/PIC/RSP_Protocol/src/RSP_Protocol.prot
index ec9fcff1d1a..11f62f5c78a 100644
--- a/MAC/APL/PIC/RSP_Protocol/src/RSP_Protocol.prot
+++ b/MAC/APL/PIC/RSP_Protocol/src/RSP_Protocol.prot
@@ -24,6 +24,7 @@ include = '<APL/RSP_Protocol/SystemStatus.h>';
 include = '<APL/RSP_Protocol/Statistics.h>';
 include = '<APL/RSP_Protocol/XCStatistics.h>';
 include = '<APL/RSP_Protocol/Versions.h>';
+include = '<APL/RSP_Protocol/AllRegisterState.h>';
 include = '<APL/RSP_Protocol/MEPHeader.h>';
 
 prelude = << PRELUDE_END
@@ -1127,3 +1128,114 @@ event = {
     type = "uint32";
   };
 };
+
+event = {
+  signal = GETREGISTERSTATE;
+  dir = IN;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+};
+
+event = {
+  signal = GETREGISTERSTATEACK;
+  dir = OUT;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+  param = {
+    name = "status";
+    type = "int16";
+  };
+  param = {
+    name = "state";
+    type = "AllRegisterState";
+    userdefined;
+  };
+};
+
+event = {
+  signal = SUBREGISTERSTATE;
+  dir = IN;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+  param = {
+    name = "period";
+    type = "uint16";
+  };
+};
+
+event = {
+  signal = SUBREGISTERSTATEACK;
+  dir = OUT;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+  param = {
+    name = "status";
+    type = "int16";
+  };
+  param = {
+    name = "handle";
+    type = "uint32";
+  };
+};
+
+event = {
+  signal = UPDREGISTERSTATE;
+  dir = OUT;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+  param = {
+    name = "status";
+    type = "int16";
+  };
+  param = {
+    name = "handle";
+    type = "uint32";
+  };
+  param = {
+    name = "state";
+    type = "AllRegisterState";
+    userdefined;
+  };
+};
+
+event = {
+  signal = UNSUBREGISTERSTATE;
+  dir = IN;
+  param = {
+    name = "handle";
+    type = "uint32";
+  };
+};
+
+event = {
+  signal = UNSUBREGISTERSTATEACK;
+  dir = OUT;
+  param = {
+    name = "timestamp";
+    type = "RTC::Timestamp";
+    userdefined;
+  };
+  param = {
+    name = "status";
+    type = "int16";
+  };
+  param = {
+    name = "handle";
+    type = "uint32";
+  };
+};
diff --git a/MAC/APL/RTCCommon/include/APL/RTCCommon/Marshalling.h b/MAC/APL/RTCCommon/include/APL/RTCCommon/Marshalling.h
index 0218ced3152..300e72eb3bf 100644
--- a/MAC/APL/RTCCommon/include/APL/RTCCommon/Marshalling.h
+++ b/MAC/APL/RTCCommon/include/APL/RTCCommon/Marshalling.h
@@ -35,7 +35,7 @@
 
 #define MSH_PACK_ARRAY(bufptr, offset, array, datatype)					     \
 do {											     \
-  for (int dim = firstDim; dim < firstDim + (array).dimensions(); dim++)		     \
+  for (int dim = blitz::firstDim; dim < blitz::firstDim + (array).dimensions(); dim++)	     \
   {											     \
     int32 extent = (array).extent(dim);							     \
     memcpy(((char*)(bufptr)) + (offset), &extent, sizeof(int32));			     \
@@ -56,14 +56,14 @@ do {											     \
 
 #define MSH_UNPACK_ARRAY(bufptr, offset, array, datatype, dims)			       \
 do {										       \
-  TinyVector<int, (dims)> extent;						       \
+  blitz::TinyVector<int, (dims)> extent;					       \
 										       \
-  for (int dim = firstDim; dim < firstDim + (dims); dim++)			       \
+  for (int dim = blitz::firstDim; dim < blitz::firstDim + (dims); dim++)	       \
   {										       \
     int32 extenttmp = array.extent(dim);					       \
     memcpy(&extenttmp, ((char*)(bufptr)) + (offset), sizeof(int32));		       \
     offset += sizeof(int32);							       \
-    extent(dim - firstDim) = extenttmp;						       \
+    extent(dim - blitz::firstDim) = extenttmp;					       \
   }										       \
 										       \
   /* resize the array to the correct size */					       \
diff --git a/MAC/APL/RTCCommon/include/APL/RTCCommon/RegisterState.h b/MAC/APL/RTCCommon/include/APL/RTCCommon/RegisterState.h
index 5d77362ff32..705008b3f87 100644
--- a/MAC/APL/RTCCommon/include/APL/RTCCommon/RegisterState.h
+++ b/MAC/APL/RTCCommon/include/APL/RTCCommon/RegisterState.h
@@ -27,6 +27,7 @@
 
 #include <blitz/array.h>
 #include <Common/LofarLogger.h>
+#include <APL/RTCCommon/Marshalling.h>
 #include <iostream>
 
 namespace LOFAR {
@@ -37,14 +38,14 @@ namespace LOFAR {
       public:
 
 	typedef enum State {
-	  INVALID      = 0,
+	  UNDEFINED    = 0,
 	  NOT_MODIFIED = 1,
 	  MODIFIED     = 2,
 	  APPLIED      = 3,
 	  CONFIRMED    = 4,
 	};
-
-	explicit RegisterState(State state = NOT_MODIFIED)
+	
+	explicit RegisterState(State state = UNDEFINED)
 	  {
 	    m_state.resize(1);
 	    m_state = state;
@@ -147,7 +148,7 @@ namespace LOFAR {
 	  {
 	    if (i < 0) {
 	      for (int j = 0; j < m_state.extent(blitz::firstDim); j++) {
-		if (CONFIRMED == m_state(j)) {
+		if (CONFIRMED == m_state(j) || UNDEFINED == m_state(j)) {
 		  m_state(j) = NOT_MODIFIED;
 		}
 	      }
@@ -164,8 +165,42 @@ namespace LOFAR {
 	  return m_state(i);
 	}
 
-	void print(std::ostream& c) const {
-	  c << m_state << endl;
+	void print(std::ostream& out) const {
+	  for (int i = 0; i < m_state.extent(blitz::firstDim); i++) {
+	    char c;
+	    switch (m_state(i)) {
+	    case UNDEFINED:    c = '?'; break;
+	    case NOT_MODIFIED: c = '.'; break;
+	    case MODIFIED:     c = 'M'; break;
+	    case APPLIED:      c = 'A'; break;
+	    case CONFIRMED:    c = 'C'; break;
+	    default:           c = 'X'; break;
+	    }
+	    out << c;
+	  }
+	  out << "$" << endl;
+	}
+
+      public:
+	/* marshalling methods */
+	unsigned int getSize() {
+	  return MSH_ARRAY_SIZE(m_state, RegisterState);
+	}
+
+	unsigned int pack(void* buffer) {
+	  unsigned int offset = 0;
+
+	  MSH_PACK_ARRAY(buffer, offset, m_state, RegisterState);
+
+	  return offset;
+	}
+
+	unsigned int unpack(void* buffer) {
+	  unsigned int offset = 0;
+
+	  MSH_UNPACK_ARRAY(buffer, offset, m_state, RegisterState, 1);
+
+	  return offset;
 	}
 
       private:
-- 
GitLab