diff --git a/MAC/APL/PIC/TBBDriver/Makefile.am b/MAC/APL/PIC/TBBDriver/Makefile.am
index b09f8718f91e6425ba850adf8f5c1bf1349fe116..df959c599b5ee7639731d18e0149004145ea40ad 100644
--- a/MAC/APL/PIC/TBBDriver/Makefile.am
+++ b/MAC/APL/PIC/TBBDriver/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS=src test include
+SUBDIRS= src test include
 
 pkgextdir     = $(prefix)/config/$(PACKAGE)
 pkgext_DATA   = pkgext pkgextcppflags pkgextcxxflags pkgextldflags
diff --git a/MAC/APL/PIC/TBBDriver/configure.in b/MAC/APL/PIC/TBBDriver/configure.in
index 6263e43c8fcc2c4d539de7c5b4df3cbd7672edee..163839e7a67115450be909aa7ada3e8c41a6a1ef 100644
--- a/MAC/APL/PIC/TBBDriver/configure.in
+++ b/MAC/APL/PIC/TBBDriver/configure.in
@@ -54,7 +54,10 @@ lofar_GENERAL
 dnl lofar_BLITZ
 dnl lofar_MPI
 lofar_INTERNAL(LCS/Common,Common,,1,Common/LofarTypedefs.h,,)
-lofar_INTERNAL(APL/TBB_Protocol,TBB_Protocol,,1,APL/TBB_Protocol/TBB_Protocol.ph,,)
+lofar_INTERNAL(MAC/Test/Suite, suite, , 1, Suite/test.h,,)
+lofar_INTERNAL(MAC/GCF/TM, GCFTM, , 1, GCF/TM/GCF_Control.h,,)
+lofar_INTERNAL(MAC/GCF/GCFCommon, GCFCommon, , 1, GCF/GCF_Defines.h,,)
+lofar_INTERNAL(MAC/APL/PIC/TBB_Protocol,TBB_Protocol,,1,APL/TBB_Protocol/TBB_Protocol.ph,,)
 lofar_INTERNAL(LCS/ACC/APS,aps,,1,APS/ParameterSet.h)
 
 dnl
diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc
index d8f7da8802193942473afb7ee944d102ebd8eeb5..7db70b694d6abe8e0122e263b9519cd42b41c74a 100644
--- a/MAC/APL/PIC/TBBDriver/src/Command.cc
+++ b/MAC/APL/PIC/TBBDriver/src/Command.cc
@@ -145,6 +145,7 @@ void Command::nextChannelNr()
 	
 	do {
 		itsChannel++;
+		if (itsChannel == TS->maxChannels()) break;
 		itsBoard = TS->getChBoardNr(itsChannel);
 		
 		if (itsBoard < TS->maxBoards()) {
@@ -179,8 +180,9 @@ void Command::nextSelectedChannelNr()
 	
 	do {
 		itsChannel++;
+		if (itsChannel == TS->maxChannels()) break;
 		itsBoard = TS->getChBoardNr(itsChannel);
-		
+
 		if (itsBoard < TS->maxBoards()) {
 			// see if board is active and channel is selected
 			if (TS->boardPort(itsBoard).isConnected()
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
index 36587a738287b29a2f680197116b6debf491563a..5bf79045a2f67431f2cfb64289ad530e663b7647 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
@@ -25,6 +25,7 @@
 #include <Common/LofarLogger.h>
 #include <Common/LofarLocators.h>
 #include <APS/ParameterSet.h>
+#include <APS/Exceptions.h>
 #include <GCF/GCF_ServiceInfo.h>
 #include <DriverSettings.h>
 
@@ -119,16 +120,16 @@ void TbbSettings::getTbbSettings()
 		snprintf(dstmac, 64, "TBBDriver.DST_MAC_ADDR_%d", boardnr);
 		
 		try { itsBoardInfo[boardnr].srcIp = globalParameterSet()->getString(srcip); }
-  	catch (...) { LOG_INFO_STR(formatString("%s not found",srcip)); configOK = false; }
+  	catch (APSException&) { LOG_INFO_STR(formatString("%s not found",srcip)); configOK = false; }
 		
 		try { itsBoardInfo[boardnr].dstIp = globalParameterSet()->getString(dstip); }
-  	catch (...) {	LOG_INFO_STR(formatString("%s not found",dstip)); configOK = false; }
+  	catch (APSException&) {	LOG_INFO_STR(formatString("%s not found",dstip)); configOK = false; }
 		
 		try { itsBoardInfo[boardnr].srcMac = globalParameterSet()->getString(srcmac); }
-  	catch (...) { LOG_INFO_STR(formatString("%s not found",srcmac)); }
+  	catch (APSException&) { LOG_INFO_STR(formatString("%s not found",srcmac)); }
 		
 		try { itsBoardInfo[boardnr].dstMac = globalParameterSet()->getString(dstmac); }
-  	catch (...) { LOG_INFO_STR(formatString("%s not found",dstmac)); }
+  	catch (APSException&) { LOG_INFO_STR(formatString("%s not found",dstmac)); }
 		
 		LOG_INFO_STR(formatString("Board %d:",boardnr));
 		LOG_INFO_STR(formatString("Control port: Mac = '%s'"
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
index 51230d81e78b4aa8b73894c8dbd7c6f12b28d6df..741fc04a42c618990b9adec1a4054c0482de0cb0 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
@@ -144,7 +144,7 @@ public:
 	uint32 getMemorySize(int32 boardnr);
 	void setMemorySize(int32 boardnr,uint32 pages);
 	
-	friend class TBBDriver;
+friend class TBBDriver;
 
 protected:	// note TBBDriver must be able to set them
 	void getTbbSettings();
@@ -161,7 +161,7 @@ private:
 	TbbSettings(const TbbSettings&	that);
 	TbbSettings& operator=(const TbbSettings& that);
 
-	// --- Datamembers ---
+	// --- Datamembers ---  
 	int32	itsDriverVersion;
 	int32	itsMaxBoards;	// constants
 	int32	itsMaxChannels;
diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
index e72fde040d6b8e6fa601378354f7e8c626078d09..29b2ba652c8de49d8223878e2728fdc58b81c0bf 100644
--- a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
+++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
@@ -192,15 +192,17 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
   		break;
 	 }
   
-  if (buf.event.signal) // buf.event.signal == 0 indicates unrecognised or invalid MEP message
+  if (buf.event.signal) // buf.event.signal == 0 indicates unrecognised or invalid TP message
 	{				
 		//
 		// Print debugging info
 		// 
+#if 0
 		LOG_DEBUG(formatString("%s receives '%s' on port '%s'",
 							task.getName().c_str(),
 							task.evtstr(buf.event),
 							port.getName().c_str()));
+#endif
 				
 		//
 		// dispatch the TP message as a GCFEvent (which it now is)
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
index 0b1835504afc0ca623b49c436ba5c10dd70ed1f4..0d10170151ae268d52b75a9e142c9f870c1e8f9b 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
@@ -124,7 +124,7 @@ TBBDriver::TBBDriver(string name)
   TS->getTbbSettings();
   
 	cmd = 0;
-	itsActiveBoards = 0x10000000;
+	itsActiveBoards = 0;
 	itsAliveCheck = false;
 	itsActiveBoardsChange = false;
 	itsResetCount = 0;
@@ -165,6 +165,8 @@ TBBDriver::TBBDriver(string name)
 		TS->setBoardPorts(bn,&itsBoard[bn]);	
 	}
 	
+	itsAliveTimer = new GCFTimerPort(*this, "AliveTimer");
+	
 	 // create cmd & msg handler
 	LOG_DEBUG_STR("initializing handlers");
 	cmdhandler = new BoardCmdHandler();
@@ -210,7 +212,7 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port)
       LOG_INFO_STR(formatString("CONNECTED: port '%s'", port.getName().c_str()));
 			
 			if (isEnabled() && !itsAcceptor.isConnected()) {
- 				
+ 			/*	
  				// free all inputs on all boards
  				TPFreeEvent free;
  				free.opcode = TPFREE;
@@ -221,21 +223,21 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port)
  					LOG_DEBUG(formatString("FREE -1 is send to port '%s'", itsBoard[bnr].getName().c_str()));
  				}
  				  
-// 				// clear all boards(FPGA register are set to 0 and firmware is maintained)
-// 				TPClearEvent clear;
-// 				clear.opcode = TPCLEAR;
-// 				clear.status = 0;
-// 				for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) {
-// 					itsBoard[bnr].send(clear);	
-// 					LOG_DEBUG(formatString("CLEAR is send to port '%s'", itsBoard[bnr].getName().c_str()));
-// 				}
+ 				// clear all boards(FPGA register are set to 0 and firmware is maintained)
+ 				TPClearEvent clear;
+ 				clear.opcode = TPCLEAR;
+ 				clear.status = 0;
+ 				for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) {
+ 					itsBoard[bnr].send(clear);	
+ 					LOG_DEBUG(formatString("CLEAR is send to port '%s'", itsBoard[bnr].getName().c_str()));
+ 				}
+ 			*/
 				itsAcceptor.open();
 			}	      			
 			if (itsAcceptor.isConnected()) {
-				
 				TRAN(TBBDriver::idle_state);
-				itsAcceptor.setTimer((long)0);
       }
+      
     } break;
 		
 		case F_TIMER: {
@@ -257,6 +259,8 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port)
 //
 GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 {
+	LOG_DEBUG_STR("idle:" << evtstr(event) << "@" << port.getName());
+	
 	GCFEvent::TResult status = GCFEvent::HANDLED;
   undertaker();
   
@@ -265,6 +269,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 		} break;
         
 		case F_ENTRY:	{
+			LOG_DEBUG_STR("Entering Idle State");
 			// look if there is an Tbb command in queue
 			if (!itsTbbQueue->empty()) {
 				LOG_DEBUG_STR("The queue is NOT empty");
@@ -277,6 +282,10 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 				itsTbbQueue->pop_front();
 				TRAN(TBBDriver::busy_state);
 			}
+			// if no tbb boards start check-alive
+			if (itsActiveBoards == 0) {
+				itsAliveTimer->setTimer((long)0);
+			} 
 		}	break;
         
 		case F_CONNECTED:	{
@@ -311,10 +320,15 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 		}	break;
 		
 		case F_TIMER: {
-			if (&port == &itsAcceptor) {
+			if (&port == itsAliveTimer) {
 				CheckAlive(event, port);
-				TRAN(TBBDriver::busy_state);
 			}
+			
+		} break;
+		
+		case TP_ALIVE_ACK: {
+			LOG_DEBUG("TP_ALIVE_ACK received");
+			CheckAlive(event, port);
 		} break;
 				
 		case TBB_GET_CONFIG: {
@@ -372,7 +386,9 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 		default: {
 			// look if the event is a Tbb event
 			if (SetTbbCommand(event.signal)) {
-				//itsAcceptor.cancelAllTimers();
+				itsAliveTimer->cancelAllTimers();
+				//itsAliveTimer->setTimer(ALIVECHECKTIME);
+				itsAliveTimer->setTimer((long)10);
 				status = cmdhandler->dispatch(event,port);
 				TRAN(TBBDriver::busy_state);
 			} else {
@@ -381,6 +397,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 			}
 		}	break;
 	}
+	LOG_DEBUG_STR("leaving??");
 	return(status);
 }
 
@@ -406,13 +423,15 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		}	break;
 		
 		case F_TIMER: {
-			if (itsAliveCheck) {
-				if (CheckAlive(event, port)) // if true, then all boards are checked
-					TRAN(TBBDriver::idle_state);
-			}
-			if (&port != &itsAcceptor) { 
-				status = cmdhandler->dispatch(event,port); // dispatch time-out event	
+			if (&port == itsAliveTimer) { 
+				if (itsAliveCheck) {
+					CheckAlive(event, port);// if true, then all boards are checked
+				} else {
+					itsAliveTimer->setTimer(ALIVECHECKTIME);
+				}
 			}
+
+			status = cmdhandler->dispatch(event,port); // dispatch time-out event	
 		} break;
 		
 		case F_DISCONNECTED: {
@@ -428,10 +447,8 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		}	break;
 		
 		case TP_ALIVE_ACK: {
-			LOG_DEBUG("TP_ALIVE_ACK received");
-			if (CheckAlive(event, port)) { // if true, then all boards are checked
-				TRAN(TBBDriver::idle_state);
-			}
+			LOG_DEBUG_STR("TP_ALIVE_ACK received");
+			CheckAlive(event, port);
 		} break;
 		
 		case TBB_GET_CONFIG: {
@@ -490,13 +507,11 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		case TP_WRITER_ACK:
 		case TP_READX_ACK:	
 		{
-			if (cmdhandler->tpCmdDone() == false) {
-				status = cmdhandler->dispatch(event,port); // dispatch ack from boards
-			}
+			status = cmdhandler->dispatch(event,port); // dispatch ack from boards
 			
 			if (cmdhandler->tpCmdDone() == true) {
-				// set ALIVE timer, and check for resets
-				//itsAcceptor.setTimer((long)5);
+				itsAliveTimer->setTimer((long)2);
+				itsAliveCheck = false;
 				TRAN(TBBDriver::idle_state);
 			}
 		}	break;	
@@ -505,17 +520,22 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 			LOG_DEBUG("DEFAULT");
 			if (cmdhandler->tpCmdDone() == true){
 				// set ALIVE timer, and check for resets
-				//itsAcceptor.setTimer((long)5);
+				//if (!itsAliveCheck) {
+				//	itsAliveTimer->setTimer((long)1);
+				//	itsAliveCheck = false;
+				//}
 				TRAN(TBBDriver::idle_state);
+			} else {
+			
+				// put event on the queue
+				TbbEvent tbbevent;
+				tbbevent.length = event.length;
+				tbbevent.event = new uint8[tbbevent.length];
+				memcpy(tbbevent.event, &event, tbbevent.length);			
+				//tbbevent.signal = event.signal;
+				tbbevent.port = &port;
+				itsTbbQueue->push_back(tbbevent);
 			}
-			// put event on the queue
-			TbbEvent tbbevent;
-			tbbevent.length = event.length;
-			tbbevent.event = new uint8[tbbevent.length];
-			memcpy(tbbevent.event, &event, tbbevent.length);			
-			//tbbevent.signal = event.signal;
-			tbbevent.port = &port;
-			itsTbbQueue->push_back(tbbevent);
 			status = GCFEvent::NOT_HANDLED;
 		}	break;
 	}
@@ -567,11 +587,12 @@ bool TBBDriver::isEnabled()
 //-----------------------------------------------------------------------------
 bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
 {
-	bool done = false;
+	//bool done = false;
 	static int32 boardnr;
 	static uint32 activeboards;
 	static uint32 checkmask;
 	
+	itsAliveTimer->cancelAllTimers();
 	if (!itsAliveCheck) {
 		itsAliveCheck	= true;
 		boardnr				= 0;
@@ -582,21 +603,29 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
 			checkmask |= (1 << nr);
 		}
 		itsBoard[boardnr].send(*itsAlive);
-		itsBoard[boardnr].setTimer(TS->timeout());
+		itsAliveTimer->setTimer(TS->timeout());
 	} else {
-		itsBoard[boardnr].cancelAllTimers();
 		checkmask &= ~(1 << boardnr);
 				
-		if ((event.signal == TP_ALIVE_ACK) && (&port == &itsBoard[boardnr])){
-			// new board, send free-cmd
+		if (event.signal == TP_ALIVE_ACK){
+			// new board, send free and clear cmd 
 			if ((itsActiveBoards & (1 << boardnr)) == 0) {  // is it a new board ??
+ 				// free all inputs on all boards
  				TPFreeEvent free;
  				free.opcode = TPFREE;
  				free.status = 0;
  				free.channel = 0xFFFFFFFF;  // send channel = -1 to free all inputs
 				itsBoard[boardnr].send(free);	
 				LOG_DEBUG_STR(formatString("FREE -1 is send to port '%s'", itsBoard[boardnr].getName().c_str()));
+				
+				// clear all boards(FPGA register are set to 0 and firmware is maintained)
+ 				TPClearEvent clear;
+ 				clear.opcode = TPCLEAR;
+ 				clear.status = 0;
+				itsBoard[boardnr].send(clear);	
+ 				LOG_DEBUG(formatString("CLEAR is send to port '%s'", itsBoard[boardnr].getName().c_str()));
 			}
+			
 			activeboards |= (1 << boardnr);
 			TPAliveAckEvent ack(event);
 			if (ack.resetflag == 0){
@@ -608,7 +637,7 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
 		boardnr++;
 		if (boardnr < TS->maxBoards()) {
 			itsBoard[boardnr].send(*itsAlive);
-			itsBoard[boardnr].setTimer(TS->timeout());
+			itsAliveTimer->setTimer(TS->timeout());
 		}
 	}
 	
@@ -636,12 +665,12 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
 		}
 		LOG_DEBUG_STR("Active TBB boards check");
 		if (itsActiveBoards == 0) {
-			itsAcceptor.setTimer((long)5);
+			itsAliveTimer->setTimer((long)5);
 		} else {
-			itsAcceptor.setTimer(ALIVECHECKTIME);
+			itsAliveTimer->setTimer(ALIVECHECKTIME);
 		}
 		itsAliveCheck = false;
-		done = true;
+		//done = true;
 	}
 	return(!itsAliveCheck);
 }
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
index e5a260d39c47331234074679eff58d02100cbfc4..5b7e57f74c0966b738b1377f2d2efe2bea1ca733 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
@@ -11,25 +11,26 @@ TBBDriver.IF_NAME=eth1
 #
 # Communication settings for TBB boards
 #
-TBBDriver.TP_RETRIES=5
+TBBDriver.TP_RETRIES=1
 TBBDriver.TP_TIMEOUT=0.5
 
 #
 # Specify the MAC addresses of all TBB boards
 #
+# 00:30:48:2D:82:F7 is used for testing with stub
 #TBBDriver.MAC_ADDR_0=00:30:48:2D:82:F7
 TBBDriver.MAC_ADDR_0=10:FA:00:00:00:02
-TBBDriver.MAC_ADDR_1=10:FA:00:00:01:02
-TBBDriver.MAC_ADDR_2=10:FA:00:00:02:02
-TBBDriver.MAC_ADDR_3=10:FA:00:00:03:02
-TBBDriver.MAC_ADDR_4=10:FA:00:00:04:02
-TBBDriver.MAC_ADDR_5=10:FA:00:00:05:02
-TBBDriver.MAC_ADDR_6=10:FA:00:00:06:02
-TBBDriver.MAC_ADDR_7=10:FA:00:00:07:02
-TBBDriver.MAC_ADDR_8=10:FA:00:00:08:02
-TBBDriver.MAC_ADDR_9=10:FA:00:00:09:02
-TBBDriver.MAC_ADDR_10=10:FA:00:00:0A:02
-TBBDriver.MAC_ADDR_11=10:FA:00:00:0B:02
+TBBDriver.MAC_ADDR_1=10:FA:00:00:02:02
+TBBDriver.MAC_ADDR_2=10:FA:00:00:04:02
+TBBDriver.MAC_ADDR_3=10:FA:00:00:06:02
+TBBDriver.MAC_ADDR_4=10:FA:00:00:08:02
+TBBDriver.MAC_ADDR_5=10:FA:00:00:0A:02
+TBBDriver.MAC_ADDR_6=10:FA:00:00:0C:02
+TBBDriver.MAC_ADDR_7=10:FA:00:00:0E:02
+TBBDriver.MAC_ADDR_8=10:FA:00:00:10:02
+TBBDriver.MAC_ADDR_9=10:FA:00:00:12:02
+TBBDriver.MAC_ADDR_10=10:FA:00:00:14:02
+TBBDriver.MAC_ADDR_11=10:FA:00:00:16:02
 #
 # End of TBB-board MAC address configuration
 
@@ -66,38 +67,45 @@ TBBDriver.MAC_ADDR_11=10:FA:00:00:0B:02
 #TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:15
 
 # CS10:
-TBBDriver.DST_MAC_ADDR_0=00:0A:5E:56:1B:A8
 #TBBDriver.DST_MAC_ADDR_0=00:E0:81:34:93:3B
-TBBDriver.DST_MAC_ADDR_1=00:E0:81:34:93:3B
-TBBDriver.DST_MAC_ADDR_2=00:E0:81:31:B0:E1
-TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:F5
+#TBBDriver.DST_MAC_ADDR_1=00:E0:81:34:93:3B
+#TBBDriver.DST_MAC_ADDR_2=00:E0:81:31:B0:E1
+#TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:F5
+
+# Used for testing the CEP port.
+# ASTRON46:
+TBBDriver.DST_MAC_ADDR_0=00:0A:5E:56:1B:A8
+TBBDriver.DST_MAC_ADDR_1=00:0A:5E:56:1B:A8
+
 #
 # End of Destination MAC address configuration
 
 
-# Source IP address in UDP header for each RSP board
+# Source IP address in UDP header for each TBB board
 #
-TBBDriver.SRC_IP_ADDR_0=10.10.0.1
-TBBDriver.SRC_IP_ADDR_1=10.10.0.2
-TBBDriver.SRC_IP_ADDR_2=10.10.0.3
-TBBDriver.SRC_IP_ADDR_3=10.10.0.4
-TBBDriver.SRC_IP_ADDR_4=10.10.0.5
-TBBDriver.SRC_IP_ADDR_5=10.10.0.6
-TBBDriver.SRC_IP_ADDR_6=10.10.0.7
-TBBDriver.SRC_IP_ADDR_7=10.10.0.8
-TBBDriver.SRC_IP_ADDR_8=10.10.0.9
-TBBDriver.SRC_IP_ADDR_9=10.10.0.10
-TBBDriver.SRC_IP_ADDR_10=10.10.0.11
-TBBDriver.SRC_IP_ADDR_11=10.10.0.12
+TBBDriver.SRC_IP_ADDR_0=10.10.0.64
+TBBDriver.SRC_IP_ADDR_1=10.10.0.65
+TBBDriver.SRC_IP_ADDR_2=10.10.0.66
+TBBDriver.SRC_IP_ADDR_3=10.10.0.67
+TBBDriver.SRC_IP_ADDR_4=10.10.0.68
+TBBDriver.SRC_IP_ADDR_5=10.10.0.69
+TBBDriver.SRC_IP_ADDR_6=10.10.0.70
+TBBDriver.SRC_IP_ADDR_7=10.10.0.71
+TBBDriver.SRC_IP_ADDR_8=10.10.0.72
+TBBDriver.SRC_IP_ADDR_9=10.10.0.73
+TBBDriver.SRC_IP_ADDR_10=10.10.0.74
+TBBDriver.SRC_IP_ADDR_11=10.10.0.75
 #
 # End of Source IP address configuration
 
 
 # Destination IP adress in UDP header for each TBB board
 #
+# for CEP port on ASTRON-46 use 0.0.0.0
 TBBDriver.DST_IP_ADDR_0=0.0.0.0
+TBBDriver.DST_IP_ADDR_1=0.0.0.0
 #TBBDriver.DST_IP_ADDR_0=10.170.0.1
-TBBDriver.DST_IP_ADDR_1=10.170.0.2
+#TBBDriver.DST_IP_ADDR_1=10.170.0.2
 TBBDriver.DST_IP_ADDR_2=10.170.0.3
 TBBDriver.DST_IP_ADDR_3=10.170.0.4
 TBBDriver.DST_IP_ADDR_4=10.170.0.5
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
index 8355108ebc03ff97ab10774a48e987fb7077621c..68a69d9ed194c4ed70cc3799ddb1528daebbc00a 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
@@ -29,6 +29,7 @@
 #include <GCF/TM/GCF_Control.h>
 #include <GCF/TM/GCF_ETHRawPort.h>
 #include <GCF/TM/GCF_DevicePort.h>
+#include <GCF/TM/GCF_TimerPort.h>
 
 #include <Common/lofar_deque.h>
 
@@ -117,8 +118,9 @@ namespace LOFAR{
 			std::deque<TbbEvent> *itsTbbQueue;
 			
 			GCFTCPPort      itsAcceptor;     // listen for clients on this port
-			GCFETHRawPort   *itsBoard;        // array of ports, one for each TBB board
-			
+			GCFETHRawPort*	itsBoard;        // array of ports, one for each TBB board
+			GCFTimerPort*		itsAliveTimer;
+			  
 			std::list<GCFPortInterface*> itsClientList;  // list of clients
 			std::list<GCFPortInterface*> itsDeadClients; // list of clients to cleanup
     };
diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
index 43c88416239db78252df8d9232d8858dbb01c7ce..de267cdcf904baa3fec06a2d58d065a73d6491ce 100644
--- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
@@ -32,7 +32,7 @@ using namespace TBB_Protocol;
 using namespace TP_Protocol;
 using namespace TBB;
 
-static const uint16 BASEUDPPORT = 0x10FA; // (=4346) start numbering src and dst UDP ports at this number (4346)
+static const uint16 BASEUDPPORT = 0x7BB0; // (=61664) start numbering src and dst UDP ports at this number (4346)
 static const uint16 TRANSIENT_FRAME_SIZE = 2140; // bytes, header(88) + payload(2048) + CRC(4)
 static const uint16 SUBBANDS_FRAME_SIZE = 2012;  // bytes, header(88) + payload(1920) + CRC(4)
 
diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
index 0ff1b7aabcf63f9c82f113868c687aa8b55f96ac..c3ec24de42982a1c063fc7d9ddb774a0ea9914d9 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
@@ -103,9 +103,11 @@ void WritefCmd::saveTbbEvent(GCFEvent& event)
 	LOG_DEBUG_STR(formatString("TP file: %s",itsFileNameTp));
 	LOG_DEBUG_STR(formatString("MP file: %s",itsFileNameMp));
 	
-	itsImageData = new uint8[1966080];
-			
+	//itsImageData = new uint8[1966080];
+	itsImageData = new uint8[2097152];
+				
 	readFiles();
+	LOG_DEBUG_STR("Image files are read");
 	
 	itsImage 	= itsTBBE->image;
 	itsSector	= (itsImage * FL_SECTORS_IN_PAGE);
@@ -329,30 +331,44 @@ void WritefCmd::readFiles()
 	int dataPtr = 0;
 	int ch_h, ch_l;
 	
+	LOG_DEBUG_STR("Opening TP file");
 	// load Tp hex file
 	itsFile = fopen(itsFileNameTp,"r");
+	if (itsFile == 0) {
+		LOG_DEBUG_STR("Error on opening TP file");
+		return;
+	}
 	
-	ch_h = getc(itsFile);
-	ch_l = getc(itsFile);
-	while (ch_l != EOF) {
-		itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l);
-		dataPtr++;
+	LOG_DEBUG_STR("Getting TP file");
+	while (1) {
 		ch_h = getc(itsFile);
+		if (ch_h == EOF) break;
 		ch_l = getc(itsFile);
+		if (ch_l == EOF) break;	
+		itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l);
+		dataPtr++;
 	}
+	LOG_DEBUG_STR("Closing TP file");
 	fclose(itsFile);
 	
+	LOG_DEBUG_STR("Opening MP file");
 	// load Mp hex file
 	itsFile = fopen(itsFileNameMp,"r");
+	if (itsFile == 0) {
+		LOG_DEBUG_STR("Error on opening MP file");
+		return;
+	}
 	
-	ch_h = getc(itsFile);
-	ch_l = getc(itsFile);
-	while (ch_l != EOF) {
-		itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l);
-		dataPtr++;
+	LOG_DEBUG_STR("Getting MP file");   
+	while (1) {
 		ch_h = getc(itsFile);
+		if (ch_h == EOF) break;
 		ch_l = getc(itsFile);
+		if (ch_l == EOF) break;
+		itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l);
+		dataPtr++;
 	}
+	LOG_DEBUG_STR("Closing MP file");    
 	fclose(itsFile);
 	
 	itsImageSize = dataPtr;
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
index 9fc800f2bd70e61e5e7ef01f32e86fabb8a48275..1cb8916ca54c636dfbc76f7efec1cef5ab12ed5c 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
@@ -1321,7 +1321,7 @@ GCFEvent::TResult WriterCmd::ack(GCFEvent& e)
 
 //---- READPAGE ------------------------------------------------------------------
 ReadPageCmd::ReadPageCmd(GCFPortInterface& port) : Command(port),
-	itsRcu(0),itsPages(1),itsCmdStage(0),itsPage(0),itsAddr(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0),
+	itsRcu(0),itsStartPage(0),itsPages(1),itsCmdStage(0),itsPage(0),itsTotalSize(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0),
 	itsStationId(0),itsRspId(0),itsRcuId(0),itsSampleFreq(0),itsTime(0),itsSampleNr(0),itsSamplesPerFrame(0),
 	itsFreqBands(0),itsTotalSamples(0),itsTotalBands(0)
 {
@@ -1333,19 +1333,27 @@ void ReadPageCmd::send()
 {
 	
 	switch (itsCmdStage) {
-		case 0: {
+		
+		case 0: {	// get info about allocated RCU's
 			TBBRcuInfoEvent send;
 			itsPort.send(send);
 			itsPort.setTimer((long)1);
 		} break;
 		
-		case 1: {
+		case 1: {	// get total memmory size
+  		TBBSizeEvent send;
+  		send.boardmask = (1 << itsBoard);
+  		itsPort.send(send);
+  		itsPort.setTimer((long)1);
+		} break;
+		
+		case 2: {	// write page address to board
 			TBBWriterEvent send;
 			send.board = itsBoard;
 			send.mp = itsMp;
 			send.pid = PID6;
 			send.regid = REGID1;
-			send.data[0] = itsAddr;
+			send.data[0] = (itsStartPage + itsPage);
 			send.data[1] = 0; 
 			send.data[2] = 0;
 			itsPort.send(send);
@@ -1355,7 +1363,7 @@ void ReadPageCmd::send()
 				send.mp,send.pid,send.regid,send.data[0]));
 		} break;
 		
-		case 2: {
+		case 3: { // write page-read-cmd to board
 			TBBWriterEvent send;
 			send.board = itsBoard;
 			send.mp = itsMp;
@@ -1371,7 +1379,7 @@ void ReadPageCmd::send()
 				send.mp,send.pid,send.regid,send.data[0]));
 		} break;
 		
-		case 3: {
+		case 4: { // read first part of frame
 			TBBReadxEvent send;
 			send.board = itsBoard;	
 			send.mp = itsMp;
@@ -1386,7 +1394,7 @@ void ReadPageCmd::send()
 				send.mp,send.pid,send.regid,send.pagelength,send.pageaddr));
 		} break;
 		
-		case 4: {
+		case 5: {	// read second part of frame
 			TBBReadxEvent send;
 			send.board = itsBoard;	
 			send.mp = itsMp;
@@ -1412,18 +1420,19 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 	int16 val[1400];
 		
 	switch (itsCmdStage) {
+		
 		case 0: {
-			int rcu;
-			rcu = getRcu();
 			TBBRcuInfoAckEvent ack(e);
-			itsState = ack.rcu_state[rcu];
-			itsStartAddr = ack.rcu_start_addr[rcu];
-			itsSize = ack.rcu_pages[rcu];
-			itsBoard = ack.rcu_on_board[rcu];
-			itsMp = static_cast<int32>(ack.rcu_on_input[rcu]) / 4;
-			//logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp));
+			itsRcu = getRcu();
+			itsState = ack.rcu_state[itsRcu];
+			itsStartAddr = ack.rcu_start_addr[itsRcu];
+			itsSize = ack.rcu_pages[itsRcu];
+			itsBoard = ack.rcu_on_board[itsRcu];
+			itsMp = static_cast<int32>(ack.rcu_on_input[itsRcu] / 4);
+			logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",itsRcu,itsBoard,itsMp));
+			
+			itsStartPage += itsStartAddr;
 			
-			itsAddr = itsStartAddr;
 			if (itsState == 'F') {
 				logMessage(cout,"Rcu not allocated");
 				itsCmdStage = 10;
@@ -1431,6 +1440,20 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		} break;
 				
 		case 1: {
+  		TBBSizeAckEvent ack(e);
+  		if (!(ack.status_mask[itsBoard] & TBB_SUCCESS)) {
+				logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask[itsBoard]).c_str()));
+				itsCmdStage = 10;
+			} else {
+				itsTotalSize = ack.npages[itsBoard] / 4;
+				if ((itsStartPage < itsStartAddr) || (itsStartPage > (itsStartAddr + itsTotalSize))) {
+					logMessage(cout,formatString("Requested Page belongs not to rcu-%d", itsRcu));			 
+				}
+				logMessage(cout,formatString("StartPage = %u ",itsStartPage));			 
+			}
+		} break;
+		
+		case 2: {
 			TBBWriterAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str()));
@@ -1438,7 +1461,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			}
 		} break;
 		
