diff --git a/MAC/APL/PIC/RSPDriver/src/XstRead.cc b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
index 65d769af47c9b44d55b767ca04bd100c645e8bb5..d00026615f1fcf0f2d1677caa5d18838ee93a5da 100644
--- a/MAC/APL/PIC/RSPDriver/src/XstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
@@ -39,7 +39,7 @@ using namespace RSP_Protocol;
 using namespace RTC;
 
 XstRead::XstRead(GCFPortInterface& board_port, int board_id, int regid)
-  : SyncAction(board_port, board_id, XST_N_FRAGMENTS),
+  : SyncAction(board_port, board_id, 1),
     m_regid(regid)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
@@ -52,14 +52,13 @@ XstRead::~XstRead()
 void XstRead::sendrequest()
 {
   // offset in bytes
-  uint16 offset = (getCurrentIndex() % XST_N_FRAGMENTS) * MEPHeader::XST_FRAGMENT_SIZE;
-
   // firmware now indexes from 1 instead of 0
-  offset += (GET_CONFIG("RSPDriver.XST_FIRST_RSP_BOARD", i) + 1) * MEPHeader::N_LOCAL_XLETS * MEPHeader::N_POL * sizeof(complex<uint32>);
+  //uint16 offset = (GET_CONFIG("RSPDriver.XST_FIRST_RSP_BOARD", i) + 1) * MEPHeader::N_LOCAL_XLETS * MEPHeader::XLET_SIZE;
+  uint16 offset = (GET_CONFIG("RSPDriver.XST_FIRST_RSP_BOARD", i) + 1) * MEPHeader::XLET_SIZE;
 
-  LOG_DEBUG_STR("XstRead::offset=" << offset);
+  LOG_INFO_STR("XstRead::offset=" << offset);
 
-  if (m_regid < MEPHeader::XST_0_X || m_regid > MEPHeader::XST_3_Y)
+  if (m_regid < MEPHeader::XST_0X0 || m_regid > MEPHeader::XST_3Y3)
   {
     LOG_FATAL("invalid regid");
     exit(EXIT_FAILURE);
@@ -68,7 +67,7 @@ void XstRead::sendrequest()
   EPAReadEvent xstread;
 
   xstread.hdr.set(MEPHeader::XST_STATS_HDR, MEPHeader::DST_RSP,
-		  MEPHeader::READ, N_XST_STATS * sizeof(uint32), offset);
+		  MEPHeader::READ, MEPHeader::XST_STATS_SIZE, offset);
   xstread.hdr.m_fields.addr.regid = m_regid;
 
   m_hdr = xstread.hdr;
@@ -132,45 +131,42 @@ GCFEvent::TResult XstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
     return GCFEvent::HANDLED;
   }
 
-  uint16 offset = ((getCurrentIndex() % XST_N_FRAGMENTS) * MEPHeader::XST_FRAGMENT_SIZE) / sizeof(uint32);
-
-  int global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (m_regid/2);
+  int global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (m_regid / MEPHeader::N_POL);
   
-  LOG_DEBUG(formatString("XstRead::handleack: global_blp=%d, offset=%d",
-			 global_blp, offset));
+  LOG_INFO(formatString("XstRead::handleack: global_blp=%d", global_blp));
 
   Array<complex<double>, 4>& cache(Cache::getInstance().getBack().getXCStats()());
 
-  offset /= (MEPHeader::N_PHASEPOL * MEPHeader::N_POL);
-  Range rcu_range(offset, cache.extent(thirdDim)-1);
+  int serdes_lane = m_regid / (MEPHeader::N_POL * StationSettings::instance()->nrBlpsPerBoard());
+  Range blp_target_range(serdes_lane,
+			 MEPHeader::N_REMOTE_XLETS * StationSettings::instance()->nrBlpsPerBoard() - 1,
+			 MEPHeader::N_PHASEPOL);
+		  
+  //Range rcu_range(remote_blp_offset, remote_blp_offset + MEPHeader::N_REMOTE_XLETS - 1);
   
-  LOG_DEBUG_STR(endl << 
+  LOG_INFO_STR(endl << 
 		"global_blp=" << global_blp << endl <<
-		"rcu_range=" << rcu_range << endl <<
-		"xststats.range=" << rcu_range-offset);
-
-  if (offset <= cache.extent(thirdDim)) {
-
-    LOG_DEBUG_STR("xststats shape=" << 
-		  shape(N_XST_STATS / (MEPHeader::N_PHASEPOL * MEPHeader::N_POL),
-			MEPHeader::N_POL));
-
-    Array<complex<uint32>, 2> xststats((complex<uint32>*)&ack.xst_stat,
-				       shape(N_XST_STATS / (MEPHeader::N_PHASEPOL * MEPHeader::N_POL),
-					     MEPHeader::N_POL),
-				       neverDeleteData);
-
-    // convert and reorder dimensions
-    for (int i = offset; i < cache.extent(fourthDim); i++) {
-      for (int j = 0; j < MEPHeader::N_POL; j++) {
-	cache(m_regid % 2, j, global_blp, i)
-	  = convert_cuint32_to_cdouble(xststats(i-offset, j));
-      }
-    }
+		"blp_target_range=" << blp_target_range << endl <<
+		"xststats.range=" << Range(0, MEPHeader::N_REMOTE_XLETS));
 
-  } else {
-    LOG_WARN("ignoring EPA_XSTSTATS event, RCUs out of range");
+  LOG_INFO_STR("xststats shape=" << shape(MEPHeader::N_REMOTE_XLETS, MEPHeader::N_POL));
+  
+  Array<complex<uint32>, 2> xststats((complex<uint32>*)&ack.xst_stat,
+				     shape(MEPHeader::N_REMOTE_XLETS, MEPHeader::N_POL),
+				     neverDeleteData);
+  
+  cache(m_regid % MEPHeader::N_POL, Range::all(), global_blp, blp_target_range) =
+    convert_cuint32_to_cdouble(xststats);
+
+#if 0
+  // convert and reorder dimensions
+  for (int i = 0; i < MEPHeader::N_REMOTE_XLETS; i++) {
+    for (int j = 0; j < MEPHeader::N_POL; j++) {
+      cache(m_regid % MEPHeader::N_POL, j, global_blp, i + remote_blp_offset)
+	= convert_cuint32_to_cdouble(xststats(i, j));
+    }
   }
+#endif
 
   return GCFEvent::HANDLED;
 }