diff --git a/MAC/APL/PIC/RSPDriver/src/BstRead.cc b/MAC/APL/PIC/RSPDriver/src/BstRead.cc
index 3919427b67adf6206904cbe7908d9dd0c51982c3..35008ed63c9ecde9dc94b0967477d03e995d0e5d 100644
--- a/MAC/APL/PIC/RSPDriver/src/BstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BstRead.cc
@@ -61,11 +61,6 @@ void BstRead::sendrequest()
 
   m_hdr = bstread.hdr;
   getBoardPort().send(bstread);
-
-  Range fragment_range(0, MEPHeader::N_LOCAL_BEAMLETS - 1);
-  fragment_range = fragment_range + (getCurrentIndex() * MEPHeader::N_LOCAL_BEAMLETS);
-
-  LOG_WARN_STR("fragment_range=" << fragment_range);
 }
 
 void BstRead::sendrequest_status()
@@ -119,9 +114,9 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   Range fragment_range(0, MEPHeader::N_LOCAL_BEAMLETS - 1);
   fragment_range = fragment_range + (getCurrentIndex() * MEPHeader::N_LOCAL_BEAMLETS);
 
-  LOG_WARN_STR("fragment_range=" << fragment_range);
+  LOG_DEBUG_STR("fragment_range=" << fragment_range);
   