-		case 2: {
+		case 3: {
 			TBBWriterAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str()));
@@ -1446,7 +1469,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			}
 		} break;
 		
-		case 3: {
+		case 4: {
 			TBBReadxAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str()));
@@ -1459,7 +1482,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			}
 		} break;
 		
-		case 4: {
+		case 5: {
 			TBBReadxAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str()));
@@ -1478,7 +1501,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 	}
 	
 	itsCmdStage++;
-	if (itsCmdStage < 5) {
+	if (itsCmdStage < 6) {
 		//itsPort.setTimer(0.01);
 	} else { 
 		
@@ -1547,14 +1570,14 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 				}
 			}
 		}
+		// write all data to file
+		FILE* file;
+		char line[10][256];
+		char basefilename[PATH_MAX];
+		char filename[PATH_MAX];
+		char timestring[256];
+		
 		if (val_cnt > 0) {
-			// write all data to file
-			FILE* file;
-			char line[10][256];
-			char basefilename[PATH_MAX];
-			char filename[PATH_MAX];
-			char timestring[256];
-			
 			strftime(timestring, 255, "%Y%m%d_%H%M%S", gmtime(&itsTime));
 			snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId);
 			
@@ -1562,49 +1585,53 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			file = fopen(filename,"a");
 			fwrite(val,sizeof(int16),val_cnt,file);
 			fclose(file);
+		}
+		itsPage++;
+		if (itsPage < itsPages) {
+			itsCmdStage = 2;
+		}	else {
+			// print page information
+			strftime(timestring, 255, "%Y-%m-%d  %H:%M:%S", gmtime(&itsTime));
 			
-			itsPage++;
-			if (itsPage < itsPages) {
-				itsCmdStage = 1;
-				itsAddr = itsStartAddr + itsPage;
-				//itsPort.setTimer(0.02);
+			sprintf(line[0],"Station ID      : %d",itsStationId);
+			sprintf(line[1],"RSP ID          : %d",itsRspId);
+			sprintf(line[2],"RCU ID          : %d",itsRcuId);
+			sprintf(line[3],"Sample freq     : %d MHz",itsSampleFreq);
+			if (itsTime < 0) {
+				sprintf(line[4],"Time            : invalid");
+			} else {
+				sprintf(line[4],"Time            : %s (%u)",timestring,(uint32)itsTime);
+			}
+			sprintf(line[5],"SampleNr        : %u",itsSampleNr);
+			if (itsTotalBands) {
+				sprintf(line[6],"FreqBands       : %u",itsTotalBands);
+				sprintf(line[7],"Data file format: binary complex(int16 Re, int16 Im)");
 			}	else {
-				// print page information
-				strftime(timestring, 255, "%Y-%m-%d  %H:%M:%S", gmtime(&itsTime));
-				
-				sprintf(line[0],"Station ID      : %d",itsStationId);
-				sprintf(line[1],"RSP ID          : %d",itsRspId);
-				sprintf(line[2],"RCU ID          : %d",itsRcuId);
-				sprintf(line[3],"Sample freq     : %d MHz",itsSampleFreq);
-				if (itsTime < 0) {
-					sprintf(line[4],"Time            : invalid");
-				} else {
-					sprintf(line[4],"Time            : %s (%u)",timestring,(uint32)itsTime);
-				}
-				sprintf(line[5],"SampleNr        : %u",itsSampleNr);
-				if (itsTotalBands) {
-					sprintf(line[6],"FreqBands       : %u",itsTotalBands);
-					sprintf(line[7],"Data file format: binary complex(int16 Re, int16 Im)");
-				}	else {
-					sprintf(line[6],"Samples         : %u",itsTotalSamples);
-					sprintf(line[7],"Data file format: binary  int16");
-				}
+				sprintf(line[6],"Samples         : %u",itsTotalSamples);
+				sprintf(line[7],"Data file format: binary  int16");
+			}
+			if (val_cnt > 0) {
 				sprintf(line[8],"Filename        : %s.nfo",basefilename);
 				sprintf(line[9],"                : %s.dat",basefilename);
-							
+			} else {
+				sprintf(line[8],"Filename        : NO DATA IN FRAME");
+				sprintf(line[9],"                : ");
+			}
+			
+			if (val_cnt > 0) {			
 				snprintf(filename, PATH_MAX, "%s.nfo",basefilename);
 				file = fopen(filename,"w");		
-										
+									
 				for (int32 lnr = 0;lnr < 10; lnr++) {
-					logMessage(cout,line[lnr]);
 					fprintf(file,line[lnr]);
 					fprintf(file,"\n");
 				}
-				logMessage(cout,"\n");
-				fclose(file);	
+				fclose(file);
+			}
+			
+			for (int32 lnr = 0;lnr < 10; lnr++) {
+				logMessage(cout,line[lnr]);
 			}
-		}	else {
-			logMessage(cout,"No data in Frame");
 		}
 	}
 	if (itsPage == itsPages) {
@@ -1627,7 +1654,7 @@ void TBBCtl::help()
 	logMessage(cout,"#  --command --select=<set> : only information for all selected boards or rcu's is displayed\n"
 									"#    Example: --select=0,1,4  or  --select=0:6  or  --select=0,1,2,8:11\n");
 	logMessage(cout,"tbbctl --alloc [--select=<set>]                                    # allocate memmory locations for selected rcu's");
-	logMessage(cout,"tbbctl --free [--select=<set>]                                     # free memmory locationsfor selected rcu's");
+	logMessage(cout,"tbbctl --free [--select=<set>]                                     # free memmory locations for selected rcu's");
 	logMessage(cout,"tbbctl --record [--select=<set>]                                   # start recording on selected rcu's");
 	logMessage(cout,"tbbctl --stop [--select=<set>]                                     # stop recording on all selected rcu's");
 	logMessage(cout,"tbbctl --rcuinfo [--select=<set>]                                  # list rcu info for all allocated rcu's\n");
@@ -1647,13 +1674,13 @@ void TBBCtl::help()
 	logMessage(cout,"tbbctl --eraseimage=board,image                                    # erase image from flash");
 	logMessage(cout,"tbbctl --readimage=board,image                                     # read image from flash to file");
 	logMessage(cout,"tbbctl --writeimage=boardnr,imagenr,version,tpfilename,mpfilename  # write tp and mp file to imagenr on boardnr");
-	logMessage(cout,"                                                                   # version is the version of the image stored");
+	logMessage(cout,"                                                                   # version is the sw version of the image stored");
 	logMessage(cout,"tbbctl --imageinfo=board                                           # read info from all images on board\n");
 	
-	logMessage(cout,"tbbctl --readddr=board,mp,addr,size                                # read 2 words from DDR2 memory");
-	logMessage(cout,"tbbctl --writeddr=board,mp,addr,wordL,wordH                        # write 2 words to DDR2 memory at addr");
-	logMessage(cout,"tbbctl --testddr=board                                             # test all adress lines from DDR2 memory");
-	logMessage(cout,"tbbctl --readpage=rcunr,npages                                     # read from rcunr, npages from DDR2 memory");
+	logMessage(cout,"tbbctl --readddr=board,mp,addr,size                                # DDR2 read, (size x 2) words starting on addr");
+	logMessage(cout,"tbbctl --writeddr=board,mp,addr,wordL,wordH                        # DDR2 write, 2 words to starting on addr");
+	logMessage(cout,"tbbctl --testddr=board                                             # DDR2 memory test, adress and data lines");
+	logMessage(cout,"tbbctl --readpage=rcunr,startpage,npages                           # DDR2 read npages from rcunr, starting on startpage");
 	logMessage(cout,"tbbctl --clear [--select=<set>]                                    # clear selected board");
 	logMessage(cout,"tbbctl --reset [--select=<set>]                                    # reset to factory images on selected boards");
 	logMessage(cout,"tbbctl --config=imagenr [--select=<set>]                           # reconfigure TP and MP's with imagenr [0..31] on ");
@@ -2169,22 +2196,24 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 				
 				if (optarg) {
 					int32 rcu = 0;
+					uint32 startpage = 0;
 					uint32 pages = 0;
 					
-					int numitems = sscanf(optarg, "%d,%u", &rcu,&pages);
+					int numitems = sscanf(optarg, "%d,%u,%u", &rcu,&startpage,&pages);
 					
-					if (numitems < 2 || numitems == EOF || rcu < 0 || rcu >= MAX_N_RCUS) {
-						logMessage(cerr,"Error: invalid read ddr value. Should be of the format "
-								"'--readw=board,mp,addr' where rcu= 0..191");  
+					if (numitems < 3 || numitems == EOF || rcu < 0 || rcu >= MAX_N_RCUS) {
+						logMessage(cerr,"Error: invalid readpage value's. Should be of the format "
+								"'--readpage=rcu,startpage,pages' where rcu= 0..191");  
 						exit(EXIT_FAILURE);
 					}
+					readddrcmd->setStartPage(startpage);
 					readddrcmd->setPages(pages);
 					select.clear();
 		  		select.push_back(rcu);
 		  		command->setSelected(true);
 				}	else {
-					logMessage(cerr,"Error: invalid read ddr value. Should be of the format "
-								"'--readw=board,mp,addr' where board= 0..11, mp= 0..3 and addr= 0x..");  
+					logMessage(cerr,"Error: invalid readpage value's. Should be of the format "
+							"'--readpage=rcu,startpage,pages' where rcu= 0..191");  
 						exit(EXIT_FAILURE);
 				}
 				command->setCmdType(BOARDCMD);
@@ -2501,8 +2530,8 @@ void TBBCtl::mainloop()
 int main(int argc, char** argv)
 {
   GCFTask::init(argc, argv);
-
-  LOG_INFO(formatString("Program %s has started", argv[0]));
+  
+  LOG_DEBUG(formatString("Program %s has started", argv[0]));
 
   TBBCtl tbbctl("tbbctl", argc, argv);
 
@@ -2511,10 +2540,11 @@ int main(int argc, char** argv)
   }
   catch (Exception e) {
     cerr << "Exception: " << e.text() << endl;
+    cout << endl << "== abnormal termination of tbbctl ============================================" << endl;
     exit(EXIT_FAILURE);
   }
-	
-  LOG_INFO("Normal termination of program");
+	cout << endl << "== normal termination of tbbctl ==============================================" << endl;
+  LOG_DEBUG("Normal termination of program");
 
   return(0);
 }
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
index da6c72e79a02a869ab06987923f03b688c24e090..fb261114fcee21428264c9ca88f5adc02818b655 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
@@ -65,7 +65,7 @@ class Command
 public:
 	virtual ~Command()
 	{
-		logMessage(cout,formatString("=============================================================================="));
+		//logMessage(cout,formatString("=============================================================================="));
 	}
 	
 	// Send the command to the TBBDriver
@@ -627,7 +627,7 @@ class ReadPageCmd : public Command
 		virtual void send();
 		virtual GCFEvent::TResult ack(GCFEvent& e);
 		void setMp(int32 mp)		{	itsMp = mp;	}
-		void setAddr(uint32 addr)  { itsAddr = addr; }
+		void setStartPage(uint32 startpage)  { itsStartPage = startpage; }
 		void setPages(uint32 pages)  { itsPages = pages; }
 		static const uint32 PID6 = 6;
 		static const uint32 REGID0 = 0;
@@ -640,11 +640,12 @@ class ReadPageCmd : public Command
 	private:
 		// values given by user
 		int32		itsRcu;
+		uint32	itsStartPage;
 		uint32	itsPages;
 		// values used in program
 		int32		itsCmdStage;
 		uint32	itsPage;
-		uint32	itsAddr;
+		uint32	itsTotalSize;
 		// data from channelInfoCmd
 		char		itsState;		
 		uint32	itsStartAddr;
diff --git a/MAC/APL/PIC/TBBDriver/test/Makefile.am b/MAC/APL/PIC/TBBDriver/test/Makefile.am
index ec80547db8f5bc80cca6d03866d45aa7658cd156..6bd14e99be55fc9dc2d9e58ffb78bea05eff9c3b 100644
--- a/MAC/APL/PIC/TBBDriver/test/Makefile.am
+++ b/MAC/APL/PIC/TBBDriver/test/Makefile.am
@@ -1,3 +1,5 @@
+#<<<<<<< Makefile.am
+#=======
 check_PROGRAMS        =
 
 # programs to run through supplied checktools
@@ -5,21 +7,91 @@ CHECKTOOLPROGS        =
 #ENDCHECKTOOLPROGS
 
 # scripts used to run tests
-TESTSCRIPTS           =
+#TESTSCRIPTS           =
 
 # scripts and possible programs to run tests
-TESTS	              = $(TESTSCRIPTS)
+#TESTS	              = $(TESTSCRIPTS)
 
 XFAIL_TESTS           =
 
 # all files (.run, .stdout, .in, .log_prop, etc.) needed to run tests
-EXTRA_DIST            = $(TESTSCRIPTS)
+#EXTRA_DIST            = $(TESTSCRIPTS)
 
 # Lines to build a test program testprg
 #testprg_SOURCES		= testprg.cc
 #testprg_LDADD			= ../src/libtbbdriver.la
 #testprg_DEPENDENCIES		= ../src/libtbbdriver.la $(LOFAR_DEPEND)
 
+#>>>>>>> 1.2
 
+AM_CPPFLAGS = \
+	-I$(top_srcdir)/src \
+	-I$(top_builddir)/src
+
+# TESTS = \
+# 	TBBTest \
+# 	TPStub
+
+AUTOGEN = autogen
+SUFFIXES = .ph
+%.cc: %.prot
+	$(AUTOGEN) --writable -L $(datadir)/GCF/TM $<
+	cp $*.ph $(top_builddir)/include/TBBDriver/TP_Protocol
+
+%.ph: %.prot
+	$(AUTOGEN) --writable -L $(datadir)/GCF/TM $<
+	cp $*.ph $(top_builddir)/include/TBBDriver/TP_Protocol
+	
+BUILT_SOURCES = \
+	TBBTest.conf \
+	TPStub.conf 
+
+lib_LTLIBRARIES = \
+	libtbbstub.la	
+	
+EXTRA_DIST = \
+	$(BUILT_SOURCES) \
+	TP_Protocol.prot 
+
+sysconf_DATA = \
+	TPStub.conf \
+	TBBTest.conf 
+
+
+%.properties: $(MAC_CONFIG)/%.properties
+	cp $< $@
+
+%.conf: %.conf.in
+	cp $< $@
+
+libtbbstub_la_SOURCES = \
+	StubRawEvent.h \
+	StubRawEvent.cc 
+
+bin_PROGRAMS = \
+	TPStub \
+	TBBTest
+
+#check_PROGRAMS = \
+#	TBBTest
+
+TBBTest_SOURCES = \
+	TBBTest.h \
+	TBBTest.cc
+
+TPStub_SOURCES = \
+	TPStub.h \
+	TPStub.cc
+
+TPStub_LDADD = \
+	libtbbstub.la \
+  $(top_builddir)/src/libtp_protocol.la \
+  $(top_builddir)/src/libtbbdriver.la
+ 
+TPStub_DEPENDENCIES = \
+	libtbbstub.la \
+	$(top_builddir)/src/libtbbdriver.la \
+	$(top_builddir)/src/libtp_protocol.la \
+	$(LOFAR_DEPEND)
 
 include $(top_srcdir)/Makefile.common
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
index 0033edacc8a178f7a87e48c3be9c8181368d9daf..cf0576a50d98ae894a6eb910f31b6ef955c98a1c 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc
@@ -24,19 +24,20 @@
 #include <lofar_config.h>
 #include <Common/LofarLogger.h>
 
+#include <GCF/GCF_ServiceInfo.h>
+
 #include <APL/TBB_Protocol/TBB_Protocol.ph>
 #include <APL/RTCCommon/TestSuite.h>
-#include <TBBTest.h>
+#include "TBBTest.h"
 
 #include <iostream>
 #include <sys/time.h>
 #include <string.h>
-#include <blitz/array.h>
+
 
 using namespace std;
-using namespace blitz;
 using namespace LOFAR;
-using namespace RTC;
+//using namespace RTC;
 using namespace TBB_Protocol;
 using namespace TBB_Test;
 
@@ -46,9 +47,9 @@ TBBTest::TBBTest(string name)
 {
   registerProtocol(TBB_PROTOCOL, TBB_PROTOCOL_signalnames);
 
-  m_server.init(*this, "server", GCFPortInterface::SAP, TBB_PROTOCOL);
+  itsClient.init(*this, MAC_SVCMASK_TBBDRIVER, GCFPortInterface::SAP, TBB_PROTOCOL);
 	
-	m_boardmask = 0x00000001; // bitmask with boards to test bo = board1
+	itsboardmask = 0x00000001; // bitmask with boards to test bo = board1
 }
 
 TBBTest::~TBBTest()
@@ -67,19 +68,22 @@ GCFEvent::TResult TBBTest::initial(GCFEvent& e, GCFPortInterface& port)
 
     case F_ENTRY:
     {
-      m_server.open();
+      LOG_DEBUG_STR("Opening client port");
+      itsClient.open();
     }
     break;
 
     case F_CONNECTED:
     {
-      TRAN(TBBTest::test001);
+      LOG_DEBUG_STR("port is connected, switch to test001");
+      TRAN(TBBTest::test008);
     }
     break;
 
     case F_DISCONNECTED:
     {
-      port.setTimer((long)1);
+      LOG_DEBUG_STR("port is disconnected, set timer, and close port");
+      port.setTimer((long)2);
       port.close();
     }
     break;
@@ -87,11 +91,13 @@ GCFEvent::TResult TBBTest::initial(GCFEvent& e, GCFPortInterface& port)
     case F_TIMER:
     {
       // try again
-      m_server.open();
+      LOG_DEBUG_STR("Try to open the port again");
+      itsClient.open();
     }
     break;
 
     default:
+      LOG_DEBUG_STR("unknown message");
       status = GCFEvent::NOT_HANDLED;
       break;
   }