-  if (MEPHeader::BST_POWER != ack.hdr.m_fields.addr.regid)
+  if (getCurrentIndex() != ack.hdr.m_fields.addr.regid)
   {
     LOG_ERROR("invalid bst ack");
     return GCFEvent::HANDLED;
diff --git a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
index d618546a5eed585f8f8755025ee3fefb229394da..facc9e7f0cec1d2c25b77eac3319cf52472ec629 100644
--- a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
@@ -185,7 +185,7 @@ void CDOWrite::sendrequest()
 
       // fill in some magic so we recognise these fields easily in tcpdump/ethereal output
       cdo.configuration_id = 0xBBAA;
-      cdo.dataformat       = 0xDDCC;
+      cdo.ffi              = 0xDDCC;
 
       cdo.nof_blocks       = GET_CONFIG("RSPDriver.CDO_N_BLOCKS", i);
       cdo.nof_beamlets     = GET_CONFIG("RSPDriver.CDO_N_BEAMLETS", i);
diff --git a/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in b/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
index 15a47991537005d42b726f726b107dc12a753b7b..f72dfaa30abe0d9d615f872808c8c227da2c9121 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
+++ b/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
@@ -30,8 +30,8 @@ RSPDriver.SOFTPPS=0
 # Specify MAC addresses of the RSP boards explicitly
 #
 RSPDriver.MAC_ADDR_0=10:FA:00:00:13:00
-RSPDriver.MAC_ADDR_1=10:FA:00:00:13:00
-RSPDriver.MAC_ADDR_2=10:FA:00:00:13:00
+RSPDriver.MAC_ADDR_1=10:FA:00:00:12:00
+RSPDriver.MAC_ADDR_2=10:FA:00:00:11:00
 RSPDriver.MAC_ADDR_3=10:FA:00:00:10:00
 
 # RSPDriver.MAC_ADDR_0=10:FA:00:00:00:00
@@ -77,76 +77,22 @@ RSPDriver.MAC_ADDR_23=10:FA:00:00:18:00
 #RSPDriver.OUTPUT_PAYLOAD_SIZE=6928
 
 #
-# Destination IP and MAC address for data packets
-# leaving the RSP board with the given index
+# Serdes lane settings.
 #
-
-RSPDriver.SRC_IP_ADDR_0=10.10.0.1
-RSPDriver.DST_IP_ADDR_0=10.170.0.1
-RSPDriver.SRC_MAC_ADDR_0=10:FA:00:00:00:00
-# FTS-1
-RSPDriver.DST_MAC_ADDR_0=00:E0:81:31:DE:8A
-# CS-1
-# RSPDriver.DST_MAC_ADDR_0=00:E0:81:34:93:3B
-
-RSPDriver.SRC_IP_ADDR_1=10.10.0.2
-RSPDriver.DST_IP_ADDR_1=10.170.0.2
-RSPDriver.SRC_MAC_ADDR_1=10:FA:00:00:00:01
-# FTS-1
-RSPDriver.DST_MAC_ADDR_1=00:E0:81:31:DF:D4
-# CS-1
-# RSPDriver.DST_MAC_ADDR_1=00:E0:81:31:B0:E1
-
-RSPDriver.SRC_IP_ADDR_2=10.10.0.3
-RSPDriver.DST_IP_ADDR_2=10.170.0.3
-RSPDriver.SRC_MAC_ADDR_2=10:FA:00:00:00:02
-RSPDriver.DST_MAC_ADDR_2=00:E0:81:31:B2:F5
-RSPDriver.SRC_IP_ADDR_3=10.10.0.4
-RSPDriver.DST_IP_ADDR_3=10.170.0.4
-RSPDriver.SRC_MAC_ADDR_3=10:FA:00:00:00:03
-RSPDriver.DST_MAC_ADDR_3=00:E0:81:31:DE:8B
-RSPDriver.SRC_IP_ADDR_4=10.10.0.4
-RSPDriver.DST_IP_ADDR_4=10.170.0.4
-RSPDriver.SRC_MAC_ADDR_4=10:FA:00:00:00:04
-RSPDriver.DST_MAC_ADDR_4=00:E0:81:31:20:37
-RSPDriver.SRC_IP_ADDR_5=10.10.0.5
-RSPDriver.DST_IP_ADDR_5=10.170.0.5
-RSPDriver.SRC_MAC_ADDR_5=10:FA:00:00:00:05
-RSPDriver.DST_MAC_ADDR_5=00:E0:81:31:DE:9B
-RSPDriver.SRC_IP_ADDR_6=10.10.0.6
-RSPDriver.DST_IP_ADDR_6=10.170.0.6
-RSPDriver.SRC_MAC_ADDR_6=10:FA:00:00:00:06
-RSPDriver.DST_MAC_ADDR_6=00:E0:81:31:8C:D1
-RSPDriver.SRC_IP_ADDR_7=10.10.0.7
-RSPDriver.DST_IP_ADDR_7=10.170.0.7
-RSPDriver.SRC_MAC_ADDR_7=10:FA:00:00:00:07
-RSPDriver.DST_MAC_ADDR_7=00:E0:81:31:9B:87
-RSPDriver.SRC_IP_ADDR_8=10.10.0.8
-RSPDriver.DST_IP_ADDR_8=10.170.0.8
-RSPDriver.SRC_MAC_ADDR_8=10:FA:00:00:00:08
-RSPDriver.DST_MAC_ADDR_8=00:E0:81:31:B3:26
-RSPDriver.SRC_IP_ADDR_9=10.10.0.9
-RSPDriver.DST_IP_ADDR_9=10.170.0.9
-RSPDriver.SRC_MAC_ADDR_9=10:FA:00:00:00:09
-RSPDriver.DST_MAC_ADDR_9=00:E0:81:31:DF:D5
-RSPDriver.SRC_IP_ADDR_10=10.10.0.10
-RSPDriver.DST_IP_ADDR_10=10.170.0.10
-RSPDriver.SRC_MAC_ADDR_10=10:FA:00:00:00:10
-RSPDriver.DST_MAC_ADDR_10=00:E0:81:31:92:11
-RSPDriver SRC_IP_ADDR_11=10.10.0.11
-RSPDriver.DST_IP_ADDR_11=10.170.0.11
-RSPDriver.SRC_MAC_ADDR_11=10:FA:00:00:00:11
-RSPDriver.DST_MAC_ADDR_11=00:E0:81:31:B2:15
-
+# Define the end of the four SERDES rings. The boards
+# not defined as end of the lane will pass on their
+# cross-correlation or beamlet data to the neighbour board.
 #
-# Define the end of the four SERDES rings. 
+# This also defines which RSP board will output data from which
+# lane on its CDO port (CDO = CEP Data Output).
 #
-# Complete beamforming and cross-correlation results
+# Complete beamforming and cross-correlation data and statistics
 # will be available on the last RSP board in a ring.
+# All other boards in the ring will produce partial 
+# data and statistics.
 #
 # Assuming the index of the last RSP board is N, then
 # the ring starts at RSP board (N - 1) % N_RSPBOARDS
-# The specified
 #
 # Note: the specified RSP board index will be taken
 # modulo N_RSPBOARDS to prevent out of range indices.
@@ -156,7 +102,6 @@ RSPDriver.DST_MAC_ADDR_11=00:E0:81:31:B2:15
 # for difference between operation with data from SERDES
 # ring and without.
 #
-RSPDriver.IGNORE_REMOTE_DATA=0
 RSPDriver.LANE_0_BLET_OUT=0
 RSPDriver.LANE_1_BLET_OUT=1
 RSPDriver.LANE_2_BLET_OUT=2
@@ -165,21 +110,66 @@ RSPDriver.LANE_0_XLET_OUT=0
 RSPDriver.LANE_1_XLET_OUT=1
 RSPDriver.LANE_2_XLET_OUT=2
 RSPDriver.LANE_3_XLET_OUT=3
+RSPDriver.IGNORE_REMOTE_DATA=0
 
 #
 # CDO Control
-# This controls which RSP board outputs which SERDES lane.
+# This controls the format of CEP output data from the serdes lane specified in
+# the previous section.
 #
 # CDO_ENABLE=(0|1)   : when 0 disable output on all RSP boards
 # CDO_N_BLOCKS=(N)   : Set number of blocks of N_BEAMLETS beamlets per output Ethernet frame
 # CDO_N_BEAMLETS=(N) : Set number of beamlets to output in each block
 # CDO_SRCMAC_FORMAT  : Template for the src mac address of the boards that output data to CEP
-#                      First %02x will be replaced by station id, second by lane number
+#   First %02x will be replaced by station id, second by lane number,
+#   e.g. Station 14, lane 3 will be: 10:FA:00:0E:03:01
 #
 RSPDriver.CDO_ENABLE=1
 RSPDriver.CDO_N_BLOCKS=16
 RSPDriver.CDO_N_BEAMLETS=54
 RSPDriver.CDO_SRCMAC_FORMAT=10:FA:00:%02x:%02x:01
+# FTS-1
+RSPDriver.DST_MAC_ADDR_0=00:E0:81:31:DE:8A
+RSPDriver.DST_MAC_ADDR_1=00:E0:81:31:DF:D4
+# CS-1
+# RSPDriver.DST_MAC_ADDR_0=00:E0:81:34:93:3B
+# RSPDriver.DST_MAC_ADDR_1=00:E0:81:31:B0:E1
+RSPDriver.DST_MAC_ADDR_2=00:E0:81:31:B2:F5
+RSPDriver.DST_MAC_ADDR_3=00:E0:81:31:DE:8B
+RSPDriver.DST_MAC_ADDR_4=00:E0:81:31:20:37
+RSPDriver.DST_MAC_ADDR_5=00:E0:81:31:DE:9B
+RSPDriver.DST_MAC_ADDR_6=00:E0:81:31:8C:D1
+RSPDriver.DST_MAC_ADDR_7=00:E0:81:31:9B:87
+RSPDriver.DST_MAC_ADDR_8=00:E0:81:31:B3:26
+RSPDriver.DST_MAC_ADDR_9=00:E0:81:31:DF:D5
+RSPDriver.DST_MAC_ADDR_10=00:E0:81:31:92:11
+RSPDriver.DST_MAC_ADDR_11=00:E0:81:31:B2:15
+
+RSPDriver.SRC_IP_ADDR_0=10.10.0.1
+RSPDriver.SRC_IP_ADDR_1=10.10.0.2
+RSPDriver.SRC_IP_ADDR_2=10.10.0.3
+RSPDriver.SRC_IP_ADDR_3=10.10.0.4
+RSPDriver.SRC_IP_ADDR_4=10.10.0.4
+RSPDriver.SRC_IP_ADDR_5=10.10.0.5
+RSPDriver.SRC_IP_ADDR_6=10.10.0.6
+RSPDriver.SRC_IP_ADDR_7=10.10.0.7
+RSPDriver.SRC_IP_ADDR_8=10.10.0.8
+RSPDriver.SRC_IP_ADDR_9=10.10.0.9
+RSPDriver.SRC_IP_ADDR_10=10.10.0.10
+RSPDriver SRC_IP_ADDR_11=10.10.0.11
+
+RSPDriver.DST_IP_ADDR_0=10.170.0.1
+RSPDriver.DST_IP_ADDR_1=10.170.0.2
+RSPDriver.DST_IP_ADDR_2=10.170.0.3
+RSPDriver.DST_IP_ADDR_3=10.170.0.4
+RSPDriver.DST_IP_ADDR_4=10.170.0.4
+RSPDriver.DST_IP_ADDR_5=10.170.0.5
+RSPDriver.DST_IP_ADDR_6=10.170.0.6
+RSPDriver.DST_IP_ADDR_7=10.170.0.7
+RSPDriver.DST_IP_ADDR_8=10.170.0.8
+RSPDriver.DST_IP_ADDR_9=10.170.0.9
+RSPDriver.DST_IP_ADDR_10=10.170.0.10
+RSPDriver.DST_IP_ADDR_11=10.170.0.11
 
 #
 # Specify the absolute backplane index of the first
diff --git a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
index 1ff7f266a074e7ff7e8b9cca06ce0fc4dd07b338..ecd48fc0eb507e92fe3add729b0683eaabe3ea9d 100644
--- a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
@@ -209,8 +209,11 @@ GCFEvent::TResult SyncAction::waitack_state(GCFEvent& event, GCFPortInterface& p
 	if (m_retries++ > N_RETRIES)
 	{
 	  // abort
-	  LOG_FATAL("maximum retries reached!");
-	  exit(EXIT_FAILURE);
+	  LOG_WARN("maximum retries reached, protocol probably out of sync, trying to continue anyway");
+
+	  // pretend we've completed the update
+	  setCompleted(true);
+	  TRAN(SyncAction::idle_state);
 	}
       }
     }