@@ -112,20 +118,19 @@ GCFEvent::TResult TBBTest::test001(GCFEvent& e, GCFPortInterface& port)
 				/* start of the test sequence */
 				TBBAllocEvent sw;
 				
-				sw.tbbmask = boardmask; // only board 0
-				sw.channel = 1;
-				sw.pageaddr = 1;
-				sw.pagelength = 1; // 1 page
+				sw.rcu_mask.set();
 				
-				TESTC_ABORT(m_server.send(sw), TBBTest::final);
+				TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 			}
 			break;
 
-    case TBB_ALLOCACK:
+    case TBB_ALLOC_ACK:
 			{
-				TBBAllocackEvent ack(e);
-	
-				TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+				TBBAllocAckEvent ack(e);
+				LOG_INFO_STR(formatString	 ("Ack status = 0X%08X", ack.status_mask));
+				for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 				LOG_INFO_STR("Alloc test OK");
 	
 				TRAN(TBBTest::test002);
@@ -167,21 +172,22 @@ GCFEvent::TResult TBBTest::test002(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBFreeEvent sw;
 				
-			sw.tbbmask = boardmask; // boards tot test
-			sw.channel = 1;
+			sw.rcu_mask.set();
 				
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_FREEACK:
+		case TBB_FREE_ACK:
 		{
-			TBBAllocackEvent ack(e);
-	
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			TBBAllocAckEvent ack(e);
+			LOG_INFO_STR(formatString	 ("Ack status = 0X%08X", ack.status_mask));
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Free test OK");
 	
-			TRAN(TBBTest::test003);
+			TRAN(TBBTest::test008);
 		}
 		break;
 
@@ -220,18 +226,19 @@ GCFEvent::TResult TBBTest::test003(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBRecordEvent sw;
 				
-			sw.tbbmask = boardmask; // boards tot test
-			sw.channel = 1;
+			sw.rcu_mask.set();
 				
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_FREEACK:
+		case TBB_FREE_ACK:
 		{
-			TBBRecordackEvent ack(e);
+			TBBRecordAckEvent ack(e);
 	
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Record test OK");
 	
 			TRAN(TBBTest::test004);
@@ -273,18 +280,19 @@ GCFEvent::TResult TBBTest::test004(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBStopEvent sw;
 				
-			sw.tbbmask = boardmask; // boards tot test
-			sw.channel = 1;
+			sw.rcu_mask.set();
 				
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_STOPACK:
+		case TBB_STOP_ACK:
 		{
-			TBBStopackEvent ack(e);
+			TBBStopAckEvent ack(e);
 	
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Stop test OK");
 	
 			TRAN(TBBTest::test005);
@@ -324,20 +332,19 @@ GCFEvent::TResult TBBTest::test005(GCFEvent& e, GCFPortInterface& port)
 			START_TEST("test005", "test TRIGCLR");
 	
 			/* start of the test sequence */
-			TBBTrigclrEvent sw;
-				
-			sw.tbbmask = boardmask; // boards tot test
-			sw.channel = 1;
+			TBBTrigReleaseEvent sw;
+
+			//sw.channel = 1;
 				
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_TRIGCLRACK:
+		case TBB_TRIG_RELEASE_ACK:
 		{
-			TBBTrigclrackEvent ack(e);
+			TBBTrigReleaseAckEvent ack(e);
 	
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			//TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final);
 			LOG_INFO_STR("TrigClr test OK");
 	
 			TRAN(TBBTest::test006);
@@ -379,18 +386,17 @@ GCFEvent::TResult TBBTest::test006(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBReadEvent sw;
 				
-			sw.tbbmask = boardmask; // boards tot test
 			sw.channel = 1;
 				
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_READACK:
+		case TBB_READ_ACK:
 		{
-			TBBReadackEvent ack(e);
+			TBBReadAckEvent ack(e);
 	
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final);
 			LOG_INFO_STR("Read test OK");
 	
 			TRAN(TBBTest::test007);
@@ -429,28 +435,19 @@ GCFEvent::TResult TBBTest::test007(GCFEvent& e, GCFPortInterface& port)
 			START_TEST("test007", "test UDP");
 
 			/* start of the test sequence */
-			TBBUdpEvent sw;
+			TBBModeEvent sw;
 			
-			sw.tbbmask = boardmask; // boards tot test
-			sw.udp[0] = 1;
-			sw.udp[1] = 1;
-			sw.ip[0] = 2;
-			sw.ip[1] = 2;
-			sw.ip[2] = 2;
-			sw.ip[3] = 2;
-			sw.ip[4] = 2;
-			sw.mac[0] = 3;
-			sw.mac[1] = 3;
+			sw.board = itsboardmask; // boards tot test
 			
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_UDPACK:
+		case TBB_MODE_ACK:
 		{
-			TBBUdpackEvent ack(e);
+			TBBModeAckEvent ack(e);
 
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final);
 			LOG_INFO_STR("Udp test OK");
 
 			TRAN(TBBTest::test008);
@@ -492,20 +489,36 @@ GCFEvent::TResult TBBTest::test008(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBVersionEvent sw;
 			
-			sw.tbbmask = boardmask; // boards tot test
+			sw.boardmask =itsboardmask; // boards tot test
 			
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_VERSIONACK:
+		case TBB_VERSION_ACK:
 		{
-			TBBVersionackEvent ack(e);
-
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			TBBVersionAckEvent ack(e);
+			
+			for(int cnt = 0;cnt < 12;cnt++) {
+				LOG_INFO_STR(formatString("boardnr      = %d", cnt));
+				LOG_INFO_STR(formatString("boardid      = 0X%08X", ack.boardid[cnt]));
+				LOG_INFO_STR(formatString("swversion    = 0X%08X", ack.swversion[cnt]));
+				LOG_INFO_STR(formatString("boardversion = 0X%08X", ack.boardversion[cnt]));
+				LOG_INFO_STR(formatString("tpversion    = 0X%08X", ack.tpversion[cnt]));
+				LOG_INFO_STR(formatString("mp0version   = 0X%08X", ack.mp0version[cnt]));
+				LOG_INFO_STR(formatString("mp1version   = 0X%08X", ack.mp1version[cnt]));
+				LOG_INFO_STR(formatString("mp2version   = 0X%08X", ack.mp2version[cnt]));
+				LOG_INFO_STR(formatString("mp3version   = 0X%08X", ack.mp3version[cnt]));
+			}
+			LOG_INFO_STR(formatString	 ("Ack status = 0X%08X", ack.status_mask));
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Version test OK");
-
-			TRAN(TBBTest::test009);
+			
+			
+			TRAN(TBBTest::final);
+			//TRAN(TBBTest::test009);
 		}
 		break;
 
@@ -544,17 +557,19 @@ GCFEvent::TResult TBBTest::test009(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBSizeEvent sw;
 			
-			sw.tbbmask = boardmask; // boards tot test
+			sw.boardmask = itsboardmask; // boards tot test
 			
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_SIZEACK:
+		case TBB_SIZE_ACK:
 		{
-			TBBSizeackEvent ack(e);
+			TBBSizeAckEvent ack(e);
 
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Size test OK");
 
 			TRAN(TBBTest::test010);
@@ -596,20 +611,22 @@ GCFEvent::TResult TBBTest::test010(GCFEvent& e, GCFPortInterface& port)
 			/* start of the test sequence */
 			TBBSizeEvent sw;
 			
-			sw.tbbmask = boardmask; // boards tot test
+			sw.boardmask =itsboardmask; // boards tot test
 			
-			TESTC_ABORT(m_server.send(sw), TBBTest::final);
+			TESTC_ABORT(itsClient.send(sw), TBBTest::final);
 		}
 		break;
 
-		case TBB_SIZEACK:
+		case TBB_SIZE_ACK:
 		{
-			TBBSizeackEvent ack(e);
+			TBBSizeAckEvent ack(e);
 
-			TESTC_ABORT(ack.status == SUCCESS, TBBTest::final);
+			for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) {
+					TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final);
+				}
 			LOG_INFO_STR("Size test OK");
 
-			TRAN(TBBTest::test011);
+			TRAN(TBBTest::final);
 		}
 		break;
 
@@ -662,6 +679,7 @@ void TBBTest::run()
   GCFTask::run();
 }
 
+
 int main(int argc, char** argv)
 {
   GCFTask::init(argc, argv);
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in b/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in
index 0fe8ae60ee28ebef2cd8aae7286f5809e35faac2..7cf768403447c71f325db03f8e8ebd9665e0952e 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in
@@ -1,6 +1,4 @@
 
 #
 # Configuration to connect TBBTest to the TBBDriver
-#
-mac.ns.TBBTest.server.type=TCP
-mac.top.TBBTest.server.remoteservice=TBBDriver:acceptor_v2
\ No newline at end of file
+#
\ No newline at end of file
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.h b/MAC/APL/PIC/TBBDriver/test/TBBTest.h
index 78da950ee48213ac1ef3a4b7d0830c183db2fa4b..8c4c8ad3dd150ccc231c728715564451cf2c7e51 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTest.h
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.h
@@ -29,8 +29,9 @@
 #include <GCF/TM/GCF_Control.h>
 #include <GCF/TM/GCF_ETHRawPort.h>
 
-namespace TBB_Test
-{
+namespace LOFAR {
+	namespace TBB_Test {
+  
   class TBBTest : public GCFTask, public Test
   {
     public:
@@ -55,7 +56,7 @@ namespace TBB_Test
 
       /**
        * The test states. This state is reached when the
-       * beam_server port is connected.
+       * beaitsClient port is connected.
        */
       GCFEvent::TResult test001(GCFEvent& e, GCFPortInterface &p);
       GCFEvent::TResult test002(GCFEvent& e, GCFPortInterface &p);
@@ -82,10 +83,11 @@ namespace TBB_Test
 
     private:
       // ports
-      GCFPort	m_server;
-			uint32	m_boardmask;
+      GCFPort	itsClient;
+			uint32	itsboardmask;
   };
-
-};
+	
+	}
+}
      
 #endif /* TBBTEST_H_ */
diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h b/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h
index 16e58a9edb3a7c23029aa7ec8983e5ab2d919497..897aafe184c69c3f2eb5e979cf61220cd6d18f14 100644
--- a/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h
+++ b/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h
@@ -24,8 +24,8 @@
 //#  $Id$
 //#
 
-#ifndef RSPTESTSUITE_H_
-#define RSPTESTSUITE_H_
+#ifndef TBBTESTSUITE_H_
+#define TBBTESTSUITE_H_
 
 #include <Suite/test.h>
 #include <Suite/suite.h>
diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.cc b/MAC/APL/PIC/TBBDriver/test/TPStub.cc
index 8ec4dee7d8293dec1dd7c52d287b2ef881b67214..ff14dced2a0944e5394c7bca089b3013bd8ab1a4 100644
--- a/MAC/APL/PIC/TBBDriver/test/TPStub.cc
+++ b/MAC/APL/PIC/TBBDriver/test/TPStub.cc
@@ -23,23 +23,27 @@
 
 #include <lofar_config.h>
 #include <Common/LofarLogger.h>
-
-#include "TP_Protocol.ph"
-#include <RawEvent.h>
-#include <TPStub.h>
-#include <APL/RTCCommon/PSAccess.h>
-#include <GCF/ParameterSet.h>
+#include <Common/LofarLocators.h>
+#include <APS/ParameterSet.h>
 
 #include <iostream>
 #include <sys/time.h>
 #include <string.h>
 #include <math.h>
 
+#include "TPStub.h"
+#include "TP_Protocol.ph"
+#include "StubRawEvent.h"
+
+
 using namespace std;
 using namespace LOFAR;
+using namespace ACC::APS;
+using namespace TP_Protocol;
+using namespace TBB;
 using namespace TBB_Test;
 
-#define ETHERTYPE_TP 0x10FA
+#define ETHERTYPE_TP 0x7BB0	// TBB
 
 TPStub::TPStub(string name)
   : GCFTask((State)&TPStub::initial, name), Test(name)
@@ -51,22 +55,23 @@ TPStub::TPStub(string name)
 
   LOG_INFO("TPStub constructor");
   
-  m_client.init(*this, "client", GCFPortInterface::SAP, TP_PROTOCOL, true /*raw*/);
-  m_client.setAddr(GET_CONFIG_STRING("TPStub.IF_NAME"),
-		   GET_CONFIG_STRING(addrstr));
-  m_client.setEtherType(ETHERTYPE_TP);
+  itsServer.init(*this, "tp_server", GCFPortInterface::SPP, TP_PROTOCOL, true /*raw*/);
+  itsServer.setAddr(	globalParameterSet()->getString("TPStub.IF_NAME").c_str(),
+  									globalParameterSet()->getString(addrstr).c_str());
+  itsServer.setEtherType(ETHERTYPE_TP);
 }
 
+
 TPStub::~TPStub()
 {
 	// TODO
 }
 
-GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port)
+GCFEvent::TResult TPStub::initial(GCFEvent &event, GCFPortInterface &port)
 {
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
-  switch(e.signal)
+  switch(event.signal)
   {
     case F_INIT:
     	{
@@ -75,7 +80,7 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port)
 
     case F_ENTRY:
     	{
-      	m_client.open();
+      	itsServer.open();
     	}
     	break;
 
@@ -97,7 +102,7 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port)
 			{
 				// try again
 				LOG_DEBUG(formatString("port '%s' retry of open...", port.getName().c_str()));
-				m_client.open();
+				itsServer.open();
 			}
 			break;
 
@@ -109,230 +114,213 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port)
   return status;
 }
 
-
-GCFEvent::TResult TPStub::connected(GCFEvent& ack, GCFPortInterface& port)
+GCFEvent::TResult TPStub::connected(GCFEvent &event, GCFPortInterface &port)
 {
   GCFEvent::TResult status = GCFEvent::HANDLED;
-		
-  switch (ack.signal)
+	LOG_DEBUG_STR("Connected and waiting.");	
+  switch (event.signal)
   {
     case F_ENTRY:
 			{
-			}
-    break;
+			} break;
 
     case F_DATAIN:
 			{
-				status = RawEvent::dispatch(*this, port);
-			}
-    break;
+				status = RawEvent::dispatch(*this, port); //*this
+			} break;
 
     case TP_ALLOC:
 			{
-				TPAllocEvent allocack;
+				TPAllocAckEvent allocack(event);
 				allocack.opcode = TPALLOC;
-				allocack.channel = ack.channel;
-				allocack.pageaddr = ack.pageaddr;
-				allocack.pagelength = ack.pagelength;
+				allocack.status = 0;
 				port.send(allocack);
-			}
-			break;
+			} break;
 			
 		case TP_FREE:
 			{
-				TPFreeEvent freeack;
+				TPFreeAckEvent freeack(event);
 				freeack.opcode = TPFREE;
-				freeack.channel = ack.channel;
+				freeack.status = 0;
 				port.send(freeack);
-			}
-			break;
+			} break;
 			
     case TP_RECORD:
 			{
-				TPRecordEvent recordack;
+				TPRecordAckEvent recordack(event);
 				recordack.opcode = TPRECORD;
-				recordack.channel = ack.channel;
+				recordack.status = 0;
 				port.send(recordack);
-			}
-			break;
+			} break;
 			
     case TP_STOP:
 			{
-				TPStopEvent stopack;
+				TPStopAckEvent stopack(event);
 				stopack.opcode = TPSTOP;
-				stopack.channel = ack.channel;
+				stopack.status = 0;
 				port.send(stopack);
-			}
-			break;
+			} break;
 				
-    case TP_TRIGCLR:
+    case TP_TRIG_RELEASE:
 			{
-				TPTrigclrEvent trigclrack;
-				trigclrack.opcode = TPTRIGCLR;
-				trigclrack.channel = ack.channel;
-				port.send(trigclrack);
-			}
-			break;
+				TPTrigReleaseAckEvent trigreleaseack(event);
+				trigreleaseack.opcode = TPTRIGRELEASE;
+				trigreleaseack.status = 0;
+				port.send(trigreleaseack);
+			} break;
 				
     case TP_READ:
 			{
-				TPReadEvent readack;
+				TPReadAckEvent readack(event);
 				readack.opcode = TPREAD;
-				readack.channel = ack.channel;
-				readack.time = ack.time;
-				readack.period = ack.period;
+				readack.status = 0;
 				port.send(readack);
-			}
-			break;
+			} break;
 			
     case TP_UDP:
 			{
-				TPUdpEvent udpack;
+				TPUdpAckEvent udpack(event);
 				udpack.opcode = TPUDP;
-				udpack.udp[0] = ack.udp[0];
-				udpack.udp[1] = ack.udp[1];
-				udpack.ip[0] = ack.ip[0];
-				udpack.ip[1] = ack.ip[1];
-				udpack.ip[2] = ack.ip[2];
-				udpack.ip[3] = ack.ip[3];
-				udpack.ip[4] = ack.ip[4];
-				udpack.mac[0] = ack.mac[0];
-				udpack.mac[1] = ack.mac[1];
+				udpack.status = 0;
 				port.send(udpack);
-			}
-			break;
+			} break;
 		
 		case TP_VERSION:
-			{
-				TPVersionEvent versionack;
+			{	
+				TPVersionAckEvent versionack;
 				versionack.opcode = TPVERSION;
-				versionack.boardid = 1;
-				versionack.swversion = 1;
-				versionack.boardversion = 1;
-				versionack.tp_version = 1;
-				versionack.mp_version[0] = 2;
-				versionack.mp_version[1] = 2;
-				versionack.mp_version[2] = 2;
-				versionack.mp_version[3] = 2;
+				versionack.status = 0x3;
+				versionack.boardid = 0;
+				versionack.swversion = 10;
+				versionack.boardversion = 56;
+      	versionack.tpversion = 4;
+      	versionack.mp0version = 0;
+      	versionack.mp1version = 1;
+      	versionack.mp2version = 2;
+      	versionack.mp3version = 3;
+				
 				port.send(versionack);
-			}
-			break;
+			} break;
 		
+		case TP_STATUS:
+			{	
+				TPStatusAckEvent statusack;
+				statusack.opcode = TPSTATUS;
+				statusack.status = 0;
+				statusack.V12 = 12;
+				statusack.V25 = 25;
+				statusack.V33 = 33;
+      	statusack.Tpcb = 40;
+      	statusack.Ttp = 44;
+      	statusack.Tmp0 = 1;
+      	statusack.Tmp1 = 2;
+      	statusack.Tmp2 = 3;
+				statusack.Tmp3 = 3;
+				
+				port.send(statusack);
+			} break;
+			
 		case TP_SIZE:
 			{
-				TPSizeEvent sizeack;
+				TPSizeAckEvent sizeack;
 				sizeack.opcode = TPSIZE;
-				sizeack.size = 8;
+				sizeack.status = 0;
+				sizeack.npages = 4000000;
 				port.send(sizeack);
-			}  
-			break;
+			} break;
 				
     case TP_CLEAR:
 			{
-				TPClearEvent clearack;
+				TPClearAckEvent clearack(event);
 				clearack.opcode = TPCLEAR;
+				clearack.status = 0;
 				port.send(clearack);
-			}
-			break;
+			} break;
 				
     case TP_RESET:
 			{
-				TPResetEvent resetack;
+				TPResetAckEvent resetack(event);
 				resetack.opcode = TPRESET;
+				resetack.status = 0;
 				port.send(resetack);
-			}
-			break;
+			} break;
 			
     case TP_CONFIG:
 			{
-				TPConfigEvent configack;
+				TPConfigAckEvent configack(event);
 				configack.opcode = TPCONFIG;
-				configack.image = ack.image;
-			}
-			break;
+				configack.status = 0;
+				port.send(configack);
+			} break;
 			
     case TP_ERASEF:
 			{
-				TPErasefEvent erasefack;
+				TPErasefAckEvent erasefack(event);
 				erasefack.opcode = TPERASEF;
-				erasefack.addr = ack.addr;
-			}
-			break;
+				erasefack.status = 0;
+				port.send(erasefack);
+			} break;
 			
 		case TP_READF:
 			{
-				TPReadfEvent readfack;
+				TPReadfAckEvent readfack(event);
 				readfack.opcode = TPREADF;
-				readfack.addr = ack.addr;
-				readfack.data = ack.data;
+				readfack.status = 0;
 				port.send(readfack);
-			}
-			break;
+			} break;
 			
     case TP_WRITEF:
 			{
-				TPWritefEvent writefack;
+				TPWritefAckEvent writefack(event);
 				writefack.opcode = TPWRITEF;
-				writefack.addr = ack.addr;
-				writefack.data = ack.data;
+				writefack.status = 0;
 				port.send(writefack);
-			}
-			break; 
+			} break; 
     
 		case TP_READW:
 			{
-				TPReadwEvent readwack;
+				TPReadwAckEvent readwack(event);
 				readwack.opcode = TPREADW;
-				readwack.mp = ack.mp;
-				readwack.addr = ack.addr;
-				readwack.wordlo = ack.wordlo;
-				readwack.wordhi = ack.wordhi;
+				readwack.status = 0;
 				port.send(readwack);
-			}
-			break;
+			} break;
     
 		case TP_WRITEW:
 			{
-				TPWritewEvent writewack;
+				TPWritewAckEvent writewack(event);
 				writewack.opcode = TPWRITEW;
-				writewack.mp = ack.mp;
-				writewack.addr = ack.addr;
-				writewack.wordlo = ack.wordlo;
-				writewack.wordhi = ack.wordhi;
+				writewack.status = 0;
 				port.send(writewack);
-			}
-			break;
+			} break;
 		
 		case F_DISCONNECTED:
 			{
 				port.close();
 				TRAN(TPStub::initial);
-			}
-			break;
+			} break;
 
     case F_EXIT:
 			{
-			}
-			break;
+			} break;
 