diff --git a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
index 7778d30783a4c2c84ea3326bb582c675e3fc2beb..e6bc3896bd3918cc2d999c03a1a5f7088edfadd4 100644
--- a/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
+++ b/MAC/APL/PIC/RSPDriver/test/EPAStub.cc
@@ -104,8 +104,14 @@ EPAStub::EPAStub(string name)
   m_reg[MEPHeader::BF][MEPHeader::BF_YIOUT].addr      = new char[MEPHeader::BF_YIOUT_SIZE      * GET_CONFIG("EPAStub.N_BLPS", i)];
   m_reg[MEPHeader::BF][MEPHeader::BF_YIOUT].size      = MEPHeader::BF_YIOUT_SIZE;
 
-  m_reg[MEPHeader::BST][MEPHeader::BST_POWER].addr     = new char[MEPHeader::BST_POWER_SIZE];
-  m_reg[MEPHeader::BST][MEPHeader::BST_POWER].size     = MEPHeader::BST_POWER_SIZE;
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_0].addr = new char[MEPHeader::BST_POWER_SIZE];
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_0].size = MEPHeader::BST_POWER_SIZE;
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_1].addr = new char[MEPHeader::BST_POWER_SIZE];
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_1].size = MEPHeader::BST_POWER_SIZE;
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_2].addr = new char[MEPHeader::BST_POWER_SIZE];
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_2].size = MEPHeader::BST_POWER_SIZE;
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_3].addr = new char[MEPHeader::BST_POWER_SIZE];
+  m_reg[MEPHeader::BST][MEPHeader::BST_POWER_LANE_3].size = MEPHeader::BST_POWER_SIZE;
 
   m_reg[MEPHeader::SST][MEPHeader::SST_POWER].addr     = new char[MEPHeader::SST_POWER_SIZE     * GET_CONFIG("EPAStub.N_BLPS", i)];
   m_reg[MEPHeader::SST][MEPHeader::SST_POWER].size     = MEPHeader::SST_POWER_SIZE;
@@ -217,7 +223,7 @@ EPAStub::EPAStub(string name)
 		  break;
 
 		case MEPHeader::BST:
-		  if (MEPHeader::BST_POWER == regid)
+		    if (0 <= regid < MEPHeader::N_SERDES_LANES)
 		    {
 		      //
 		      // Initialize beamlet statistics register with sensible test pattern