-    default:
+    default: {
+      LOG_DEBUG_STR("default: unknown command");
       status = GCFEvent::NOT_HANDLED;
-      break;
+    } break;
 	}
   return status;
 }
 
-GCFEvent::TResult TPStub::final(GCFEvent& ack, GCFPortInterface& /*port*/)
+GCFEvent::TResult TPStub::final(GCFEvent &event, GCFPortInterface& /*port*/)
 {
   GCFEvent::TResult status = GCFEvent::HANDLED;
 
-  switch(ack.signal)
+  switch(event.signal)
   {
     case F_ENTRY:
 			{
 				GCFTask::stop();
-    	}
-			break;
+    	} break;
 
     case F_EXIT:
     	break;
@@ -354,8 +342,18 @@ void TPStub::run()
 int main(int argc, char** argv)
 {
   GCFTask::init(argc, argv);
-
-  LOG_INFO(formatString("Program %s has started", argv[0]));
+	
+	LOG_DEBUG_STR("Reading configuration files");
+  try {
+		ConfigLocator cl;
+		globalParameterSet()->adoptFile(cl.locate("TPStub.conf"));
+	}
+	catch (LOFAR::Exception e) {
+		LOG_ERROR_STR("Failed to load configuration files: " << e.text());
+		//exit(EXIT_FAILURE);
+	}
+	
+  //LOG_INFO(formatString("Program %s has started", argv[0]));
 
   TPStub stub("TPStub");
   stub.run();
diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in b/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in
index c5fe6b0c4ea9909f1893ba8576a03389b4aa563d..42910b3a136d7c1f98a82144afdc1efbcdb58ddd 100644
--- a/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in
+++ b/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in
@@ -3,12 +3,12 @@
 #
 
 #
-# MAC address of lofar27, eth2, 00:0A:5E:46:5D:ED
-# This sets the destination MAC address of the EPA response events
+# MAC address of rs002, eth1, 00:30:48:2D:82:F7
+# This sets the destination MAC address of the TP response events
 #
-TPStub.MAC_ADDR_TBBDRIVER=00:50:04:32:B8:5C
+TPStub.MAC_ADDR_TBBDRIVER=00:30:48:2D:82:F7
 
 #
 # Interface on which to listen for TBBDriver events
 #
-TPStub.IF_NAME=eth2
+TPStub.IF_NAME=eth1
diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.h b/MAC/APL/PIC/TBBDriver/test/TPStub.h
index 59d6b572d9c7779feae8a91552ce69b2d4e53532..84bba37a8940165b3de79c2638bdefb44ce6dd50 100644
--- a/MAC/APL/PIC/TBBDriver/test/TPStub.h
+++ b/MAC/APL/PIC/TBBDriver/test/TPStub.h
@@ -29,8 +29,10 @@
 #include <GCF/TM/GCF_Control.h>
 #include <GCF/TM/GCF_ETHRawPort.h>
 
+#include "TP_Protocol.ph"
+
 namespace LOFAR {
-  namespace TBB_Test {
+	namespace TBB_Test {
 
     class TPStub : public GCFTask, public Test
     {
@@ -50,14 +52,14 @@ namespace LOFAR {
        * The initial and final state.
        */
       /*@{*/
-      GCFEvent::TResult initial(GCFEvent& e, GCFPortInterface &p);
-      GCFEvent::TResult final(GCFEvent& e, GCFPortInterface &p);
+      GCFEvent::TResult initial(GCFEvent &event, GCFPortInterface &port);
+      GCFEvent::TResult final(GCFEvent &event, GCFPortInterface &port);
       /*@}*/
 
       /**
        * The stub states.
        */
-      GCFEvent::TResult connected(GCFEvent& event, GCFPortInterface& port);
+      GCFEvent::TResult connected(GCFEvent &event, GCFPortInterface &port);
 
       
       /**
@@ -70,7 +72,7 @@ namespace LOFAR {
 
     private:
       // ports
-      GCFETHRawPort m_client;
+      GCFETHRawPort itsServer;
 
 //       // lookup for register pointers
 //       typedef struct
@@ -81,8 +83,8 @@ namespace LOFAR {
 //       
 //       reginfo m_reg[MEPHeader::MAX_PID + 1][MEPHeader::MAX_REGID + 1];
     };
-
-  };
-};
+		
+  }
+}
      
 #endif /* TPSTUB_H_ */