diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
index 07c6a69ccd3e95aeeaaf9893c489957985d5bcc2..a6023941d4b531bd6359a11262e532676b8b5372 100644
--- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc
@@ -39,7 +39,7 @@ AllocCmd::AllocCmd(): itsStage(0),itsRcuStatus(0)
 	itsTPE 			= new TPAllocEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE	= new TBBAllocackEvent();
+	itsTBBackE	= new TBBAllocAckEvent();
 	
 	for(int boardnr = 0;boardnr < TS->maxBoards();boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -59,8 +59,8 @@ AllocCmd::~AllocCmd()
 bool AllocCmd::isValid(GCFEvent& event)
 {
 	if ((event.signal == TBB_ALLOC)
-		|| (event.signal == TP_ALLOCACK)
-		|| (event.signal == TP_SIZEACK)) {
+		|| (event.signal == TP_ALLOC_ACK)
+		|| (event.signal == TP_SIZE_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -72,18 +72,21 @@ void AllocCmd::saveTbbEvent(GCFEvent& event)
 	itsTBBE	= new TBBAllocEvent(event);
 	
 	// convert rcu-bitmask to tbb-channelmask
-	int32 board;
-	int32 channel;
+	int32 board;				// board 0 .. 11
+	int32 board_channel;// board_channel 0 .. 15	
+	int32 channel;			// channel 0 .. 191 (= maxboard * max_channels_on_board)	
 	for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) {
 		if(itsTBBE->rcu_mask.test(rcunr)) {
-			TS->convertRcu2Ch(rcunr,&board,&channel);	
-			itsChannelMask[board] |= (1 << channel);
+			TS->convertRcu2Ch(rcunr,&board,&board_channel);
+			channel = (board * TS->nrChannelsOnBoard()) + board_channel;	
+			itsChannelMask[board] |= (1 << board_channel);
+			TS->setChSelected(channel,true);
 		}
 	} 
 	
 	uint32 boardmask = 0;	
 	for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) {
-		if (itsChannelMask[board] != 0) boardmask |= (1 << boardnr); 
+		if (itsChannelMask[boardnr] != 0) boardmask |= (1 << boardnr); 
 		
 		if (TS->isBoardActive(boardnr)) {
 			
@@ -95,7 +98,6 @@ void AllocCmd::saveTbbEvent(GCFEvent& event)
 					if (TS->getChState((ch + (boardnr * 16))) != 'F') {
 						itsTBBackE->status_mask[boardnr] |= TBB_ALLOC_ERROR;
 					}	else {	
-						TS->setChSelected((ch + (boardnr * 16)),true);
 						LOG_DEBUG_STR(formatString("Ch[%d] is selected",ch + (boardnr * 16)));
 					}
 				}
@@ -111,6 +113,7 @@ void AllocCmd::saveTbbEvent(GCFEvent& event)
 	}
 	
 	setBoardMask(boardmask);
+	LOG_DEBUG_STR(formatString("boardmask = 0x%08X",boardmask));
 		
 	// select first board to handle
 	nextBoardNr();
@@ -125,7 +128,7 @@ void AllocCmd::saveTbbEvent(GCFEvent& event)
 // ----------------------------------------------------------------------------
 void AllocCmd::sendTpEvent()
 {
-	if (itsTBBackE->status_mask[getBoardNr()] == 0) {
+	//if (itsTBBackE->status_mask[getBoardNr()] == 0) {
 	
 		switch (itsStage) {
 			// stage 1, get board memory size
@@ -150,16 +153,16 @@ void AllocCmd::sendTpEvent()
 					itsRcuStatus |= TBB_RCU_NOT_FREE;
 		
 				// send cmd if no errors
-				if (itsRcuStatus == 0) {
+				//if (itsRcuStatus == 0) {
 					TS->boardPort(getBoardNr()).send(*itsTPE);
 					LOG_DEBUG_STR(formatString("Sending Alloc to boardnr[%d], channel[%d]",getBoardNr(),getChannelNr()));
-				}
+			//}
 			} break;
 			
 			default: {
 			} break;
 		}
-	}	
+	//}	
 	TS->boardPort(getBoardNr()).setTimer(TS->timeout());
 }
 
@@ -173,12 +176,14 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event)
 			if (event.signal == F_TIMER) {
 				itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR;
 			}	else {
-				TPSizeackEvent *sizeAckEvent = new TPSizeackEvent(event);
+				TPSizeAckEvent *sizeAckEvent = new TPSizeAckEvent(event);
 		
-				if ((sizeAckEvent->status >= 0xF0) && (sizeAckEvent->status <= 0xF6)) 
+				if ((sizeAckEvent->status >= 0xF0) && (sizeAckEvent->status <= 0xF6)) {
 					itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (sizeAckEvent->status & 0x0F)));	
+				}
 		
-				TS->setMemorySize(getBoardNr(),sizeAckEvent->npages);
+				//TS->setMemorySize(getBoardNr(),sizeAckEvent->npages);
+				TS->setMemorySize(getBoardNr(),4194304);
 				
 				if (!devideChannels(getBoardNr())) // calculate allocations
 					itsTBBackE->status_mask[getBoardNr()] |= TBB_ALLOC_ERROR;
@@ -192,7 +197,7 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event)
 			if (isDone()) {
 				setDone(false);
 				resetChannelNr(); 
-				nextChannelNr();
+				nextSelectedChannelNr();
 				itsStage = 1;
 			}
 		} break;
@@ -206,7 +211,7 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event)
 				LOG_INFO_STR(formatString("F_TIMER AllocCmd DriverStatus[0x%08X], RcuStatus[0x%08X]",
 										 itsTBBackE->status_mask[getBoardNr()],itsRcuStatus));
 			}	else {
-				itsTPackE = new TPAllocackEvent(event);
+				itsTPackE = new TPAllocAckEvent(event);
 				
 				if (itsTPackE->status == 0) {
 					TS->setChState(getChannelNr(),'A');
@@ -231,12 +236,17 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event)
 			if (itsRcuStatus || itsTBBackE->status_mask[getBoardNr()]) {
 				int32 rcu;
 				TS->convertCh2Rcu(getChannelNr(),&rcu);
-				LOG_INFO_STR(formatString("ERROR AllocCmd Rcu[%d], DriverStatus[0x%x], RcuStatus[0x%x]",
+				LOG_INFO_STR(formatString("ERROR AllocCmd Rcu[%d], DriverStatus[0x%08x], RcuStatus[0x%08x]",
 										 rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus));
 			}
 	
 			itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus;
-			nextChannelNr();
+			/*
+			if (itsTBBackE->status_mask[getBoardNr()] != 0) {
+				setChannelNr((getBoardNr() * 16) + 15);
+			}
+			*/
+			nextSelectedChannelNr();
 		} break;
 		
 		default: {
diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.h b/MAC/APL/PIC/TBBDriver/src/AllocCmd.h
index e5b4215346ed98f5e1ffc44a27dca7e0cb165720..37c67f5a68618fb2abbbffcff49a2ec07d088961 100644
--- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.h
@@ -68,9 +68,9 @@ namespace LOFAR {
 				uint32	itsChannelMask[MAX_N_TBBBOARDS];
 								
 				TPAllocEvent			*itsTPE;
-				TPAllocackEvent		*itsTPackE;
+				TPAllocAckEvent		*itsTPackE;
 				TBBAllocEvent			*itsTBBE;
-				TBBAllocackEvent	*itsTBBackE;
+				TBBAllocAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
index 58bd038bd431f46965f3469053035e1ceb2fba8d..19f3beb0c2735cd81fdfbc83b82bb0b4e6ec9aca 100644
--- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
@@ -37,7 +37,7 @@ ClearCmd::ClearCmd()
 	itsTPE 			= new TPClearEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBClearackEvent();
+	itsTBBackE 	= new TBBClearAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -55,7 +55,7 @@ ClearCmd::~ClearCmd()
 // ----------------------------------------------------------------------------
 bool ClearCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_CLEAR)||(event.signal == TP_CLEARACK)) {
+	if ((event.signal == TBB_CLEAR)||(event.signal == TP_CLEAR_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -97,7 +97,7 @@ void ClearCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		;
 	}	else {
-		itsTPackE = new TPClearackEvent(event);
+		itsTPackE = new TPClearAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));	
diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.h b/MAC/APL/PIC/TBBDriver/src/ClearCmd.h
index 9b33a07af0f9f13220a32ee303c0e40261dca296..59deebbe26012ce03c9312f950fdba2aad29790a 100644
--- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPClearEvent			*itsTPE;
-				TPClearackEvent		*itsTPackE;
+				TPClearAckEvent		*itsTPackE;
 				TBBClearEvent			*itsTBBE;
-				TBBClearackEvent	*itsTBBackE;
+				TBBClearAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc
index 693e7ac66d3d9d0424bfee7ee82c7b6f36f94dcc..d8f7da8802193942473afb7ee944d102ebd8eeb5 100644
--- a/MAC/APL/PIC/TBBDriver/src/Command.cc
+++ b/MAC/APL/PIC/TBBDriver/src/Command.cc
@@ -143,6 +143,40 @@ void Command::nextChannelNr()
 {
 	bool validNr = false;
 	
+	do {
+		itsChannel++;
+		itsBoard = TS->getChBoardNr(itsChannel);
+		
+		if (itsBoard < TS->maxBoards()) {
+			// see if board is active 
+			if (	TS->boardPort(itsBoard).isConnected()
+						&& TS->isBoardActive(itsBoard)
+						&& (itsChannel < TS->maxChannels())) 
+			{
+				validNr = true;
+			}
+		} else {
+			break;	
+		}
+	} while (!validNr && (itsChannel < TS->maxChannels()));
+		
+	// if all nr done send clear all variables
+	if (!validNr) {
+		itsDone = true;
+		itsChannel = -1;
+		for (int ch = 0; ch < TS->maxChannels(); ch++) {
+			TS->setChSelected(ch, false);
+		}
+	}
+	LOG_DEBUG_STR(formatString("nextChannelNr() = %d",itsChannel));	
+}
+
+// ----------------------------------------------------------------------------
+// only channels with a state different than 'F' are selected
+void Command::nextSelectedChannelNr()
+{
+	bool validNr = false;
+	
 	do {
 		itsChannel++;
 		itsBoard = TS->getChBoardNr(itsChannel);
@@ -150,7 +184,8 @@ void Command::nextChannelNr()
 		if (itsBoard < TS->maxBoards()) {
 			// see if board is active and channel is selected
 			if (TS->boardPort(itsBoard).isConnected()
-						&& TS->isBoardActive(itsBoard) 
+						&& TS->isBoardActive(itsBoard)
+						&& (itsChannel < TS->maxChannels()) 
 						&& TS->isChSelected(itsChannel)) 
 			{
 				validNr = true;
@@ -164,8 +199,9 @@ void Command::nextChannelNr()
 	if (!validNr) {
 		itsDone = true;
 		itsChannel = -1;
+		for (int ch = 0; ch < TS->maxChannels(); ch++) {
+			TS->setChSelected(ch, false);
+		}
 	}
-	LOG_DEBUG_STR(formatString("nextChannelNr() = %d",itsChannel));	
+	LOG_DEBUG_STR(formatString("nextSelectedChannelNr() = %d",itsChannel));	
 }
-
-
diff --git a/MAC/APL/PIC/TBBDriver/src/Command.h b/MAC/APL/PIC/TBBDriver/src/Command.h
index 4d68e4176be63c326d907df3075ab77892093617..b9749232b356121c8fce42f829f24a1081d08363 100644
--- a/MAC/APL/PIC/TBBDriver/src/Command.h
+++ b/MAC/APL/PIC/TBBDriver/src/Command.h
@@ -75,6 +75,8 @@ namespace LOFAR {
 			
 			void nextChannelNr();
 			
+			void nextSelectedChannelNr();
+			
 			void setBoardMask(uint32 mask);
 			
     private:
diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
index 98bf9c82ddf55ca22f2905e24bbe185f66bf4ec7..4a6c89c8f45766b5634abcdb6867066ebf62885e 100644
--- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc
@@ -38,7 +38,7 @@ ConfigCmd::ConfigCmd()
 	itsTPE 			= new TPConfigEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBConfigackEvent();
+	itsTBBackE 	= new TBBConfigAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -56,7 +56,7 @@ ConfigCmd::~ConfigCmd()
 // ----------------------------------------------------------------------------
 bool ConfigCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_CONFIG)||(event.signal == TP_CONFIGACK)) {
+	if ((event.signal == TBB_CONFIG)||(event.signal == TP_CONFIG_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -100,7 +100,7 @@ void ConfigCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR;
 	}	else {
-		itsTPackE = new TPConfigackEvent(event);
+		itsTPackE = new TPConfigAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));	
diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h
index 30cc767a7c14f7b44509d9017c3e033c996b8883..8c6039ae61c609afb28aa6f440f20a2a13d8f206 100644
--- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPConfigEvent			*itsTPE;
-				TPConfigackEvent	*itsTPackE;
+				TPConfigAckEvent	*itsTPackE;
 				TBBConfigEvent		*itsTBBE;
-				TBBConfigackEvent	*itsTBBackE;
+				TBBConfigAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
index 02242567c26a22b9ff718e65e2e26f632799953c..36587a738287b29a2f680197116b6debf491563a 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
@@ -51,7 +51,7 @@ TbbSettings* TbbSettings::instance()
 // Default constructor
 //
 TbbSettings::TbbSettings() :
-	itsDriverVersion(10),				  // driver version 1.0
+	itsDriverVersion(19),				  // driver version 1.9
 	itsMaxBoards(0),							// max.number of boards on 1 driver 
 	itsMaxChannels(0),						// max.number of channels on 1 driver
 	itsMpsOnBoard(4),							// number of MPs on 1 board
@@ -178,6 +178,18 @@ void TbbSettings::setMaxBoards (int32 maxboards)
 			boardnr++;
 		}
 		mpnr = (int32)(inputnr / 4);
+		
+		// initialize filter settings
+		itsChannelInfo[ch].TriggerReleased = false;
+		itsChannelInfo[ch].Triggered = false;
+		itsChannelInfo[ch].TriggerLevel = 0;
+		itsChannelInfo[ch].TriggerMode = 0;
+		itsChannelInfo[ch].FilterSelect = 0;
+		itsChannelInfo[ch].DetectWindow = 0;
+		itsChannelInfo[ch].TriggerDummy = 0;
+		for (int i = 0; i < 4; i++) {
+			itsChannelInfo[ch].Coefficient[i] = 0;
+		}
 	}
 	
 	if (itsBoardInfo) delete itsBoardInfo;
@@ -228,8 +240,8 @@ void TbbSettings::setConversionTable(int32 rcu, int32 channel)
 
 void TbbSettings::convertRcu2Ch(int32 rcunr, int32 *boardnr, int32 *channelnr)
 {
-	int32 board;
-	int32 channel;
+	int32 board;		// board 0 .. 11
+	int32 channel;	// channel 0 .. 15
 	
 	board = (int32)(rcunr / itsChannelsOnBoard);
 	channel = itsRcu2ChTable[rcunr - (board * itsChannelsOnBoard)];
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
index 4999d1c9d907c4615ced085bcb89899332b4259b..51230d81e78b4aa8b73894c8dbd7c6f12b28d6df 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
@@ -47,6 +47,15 @@ struct ChannelInfo
 	int32		MpNr;
 	uint32	StartAddr;
 	uint32	PageSize;
+	// settings for the trigger system
+	bool	TriggerReleased;
+	bool	Triggered;
+	uint32	TriggerLevel;
+	uint32	TriggerMode;
+	uint32	FilterSelect;
+	uint32	DetectWindow;
+	uint32	TriggerDummy;
+	uint32	Coefficient[4];
 };
 
 struct BoardInfo
@@ -97,6 +106,14 @@ public:
 	int32 getChMpNr(int32 channelnr);
 	uint32 getChStartAddr(int32 channelnr);
 	uint32 getChPageSize(int32 channelnr);
+	bool isChTriggerReleased(int32 channelnr);
+	bool isChTriggered(int32 channelnr);
+	uint32 getChTriggerLevel(int32 channelnr);
+	uint32 getChTriggerMode(int32 channelnr);
+	uint32 getChFilterSelect(int32 channelnr);
+	uint32 getChDetectWindow(int32 channelnr);
+	uint32 getChTriggerDummy(int32 channelnr);
+	uint32 getChFilterCoefficient(int32 channelnr, int32 coef_nr);
 	
 	string getIfName();
 	string getSrcIp(int32 boardnr);
@@ -109,6 +126,14 @@ public:
 	void setChState(int32 channelnr, char state);
 	void setChStartAddr(int32 channelnr, uint32 startaddr);
 	void setChPageSize(int32 channelnr, uint32 pagesize);
+	void setChTriggered(int32 channelnr, bool triggered);
+	void setChTriggerReleased(int32 channelnr, bool released);
+	void setChTriggerLevel(int32 channelnr, uint32 level);
+	void setChTriggerMode(int32 channelnr, uint32 mode);
+	void setChFilterSelect(int32 channelnr, uint32 filter_select);
+	void setChDetectWindow(int32 channelnr, uint32 detect_window);
+	void setChTriggerDummy(int32 channelnr, uint32 dummy);
+	void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint32 coef);
 	
 	void convertRcu2Ch(int32 rcunr, int32 *boardnr, int32 *channelnr);
 	void convertCh2Rcu(int32 channelnr, int32 *rcunr);
@@ -195,6 +220,14 @@ inline	int32 TbbSettings::getChInputNr(int32 channelnr) { return (itsChannelInfo
 inline	int32 TbbSettings::getChMpNr(int32 channelnr) { return (itsChannelInfo[channelnr].MpNr); }
 inline	uint32 TbbSettings::getChStartAddr(int32 channelnr) { return (itsChannelInfo[channelnr].StartAddr); }
 inline	uint32 TbbSettings::getChPageSize(int32 channelnr) { return (itsChannelInfo[channelnr].PageSize); }
+inline	bool TbbSettings::isChTriggered(int32 channelnr) { return (itsChannelInfo[channelnr].Triggered); }	
+inline	bool TbbSettings::isChTriggerReleased(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerReleased); }
+inline	uint32 TbbSettings::getChTriggerLevel(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerLevel); }
+inline	uint32 TbbSettings::getChTriggerMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerMode); }
+inline	uint32 TbbSettings::getChFilterSelect(int32 channelnr) { return (itsChannelInfo[channelnr].FilterSelect); }
+inline	uint32 TbbSettings::getChDetectWindow(int32 channelnr) { return (itsChannelInfo[channelnr].DetectWindow); }
+inline	uint32 TbbSettings::getChTriggerDummy(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerDummy); }
+inline	uint32 TbbSettings::getChFilterCoefficient(int32 channelnr, int32 coef_nr) { return (itsChannelInfo[channelnr].Coefficient[coef_nr]); }
 inline	string TbbSettings::getIfName() { return(itsIfName); }
 inline	string TbbSettings::getSrcIp(int32 boardnr) { return(itsBoardInfo[boardnr].srcIp); }
 inline	string TbbSettings::getDstIp(int32 boardnr) { return(itsBoardInfo[boardnr].dstIp); }
@@ -206,6 +239,14 @@ inline	void TbbSettings::setChStatus(int32 channelnr, uint32 status){ itsChannel
 inline	void TbbSettings::setChState(int32 channelnr, char state){ itsChannelInfo[channelnr].State = state; }
 inline	void TbbSettings::setChStartAddr(int32 channelnr, uint32 startaddr){ itsChannelInfo[channelnr].StartAddr = startaddr; }
 inline	void TbbSettings::setChPageSize(int32 channelnr, uint32 pagesize){ itsChannelInfo[channelnr].PageSize = pagesize; }
+inline	void TbbSettings::setChTriggered(int32 channelnr, bool triggered){ itsChannelInfo[channelnr].Triggered = triggered; }
+inline	void TbbSettings::setChTriggerReleased(int32 channelnr, bool release){ itsChannelInfo[channelnr].TriggerReleased = release; }
+inline	void TbbSettings::setChTriggerLevel(int32 channelnr, uint32 level){ itsChannelInfo[channelnr].TriggerLevel = level; }
+inline	void TbbSettings::setChTriggerMode(int32 channelnr, uint32 mode){ itsChannelInfo[channelnr].TriggerMode = mode; }
+inline	void TbbSettings::setChFilterSelect(int32 channelnr, uint32 select){ itsChannelInfo[channelnr].FilterSelect = select; }
+inline	void TbbSettings::setChDetectWindow(int32 channelnr, uint32 window){ itsChannelInfo[channelnr].DetectWindow = window; }
+inline	void TbbSettings::setChTriggerDummy(int32 channelnr, uint32 dummy){ itsChannelInfo[channelnr].TriggerDummy = dummy; }
+inline	void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint32 coef){ itsChannelInfo[channelnr].Coefficient[coef_nr] = coef; }
 
 //---- inline functions for board information ------------
 inline	uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); }
diff --git a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
index fd1ce20de5880ed0e12d2f7695df24919184fa50..9b89f2ca2084801cc7324fd3ac27f14387520748 100644
--- a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc
@@ -68,7 +68,7 @@ ErasefCmd::~ErasefCmd()
 // ----------------------------------------------------------------------------
 bool ErasefCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_ERASE_IMAGE)||(event.signal == TP_ERASEFACK)) {
+	if ((event.signal == TBB_ERASE_IMAGE)||(event.signal == TP_ERASEF_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -78,10 +78,14 @@ bool ErasefCmd::isValid(GCFEvent& event)
 void ErasefCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE = new TBBEraseImageEvent(event);
-		
-	setBoardNr(itsTBBE->board);
 	
-	itsTBBackE->status_mask = 0;
+	itsTBBackE->status_mask = 0;	
+	if (TS->isBoardActive(itsTBBE->board)) {	
+		setBoardNr(itsTBBE->board);
+	} else {
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
 	
 	itsImage = itsTBBE->image;
 	itsSector = (itsImage * FL_SECTORS_IN_PAGE);
@@ -110,7 +114,7 @@ void ErasefCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	} else {
-		itsTPackE = new TPErasefackEvent(event);
+		itsTPackE = new TPErasefAckEvent(event);
 		
 		itsBoardStatus	= itsTPackE->status;
 		if (itsBoardStatus == 0) {
diff --git a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h
index 899c40e0e433ad78029653ec0e1a6e60e68d0f25..76a42b3b752e56cd630a41cfb6cbd5de43fd7f3f 100644
--- a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h
@@ -61,7 +61,7 @@ namespace LOFAR {
 				TbbSettings *TS;
 
 				TPErasefEvent					*itsTPE;
-				TPErasefackEvent			*itsTPackE;
+				TPErasefAckEvent			*itsTPackE;
 				TBBEraseImageEvent		*itsTBBE;
 				TBBEraseImageAckEvent	*itsTBBackE;
 				
diff --git a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
index 82e66a0053955c748eb5cbd92904f74bea62a612..7f79aaf213d7ed0d489d6ea0e3f76d7ec2f9a5bc 100644
--- a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc
@@ -38,7 +38,7 @@ FreeCmd::FreeCmd():
 	itsTPE 			= new TPFreeEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBFreeackEvent();
+	itsTBBackE 	= new TBBFreeAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -57,7 +57,7 @@ FreeCmd::~FreeCmd()
 // ----------------------------------------------------------------------------
 bool FreeCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_FREE)||(event.signal == TP_FREEACK)) {
+	if ((event.signal == TBB_FREE)||(event.signal == TP_FREE_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -69,16 +69,16 @@ void FreeCmd::saveTbbEvent(GCFEvent& event)
 	itsTBBE = new TBBFreeEvent(event);
 	
 	// convert rcu-bitmask to tbb-channelmask
-	int boardnr;
-	int channelnr;
+	int32 board;				// board 0 .. 11
+	int32 board_channel;// board_channel 0 .. 15	
+	int32 channel;			// channel 0 .. 191 (= maxboard * max_channels_on_board)	
 	for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) {
+		TS->convertRcu2Ch(rcunr,&board,&board_channel);
+		channel = (board * TS->nrChannelsOnBoard()) + board_channel;
 		if(itsTBBE->rcu_mask.test(rcunr)) {
-			TS->convertRcu2Ch(rcunr,&boardnr,&channelnr);	
-			itsChannelMask[boardnr] |= (1 << channelnr);
-			TS->setChSelected(((boardnr * 16) + channelnr),true);
+			itsChannelMask[board] |= (1 << board_channel);
+			TS->setChSelected(channel,true);
 		}
-		//else
-		//	TS->setChSelected(((boardnr * 16) + channelnr),false);
 	} 
 	
 	uint32 boardmask = 0;		
@@ -99,7 +99,7 @@ void FreeCmd::saveTbbEvent(GCFEvent& event)
 	setBoardMask(boardmask);
 	
 	// select firt channel to handle
-	nextChannelNr();
+	nextSelectedChannelNr();
 	
 	// initialize TP send frame
 	itsTPE->opcode			= TPFREE;
@@ -148,7 +148,7 @@ void FreeCmd::saveTpAckEvent(GCFEvent& event)
 		itsRcuStatus |= TBB_TIMEOUT_ETH;
 	}
 	else {
-		itsTPackE = new TPFreeackEvent(event);
+		itsTPackE = new TPFreeAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F)));
@@ -182,8 +182,10 @@ void FreeCmd::saveTpAckEvent(GCFEvent& event)
 				(getBoardNr() * 16),((getBoardNr() + 1) * 16), itsTBBackE->status_mask[getBoardNr()],itsRcuStatus));
 	}
 	itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus;
-	
-	nextChannelNr();
+	if (itsTPE->channel == 0xFFFFFFFF) {
+		setChannelNr((getBoardNr() * 16) + 15);
+	}
+	nextSelectedChannelNr();
 }
 
 // ----------------------------------------------------------------------------
diff --git a/MAC/APL/PIC/TBBDriver/src/FreeCmd.h b/MAC/APL/PIC/TBBDriver/src/FreeCmd.h
index 39237391cceac75622c91d47dda6f3b93ee1c044..97866072548b9066543782479b9612067b7309b8 100644
--- a/MAC/APL/PIC/TBBDriver/src/FreeCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/FreeCmd.h
@@ -66,9 +66,9 @@ namespace LOFAR {
 				uint32	itsRcuStatus;
 				
 				TPFreeEvent			*itsTPE;
-				TPFreeackEvent	*itsTPackE;
+				TPFreeAckEvent	*itsTPackE;
 				TBBFreeEvent		*itsTBBE;
-				TBBFreeackEvent	*itsTBBackE;
+				TBBFreeAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
index 62ff78f2641f11744bfbcd05949c14382dc76b40..93e9308c1d70b6a91569ee1cc3b5aec4cc546794 100644
--- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
@@ -70,7 +70,7 @@ ImageInfoCmd::~ImageInfoCmd()
 // ----------------------------------------------------------------------------
 bool ImageInfoCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_IMAGE_INFO)||(event.signal == TP_READFACK)) {
+	if ((event.signal == TBB_IMAGE_INFO)||(event.signal == TP_READF_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -111,7 +111,7 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 		setDone(true);	
 	} else {
-		itsTPackE = new TPReadfackEvent(event);
+		itsTPackE = new TPReadfAckEvent(event);
 		
 		if (itsTPackE->status == 0) {
 			itsTBBackE->image_version[itsImage]= itsTPackE->data[0];	  
diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h
index 2a98972dfc49b9d939db39e898b7a0c913b44d87..65869760551bea543a70b11ebebc8783bc80e2cf 100644
--- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h
@@ -61,7 +61,7 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPReadfEvent					*itsTPE;
-				TPReadfackEvent				*itsTPackE;
+				TPReadfAckEvent				*itsTPackE;
 				TBBImageInfoEvent			*itsTBBE;
 				TBBImageInfoAckEvent	*itsTBBackE;
 				
diff --git a/MAC/APL/PIC/TBBDriver/src/Makefile.am b/MAC/APL/PIC/TBBDriver/src/Makefile.am
index 19eaa38c010d6b0148a056e0c62b0301ec999ea7..343844b3ba9d6772ee8a1adfe82c5c34f4418181 100644
--- a/MAC/APL/PIC/TBBDriver/src/Makefile.am
+++ b/MAC/APL/PIC/TBBDriver/src/Makefile.am
@@ -60,7 +60,11 @@ libtbbdriver_la_SOURCES = \
 	FreeCmd.cc \
 	RecordCmd.cc \
 	StopCmd.cc \
-	TrigclrCmd.cc \
+	TrigReleaseCmd.cc \
+	TrigGenCmd.cc\
+	TrigSetupCmd.cc\
+	TrigCoefCmd.cc\
+	TrigInfoCmd.cc\
 	ReadCmd.cc \
 	UdpCmd.cc \
 	PageperiodCmd.cc \
@@ -89,7 +93,11 @@ noinst_HEADERS = \
 	FreeCmd.h \
 	RecordCmd.h \
 	StopCmd.h \
-	TrigclrCmd.h \
+	TrigReleaseCmd.h \
+	TrigGenCmd.h\
+	TrigSetupCmd.h\
+	TrigCoefCmd.h\
+	TrigInfoCmd.h\
 	ReadCmd.h \
 	UdpCmd.h \
 	PageperiodCmd.h \
diff --git a/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc b/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc
index 4f7c32fb427b12b687a37a152eb043f7b1f6e8be..80a7ddc012683e44723cd026e97122fead7e0d2a 100644
--- a/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc
+++ b/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc
@@ -31,6 +31,7 @@ namespace LOFAR {
 
 MsgHandler::MsgHandler()
 {
+	TS						= TbbSettings::instance();
 	itsTriggerE		= new TBBTriggerEvent();
 	itsErrorE			=	new TBBErrorEvent();
 	itsBoardchangeE	= new	TBBBoardchangeEvent();
@@ -61,17 +62,21 @@ void MsgHandler::removeClient(GCFPortInterface& port)
 }
 
 //-----------------------------------------------------------------------------
-void MsgHandler::sendTrigger(GCFEvent& event)
+void MsgHandler::sendTrigger(GCFEvent& event, int boardnr)
 {
 	TPTriggerEvent	*TPE;
 	TPE	= new TPTriggerEvent(event);
-		
-	itsTriggerE->channel	= TPE->channel;
-	itsTriggerE->time			=	TPE->time;
-	itsTriggerE->sample		= TPE->sample;
-	
+	int channel = TPE->trigger.channel + (boardnr * TS->maxBoards());	
+	TS->convertCh2Rcu(channel, &itsTriggerE->rcu);
+	itsTriggerE->sequence_nr			=	TPE->trigger.sequence_nr;
+	itsTriggerE->time							=	TPE->trigger.time;
+	itsTriggerE->sample_nr				= TPE->trigger.sample_nr;
+	itsTriggerE->trigger_sum 			= TPE->trigger.sum;
+	itsTriggerE->trigger_samples	= TPE->trigger.samples;
+	itsTriggerE->peak_value 			= TPE->trigger.peak;
+				
 	sendMessage(*itsTriggerE);
-	
+	TS->setChTriggered(channel, true);
 	delete TPE;		
 }
 
diff --git a/MAC/APL/PIC/TBBDriver/src/MsgHandler.h b/MAC/APL/PIC/TBBDriver/src/MsgHandler.h
index e1ba7daa74e540346cc2fe12eee8f30b38b9e1af..0643f1793f18ce89d0681ebc0435368e03b51797 100644
--- a/MAC/APL/PIC/TBBDriver/src/MsgHandler.h
+++ b/MAC/APL/PIC/TBBDriver/src/MsgHandler.h
@@ -33,6 +33,7 @@
 
 #include <APL/TBB_Protocol/TBB_Protocol.ph>
 #include "TP_Protocol.ph"
+#include "DriverSettings.h"
 
 namespace LOFAR {
 	namespace TBB {
@@ -51,7 +52,7 @@ namespace LOFAR {
 				
 				void removeClient(GCFPortInterface& port);
 				
-				void sendTrigger(GCFEvent& event);
+				void sendTrigger(GCFEvent& event, int boardnr);
 				
 				void sendError(GCFEvent& event);
 				
@@ -62,6 +63,7 @@ namespace LOFAR {
 			protected:
 				
 			private:
+				TbbSettings *TS;
 				
 				std::set<GCFPortInterface*> itsClientMsgList;  // list of clients witch receive messages
 				
diff --git a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
index b5a61474827d9e816cf7a7b47a6b45464d5a37c8..03331fa22971ecf501a3b3733b25fbe844d01e02 100644
--- a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc
@@ -38,7 +38,7 @@ PageperiodCmd::PageperiodCmd():
 	itsTPE 			= new TPPageperiodEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBPageperiodackEvent();
+	itsTBBackE 	= new TBBPageperiodAckEvent();
 	setWaitAck(true);
 }
 	  
@@ -52,7 +52,7 @@ PageperiodCmd::~PageperiodCmd()
 // ----------------------------------------------------------------------------
 bool PageperiodCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_PAGEPERIOD)||(event.signal == TP_PAGEPERIODACK)) {
+	if ((event.signal == TBB_PAGEPERIOD)||(event.signal == TP_PAGEPERIOD_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -94,7 +94,7 @@ void PageperiodCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	}
 	else {
-		itsTPackE = new TPPageperiodackEvent(event);
+		itsTPackE = new TPPageperiodAckEvent(event);
 		
 		itsBoardStatus 					= itsTPackE->status;
 		itsTBBackE->pageperiod	= itsTPackE->pageperiod;
diff --git a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h
index 7307f6ea3c0606743ab25f473ffe52c9ef8a3d8e..e195b45d239e6ee747416010f7fb3cf9eb8f0c05 100644
--- a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPPageperiodEvent			*itsTPE;
-				TPPageperiodackEvent	*itsTPackE;
+				TPPageperiodAckEvent	*itsTPackE;
 				TBBPageperiodEvent		*itsTBBE;
-				TBBPageperiodackEvent	*itsTBBackE;
+				TBBPageperiodAckEvent	*itsTBBackE;
 				
 				// variables holding data from tp cmd
 				uint32	itsBoardStatus;
diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
index b2d753efbbda68d8398f59d52987022d7b926482..e72fde040d6b8e6fa601378354f7e8c626078d09 100644
--- a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
+++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc
@@ -65,56 +65,72 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
   //
   // If no error, lookup buf.opcode number, else assign ACK_ERROR buf.event.signal number
   //
+  // for all commands opcode(4) + status(4)
   switch(buf.opcode)
 	 {
-	 
 	 case TPALLOC:
-  		buf.event.signal = TP_ALLOCACK;
+  		buf.event.signal = TP_ALLOC_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPFREE:
-  		buf.event.signal = TP_FREEACK;
+  		buf.event.signal = TP_FREE_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPRECORD:
-  		buf.event.signal = TP_RECORDACK;
+  		buf.event.signal = TP_RECORD_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPSTOP:
-  		buf.event.signal = TP_STOPACK;
+  		buf.event.signal = TP_STOP_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPTRIGGER:
   		buf.event.signal = TP_TRIGGER;
-  		buf.event.length = 20;
+  		buf.event.length = 44;
+  		break;
+	 case TPTRIGRELEASE:
+  		buf.event.signal = TP_TRIG_RELEASE_ACK;
+  		buf.event.length = 8;
+  		break;
+  	case TPTRIGGENERATE:
+  		buf.event.signal = TP_TRIG_GENERATE_ACK;
+  		buf.event.length = 8;
   		break;
-	 case TPTRIGCLR:
-  		buf.event.signal = TP_TRIGCLRACK;
+  	case TPTRIGSETUP:
+  		buf.event.signal = TP_TRIG_SETUP_ACK;
   		buf.event.length = 8;
   		break;
+  	case TPTRIGCOEF:
+  		buf.event.signal = TP_TRIG_COEF_ACK;
+  		buf.event.length = 8;
+  		break;
+  	case TPTRIGINFO:
+  		buf.event.signal = TP_TRIG_INFO_ACK;
+  		buf.event.length = 40;
+  		break;	
 	 case TPREAD:
-  		buf.event.signal = TP_READACK;
+  		buf.event.signal = TP_READ_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPUDP:
-  		buf.event.signal = TP_UDPACK;
+  		buf.event.signal = TP_UDP_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPPAGEPERIOD:
-  		buf.event.signal = TP_PAGEPERIODACK;
+  		buf.event.signal = TP_PAGEPERIOD_ACK;
   		buf.event.length = 12;
   		break;
   		
 	 case TPVERSION:
-  		buf.event.signal = TP_VERSIONACK;
+  		buf.event.signal = TP_VERSION_ACK;
   		buf.event.length = 40;
   		break;
 	 case TPSIZE:
-  		buf.event.signal = TP_SIZEACK;
+  		buf.event.signal = TP_SIZE_ACK;
   		buf.event.length = 12;
   		break;
    case TPSTATUS:
-  		buf.event.signal = TP_STATUSACK;
+  		buf.event.signal = TP_STATUS_ACK;
   		buf.event.length = 44;
   		break;
 	 case TPERROR:
@@ -122,51 +138,51 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port)
   		buf.event.length = 12;
   		break;
 	 case TPCLEAR:
-  		buf.event.signal = TP_CLEARACK;
+  		buf.event.signal = TP_CLEAR_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPRESET:
-  		buf.event.signal = TP_RESETACK;
+  		buf.event.signal = TP_RESET_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPCONFIG:
-  		buf.event.signal = TP_CONFIGACK;
+  		buf.event.signal = TP_CONFIG_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPERASEF:
-  		buf.event.signal = TP_ERASEFACK;
+  		buf.event.signal = TP_ERASEF_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPREADF:
-  		buf.event.signal = TP_READFACK;
+  		buf.event.signal = TP_READF_ACK;
   		buf.event.length = 1032;
   		break;
 	 case TPWRITEF:
-  		buf.event.signal = TP_WRITEFACK;
+  		buf.event.signal = TP_WRITEF_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPREADW:
-  		buf.event.signal = TP_READWACK;
+  		buf.event.signal = TP_READW_ACK;
   		buf.event.length = 16;
   		break;
 	 case TPWRITEW:
-  		buf.event.signal = TP_WRITEWACK;
+  		buf.event.signal = TP_WRITEW_ACK;
   		buf.event.length = 8;
   		break;
 	 case TPREADR:
-  		buf.event.signal = TP_READRACK;
+  		buf.event.signal = TP_READR_ACK;
   		buf.event.length = 2056;
   		break;
    case TPWRITER:
-  		buf.event.signal = TP_WRITERACK;
+  		buf.event.signal = TP_WRITER_ACK;
   		buf.event.length = 8;
   		break;
    case TPREADX:
-  		buf.event.signal = TP_READXACK;
+  		buf.event.signal = TP_READX_ACK;
   		buf.event.length = 1032;
   		break;	
    case TPALIVE:
-  		buf.event.signal = TP_ALIVEACK;
+  		buf.event.signal = TP_ALIVE_ACK;
   		buf.event.length = 12;
   		break;	
   		
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
index 4f53da285b8ffee05f72235c07fe0b3cf89d3ef7..c1c1140a5d957e5d4cda618b8f03cc67e6573310 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc
@@ -39,7 +39,7 @@ ReadCmd::ReadCmd()
 	itsTPE 			= new TPReadEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBReadackEvent();
+	itsTBBackE 	= new TBBReadAckEvent();
 	
 	itsTBBackE->status_mask = 0;
 	setWaitAck(true);
@@ -55,7 +55,7 @@ ReadCmd::~ReadCmd()
 // ----------------------------------------------------------------------------
 bool ReadCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_READ)||(event.signal == TP_READACK)) {
+	if ((event.signal == TBB_READ)||(event.signal == TP_READ_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -71,6 +71,11 @@ void ReadCmd::saveTbbEvent(GCFEvent& event)
 	TS->convertRcu2Ch(itsTBBE->channel,&boardnr,&channelnr);
 		
 	setChannelNr(channelnr);
+	
+	if (!TS->isBoardActive(getBoardNr())) {	
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
 				
 	// initialize TP send frame
 	itsTPE->opcode			= TPREAD;
@@ -98,7 +103,7 @@ void ReadCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	}	else {
-		itsTPackE = new TPReadackEvent(event);
+		itsTPackE = new TPReadAckEvent(event);
 		
 		LOG_DEBUG_STR(formatString("Received ReadAck from boardnr[%d]", getBoardNr()));
 		delete itsTPackE;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadCmd.h
index 7c9fe6def0a82067c77cfd2b918980bffc443692..797a161c405e877d456ee37426a7321dc48b018d 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ReadCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPReadEvent			*itsTPE;
-				TPReadackEvent	*itsTPackE;
+				TPReadAckEvent	*itsTPackE;
 				TBBReadEvent		*itsTBBE;
-				TBBReadackEvent	*itsTBBackE;
+				TBBReadAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
index 2c235cb47b389d413a7f738b66d46634bab8d91b..38f6f1f4c25b8e1c199dcabb250aa1a7994e47a2 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc
@@ -34,7 +34,7 @@ using	namespace TBB;
 static const int FL_SIZE 						= 64 * 1024 *1024; // 64 MB in bytes
 static const int FL_N_PAGES 				= 32; // 32 pages in flash
 static const int FL_N_SECTORS				= 512; // 512 sectors in flash
-static const int FL_N_BLOCKS				= 65536; // 65336 blocks in flash
+static const int FL_N_BLOCKS				= 65536; // 65536 blocks in flash
 
 static const int FL_PAGE_SIZE 			= FL_SIZE / FL_N_PAGES; // 2.097.152 bytes  
 static const int FL_SECTOR_SIZE			= FL_SIZE / FL_N_SECTORS; // 131.072 bytes
@@ -70,7 +70,7 @@ ReadfCmd::~ReadfCmd()
 // ----------------------------------------------------------------------------
 bool ReadfCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_READ_IMAGE)||(event.signal == TP_READFACK)) {
+	if ((event.signal == TBB_READ_IMAGE)||(event.signal == TP_READF_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -81,9 +81,13 @@ void ReadfCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE = new TBBReadImageEvent(event);
 	
-	setBoardNr(itsTBBE->board);	
-	
 	itsTBBackE->status_mask = 0;
+	if (TS->isBoardActive(itsTBBE->board)) {	
+		setBoardNr(itsTBBE->board);
+	} else {
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
 	
 	itsImage = itsTBBE->image;
 	itsBlock = (itsImage * FL_BLOCKS_IN_PAGE);
@@ -101,7 +105,7 @@ void ReadfCmd::sendTpEvent()
 {
 	itsTPE->addr		= static_cast<uint32>(itsBlock * FL_BLOCK_SIZE);
 	TS->boardPort(getBoardNr()).send(*itsTPE);
-	TS->boardPort(getBoardNr()).setTimer(TS->timeout());
+	TS->boardPort(getBoardNr()).setTimer(0.2);
 }
 
 // ----------------------------------------------------------------------------
@@ -112,7 +116,7 @@ void ReadfCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 		setDone(true);	
 	} else {
-		itsTPackE = new TPReadfackEvent(event);
+		itsTPackE = new TPReadfAckEvent(event);
 		
 		itsBoardStatus	= itsTPackE->status;
 		  
@@ -142,7 +146,7 @@ void ReadfCmd::saveTpAckEvent(GCFEvent& event)
 			}
 			
 			itsBlock++;
-			if (itsBlock >= ((itsImage + 1) * FL_BLOCKS_IN_PAGE)) {
+			if (itsBlock == ((itsImage + 1) * FL_BLOCKS_IN_PAGE)) {
 				setDone(true);
 			}
 		} else {
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h
index 5740e86e7a22747d274537c00730ce312c570396..1563a9d5ed5fcf868a533c575b469c31aed7f662 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h
@@ -61,7 +61,7 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPReadfEvent					*itsTPE;
-				TPReadfackEvent				*itsTPackE;
+				TPReadfAckEvent				*itsTPackE;
 				TBBReadImageEvent			*itsTBBE;
 				TBBReadImageAckEvent	*itsTBBackE;
 				FILE 									*itsFile;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
index e37a5e7f8dcdfdbe47f81bd548371becebc30a4b..f98ab62add456975d333fecd2553355e7b181f82 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc
@@ -38,7 +38,9 @@ ReadwCmd::ReadwCmd():
 	itsTPE 			= new TPReadwEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBReadwackEvent();
+	itsTBBackE 	= new TBBReadwAckEvent();
+	
+	itsTBBackE->status_mask = 0;
 	setWaitAck(true);
 }
 	  
@@ -52,7 +54,7 @@ ReadwCmd::~ReadwCmd()
 // ----------------------------------------------------------------------------
 bool ReadwCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_READW)||(event.signal == TP_READWACK)) {
+	if ((event.signal == TBB_READW)||(event.signal == TP_READW_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -63,9 +65,12 @@ void ReadwCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE	= new TBBReadwEvent(event);
 	
-	setBoardNr(itsTBBE->board);	
-	
-	itsTBBackE->status_mask = 0;
+	if (TS->isBoardActive(itsTBBE->board)) {	
+		setBoardNr(itsTBBE->board);
+	} else {
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
 	
 	// initialize TP send frame
 	itsTPE->opcode	= TPREADW;
@@ -90,7 +95,7 @@ void ReadwCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	}
 	else {
-		itsTPackE = new TPReadwackEvent(event);
+		itsTPackE = new TPReadwAckEvent(event);
 		
 		itsBoardStatus	= itsTPackE->status;
 		itsTBBackE->wordlo	= itsTPackE->wordlo;
diff --git a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h
index 883873c0131b8b3b1f184d8ad94a660224366860..4e918c712f24d1235781518c173583db714bf840 100644
--- a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPReadwEvent			*itsTPE;
-				TPReadwackEvent		*itsTPackE;
+				TPReadwAckEvent		*itsTPackE;
 				TBBReadwEvent			*itsTBBE;
-				TBBReadwackEvent	*itsTBBackE;
+				TBBReadwAckEvent	*itsTBBackE;
 				
 				// variables holding data from tp cmd
 				uint32	itsBoardStatus;
diff --git a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
index c440aaa1c2b52edb440ff86117ffab3c709c250d..1930c8927280b693e13ed6cb376e7c8788919b77 100644
--- a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc
@@ -38,7 +38,7 @@ RecordCmd::RecordCmd():
 	itsTPE 			= new TPRecordEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBRecordackEvent();
+	itsTBBackE 	= new TBBRecordAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -57,7 +57,7 @@ RecordCmd::~RecordCmd()
 // ----------------------------------------------------------------------------
 bool RecordCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_RECORD)||(event.signal == TP_RECORDACK)) {
+	if ((event.signal == TBB_RECORD)||(event.signal == TP_RECORD_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -67,14 +67,23 @@ bool RecordCmd::isValid(GCFEvent& event)
 void RecordCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE	= new TBBRecordEvent(event);
+	
 		
 	// convert rcu-bitmask to tbb-channelmask
-	int boardnr;
-	int channelnr;
+	int32 board;				// board 0 .. 11
+	int32 board_channel;// board_channel 0 .. 15	
+	int32 channel;			// channel 0 .. 191 (= maxboard * max_channels_on_board)	
 	for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) {
-		if(itsTBBE->rcu_mask.test(rcunr)) {
-			TS->convertRcu2Ch(rcunr,&boardnr,&channelnr);	
-			itsChannelMask[boardnr] |= (1 << channelnr);
+		TS->convertRcu2Ch(rcunr,&board,&board_channel);
+		channel = (board * TS->nrChannelsOnBoard()) + board_channel;
+		if (itsTBBE->rcu_mask.test(rcunr)) { 
+			if ((TS->getChState(channel) == 'A') || (TS->getChState(channel) == 'S')) {
+				itsChannelMask[board] |= (1 << board_channel);
+				TS->setChSelected(channel,true);
+				
+			} else {
+				TS->setChStatus(channel,(uint16)(TBB_RCU_NOT_ALLOCATED >> 16));
+			}
 		}
 	} 
 	
@@ -97,7 +106,7 @@ void RecordCmd::saveTbbEvent(GCFEvent& event)
 	setBoardMask(boardmask);
 	
 	// select firt channel to handle
-	nextChannelNr();
+	nextSelectedChannelNr();
 	
 	// initialize TP send frame
 	itsTPE->opcode	= TPRECORD;
@@ -109,18 +118,12 @@ void RecordCmd::saveTbbEvent(GCFEvent& event)
 // ----------------------------------------------------------------------------
 void RecordCmd::sendTpEvent()
 {
-	itsRcuStatus = 0;
-	
 	itsTPE->channel = TS->getChInputNr(getChannelNr());
+	itsRcuStatus = 0;
 	
-	if ((TS->getChState(getChannelNr()) != 'A') && (TS->getChState(getChannelNr()) != 'S'))
-		itsRcuStatus |= TBB_RCU_NOT_ALLOCATED;
-	
-	if (itsTBBackE->status_mask[getBoardNr()] == 0) {
-		if (itsRcuStatus == 0) {
-			TS->boardPort(getBoardNr()).send(*itsTPE);
-			LOG_DEBUG_STR(formatString("Sending RecordCmd to boardnr[%d], channel[%08X]", getBoardNr(), itsTPE->channel));
-		}
+	if ((itsTBBackE->status_mask[getBoardNr()] == 0) && (itsRcuStatus == 0)) {
+		TS->boardPort(getBoardNr()).send(*itsTPE);
+		LOG_DEBUG_STR(formatString("Sending RecordCmd to boardnr[%d], channel[%08X]", getBoardNr(), itsTPE->channel));
 	}
 	TS->boardPort(getBoardNr()).setTimer(TS->timeout());
 }
@@ -132,9 +135,8 @@ void RecordCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask[getBoardNr()] |= TBB_RCU_COMM_ERROR;
 		itsRcuStatus |= TBB_TIMEOUT_ETH;
-	}
-	else {
-		itsTPackE = new TPRecordackEvent(event);
+	}	else {
+		itsTPackE = new TPRecordAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F)));
@@ -152,11 +154,11 @@ void RecordCmd::saveTpAckEvent(GCFEvent& event)
 	if (itsRcuStatus || itsTBBackE->status_mask[getBoardNr()]) {
 		int32 rcu;
 		TS->convertCh2Rcu(getChannelNr(),&rcu);
-		LOG_INFO_STR(formatString("ERROR RecordCmd Rcu[%d], DriverStatus[0x%x], RcuStatus[0x%x]",
+		LOG_INFO_STR(formatString("ERROR RecordCmd Rcu[%d], DriverStatus[0x%08x], RcuStatus[0x%08x]",
 			rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus));
 	}
 	itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus;
-	nextChannelNr();
+	nextSelectedChannelNr();
 }
 
 // ----------------------------------------------------------------------------
diff --git a/MAC/APL/PIC/TBBDriver/src/RecordCmd.h b/MAC/APL/PIC/TBBDriver/src/RecordCmd.h
index 97dd914c46afd56469661bda9189423186961c90..9c01bbc2b9e6ac1d47c24945df8edb17a5bf2f7c 100644
--- a/MAC/APL/PIC/TBBDriver/src/RecordCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/RecordCmd.h
@@ -64,9 +64,9 @@ namespace LOFAR {
 				uint32	itsRcuStatus;
 				
 				TPRecordEvent			*itsTPE;
-				TPRecordackEvent	*itsTPackE;
+				TPRecordAckEvent	*itsTPackE;
 				TBBRecordEvent		*itsTBBE;
-				TBBRecordackEvent	*itsTBBackE;
+				TBBRecordAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
index 2a1b22b6e311dc4da0fe185e5e77f32b87ab3bf4..ce01155a95227f855c22fb0c1539bc7b514c02a5 100644
--- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
@@ -37,7 +37,7 @@ ResetCmd::ResetCmd()
 	itsTPE 			= new TPResetEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBResetackEvent();
+	itsTBBackE 	= new TBBResetAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -55,7 +55,7 @@ ResetCmd::~ResetCmd()
 // ----------------------------------------------------------------------------
 bool ResetCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_RESET)||(event.signal == TP_RESETACK)) {
+	if ((event.signal == TBB_RESET)||(event.signal == TP_RESET_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -101,7 +101,7 @@ void ResetCmd::saveTpAckEvent(GCFEvent& event)
 		;
 	}
 	else {
-		itsTPackE = new TPResetackEvent(event);
+		itsTPackE = new TPResetAckEvent(event);
 		
 		delete itsTPackE;
 	}
diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.h b/MAC/APL/PIC/TBBDriver/src/ResetCmd.h
index b25c4f183d364c051c74afb6d86ac490c67ca14c..9e5d72d0941217c6f0951dc578ef4df41ce0126f 100644
--- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPResetEvent			*itsTPE;
-				TPResetackEvent		*itsTPackE;
+				TPResetAckEvent		*itsTPackE;
 				TBBResetEvent			*itsTBBE;
-				TBBResetackEvent	*itsTBBackE;
+				TBBResetAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
index ef99c0fbca6fa975465c2bccc7e2fac91b0ad8af..60a389f5a8c277e5fe9b998fd6f88f5ec1acca4a 100644
--- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc
@@ -37,7 +37,7 @@ SizeCmd::SizeCmd()
 	itsTPE 			= new TPSizeEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBSizeackEvent();
+	itsTBBackE 	= new TBBSizeAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -55,7 +55,7 @@ SizeCmd::~SizeCmd()
 // ----------------------------------------------------------------------------
 bool SizeCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_SIZE)||(event.signal == TP_SIZEACK)) {
+	if ((event.signal == TBB_SIZE)||(event.signal == TP_SIZE_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -97,7 +97,7 @@ void SizeCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR;
 	} else {
-		itsTPackE = new TPSizeackEvent(event);
+		itsTPackE = new TPSizeAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));	
diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.h b/MAC/APL/PIC/TBBDriver/src/SizeCmd.h
index 26bb995ef931502638b0ffe9b10f8b92525833f7..72121c95e6bbf9028ed6d21dca4883c95f0ea1f5 100644
--- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPSizeEvent			*itsTPE;
-				TPSizeackEvent	*itsTPackE;
+				TPSizeAckEvent	*itsTPackE;
 				TBBSizeEvent		*itsTBBE;
-				TBBSizeackEvent	*itsTBBackE;
+				TBBSizeAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
index 08c2c553712381af8a90f25eef6eccf289208955..3b01d1dac3a9d0f8053e3f74f6860a3a94c199f4 100644
--- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc
@@ -36,7 +36,7 @@ StatusCmd::StatusCmd()
 	itsTPE 			= new TPStatusEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBStatusackEvent();
+	itsTBBackE 	= new TBBStatusAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -54,7 +54,7 @@ StatusCmd::~StatusCmd()
 // ----------------------------------------------------------------------------
 bool StatusCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_STATUS)||(event.signal == TP_STATUSACK)) {
+	if ((event.signal == TBB_STATUS)||(event.signal == TP_STATUS_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -96,7 +96,7 @@ void StatusCmd::saveTpAckEvent(GCFEvent& event)
 	if (event.signal == F_TIMER) {
 		itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR;
 	}	else {
-		itsTPackE = new TPStatusackEvent(event);
+		itsTPackE = new TPStatusAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));	
diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.h b/MAC/APL/PIC/TBBDriver/src/StatusCmd.h
index c96b9dc7b94a6b22c4bfdebee7d87ea779234333..cb24443058ef43fdb0a2aa978dc423ec3d39a92e 100644
--- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPStatusEvent			*itsTPE;
-				TPStatusackEvent	*itsTPackE;
+				TPStatusAckEvent	*itsTPackE;
 				TBBStatusEvent		*itsTBBE;
-				TBBStatusackEvent	*itsTBBackE;
+				TBBStatusAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
index 571b29d92e91e03187ef6e6c82236a3a64794f5c..6519b16a049597d17a6ffd7b55689ea0a533db41 100644
--- a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc
@@ -38,7 +38,7 @@ StopCmd::StopCmd():
 	itsTPE 			= new TPStopEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBStopackEvent();
+	itsTBBackE 	= new TBBStopAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]	= 0;
@@ -57,7 +57,7 @@ StopCmd::~StopCmd()
 // ----------------------------------------------------------------------------
 bool StopCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_STOP)||(event.signal == TP_STOPACK)) {
+	if ((event.signal == TBB_STOP)||(event.signal == TP_STOP_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -67,14 +67,22 @@ bool StopCmd::isValid(GCFEvent& event)
 void StopCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE	= new TBBStopEvent(event);
+	
 		
 	// convert rcu-bitmask to tbb-channelmask
-	int boardnr;
-	int channelnr;
+	int32 board;				// board 0 .. 11
+	int32 board_channel;// board_channel 0 .. 15	
+	int32 channel;			// channel 0 .. 191 (= maxboard * max_channels_on_board)	
 	for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) {
-		if(itsTBBE->rcu_mask.test(rcunr)) {
-			TS->convertRcu2Ch(rcunr,&boardnr,&channelnr);	
-			itsChannelMask[boardnr] |= (1 << channelnr);
+		TS->convertRcu2Ch(rcunr,&board,&board_channel);
+		channel = (board * TS->nrChannelsOnBoard()) + board_channel;	
+		if(itsTBBE->rcu_mask.test(rcunr)) { 
+			if (TS->getChState(channel) == 'R') {
+				itsChannelMask[board] |= (1 << board_channel);
+				TS->setChSelected(channel,true);
+			} else {
+				TS->setChStatus(channel,(uint16)(TBB_RCU_NOT_RECORDING >> 16));	
+			}
 		}
 	} 
 	
@@ -99,7 +107,7 @@ void StopCmd::saveTbbEvent(GCFEvent& event)
 	setBoardMask(boardmask);
 	
 	// select firt channel to handle
-	nextChannelNr();
+	nextSelectedChannelNr();
 	
 	// initialize TP send frame
 	itsTPE->opcode			= TPSTOP;
@@ -111,13 +119,8 @@ void StopCmd::saveTbbEvent(GCFEvent& event)
 // ----------------------------------------------------------------------------
 void StopCmd::sendTpEvent()
 {
-	itsRcuStatus = 0;
-		
 	itsTPE->channel = TS->getChInputNr(getChannelNr());
-	
-	if (TS->getChState(getChannelNr()) != 'R') {
-		itsRcuStatus |= TBB_RCU_NOT_RECORDING;
-	}
+	itsRcuStatus = 0;
 	
 	if ((itsTBBackE->status_mask[getBoardNr()] == 0) && (itsRcuStatus == 0)) {
 		TS->boardPort(getBoardNr()).send(*itsTPE);
@@ -135,7 +138,7 @@ void StopCmd::saveTpAckEvent(GCFEvent& event)
 		itsRcuStatus |= TBB_TIMEOUT_ETH;
 	}
 	else {
-		itsTPackE = new TPStopackEvent(event);
+		itsTPackE = new TPStopAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F)));
@@ -158,7 +161,7 @@ void StopCmd::saveTpAckEvent(GCFEvent& event)
 			rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus));
 	}
 	itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus;
-	nextChannelNr();
+	nextSelectedChannelNr();
 }
 
 // ----------------------------------------------------------------------------
diff --git a/MAC/APL/PIC/TBBDriver/src/StopCmd.h b/MAC/APL/PIC/TBBDriver/src/StopCmd.h
index daeed824935ffadad46367c0a098c1aae142c6af..157e0f8d298deacb6138631b5195222f345374a3 100644
--- a/MAC/APL/PIC/TBBDriver/src/StopCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/StopCmd.h
@@ -64,9 +64,9 @@ namespace LOFAR {
 				uint32	itsRcuStatus;
 				
 				TPStopEvent			*itsTPE;
-				TPStopackEvent	*itsTPackE;
+				TPStopAckEvent	*itsTPackE;
 				TBBStopEvent		*itsTBBE;
-				TBBStopackEvent	*itsTBBackE;
+				TBBStopAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
index f5ee675f8210e2755ab39571d9350237e5c06675..0b1835504afc0ca623b49c436ba5c10dd70ed1f4 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
@@ -36,7 +36,11 @@
 #include "FreeCmd.h"
 #include "RecordCmd.h"
 #include "StopCmd.h"
-#include "TrigclrCmd.h"
+#include "TrigReleaseCmd.h"
+#include "TrigGenCmd.h"
+#include "TrigSetupCmd.h"
+#include "TrigCoefCmd.h"
+#include "TrigInfoCmd.h"
 #include "ReadCmd.h"
 #include "UdpCmd.h"
 #include "PageperiodCmd.h"
@@ -120,9 +124,8 @@ TBBDriver::TBBDriver(string name)
   TS->getTbbSettings();
   
 	cmd = 0;
-	itsActiveBoards = 0x00000000;
+	itsActiveBoards = 0x10000000;
 	itsAliveCheck = false;
-	itsSizeCheck = false;
 	itsActiveBoardsChange = false;
 	itsResetCount = 0;
   
@@ -178,11 +181,6 @@ TBBDriver::TBBDriver(string name)
 	itsAlive					= new TPAliveEvent();
  	itsAlive->opcode	= TPALIVE;
  	itsAlive->status	= 0;
- 	 	
- 	itsSize						=	new TPSizeEvent();
- 	itsSize->opcode 	= TPSIZE;
- 	itsSize->status 	= 0;
- 	
 }
 
 //-----------------------------------------------------------------------------
@@ -191,7 +189,6 @@ TBBDriver::~TBBDriver()
 	delete cmdhandler; 
 	delete msghandler;
 	delete itsAlive;
-	delete itsSize;
 }
 
 //-----------------------------------------------------------------------------
@@ -213,6 +210,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,7 +219,8 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port)
  				for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) {
  					itsBoard[bnr].send(free);	
  					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;
@@ -270,9 +269,10 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 			if (!itsTbbQueue->empty()) {
 				LOG_DEBUG_STR("The queue is NOT empty");
 				
-				GCFEvent e(itsTbbQueue->front().signal);
-				SetTbbCommand(e.signal);
-				status = cmdhandler->dispatch(e,*itsTbbQueue->front().port);
+				GCFEvent event;
+				memcpy(&event, itsTbbQueue->front().event, itsTbbQueue->front().length); 
+				SetTbbCommand(event.signal);
+				status = cmdhandler->dispatch(event,*itsTbbQueue->front().port);
 				
 				itsTbbQueue->pop_front();
 				TRAN(TBBDriver::busy_state);
@@ -317,15 +317,15 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 			}
 		} break;
 				
-		case TBB_GETCONFIG: {
-			TBBGetconfigackEvent ack;
+		case TBB_GET_CONFIG: {
+			TBBGetConfigAckEvent ack;
 			ack.max_boards = TS->maxBoards();
 			ack.active_boards_mask = TS->activeBoardsMask();
 			port.send(ack); 
 		} break;
 		
-		case TBB_RCUINFO: {
-			TBBRcuinfoackEvent ack;
+		case TBB_RCU_INFO: {
+			TBBRcuInfoAckEvent ack;
 			int rcu;
 			for (int32 ch = 0; ch < TS->maxChannels(); ch++) {
 				rcu = TS->getChRcuNr(ch);
@@ -345,14 +345,24 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 		
 		case TBB_SUBSCRIBE: {
 			msghandler->addClient(port)	;
+			TBBSubscribeAckEvent subscribeack;
+			port.send(subscribeack);
+			
 		} break;
 		
 		case TBB_UNSUBSCRIBE: {
 			msghandler->removeClient(port);
+			TBBUnsubscribeAckEvent unsubscribeack;
+			port.send(unsubscribeack);
 		} break;
 						
 		case TP_TRIGGER: {
-			msghandler->sendTrigger(event);
+			for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) {
+				if (&port == &TS->boardPort(boardnr)) {
+					msghandler->sendTrigger(event,boardnr);
+					break;
+				}
+			}
 		} break;
 
 		case TP_ERROR: {
@@ -381,7 +391,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 {
 	GCFEvent::TResult status = GCFEvent::HANDLED;    
 	
-	//LOG_INFO_STR(formatString("event.signal = [%d]",event.signal));
+	LOG_DEBUG_STR(formatString("busy_state signal = [%d]",event.signal));
 	switch(event.signal) {
 		case F_INIT: {
 		} break;
@@ -397,7 +407,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		
 		case F_TIMER: {
 			if (itsAliveCheck) {
-				if (CheckAlive(event, port))
+				if (CheckAlive(event, port)) // if true, then all boards are checked
 					TRAN(TBBDriver::idle_state);
 			}
 			if (&port != &itsAcceptor) { 
@@ -406,7 +416,6 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		} break;
 		
 		case F_DISCONNECTED: {
-			LOG_DEBUG("done_0");
 			itsAcceptor.setTimer((long)1);
 			TRAN(TBBDriver::idle_state);	
 		}	break;
@@ -418,15 +427,15 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 			status = RawEvent::dispatch(*this, port);
 		}	break;
 		
-		case TP_ALIVEACK: {
-			LOG_DEBUG("TP_ALIVEACK received");
-			if (CheckAlive(event, port)) {
+		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);
 			}
 		} break;
 		
-		case TBB_GETCONFIG: {
-			TBBGetconfigackEvent ack;
+		case TBB_GET_CONFIG: {
+			TBBGetConfigAckEvent ack;
 			ack.max_boards = TS->maxBoards();
 			ack.active_boards_mask = itsActiveBoards;
 			port.send(ack); 
@@ -442,41 +451,52 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		} break;
 		
 		case TP_TRIGGER: {
-			msghandler->sendTrigger(event);
+			for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) {
+				if (&port == &TS->boardPort(boardnr)) {
+					msghandler->sendTrigger(event,boardnr);
+					break;
+				}
+			}
 		} break;
 
 		case TP_ERROR: {
 			msghandler->sendError(event);
 		} break;		
 		
-		case TP_ALLOCACK:	
-		case TP_FREEACK:
-		case TP_RECORDACK: 
-		case TP_STOPACK:
-		case TP_TRIGCLRACK:
-		case TP_READACK:
-		case TP_UDPACK:
-		case TP_PAGEPERIODACK:	
-		case TP_VERSIONACK:
-		case TP_STATUSACK:
-		case TP_CLEARACK:
-		case TP_SIZEACK:	
-		case TP_RESETACK:
-		case TP_CONFIGACK:
-		case TP_ERASEFACK:
-		case TP_READFACK:
-		case TP_WRITEFACK:
-		case TP_READWACK:
-		case TP_WRITEWACK:
-		case TP_READRACK:
-		case TP_WRITERACK:
-		case TP_READXACK:	
+		case TP_ALLOC_ACK:	
+		case TP_FREE_ACK:
+		case TP_RECORD_ACK: 
+		case TP_STOP_ACK:
+		case TP_TRIG_RELEASE_ACK:
+		case TP_TRIG_GENERATE_ACK:
+		case TP_TRIG_SETUP_ACK:
+		case TP_TRIG_COEF_ACK:
+		case TP_TRIG_INFO_ACK:				
+		case TP_READ_ACK:
+		case TP_UDP_ACK:
+		case TP_PAGEPERIOD_ACK:	
+		case TP_VERSION_ACK:
+		case TP_STATUS_ACK:
+		case TP_CLEAR_ACK:
+		case TP_SIZE_ACK:	
+		case TP_RESET_ACK:
+		case TP_CONFIG_ACK:
+		case TP_ERASEF_ACK:
+		case TP_READF_ACK:
+		case TP_WRITEF_ACK:
+		case TP_READW_ACK:
+		case TP_WRITEW_ACK:
+		case TP_READR_ACK:
+		case TP_WRITER_ACK:
+		case TP_READX_ACK:	
 		{
-			status = cmdhandler->dispatch(event,port); // dispatch ack from boards
-			if (cmdhandler->tpCmdDone() == true){
-				// set ALIVE timer
-				LOG_DEBUG("done_1");
-				itsAcceptor.setTimer((long)1);
+			if (cmdhandler->tpCmdDone() == false) {
+				status = cmdhandler->dispatch(event,port); // dispatch ack from boards
+			}
+			
+			if (cmdhandler->tpCmdDone() == true) {
+				// set ALIVE timer, and check for resets
+				//itsAcceptor.setTimer((long)5);
 				TRAN(TBBDriver::idle_state);
 			}
 		}	break;	
@@ -484,14 +504,16 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
 		default: {
 			LOG_DEBUG("DEFAULT");
 			if (cmdhandler->tpCmdDone() == true){
-				// set ALIVE timer
-				LOG_DEBUG("done_2");
-				itsAcceptor.setTimer((long)1);
+				// set ALIVE timer, and check for resets
+				//itsAcceptor.setTimer((long)5);
 				TRAN(TBBDriver::idle_state);
 			}
 			// put event on the queue
 			TbbEvent tbbevent;
-			tbbevent.signal = event.signal;
+			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;
@@ -564,9 +586,19 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
 	} else {
 		itsBoard[boardnr].cancelAllTimers();
 		checkmask &= ~(1 << boardnr);
-		if ((event.signal == TP_ALIVEACK) && (&port == &itsBoard[boardnr])){
+				
+		if ((event.signal == TP_ALIVE_ACK) && (&port == &itsBoard[boardnr])){
+			// new board, send free-cmd
+			if ((itsActiveBoards & (1 << boardnr)) == 0) {  // is it a new board ??
+ 				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()));
+			}
 			activeboards |= (1 << boardnr);
-			TPAliveackEvent ack(event);
+			TPAliveAckEvent ack(event);
 			if (ack.resetflag == 0){
 				itsResetCount[boardnr]++;
 				TS->clearRcuSettings(boardnr);
@@ -645,9 +677,33 @@ bool TBBDriver::SetTbbCommand(unsigned short signal)
 			cmdhandler->setTpCmd(cmd);
 		} break;
 		
-		case TBB_TRIGCLR:	{
-			TrigclrCmd *cmd;
-			cmd = new TrigclrCmd();
+		case TBB_TRIG_RELEASE:	{
+			TrigReleaseCmd *cmd;
+			cmd = new TrigReleaseCmd();
+			cmdhandler->setTpCmd(cmd);
+		} break;
+		
+		case TBB_TRIG_GENERATE:	{
+			TrigGenCmd *cmd;
+			cmd = new TrigGenCmd();
+			cmdhandler->setTpCmd(cmd);
+		} break;
+		
+		case TBB_TRIG_SETUP:	{
+			TrigSetupCmd *cmd;
+			cmd = new TrigSetupCmd();
+			cmdhandler->setTpCmd(cmd);
+		} break;
+		
+		case TBB_TRIG_COEF:	{
+			TrigCoefCmd *cmd;
+			cmd = new TrigCoefCmd();
+			cmdhandler->setTpCmd(cmd);
+		} break;
+		
+		case TBB_TRIG_INFO:	{
+			TrigInfoCmd *cmd;
+			cmd = new TrigInfoCmd();
 			cmdhandler->setTpCmd(cmd);
 		} break;
 		
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
index 4d7bd99dbb4e2299829a07e6f9f598449ec2bea8..e5a260d39c47331234074679eff58d02100cbfc4 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in
@@ -12,7 +12,7 @@ TBBDriver.IF_NAME=eth1
 # Communication settings for TBB boards
 #
 TBBDriver.TP_RETRIES=5
-TBBDriver.TP_TIMEOUT=0.2
+TBBDriver.TP_TIMEOUT=0.5
 
 #
 # Specify the MAC addresses of all TBB boards
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
index b06fa55cbcbe2312fd81556833c0176ed5af0ed7..8355108ebc03ff97ab10774a48e987fb7077621c 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
@@ -98,7 +98,6 @@ namespace LOFAR{
 			
 			// define some variables
 			TPAliveEvent			*itsAlive;
-			TPSizeEvent				*itsSize;
 	  	BoardCmdHandler		*cmdhandler;
 			MsgHandler				*msghandler;
 			Command 					*cmd;
@@ -109,8 +108,10 @@ namespace LOFAR{
 			int32 						*itsResetCount;
 			
 			struct TbbEvent{
-				unsigned short		signal;
+				//unsigned short		signal;
 				GCFPortInterface	*port;
+				uint32						length;
+				uint8							*event;
 			};
 			
 			std::deque<TbbEvent> *itsTbbQueue;
diff --git a/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot b/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot
index 12667ecd45dc0800aba0ec66cbd5cbd1fec6dcaf..f91a50e120f0afb55abbecd66c9fef57928541e9 100644
--- a/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot
+++ b/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot
@@ -17,43 +17,76 @@ include = '<Common/LofarTypes.h>';
 //include = '<APL/RTCCommon/Timestamp.h>';
 
 prelude = << PRELUDE_END
-
 	
 	//--TP Command Opcode's-------------------------------------------------------
 	//--Data Recording----------
-	static const uint32 TPALLOC   	= 0x00000100;  // OUT allocate buffer space to a certain input channel
-	static const uint32 TPFREE    	= 0x00000101;  // OUT free buffer settings and disable input channel 
-	static const uint32 TPRECORD  	= 0x00000102;  // OUT record channel
-	static const uint32 TPSTOP    	= 0x00000103;  // OUT freeze channel
-	//--Triggering--------------
-	static const uint32 TPTRIGGER 	= 0x00000200;  // IN trigger detected
-	static const uint32 TPTRIGCLR 	= 0x00000201;  // OUT clear trigger flag
-	//--Data reading------------
-	static const uint32 TPREAD    	= 0x00000300;  // OUT send recorded data to CEP
-	static const uint32 TPUDP     	= 0x00000301;  // OUT configure UDP and IP header
-	static const uint32 TPPAGEPERIOD= 0x00000302;  // OUT time in one page 30.2 format in nsec
-	//--Board information-------
-	static const uint32 TPVERSION 	= 0x00000700;  // IN/OUT returns board version
-	static const uint32 TPSIZE    	= 0x00000701;  // IN/OUT returns TBB memory size
-	//--Board status------------
-	static const uint32 TPERROR  		= 0x00000702;  // IN error on TBB board
-	static const uint32 TPSTATUS 		= 0x00000703;  // IN status of board Voltage and Temperature
-	static const uint32 TPALIVE  		= 0x00000704;  // OUT if response board exist
-	//--Board control-----------
-	static const uint32 TPCLEAR  		= 0x00000710;  // OUT clear registers
-	static const uint32 TPRESET   	= 0x00000711;  // OUT reset to facory image
-	static const uint32 TPCONFIG 		= 0x00000712;  // OUT reconfigure image
-	//--Remote system update----
-	static const uint32 TPERASEF 		= 0x00000720;  // OUT erase flash memory
-	static const uint32 TPREADF  		= 0x00000721;  // IN/OUT read flash memory
-	static const uint32 TPWRITEF		= 0x00000722;  // OUT write flash memory
-	//--DDR2 acces--------------
-	static const uint32 TPREADW			= 0x00000730;  // IN/OUT read 64bit word from mp
-	static const uint32 TPWRITEW 		= 0x00000731;  // OUT write 64bit wort to mp
-	//--Direct register acces--- 
-	static const uint32 TPREADR  		= 0x00000740;  // IN/OUT read register(direct access), for debug purpose
-	static const uint32 TPWRITER 		= 0x00000741;  // OUT write register(direct access), for debug purpose
-	static const uint32 TPREADX 		= 0x00000742;  // OUT write register(direct access), for debug purpose
+	static const uint32 TPALLOC   		= 0x00000100;  // OUT allocate buffer space to a certain input channel
+	static const uint32 TPFREE    		= 0x00000101;  // OUT free buffer settings and disable input channel 
+	static const uint32 TPRECORD  		= 0x00000102;  // OUT record channel
+	static const uint32 TPSTOP    		= 0x00000103;  // OUT freeze channel
+	//--Triggering--------------    	
+	static const uint32 TPTRIGGER 		= 0x00000200;  // IN trigger detected
+	static const uint32 TPTRIGRELEASE = 0x00000201;  // OUT clear trigger
+	static const uint32 TPTRIGGENERATE= 0x00000202;  // OUT generate trigger
+	static const uint32 TPTRIGSETUP		= 0x00000203;  // OUT setup trigger system
+	static const uint32 TPTRIGCOEF 		= 0x00000204;  // OUT set coefficients for the filters
+	static const uint32 TPTRIGINFO 		= 0x00000205;  // IN/OUT get trigger info, same data as TPTRIGGER
+	//--Data reading------------    	
+	static const uint32 TPREAD    		= 0x00000300;  // OUT send recorded data to CEP
+	static const uint32 TPUDP     		= 0x00000301;  // OUT configure UDP and IP header
+	static const uint32 TPPAGEPERIOD	= 0x00000302;  // OUT time in one page 30.2 format in nsec
+	//--Board information-------    	
+	static const uint32 TPVERSION 		= 0x00000700;  // IN/OUT returns board version
+	static const uint32 TPSIZE    		= 0x00000701;  // IN/OUT returns TBB memory size
+	//--Board status------------    	
+	static const uint32 TPERROR  			= 0x00000702;  // IN error on TBB board
+	static const uint32 TPSTATUS 			= 0x00000703;  // IN status of board Voltage and Temperature
+	static const uint32 TPALIVE  			= 0x00000704;  // OUT if response board exist
+	//--Board control-----------    	
+	static const uint32 TPCLEAR  			= 0x00000710;  // OUT clear registers
+	static const uint32 TPRESET   		= 0x00000711;  // OUT reset to facory image
+	static const uint32 TPCONFIG 			= 0x00000712;  // OUT reconfigure image
+	//--Remote system update----    	
+	static const uint32 TPERASEF 			= 0x00000720;  // OUT erase flash memory
+	static const uint32 TPREADF  			= 0x00000721;  // IN/OUT read flash memory
+	static const uint32 TPWRITEF			= 0x00000722;  // OUT write flash memory
+	//--DDR2 acces--------------    	
+	static const uint32 TPREADW				= 0x00000730;  // IN/OUT read 64bit word from mp
+	static const uint32 TPWRITEW 			= 0x00000731;  // OUT write 64bit wort to mp
+	//--Direct register acces---    	
+	static const uint32 TPREADR  			= 0x00000740;  // IN/OUT read register(direct access), for debug purpose
+	static const uint32 TPWRITER 			= 0x00000741;  // OUT write register(direct access), for debug purpose
+	static const uint32 TPREADX 			= 0x00000742;  // OUT write register(direct access), for debug purpose
+	
+	typedef struct TpTriggerInfo // trigger information
+	{
+		uint32 channel;
+		uint32 sequence_nr;
+		uint32 time;
+		uint32 sample_nr;
+		uint32 sum;
+		uint32 samples;
+		uint32 peak;
+		uint32 flags;
+		uint32 end_code;
+	};
+
+	typedef struct TpTriggerSetup // setup variables for 1 channel
+	{
+		uint32 level;
+		uint32 td_mode;
+		uint32 filter_select;
+		uint32 window;
+		uint32 dummy;
+	};
+		 
+	typedef struct TpFilterCoeffients // filter coeffients for 1 channel
+	{
+		uint32 c0;
+		uint32 c1;
+		uint32 c2;
+		uint32 c3;
+	};
 	
 PRELUDE_END;
 
@@ -98,7 +131,7 @@ event = {
 
 event = {
   noheader;
-  signal = ALLOCACK;
+  signal = ALLOC_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -130,7 +163,7 @@ event = {
 
 event = {
   noheader;
-  signal = FREEACK;
+  signal = FREE_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -162,7 +195,7 @@ event = {
 
 event = {
   noheader;
-  signal = RECORDACK;
+  signal = RECORD_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -194,7 +227,7 @@ event = {
 
 event = {
   noheader;
-  signal = STOPACK;
+  signal = STOP_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -219,23 +252,51 @@ event = {
     name = "status";
     type = "uint32";
   };
+	param = {
+		name = "trigger";
+		type = "TpTriggerInfo";
+	};
+};
+
+event = {
+  noheader;
+  signal = TRIG_RELEASE;
+  dir = OUT;
   param = {
-    name = "channel";
+    name = "opcode";
+    type = "uint32";
+  };
+  param = {
+    name = "status";
+    type = "uint32";
+  };
+  param = {
+    name = "mp";
+    type = "uint32";
+  };
+  param = {
+    name = "channel_mask"; // 1 mp, bit 0 .. 3
+    type = "uint32";
+  };
+};
+
+event = {
+  noheader;
+  signal = TRIG_RELEASE_ACK;
+  dir = IN;
+  param = {
+    name = "opcode";
+    type = "uint32";
+  };
+  param = {
+    name = "status";
     type = "uint32";
   };
-	param = {
-		name = "time";
-		type = "uint32";
-	};
-	param = {
-		name = "sample";
-		type = "uint32";
-	};
 };
   
 event = {
   noheader;
-  signal = TRIGCLR;
+  signal = TRIG_GENERATE;
   dir = OUT;
   param = {
     name = "opcode";
@@ -246,14 +307,54 @@ event = {
     type = "uint32";
   };
   param = {
-    name = "channel";
+    name = "mp";
+    type = "uint32";
+  };
+  param = {
+    name = "channel_mask"; // 1 mp, bit 0 .. 3
+    type = "uint32";
+  };
+};
+
+event = {
+  noheader;
+  signal = TRIG_GENERATE_ACK;
+  dir = IN;
+  param = {
+    name = "opcode";
+    type = "uint32";
+  };
+  param = {
+    name = "status";
+    type = "uint32";
+  };
+};
+
+event = {
+  noheader;
+  signal = TRIG_SETUP;
+  dir = OUT;
+  param = {
+    name = "opcode";
+    type = "uint32";
+  };
+  param = {
+    name = "status";
+    type = "uint32";
+  };
+  param = {
+    name = "mp";
     type = "uint32";
   };
+	param = {
+		name = "channel";
+		type = "TpTriggerSetup[4]";
+	};
 };
 
 event = {
   noheader;
-  signal = TRIGCLRACK;
+  signal = TRIG_SETUP_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -265,6 +366,80 @@ event = {
   };
 };
 
+event = {
+	noheader;
+	signal = TRIG_COEF;
+	dir = OUT;
+	param = {
+		name = "opcode";
+		type = "uint32";
+	};
+	param = {
+		name = "status";
+		type = "uint32";
+	};
+	param = {
+		name = "mp";
+		type = "uint32";
+	};
+	param = {
+		name = "channel";
+		type = "TpFilterCoeffients[4]";
+	};
+	
+};
+
+event = {
+	noheader;
+	signal = TRIG_COEF_ACK;
+	dir = IN;
+	param = {
+		name = "opcode";
+		type = "uint32";
+	};
+	param = {
+		name = "status";
+		type = "uint32";
+	};
+};
+
+event = {
+	noheader;
+	signal = TRIG_INFO;
+	dir = OUT;
+	param = {
+		name = "opcode";
+		type = "uint32";
+	};
+	param = {
+		name = "status";
+		type = "uint32";
+	};
+	param = {
+		name = "channel";
+		type = "uint32";
+	};
+};
+
+event = {
+	noheader;
+	signal = TRIG_INFO_ACK;
+	dir = IN;
+	param = {
+		name = "opcode";
+		type = "uint32";
+	};
+	param = {
+		name = "status";
+		type = "uint32";
+	};
+	param = {
+		name = "trigger";
+		type = "TpTriggerInfo";
+	};
+};
+
+
 //--Data reading--------------
 event = {
   noheader;
@@ -302,7 +477,7 @@ event = {
 
 event = {
   noheader;
-  signal = READACK;
+  signal = READ_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -342,7 +517,7 @@ event = {
 
 event = {
   noheader;
-  signal = UDPACK;
+  signal = UDP_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -374,7 +549,7 @@ event = {
 
 event = {
   noheader;
-  signal = PAGEPERIODACK;
+  signal = PAGEPERIOD_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -407,7 +582,7 @@ event = {
 
 event = {
   noheader;
-  signal = VERSIONACK;
+  signal = VERSION_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -467,7 +642,7 @@ event = {
 
 event = {
   noheader;
-  signal = SIZEACK;
+  signal = SIZE_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -517,7 +692,7 @@ event = {
 
 event = {
   noheader;
-  signal = STATUSACK;
+  signal = STATUS_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -581,7 +756,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = ALIVEACK;
+  signal = ALIVE_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -614,7 +789,7 @@ event = {
 
 event = {
   noheader;
-  signal = CLEARACK;
+  signal = CLEAR_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -642,7 +817,7 @@ event = {
 
 event = {
   noheader;
-  signal = RESETACK;
+  signal = RESET_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -674,7 +849,7 @@ event = {
 
 event = {
   noheader;
-  signal = CONFIGACK;
+  signal = CONFIG_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -707,7 +882,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = ERASEFACK;
+  signal = ERASEF_ACK;
   dir = INOUT;
   param = {
     name = "opcode";
@@ -739,7 +914,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = READFACK;
+  signal = READF_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -779,7 +954,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = WRITEFACK;
+  signal = WRITEF_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -816,7 +991,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = READWACK;
+  signal = READW_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -868,7 +1043,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = WRITEWACK;
+  signal = WRITEW_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -909,7 +1084,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = READRACK;
+  signal = READR_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -957,7 +1132,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = WRITERACK;
+  signal = WRITER_ACK;
   dir = IN;
   param = {
     name = "opcode";
@@ -1005,7 +1180,7 @@ event  = {
 
 event  = {
   noheader;
-  signal = READXACK;
+  signal = READX_ACK;
   dir = IN;
   param = {
     name = "opcode";
diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
index de817013cd928b69557167a7c1169fa452b43d8a..43c88416239db78252df8d9232d8858dbb01c7ce 100644
--- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc
@@ -164,7 +164,7 @@ UdpCmd::UdpCmd():
 	itsTPE 			= new TPUdpEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBModeackEvent();
+	itsTBBackE 	= new TBBModeAckEvent();
 	
 	itsTBBackE->status_mask	= 0;
 	setWaitAck(true);	
@@ -180,7 +180,7 @@ UdpCmd::~UdpCmd()
 // ----------------------------------------------------------------------------
 bool UdpCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_MODE)||(event.signal == TP_UDPACK)) {
+	if ((event.signal == TBB_MODE)||(event.signal == TP_UDP_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -234,7 +234,7 @@ void UdpCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	}
 	else {
-		itsTPackE = new TPUdpackEvent(event);
+		itsTPackE = new TPUdpAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask |= (1 << (16 + (itsTPackE->status & 0x0F)));
@@ -255,8 +255,3 @@ void UdpCmd::sendTbbAckEvent(GCFPortInterface* clientport)
 	clientport->send(*itsTBBackE);
 }
 
-// ----------------------------------------------------------------------------
-bool UdpCmd::waitAck()
-{
-	return(true);
-}
diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.h b/MAC/APL/PIC/TBBDriver/src/UdpCmd.h
index 2c24c2190384744bc84264f8e072674b6a04d43d..bfa6642fb563755d8267484c85252503b69960a3 100644
--- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.h
@@ -58,8 +58,6 @@ namespace LOFAR {
 
 				virtual void sendTbbAckEvent(GCFPortInterface* clientport);
 				
-				virtual bool waitAck();
-      
       private:
       //private methods
 
@@ -83,9 +81,9 @@ namespace LOFAR {
 				uint32	itsMode; // Transient or subbands
 				
 				TPUdpEvent			*itsTPE;
-				TPUdpackEvent		*itsTPackE;
+				TPUdpAckEvent		*itsTPackE;
 				TBBModeEvent		*itsTBBE;
-				TBBModeackEvent	*itsTBBackE;
+				TBBModeAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
index 4a6a06461b1856e3f029d305f03d78a50cb6527c..fa9709c69004e5561a28fe515e7c6138ba4fb132 100644
--- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc
@@ -38,7 +38,7 @@ VersionCmd::VersionCmd()
 	itsTPE 			= new TPVersionEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBVersionackEvent();
+	itsTBBackE 	= new TBBVersionAckEvent();
 	
 	for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { 
 		itsTBBackE->status_mask[boardnr]		= 0;
@@ -56,7 +56,7 @@ VersionCmd::~VersionCmd()
 // ----------------------------------------------------------------------------
 bool VersionCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_VERSION)||(event.signal == TP_VERSIONACK)) {
+	if ((event.signal == TBB_VERSION)||(event.signal == TP_VERSION_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -101,19 +101,19 @@ void VersionCmd::saveTpAckEvent(GCFEvent& event)
 	}
 	else {
 		//TPVersionEvent tpe(event);
-		itsTPackE = new TPVersionackEvent(event);
+		itsTPackE = new TPVersionAckEvent(event);
 		
 		if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) 
 			itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));	
 		
-		itsTBBackE->boardid[getBoardNr()] 			= itsTPackE->boardid;
+		itsTBBackE->boardid[getBoardNr()] 		= itsTPackE->boardid;
 		itsTBBackE->swversion[getBoardNr()]  	= itsTPackE->swversion;
-		itsTBBackE->boardversion[getBoardNr()]	= itsTPackE->boardversion;
+		itsTBBackE->boardversion[getBoardNr()]= itsTPackE->boardversion;
 		itsTBBackE->tpversion[getBoardNr()]		= itsTPackE->tpversion;
-		itsTBBackE->mp0version[getBoardNr()] 	= itsTPackE->mp0version;
-		itsTBBackE->mp1version[getBoardNr()] 	= itsTPackE->mp1version;
-		itsTBBackE->mp2version[getBoardNr()] 	= itsTPackE->mp2version;
-		itsTBBackE->mp3version[getBoardNr()] 	= itsTPackE->mp3version;
+		itsTBBackE->mp0version[getBoardNr()] 	= (itsTPackE->mp0version >> 24);
+		itsTBBackE->mp1version[getBoardNr()] 	= (itsTPackE->mp1version >> 24);
+		itsTBBackE->mp2version[getBoardNr()] 	= (itsTPackE->mp2version >> 24);
+		itsTBBackE->mp3version[getBoardNr()] 	= (itsTPackE->mp3version >> 24);
 		
 		LOG_DEBUG_STR(formatString("VersionCmd: board[%d] %08X;%u;%u;%u;%u;%u;%u;%u;%u",
 				getBoardNr(),itsTBBackE->status_mask[getBoardNr()],itsTPackE->boardid,itsTPackE->swversion,itsTPackE->boardversion,
diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.h b/MAC/APL/PIC/TBBDriver/src/VersionCmd.h
index 21d2ea0b543ee1465848e002ed22a3db450f6bca..e91ad31e77f4ee44be4dbac29b6193022c969dc0 100644
--- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPVersionEvent			*itsTPE;
-				TPVersionackEvent		*itsTPackE;
+				TPVersionAckEvent		*itsTPackE;
 				TBBVersionEvent			*itsTBBE;
-				TBBVersionackEvent	*itsTBBackE;
+				TBBVersionAckEvent	*itsTBBackE;
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
index 084b2a9500a8133655d9186773108eec98f7c59c..0ff1b7aabcf63f9c82f113868c687aa8b55f96ac 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc
@@ -50,7 +50,7 @@ static const int FL_BLOCKS_IN_PAGE	= FL_PAGE_SIZE / FL_BLOCK_SIZE; // 2048 block
 
 //--Constructors for a WritefCmd object.----------------------------------------
 WritefCmd::WritefCmd():
-		itsStage(idle),itsImage(0),itsSector(0),itsBlock(0),itsImageSize(0),itsBoardStatus(0)
+		itsStage(idle),itsImage(0),itsSector(0),itsBlock(0),itsImageSize(0),itsDataPtr(0),itsBoardStatus(0)
 {
 	TS					= TbbSettings::instance();
 	itsTPE 			= new TPWritefEvent();
@@ -58,6 +58,8 @@ WritefCmd::WritefCmd():
 	itsTBBE 		= 0;
 	itsTBBackE 	= new TBBWriteImageAckEvent();
 	itsImageData= 0;
+	
+	itsTBBackE->status_mask = 0;
 	setWaitAck(true);
 }
 	  
@@ -74,9 +76,9 @@ WritefCmd::~WritefCmd()
 bool WritefCmd::isValid(GCFEvent& event)
 {
 	if ((event.signal == TBB_WRITE_IMAGE) 
-		|| (event.signal == TP_ERASEFACK)
-		|| (event.signal == TP_WRITEFACK)
-		|| (event.signal == TP_READFACK)) {
+		|| (event.signal == TP_ERASEF_ACK)
+		|| (event.signal == TP_WRITEF_ACK)
+		|| (event.signal == TP_READF_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -87,7 +89,13 @@ void WritefCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE	= new TBBWriteImageEvent(event);
 	
-	setBoardNr(itsTBBE->board);	
+	itsTBBackE->status_mask = 0;
+	if (TS->isBoardActive(itsTBBE->board)) {	
+		setBoardNr(itsTBBE->board);
+	} else {
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
 	
 	memcpy(itsFileNameTp,itsTBBE->filename_tp,sizeof(char) * 64);
 	memcpy(itsFileNameMp,itsTBBE->filename_mp,sizeof(char) * 64);
@@ -99,8 +107,6 @@ void WritefCmd::saveTbbEvent(GCFEvent& event)
 			
 	readFiles();
 	
-	itsTBBackE->status_mask = 0;
-	
 	itsImage 	= itsTBBE->image;
 	itsSector	= (itsImage * FL_SECTORS_IN_PAGE);
 	itsBlock	= (itsImage * FL_BLOCKS_IN_PAGE); 
@@ -133,12 +139,12 @@ void WritefCmd::sendTpEvent()
 				// fill event with data and send
 				itsTPE->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE);
 				
-				int ptr = itsBlock - (itsImage * FL_BLOCKS_IN_PAGE);
+				//int ptr = itsBlock - (itsImage * FL_BLOCKS_IN_PAGE);
 				for (int tp_an=0; tp_an < 256; tp_an++) {
-					itsTPE->data[tp_an]  = itsImageData[ptr]; ptr++;
-					itsTPE->data[tp_an] |= (itsImageData[ptr] << 8); ptr++; 
-					itsTPE->data[tp_an] |= (itsImageData[ptr] << 16); ptr++; 
-					itsTPE->data[tp_an] |= (itsImageData[ptr] << 24); ptr++; 		
+					itsTPE->data[tp_an]  = itsImageData[itsDataPtr]; itsDataPtr++;
+					itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 8); itsDataPtr++; 
+					itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 16); itsDataPtr++; 
+					itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 24); itsDataPtr++; 		
 				}
 				
 				TS->boardPort(getBoardNr()).send(*itsTPE);
@@ -209,7 +215,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event)
 		switch (itsStage) {
 			
 			case erase_flash: {
-				TPErasefackEvent *erasefAckEvent = new TPErasefackEvent(event);
+				TPErasefAckEvent *erasefAckEvent = new TPErasefAckEvent(event);
 				
 				if (erasefAckEvent->status == 0) {
 					itsSector++;
@@ -224,7 +230,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event)
 			} break;
 			
 			case write_flash: {
-				itsTPackE = new TPWritefackEvent(event);
+				itsTPackE = new TPWritefAckEvent(event);
 					
 					if (itsTPackE->status == 0) {
 						itsStage = verify_flash;		
@@ -239,7 +245,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event)
 				// check if write-data is read-data
 				bool same = true;
 				
-				TPReadfackEvent *readfAckEvent = new TPReadfackEvent(event);
+				TPReadfAckEvent *readfAckEvent = new TPReadfAckEvent(event);
 				
 				if (readfAckEvent->status == 0) {
 					for (int i = 0; i < (FL_BLOCK_SIZE / 4); i++) {
@@ -268,7 +274,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event)
 			} break;
 			
 			case write_info: {
-				itsTPackE = new TPWritefackEvent(event);
+				itsTPackE = new TPWritefAckEvent(event);
 					
 				if (itsTPackE->status == 0) {
 					itsStage = verify_info;		
@@ -283,7 +289,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event)
 			// check if write-data is read-data
 				bool same = true;
 				
-				TPReadfackEvent *readfAckEvent = new TPReadfackEvent(event);
+				TPReadfAckEvent *readfAckEvent = new TPReadfAckEvent(event);
 				
 				if (readfAckEvent->status == 0) {
 					for (int i = 0; i < 10; i++) {
diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.h b/MAC/APL/PIC/TBBDriver/src/WritefCmd.h
index cf111729317ea30f88160b8deafcf3f689e30e87..869c9c872b439bc813ed04b3b685d1e2b504ae13 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.h
@@ -72,12 +72,13 @@ namespace LOFAR {
 				int32		itsSector;
 				int32		itsBlock;
 				int32		itsImageSize;
+				int32		itsDataPtr;
 				char		itsFileNameTp[64];
 				char		itsFileNameMp[64];
 				
 								
 				TPWritefEvent					*itsTPE;
-				TPWritefackEvent			*itsTPackE;
+				TPWritefAckEvent			*itsTPackE;
 				TBBWriteImageEvent		*itsTBBE;
 				TBBWriteImageAckEvent	*itsTBBackE;
 				uint8									*itsImageData;
diff --git a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
index 90e498189a6ade7e022ef7ec2ebe57775d0e65d2..fc8346d1ab8c72301a3b594976818666d53ff06c 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc
@@ -38,7 +38,9 @@ WritewCmd::WritewCmd():
 	itsTPE 			= new TPWritewEvent();
 	itsTPackE 	= 0;
 	itsTBBE 		= 0;
-	itsTBBackE 	= new TBBWritewackEvent();
+	itsTBBackE 	= new TBBWritewAckEvent();
+	
+	itsTBBackE->status_mask = 0;
 	setWaitAck(true);
 }
 	  
@@ -52,7 +54,7 @@ WritewCmd::~WritewCmd()
 // ----------------------------------------------------------------------------
 bool WritewCmd::isValid(GCFEvent& event)
 {
-	if ((event.signal == TBB_WRITEW)||(event.signal == TP_WRITEWACK)) {
+	if ((event.signal == TBB_WRITEW)||(event.signal == TP_WRITEW_ACK)) {
 		return(true);
 	}
 	return(false);
@@ -62,11 +64,15 @@ bool WritewCmd::isValid(GCFEvent& event)
 void WritewCmd::saveTbbEvent(GCFEvent& event)
 {
 	itsTBBE	= new TBBWritewEvent(event);
-		
-	setBoardNr(itsTBBE->board);
 	
 	itsTBBackE->status_mask = 0;
-	
+	if (TS->isBoardActive(itsTBBE->board)) {	
+		setBoardNr(itsTBBE->board);
+	} else {
+		itsTBBackE->status_mask |= TBB_NO_BOARD ;
+		setDone(true);
+	}
+		
 	// initialize TP send frame
 	itsTPE->opcode	= TPWRITEW;
 	itsTPE->status	= 0;
@@ -93,7 +99,7 @@ void WritewCmd::saveTpAckEvent(GCFEvent& event)
 		itsTBBackE->status_mask |= TBB_COMM_ERROR;
 	}
 	else {
-		itsTPackE = new TPWritewackEvent(event);
+		itsTPackE = new TPWritewAckEvent(event);
 		
 		itsBoardStatus	= itsTPackE->status;
 				
diff --git a/MAC/APL/PIC/TBBDriver/src/WritewCmd.h b/MAC/APL/PIC/TBBDriver/src/WritewCmd.h
index 82db77fb1c3c90d4440fa47196cc79ae6939cf02..b4b0d23e8a50d19bea3392c87870e404b24cfd1c 100644
--- a/MAC/APL/PIC/TBBDriver/src/WritewCmd.h
+++ b/MAC/APL/PIC/TBBDriver/src/WritewCmd.h
@@ -61,9 +61,9 @@ namespace LOFAR {
 				TbbSettings *TS;
 				
 				TPWritewEvent			*itsTPE;
-				TPWritewackEvent	*itsTPackE;
+				TPWritewAckEvent	*itsTPackE;
 				TBBWritewEvent		*itsTBBE;
-				TBBWritewackEvent	*itsTBBackE;
+				TBBWritewAckEvent	*itsTBBackE;
 				
 				// variables holding data from tp cmd
 				uint32	itsBoardStatus;
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
index e82ff4c13d805644c6bf451b4f94674580beb0da..9fc800f2bd70e61e5e7ef01f32e86fabb8a48275 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
@@ -67,18 +67,19 @@ void AllocCmd::send()
 	if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult AllocCmd::ack(GCFEvent& e)
 {
-	TBBAllocackEvent ack(e);
+	TBBAllocAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");
 	int32 bnr = 0;
 	int32 oldbnr = -1;
 	for (int cnr=0; cnr < getMaxSelections(); cnr++) {
-		bnr = (int32)(cnr / 16);
+		bnr = static_cast<int32>(cnr / 16);
 		
 		if (bnr != oldbnr) {
 			if ((ack.status_mask[bnr] & TBB_SUCCESS) || (ack.status_mask[bnr] & TBB_RCU_COMM_ERROR)) {
@@ -114,19 +115,20 @@ ChannelInfoCmd::ChannelInfoCmd(GCFPortInterface& port) : Command(port)
 //-----------------------------------------------------------------------------
 void ChannelInfoCmd::send()
 {
-	TBBRcuinfoEvent event;
+	TBBRcuInfoEvent event;
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ChannelInfoCmd::ack(GCFEvent& e)
 {
-	TBBRcuinfoackEvent ack(e);
+	TBBRcuInfoAckEvent ack(e);
 	
 	int32 bnr = 0;
 	int32 oldbnr = -1;
 	for (int rcu=0; rcu < getMaxSelections(); rcu++) {
-	 		bnr = (int32)(rcu / 16);
+	 		bnr = static_cast<int32>(rcu / 16);
 			if (ack.rcu_state[rcu] != 'F') {
 				if (isSelected(rcu) ) {
 					if (bnr != oldbnr) {
@@ -152,7 +154,7 @@ GCFEvent::TResult ChannelInfoCmd::ack(GCFEvent& e)
 //---- FREE ----------------------------------------------------------------
 FreeCmd::FreeCmd(GCFPortInterface& port) : Command(port)
 {
-	logMessage(cout,"\n== TBB =================== discard buffer allocation and disable channels ====\n");
+	logMessage(cout,"\n== TBB =================== discard buffer allocation and disable rcu's ====\n");
 }
 
 //-----------------------------------------------------------------------------
@@ -163,18 +165,19 @@ void FreeCmd::send()
 	if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult FreeCmd::ack(GCFEvent& e)
 {
-	TBBFreeackEvent ack(e);
+	TBBFreeAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");
 	int32 bnr = 0;
 	int32 oldbnr = -1;
 	for (int cnr=0; cnr < getMaxSelections(); cnr++) {
-		bnr = (int32)(cnr / 16);
+		bnr = static_cast<int32>(cnr / 16);
 		
 		if (bnr != oldbnr) {
 			if (ack.status_mask[bnr] & TBB_SUCCESS) {
@@ -203,7 +206,7 @@ GCFEvent::TResult FreeCmd::ack(GCFEvent& e)
 //---- RECORD ----------------------------------------------------------------
 RecordCmd::RecordCmd(GCFPortInterface& port) : Command(port)
 {
-	logMessage(cout,"\n== TBB ============================= start recording on selected channels ====\n");
+	logMessage(cout,"\n== TBB ============================= start recording on selected rcu's ====\n");
 }
 
 //-----------------------------------------------------------------------------
@@ -214,18 +217,19 @@ void RecordCmd::send()
 	if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult RecordCmd::ack(GCFEvent& e)
 {
-	TBBRecordackEvent ack(e);
+	TBBRecordAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");
 	int32 bnr = 0;
 	int32 oldbnr = -1;
 	for (int cnr=0; cnr < getMaxSelections(); cnr++) {
-		bnr = (int32)(cnr / 16);
+		bnr = static_cast<int32>(cnr / 16);
 		
 		if (bnr != oldbnr) {
 			if (ack.status_mask[bnr] & TBB_SUCCESS) {
@@ -256,7 +260,7 @@ GCFEvent::TResult RecordCmd::ack(GCFEvent& e)
 //---- STOP -------------------------------------------------------------------
 StopCmd::StopCmd(GCFPortInterface& port) : Command(port)
 {
-	logMessage(cout,"\n== TBB ============================== stop recording on selected channels ====\n");	
+	logMessage(cout,"\n== TBB ============================== stop recording on selected rcu's ====\n");	
 }
 
 //-----------------------------------------------------------------------------
@@ -264,21 +268,23 @@ void StopCmd::send()
 {
 	TBBStopEvent event;
 	
-	if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used
-	
+	if (getSelected()) {
+		event.rcu_mask = getRcuMask(); // if select cmd is use
+	}
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult StopCmd::ack(GCFEvent& e)
 {
-	TBBStopackEvent ack(e);
+	TBBStopAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");
 	int32 bnr = 0;
 	int32 oldbnr = -1;
 	for (int cnr=0; cnr < getMaxSelections(); cnr++) {
-		bnr = (int32)(cnr / 16);
+		bnr = static_cast<int32>(cnr / 16);
 		
 		if (bnr != oldbnr) {
 			if (ack.status_mask[bnr] & TBB_SUCCESS) {
@@ -306,38 +312,200 @@ GCFEvent::TResult StopCmd::ack(GCFEvent& e)
 	return(GCFEvent::HANDLED);
 }
 
-//---- TRIGCLR ----------------------------------------------------------------
-TrigclrCmd::TrigclrCmd(GCFPortInterface& port) : Command(port)
+//---- TRIGRELEASE ------------------------------------------------------------
+TrigReleaseCmd::TrigReleaseCmd(GCFPortInterface& port) : Command(port)
 {
-	logMessage(cout,"\n== TBB ============================ clear trigger on selected channel ====\n");
+	logMessage(cout,"\n== TBB ============================ release trigger for selected rcu's ====\n");
 }
 
 //-----------------------------------------------------------------------------
-void TrigclrCmd::send()
+void TrigReleaseCmd::send()
 {
-	TBBTrigclrEvent event;
-	event.channel = (uint32)getRcu();
+	TBBTrigReleaseEvent event;
+	if (getSelected()) {
+		event.rcu_mask = getRcuMask();
+	}
+	itsPort.send(event);
+	itsPort.setTimer((long)1);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TrigReleaseCmd::ack(GCFEvent& e)
+{
+	TBBTrigReleaseAckEvent ack(e);
+	logMessage(cout,"TBB  Info");
+	logMessage(cout,"---  -------------------------------------------------------");  
+	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
+		if (isSelected(bnr) ) {
+			if (ack.status_mask[bnr] & TBB_SUCCESS) {
+				logMessage(cout,formatString(" %2d  trigger detection released for selected rcu's",bnr ));
+			}	else {	
+				logMessage(cout,formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()));
+			}
+		}
+	}
+	setCmdDone(true);
+	return(GCFEvent::HANDLED);
+}
+
+//---- TRIGGENERATE -----------------------------------------------------------
+TrigGenerateCmd::TrigGenerateCmd(GCFPortInterface& port) : Command(port)
+{
+	logMessage(cout,"\n== TBB ============================ generate trigger on selected rcu's ====\n");
+	logMessage(cout,"RCU  seq_nr     time       sample     sum        samples    peak");
+	logMessage(cout,"---  ---------  ---------  ---------  ---------  ---------  ---------");  
+}
+
+//-----------------------------------------------------------------------------
+void TrigGenerateCmd::send()
+{
+	TBBTrigGenerateEvent event;
+	if (getSelected()) {
+		event.rcu_mask = getRcuMask();
+	}	
+	itsPort.send(event);
+	itsPort.setTimer((long)1);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e)
+{
+	if (e.signal == TBB_TRIG_GENERATE_ACK) {
+		TBBTrigGenerateAckEvent ack(e);
+	}
+	if (e.signal == TBB_TRIGGER) {
+		TBBTriggerEvent trig(e);
+		logMessage(cout,formatString(" %2d  %8u   %8u   %8u   %8u   %8u   %9u",
+			trig.rcu, trig.sequence_nr, trig.time, trig.sample_nr, trig.trigger_sum, trig.trigger_samples, trig.peak_value));
+	}
+	//setCmdDone(true);
+	return(GCFEvent::HANDLED);
+}
+
+//---- TRIGSETUP --------------------------------------------------------------
+TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port),
+	itsLevel(0), itsMode(0), itsFilter(0), itsWindow(0), itsDummy(0)
+{
+	logMessage(cout,"\n== TBB ============================ trigger system setup for selected rcu's ====\n");
+}
+
+//-----------------------------------------------------------------------------
+void TrigSetupCmd::send()
+{
+	TBBTrigSetupEvent event;
+	if (getSelected()) {
+		for (int cnr=0; cnr < MAX_N_RCUS; cnr++) {	
+			event.setup[cnr].level = itsLevel;
+			event.setup[cnr].td_mode = itsMode;
+			event.setup[cnr].filter_select = itsFilter;
+			event.setup[cnr].window = itsWindow;
+			event.setup[cnr].dummy = itsDummy + (cnr << 24);
+		}
+	}
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
-GCFEvent::TResult TrigclrCmd::ack(GCFEvent& e)
+GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e)
 {
-	TBBTrigclrackEvent ack(e);
+	TBBTrigSetupAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");  
+	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
+		if (isSelected(bnr) ) {
+			if (ack.status_mask[bnr] & TBB_SUCCESS) {
+				logMessage(cout,formatString(" %2d  setup trigger system for all rcu's",bnr ));
+			}	else {	
+				logMessage(cout,formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()));
+			}
+		}
+	}
+	setCmdDone(true);
+	return(GCFEvent::HANDLED);
+}
+
+//---- TRIGCOEFFICIENTS -------------------------------------------------------
+TrigCoefficientCmd::TrigCoefficientCmd(GCFPortInterface& port) : Command(port),
+	itsC0(0), itsC1(0), itsC2(0), itsC3(0)
+{
+	logMessage(cout,"\n== TBB ============================ setup trigger coeffients for selected rcu's ====\n");
+}
+
+//-----------------------------------------------------------------------------
+void TrigCoefficientCmd::send()
+{
+	TBBTrigCoefEvent event;
+	if (getSelected()) {
+		for (int cnr=0; cnr < getMaxSelections(); cnr++) {
+			event.coefficients[cnr].c0 = itsC0;
+			event.coefficients[cnr].c1 = itsC1;
+			event.coefficients[cnr].c2 = itsC2;
+			event.coefficients[cnr].c3 = itsC3;
+		}
+	}
+	itsPort.send(event);
+	itsPort.setTimer((long)1);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e)
+{
+	TBBTrigCoefAckEvent ack(e);
+	logMessage(cout,"TBB  Info");
+	logMessage(cout,"---  -------------------------------------------------------");  
+	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
+		if (isSelected(bnr) ) {
+			if (ack.status_mask[bnr] & TBB_SUCCESS) {
+				logMessage(cout,formatString(" %2d  setup trigger coeffients for selected rcu's",bnr ));
+			}	else {	
+				logMessage(cout,formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()));
+			}
+		}
+	}
+	setCmdDone(true);
+	return(GCFEvent::HANDLED);
+}
+
+//---- TRIGINFO ---------------------------------------------------------------
+TrigInfoCmd::TrigInfoCmd(GCFPortInterface& port) : Command(port)
+{
+	logMessage(cout,"\n== TBB ============================ trigger info for selected rcu's ====\n");
+}
+
+//-----------------------------------------------------------------------------
+void TrigInfoCmd::send()
+{
+	TBBTrigInfoEvent event;
+	if (getSelected()) {
+		event.rcu = getRcu();
+	}
+	itsPort.send(event);
+	itsPort.setTimer((long)1);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TrigInfoCmd::ack(GCFEvent& e)
+{
+	TBBTrigInfoAckEvent ack(e);
+	logMessage(cout,"RCU  Info");
+	logMessage(cout,"---  -------------------------------------------------------");  
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
 		if (isSelected(bnr) ) {
 			if (ack.status_mask & TBB_SUCCESS) {
-				logMessage(cout,formatString(" %2d  clear trigger message",bnr ));
+				logMessage(cout,formatString(" %2d  sequence   : %u",bnr,ack.sequence_nr));
+				logMessage(cout,formatString("      time       : %u",ack.time));
+				logMessage(cout,formatString("      sample     : %u",ack.sample_nr));
+				logMessage(cout,formatString("      sum        : %u",ack.trigger_sum));
+				logMessage(cout,formatString("      samples    : %u",ack.trigger_samples));
+				logMessage(cout,formatString("      peak value : %u",ack.peak_value));
+				logMessage(cout,formatString("      flags      : %08X",ack.trigger_flags));
 			}	else {	
 				logMessage(cout,formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask).c_str()));
 			}
 		}
 	}
-	
 	setCmdDone(true);
-
 	return(GCFEvent::HANDLED);
 }
 
@@ -345,7 +513,7 @@ GCFEvent::TResult TrigclrCmd::ack(GCFEvent& e)
 ReadCmd::ReadCmd(GCFPortInterface& port) : Command(port),
 	itsSecondsTime(0),itsSampleTime(0),itsPrePages(0),itsPostPages(0)
 {
-	logMessage(cout,"\n== TBB ==============  transfer data to CEP for all selected channels ====\n");	
+	logMessage(cout,"\n== TBB ==============  transfer data to CEP for all selected rcu ====\n");	
 }
 
 //-----------------------------------------------------------------------------
@@ -358,12 +526,13 @@ void ReadCmd::send()
 	event.prepages = itsPrePages;
 	event.postpages = itsPostPages;
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ReadCmd::ack(GCFEvent& e)
 {
-	TBBReadackEvent ack(e);
+	TBBReadAckEvent ack(e);
 	logMessage(cout,"RCU  Info");
 	logMessage(cout,"---  -------------------------------------------------------");  
 	for (int cnr=0; cnr < getMaxSelections(); cnr++) {
@@ -395,12 +564,13 @@ void ModeCmd::send()
 	event.board = (uint32)getBoard();
 	event.rec_mode = itsRecMode;
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ModeCmd::ack(GCFEvent& e)
 {
-	TBBModeackEvent ack(e);
+	TBBModeAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");  
 	if (ack.status_mask & TBB_SUCCESS) {
@@ -426,15 +596,16 @@ void VersionCmd::send()
   TBBVersionEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
+  itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult VersionCmd::ack(GCFEvent& e)
 {
-  TBBVersionackEvent ack(e);
+  TBBVersionAckEvent ack(e);
 	
 	logMessage(cout,formatString("TBBDriver software version %3.1f\n",(ack.driverversion / 10.)));
-	logMessage(cout,"TBB  ID  Software   Board    TP0      MP0      MP1      MP2      TP3");
+	logMessage(cout,"TBB  ID  Software   Board    TP0      MP0      MP1      MP2      MP3");
 	logMessage(cout,"---  --  --------  -------  -------  -------  -------  -------  -------");
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
 		if (isSelected(bnr) ) {
@@ -472,12 +643,13 @@ void SizeCmd::send()
   TBBSizeEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
+  itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult SizeCmd::ack(GCFEvent& e)
 {
-  TBBSizeackEvent ack(e);
+  TBBSizeAckEvent ack(e);
 	logMessage(cout,"TBB  pages     Total memory ");
 	logMessage(cout,"---  --------  ------------"); 
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -509,12 +681,13 @@ void StatusCmd::send()
   TBBStatusEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
+  itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult StatusCmd::ack(GCFEvent& e)
 {
-  TBBStatusackEvent ack(e);
+  TBBStatusAckEvent ack(e);
     
 	logMessage(cout,"TBB  Voltage 1.2  Voltage 2.5  Voltage 3.3  Temp PCB  Temp TP   Temp MP0  Temp MP1  Temp MP2  Temp MP3");
 	logMessage(cout,"---  -----------  -----------  -----------  --------  --------  --------  --------  --------  --------");
@@ -556,12 +729,13 @@ void ClearCmd::send()
 	TBBClearEvent event;
 	event.boardmask = getBoardMask();
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ClearCmd::ack(GCFEvent& e)
 {
-	TBBClearackEvent ack(e);
+	TBBClearAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -591,12 +765,13 @@ void ResetCmd::send()
 	TBBResetEvent event;
 	event.boardmask = getBoardMask();
 	itsPort.send(event);
+	itsPort.setTimer((long)5);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ResetCmd::ack(GCFEvent& e)
 {
-	TBBResetackEvent ack(e);
+	TBBResetAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -627,12 +802,13 @@ void ConfigCmd::send()
 	event.boardmask = getBoardMask();
 	event.imagenr = itsImage;
 	itsPort.send(event);
+	itsPort.setTimer((long)5);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ConfigCmd::ack(GCFEvent& e)
 {
-	TBBConfigackEvent ack(e);
+	TBBConfigAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -669,6 +845,7 @@ void ErasefCmd::send()
 	logMessage(cout,formatString(" %2d  erasing flash memory of image %d\n", getBoard(), itsPage));
 	logMessage(cout,"     erasing will take about 8 seconds");	
 	itsPort.send(event);
+	itsPort.setTimer((long)16);
 }
 
 //-----------------------------------------------------------------------------
@@ -707,6 +884,7 @@ void ReadfCmd::send()
 	logMessage(cout,formatString(" %2d  reading flash memory of image %d\n", getBoard(), itsPage));
 	logMessage(cout,"     reading will take about 12 seconds");	
 	itsPort.send(event);
+	itsPort.setTimer((long)24);
 }
 
 //-----------------------------------------------------------------------------
@@ -750,6 +928,7 @@ void WritefCmd::send()
 	logMessage(cout,formatString(" %2d  writing flash memory of image %d\n", getBoard(), itsPage));
 	logMessage(cout,"     writing will take about 25 seconds");	
 	itsPort.send(event);
+	itsPort.setTimer((long)60);
 }
 
 //-----------------------------------------------------------------------------
@@ -779,6 +958,7 @@ void ImageInfoCmd::send()
 	TBBImageInfoEvent event;
 	event.board = getBoard();
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
@@ -831,12 +1011,13 @@ void ReadwCmd::send()
 	event.mp = itsMp;
 	event.addr = itsAddr;
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ReadwCmd::ack(GCFEvent& e)
 {
-	TBBReadwackEvent ack(e);
+	TBBReadwAckEvent ack(e);
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
 		if (isSelected(bnr) ) {
 			if (ack.status_mask & TBB_SUCCESS) {
@@ -849,14 +1030,13 @@ GCFEvent::TResult ReadwCmd::ack(GCFEvent& e)
 			}
 		}
 	}
-	if (itsAddr == (itsStopAddr - 1))
-	
+	//if (itsAddr == (itsStopAddr - 1))
 	
 	itsAddr++;
 	if (itsAddr >= itsStopAddr) { 
 		setCmdDone(true); 
 	}	else { 
-		itsPort.setTimer(0.01);
+		//itsPort.setTimer((long)0);
 	}
 	return(GCFEvent::HANDLED);
 }
@@ -877,12 +1057,13 @@ void WritewCmd::send()
 	event.wordlo = itsWordLo;
 	event.wordhi = itsWordHi;
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult WritewCmd::ack(GCFEvent& e)
 {
-	TBBWritewackEvent ack(e);
+	TBBWritewAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -901,6 +1082,170 @@ GCFEvent::TResult WritewCmd::ack(GCFEvent& e)
 	return(GCFEvent::HANDLED);
 }
 
+//---- TESTDDR ----------------------------------------------------------------
+TestDdrCmd::TestDdrCmd(GCFPortInterface& port) : Command(port),
+	itsCmdStage(0),itsMp(0), itsAddr(0), itsAddrLine(0), itsTestPatern(1), itsWordLo(0), itsWordHi(0)
+{
+	logMessage(cout,"\n==== TBB-board, test ddr =================================================\n");	
+}
+
+//-----------------------------------------------------------------------------
+void TestDdrCmd::send()
+{
+	if ((itsCmdStage == 0)&&(itsMp == 0)&&(itsAddrLine == 0)) {
+		logMessage(cout,formatString("Testing DDR memory address lines of board %d\n",getBoard()));
+		logMessage(cout,"Mp  Addr   Write  Read                                 ");
+		logMessage(cout,"Nr  Line   DDR    DDR     Info                         ");
+		logMessage(cout,"--  -----  -----  -----   -----------------------------");
+	}
+	
+	if ((itsCmdStage == 2)&&(itsMp == 0)&&(itsTestPatern == 1)) {
+		logMessage(cout,formatString("\nTesting DDR memory data lines of board %d\n",getBoard()));
+		logMessage(cout,"Mp  Write     Read      Write      Read                              ");
+		logMessage(cout,"Nr  WordLow   WordLow   WordHigh   WordHigh  Info                         ");
+		logMessage(cout,"--  --------  --------  --------   --------  ------------------------");
+	}
+	switch (itsCmdStage) {
+			
+		case 0: {
+			TBBWritewEvent event;
+			event.board = getBoard();
+			event.mp = itsMp;
+			event.addr = itsAddr;
+			event.wordlo = itsAddrLine;
+			event.wordhi = (itsMp << 8) + itsAddrLine;
+			itsPort.send(event);
+		} break;
+		
+		case 1: {
+			TBBReadwEvent event;
+			event.board = getBoard();
+			event.mp = itsMp;
+			event.addr = itsAddr;
+			itsPort.send(event);
+		} break;
+		
+		case 2: {
+			TBBWritewEvent event;
+			event.board = getBoard();
+			event.mp = itsMp;
+			event.addr = itsAddr;
+			event.wordlo = itsTestPatern;
+			event.wordhi = ~itsTestPatern;
+			itsPort.send(event);	
+		} break;
+		
+		case 3: {
+			TBBReadwEvent event;
+			event.board = getBoard();
+			event.mp = itsMp;
+			event.addr = itsAddr;
+			itsPort.send(event);
+		} break;
+		
+		default: break;
+	}
+	
+	itsPort.setTimer((long)1);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TestDdrCmd::ack(GCFEvent& e)
+{
+	switch (itsCmdStage) {
+		case 0: {
+			TBBWritewAckEvent ack(e);
+			if (!(ack.status_mask & TBB_SUCCESS)) {
+				logMessage(cout,formatString(" %2d  %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str()));
+			}
+			itsAddr = (1 << itsAddrLine);
+			itsAddrLine++;
+			if (itsAddrLine == 28) {
+				itsAddr = 0;
+				itsAddrLine = 0;
+				itsCmdStage = 1;
+			}  		
+		}break;
+		
+		case 1: {
+			TBBReadwAckEvent ack(e);
+			if (ack.status_mask & TBB_SUCCESS) {
+				if (ack.wordlo == itsAddrLine) {
+					logMessage(cout,formatString("%2d  %5d  %5d  %5d   SAME",
+						itsMp, itsAddrLine, itsAddrLine, ack.wordlo));
+				} else {
+					logMessage(cout,formatString("%2d  %5d  %5d  %5d   FAULT",
+						itsMp, itsAddrLine, itsAddrLine, ack.wordlo ));
+				}
+			} else {
+				logMessage(cout,formatString(" %2d  %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str()));
+			}
+			itsAddr = (1 << itsAddrLine);
+			itsAddrLine++;
+			if (itsAddrLine == 28) {
+				itsAddr = 0;
+				itsAddrLine = 0;
+				itsCmdStage = 0;
+				itsMp++;
+				if (itsMp == 4) {
+					itsMp = 0;
+					itsAddr = 0;
+					itsCmdStage = 2;
+					//setCmdDone(true);
+				}
+			}
+		} break;
+		
+		case 2: {
+			TBBWritewAckEvent ack(e);
+			if (!(ack.status_mask & TBB_SUCCESS)) {
+				logMessage(cout,formatString(" %2d  %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str()));
+			}
+			itsAddr++;
+			itsTestPatern <<= 1;
+			//if (itsTestPatern == 0) itsTestPatern == 1;
+				
+			if (itsTestPatern == 0x00000000) {
+				itsAddr = 0;
+				itsTestPatern = 1;
+				itsCmdStage = 3;
+			}  		
+		}break;
+		
+		case 3: {
+			TBBReadwAckEvent ack(e);
+			if (ack.status_mask & TBB_SUCCESS) {
+				if ((ack.wordlo == itsTestPatern)&&(ack.wordhi == ~itsTestPatern)) {
+					logMessage(cout,formatString("%2d  %08X  %08X  %08X  %08X   SAME",
+						itsMp, itsTestPatern, ack.wordlo, ~itsTestPatern, ack.wordhi));
+				} else {
+					logMessage(cout,formatString("%2d  %08X  %08X  %08X  %08X   FAULT",
+						itsMp, itsTestPatern, ack.wordlo, ~itsTestPatern, ack.wordhi));
+				}
+			} else {
+				logMessage(cout,formatString(" %2d  %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str()));
+			}
+			itsAddr++;
+			itsTestPatern <<= 1;
+			//if (itsTestPatern == 0) itsTestPatern == 1;
+				
+			if (itsTestPatern == 0x00000000) {
+				itsAddr = 0;
+				itsTestPatern = 1;
+				itsCmdStage = 2;
+				itsMp++;
+				if (itsMp == 4) {
+					setCmdDone(true);
+				}
+			}
+		} break;
+		
+		
+		default: break;
+	}
+	return(GCFEvent::HANDLED);
+}
+
 //---- READR -------------------------------------------------------------------
 ReadrCmd::ReadrCmd(GCFPortInterface& port) : Command(port)
 {
@@ -913,12 +1258,13 @@ void ReadrCmd::send()
 	TBBReadrEvent event;
 	event.board = (uint32)getBoard();
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult ReadrCmd::ack(GCFEvent& e)
 {
-	TBBReadrackEvent ack(e);
+	TBBReadrAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -948,12 +1294,13 @@ void WriterCmd::send()
 	TBBWriterEvent event;
 	event.board = (uint32)getBoard();
 	itsPort.send(event);
+	itsPort.setTimer((long)1);
 }
 
 //-----------------------------------------------------------------------------
 GCFEvent::TResult WriterCmd::ack(GCFEvent& e)
 {
-	TBBWriterackEvent ack(e);
+	TBBWriterAckEvent ack(e);
 	logMessage(cout,"TBB  Info");
 	logMessage(cout,"---  -------------------------------------------------------");    
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
@@ -987,8 +1334,9 @@ void ReadPageCmd::send()
 	
 	switch (itsCmdStage) {
 		case 0: {
-			TBBRcuinfoEvent send;
+			TBBRcuInfoEvent send;
 			itsPort.send(send);
+			itsPort.setTimer((long)1);
 		} break;
 		
 		case 1: {
@@ -1001,6 +1349,7 @@ void ReadPageCmd::send()
 			send.data[1] = 0; 
 			send.data[2] = 0;
 			itsPort.send(send);
+			itsPort.setTimer((long)1);
 			
 			LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.data[0]));
@@ -1016,6 +1365,7 @@ void ReadPageCmd::send()
 			send.data[1] = 0; 
 			send.data[2] = 0;
 			itsPort.send(send);
+			itsPort.setTimer((long)1);
 			
 			LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.data[0]));
@@ -1029,8 +1379,9 @@ void ReadPageCmd::send()
 			send.regid = REGID2;
 			send.pagelength = 256;
 			send.pageaddr = 0;
-			
 			itsPort.send(send);
+			itsPort.setTimer((long)1);
+			
 			LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.pagelength,send.pageaddr));
 		} break;
@@ -1043,8 +1394,9 @@ void ReadPageCmd::send()
 			send.regid = REGID2;
 			send.pagelength = 256;
 			send.pageaddr = 256;
-			
 			itsPort.send(send);
+			itsPort.setTimer((long)1);
+			
 			LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.pagelength,send.pageaddr));
 		} break;
@@ -1063,13 +1415,13 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		case 0: {
 			int rcu;
 			rcu = getRcu();
-			TBBRcuinfoackEvent ack(e);
+			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 = (int32)((int32)ack.rcu_on_input[rcu] / 4);
-			logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp));
+			itsMp = static_cast<int32>(ack.rcu_on_input[rcu]) / 4;
+			//logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp));
 			
 			itsAddr = itsStartAddr;
 			if (itsState == 'F') {
@@ -1079,7 +1431,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		} break;
 				
 		case 1: {
-			TBBWriterackEvent ack(e);
+			TBBWriterAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str()));
 				itsCmdStage = 10;
@@ -1087,7 +1439,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		} break;
 		
 		case 2: {
-			TBBWriterackEvent ack(e);
+			TBBWriterAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str()));
 				itsCmdStage = 10;
@@ -1095,7 +1447,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		} break;
 		
 		case 3: {
-			TBBReadxackEvent ack(e);
+			TBBReadxAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str()));
 				itsCmdStage = 10;
@@ -1108,7 +1460,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 		} break;
 		
 		case 4: {
-			TBBReadxackEvent ack(e);
+			TBBReadxAckEvent ack(e);
 			if (!(ack.status_mask & TBB_SUCCESS)) {
 				logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str()));
 				itsCmdStage = 10;
@@ -1127,20 +1479,20 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 	
 	itsCmdStage++;
 	if (itsCmdStage < 5) {
-		itsPort.setTimer(0.01);
+		//itsPort.setTimer(0.01);
 	} else { 
 		
 				
 		if (itsPage == 0) {
-			itsStationId = (int)(itsData[0] & 0xFF);
-			itsRspId = (int)((itsData[0] >> 8) & 0xFF);
-			itsRcuId = (int)((itsData[0] >> 16) & 0xFF);
-			itsSampleFreq = (int)((itsData[0] >> 24) & 0xFF);
-			itsTime = (time_t)itsData[2]-1;
-			itsSampleNr = (int)itsData[3];
+			itsStationId = static_cast<int>(itsData[0] & 0xFF);
+			itsRspId = static_cast<int>((itsData[0] >> 8) & 0xFF);
+			itsRcuId = static_cast<int>((itsData[0] >> 16) & 0xFF);
+			itsSampleFreq = static_cast<int>((itsData[0] >> 24) & 0xFF);
+			itsTime = static_cast<time_t>(itsData[2])-1;
+			itsSampleNr = static_cast<int>(itsData[3]);
 		}
-		itsSamplesPerFrame = (int)(itsData[4] & 0xFFFF);
-		itsFreqBands = (int)((itsData[4] >> 16) & 0xFFFF);
+		itsSamplesPerFrame = static_cast<int>(itsData[4] & 0xFFFF);
+		itsFreqBands = static_cast<int>((itsData[4] >> 16) & 0xFFFF);
 						
 		int sample_cnt = 0;
 		int val_cnt = 0;
@@ -1152,12 +1504,12 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			if (itsSamplesPerFrame < 975) {		
 				itsTotalSamples += itsSamplesPerFrame;
 				itsTotalBands += itsFreqBands;
-				logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands));
+				//logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands));
 				// convert uint32 to complex int16
 				while (sample_cnt < itsSamplesPerFrame) {
 					// get complex sample
-					val[val_cnt++] = (int16) (itsData[data_cnt] & 0xFFFF);	// re part
-					val[val_cnt++] = (int16)((itsData[data_cnt++] >> 16) & 0xFFFF);	// im part
+					val[val_cnt++] = static_cast<int16>(itsData[data_cnt] & 0xFFFF);	// re part
+					val[val_cnt++] = static_cast<int16>((itsData[data_cnt++] >> 16) & 0xFFFF);	// im part
 					sample_cnt++;
 				}
 			}
@@ -1166,7 +1518,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			if (itsSamplesPerFrame < 1299) {		
 				itsTotalSamples += itsSamplesPerFrame;
 				itsTotalBands += itsFreqBands;
-				logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands));
+				//logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands));
 				// convert uint32 to int12
 				uint32 data[3];
 				
@@ -1177,14 +1529,14 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 					data[2] = itsData[data_cnt++];
 					
 					// extract 8 values of 12 bit
-					val[val_cnt++] = (int16)  (data[0] & 0x00000FFF);
-					val[val_cnt++] = (int16) ((data[0] & 0x00FFF000) >> 12);
-					val[val_cnt++] = (int16)(((data[0] & 0xFF000000) >> 24) | ((data[1] & 0x0000000F) << 8));
-					val[val_cnt++] = (int16) ((data[1] & 0x0000FFF0) >> 4 );
-					val[val_cnt++] = (int16) ((data[1] & 0x0FFF0000) >> 16);
-					val[val_cnt++] = (int16)(((data[1] & 0xF0000000) >> 28) | ((data[2] & 0x000000FF) << 4));
-					val[val_cnt++] = (int16) ((data[2] & 0x000FFF00) >> 8);
-					val[val_cnt++] = (int16) ((data[2] & 0xFFF00000) >> 20);
+					val[val_cnt++] = static_cast<int16>(  data[0] & 0x00000FFF);
+					val[val_cnt++] = static_cast<int16>(( data[0] & 0x00FFF000) >> 12);
+					val[val_cnt++] = static_cast<int16>(((data[0] & 0xFF000000) >> 24) | ((data[1] & 0x0000000F) << 8));
+					val[val_cnt++] = static_cast<int16>(( data[1] & 0x0000FFF0) >> 4 );
+					val[val_cnt++] = static_cast<int16>(( data[1] & 0x0FFF0000) >> 16);
+					val[val_cnt++] = static_cast<int16>(((data[1] & 0xF0000000) >> 28) | ((data[2] & 0x000000FF) << 4));
+					val[val_cnt++] = static_cast<int16>(( data[2] & 0x000FFF00) >> 8);
+					val[val_cnt++] = static_cast<int16>(( data[2] & 0xFFF00000) >> 20);
 					
 					sample_cnt += 8;
 				}
@@ -1204,7 +1556,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			char timestring[256];
 			
 			strftime(timestring, 255, "%Y%m%d_%H%M%S", gmtime(&itsTime));
-			snprintf(basefilename, PATH_MAX, "%s_%02d%02d", timestring,itsStationId,itsRcuId);
+			snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId);
 			
 			snprintf(filename, PATH_MAX, "%s.dat",basefilename);
 			file = fopen(filename,"a");
@@ -1215,7 +1567,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			if (itsPage < itsPages) {
 				itsCmdStage = 1;
 				itsAddr = itsStartAddr + itsPage;
-				itsPort.setTimer(0.05);
+				//itsPort.setTimer(0.02);
 			}	else {
 				// print page information
 				strftime(timestring, 255, "%Y-%m-%d  %H:%M:%S", gmtime(&itsTime));
@@ -1248,6 +1600,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 					fprintf(file,line[lnr]);
 					fprintf(file,"\n");
 				}
+				logMessage(cout,"\n");
 				fclose(file);	
 			}
 		}	else {
@@ -1279,7 +1632,12 @@ void TBBCtl::help()
 	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");
 	
-	logMessage(cout,"tbbctl --trigclr=channel                                           # clear tigger message for all selected channel");
+	logMessage(cout,"tbbctl --release [--select=<set>]                                  # release trigger system for all selected rcu's");
+	logMessage(cout,"tbbctl --generate [--select=<set>]                                 # generate a trigger for all selected rcu's");	
+	logMessage(cout,"tbbctl --setup=level,mode,filter,window,dummy [--select=<set>]     # setup trigger system for all selected rcu's");
+	logMessage(cout,"tbbctl --coef=c0,c1,c2,c3 [--select=<set>]                         # set trigger coeffients for all selected rcu's");
+	logMessage(cout,"tbbctl --triginfo=rcu                                              # get trigger info for all selected rcu's\n");
+	
 	logMessage(cout,"tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages      # transfer recorded data from rcunr to CEP");
 	logMessage(cout,"tbbctl --mode=board,[transient | subbands]                         # set mode to configure UDP/IP header for CEP"); 
 	logMessage(cout,"tbbctl --version [--select=<set>]                                  # get version information from selected boards");
@@ -1290,10 +1648,12 @@ void TBBCtl::help()
 	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,"tbbctl --imageinfo=board                                           # read info from all images on board");
+	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 --readpage=board,mp,addr,pages                              # read n pages from DDR2 memory starting 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 --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 ");
@@ -1342,13 +1702,13 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
     case F_CONNECTED: {
       if (itsServerPort.isConnected()) {
         itsServerPort.cancelAllTimers();
-        TBBGetconfigEvent getconfig;
+        TBBGetConfigEvent getconfig;
         itsServerPort.send(getconfig);
        }
     } break;
 
-    case TBB_GETCONFIGACK: {
-      TBBGetconfigackEvent ack(e);
+    case TBB_GET_CONFIG_ACK: {
+      TBBGetConfigAckEvent ack(e);
       itsMaxBoards		= ack.max_boards;
       itsActiveBoards	= ack.active_boards_mask;
 			itsMaxChannels = itsMaxBoards * 16;
@@ -1356,9 +1716,15 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
 			//logMessage(cout,formatString("Max nr of Channels   = %d\n",itsMaxChannels));
 			//logMessage(cout,formatString("Active boards mask   = 0x%03X",itsActiveBoards));
 			
-      TRAN(TBBCtl::docommand);
+			// send subscribe 
+      TBBSubscribeEvent subscribe;
+      itsServerPort.send(subscribe);
     } break;
-
+		
+		case TBB_SUBSCRIBE_ACK: {
+			TRAN(TBBCtl::docommand);
+		} break;
+		
     case F_DISCONNECTED: {
       //port.setTimer((long)1);
       port.close();
@@ -1410,45 +1776,71 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
     } break;
 		
 		case F_TIMER: {
-			itsCommand->send();
+			//itsCommand->send();
+			logMessage(cout,"Timeout, tbbctl stopped\n");
+			TBBUnsubscribeEvent unsubscribe;
+      itsServerPort.send(unsubscribe);
+    	GCFTask::stop();
 		} break;
     
-    case TBB_ALLOCACK:
-    case TBB_RCUINFOACK:
-    case TBB_FREEACK:
-    case TBB_RECORDACK:
-    case TBB_STOPACK:
-    case TBB_TRIGCLRACK:
-    case TBB_READACK:
-    case TBB_MODEACK:
-    case TBB_VERSIONACK:
-    case TBB_SIZEACK:
-    case TBB_STATUSACK: 
-    case TBB_CLEARACK:
-    case TBB_RESETACK:
-    case TBB_CONFIGACK:
+    case TBB_TRIG_GENERATE_ACK:
+    case TBB_TRIGGER: {
+    	itsServerPort.cancelAllTimers();
+    	itsServerPort.setTimer((long)5);
+    	status = itsCommand->ack(e); // handle the acknowledgement
+    } break;
+    
+    
+    	
+    case TBB_ALLOC_ACK:
+    case TBB_RCU_INFO_ACK:
+    case TBB_FREE_ACK:
+    case TBB_RECORD_ACK:
+    case TBB_STOP_ACK:
+    case TBB_TRIG_RELEASE_ACK:
+    case TBB_TRIG_SETUP_ACK:	
+    case TBB_TRIG_COEF_ACK:
+    case TBB_TRIG_INFO_ACK:	
+    case TBB_READ_ACK:
+    case TBB_MODE_ACK:
+    case TBB_VERSION_ACK:
+    case TBB_SIZE_ACK:
+    case TBB_STATUS_ACK: 
+    case TBB_CLEAR_ACK:
+    case TBB_RESET_ACK:
+    case TBB_CONFIG_ACK:
     case TBB_ERASE_IMAGE_ACK:
     case TBB_READ_IMAGE_ACK:
     case TBB_WRITE_IMAGE_ACK:
-		case TBB_IMAGE_INFO_ACK:
-    case TBB_READWACK:
-    case TBB_WRITEWACK:
-    case TBB_READRACK:
-    case TBB_WRITERACK:
-    case TBB_READXACK: {	
+    case TBB_IMAGE_INFO_ACK:
+    case TBB_READW_ACK:
+    case TBB_WRITEW_ACK:
+    case TBB_READR_ACK:
+    case TBB_WRITER_ACK:
+    case TBB_READX_ACK: {	
+    	itsServerPort.cancelAllTimers();
     	status = itsCommand->ack(e); // handle the acknowledgement
-    	if (itsCommand->isCmdDone()) {
-    		GCFTask::stop();
+    	if (!itsCommand->isCmdDone()) {
+    		// not done send next command
+    		itsCommand->send();
     	}
     } break;
 
     default: {
       logMessage(cerr,"Error: unhandled event.");
       logMessage(cerr,formatString("Error: unhandled event. %d",e.signal));
+      TBBUnsubscribeEvent unsubscribe;
+      itsServerPort.send(unsubscribe);
       GCFTask::stop();
     } break;
   }
-
+	
+	if (itsCommand->isCmdDone()) {
+  	TBBUnsubscribeEvent unsubscribe;
+    itsServerPort.send(unsubscribe);
+    GCFTask::stop();
+   }
+    	 
   return(status);
 }
 
@@ -1469,7 +1861,11 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 			{ "free",				no_argument,				0,	'f' }, //ok ??
 		  { "record",			no_argument,				0,	'r' }, //ok ??
 		  { "stop",				no_argument,				0,	's' }, //ok ??
-		  { "trigclr",		required_argument,	0,	't' }, //ok ??
+		  { "release",		no_argument,				0,	'e' }, //ok ??
+		  { "generate",		no_argument,				0,	'g' }, //ok ??
+		  { "setup",			required_argument,	0,	't' }, //ok ??
+		  { "coef",				required_argument,	0,	'c' }, //ok ??
+		  { "triginfo",		required_argument,	0,	'I' }, //ok ??
 			{ "read",				required_argument,	0,	'R' }, //ok ??
 			{ "mode",				required_argument,	0,	'm' }, //ok ??
 			{ "version",		no_argument,				0,	'v' }, //ok
@@ -1485,6 +1881,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 			{ "imageinfo",	required_argument,	0,	'8' }, //ok
 		  { "readddr",		required_argument,	0,	'4' }, //ok
 		  { "writeddr",		required_argument,	0,	'5' }, //ok
+		  { "testddr",		required_argument,	0,	'9' }, //ok
 		  { "readreg",		required_argument,	0,	'6' }, //ok not in help
 		  { "writereg",		required_argument,	0,	'7' }, //ok not in help
 			{ "help",				no_argument,				0,	'h' }, //ok ??
@@ -1493,7 +1890,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 
     int option_index = 0;
     int c = getopt_long(argc, argv,
-												"l:afrst:R:m:vzAp:CZS:1:2:3:8:4:5:6:7:h",
+												"l:afrsegt:c:I:R:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:h",
 				long_options, &option_index);
 
     if (c == -1)
@@ -1560,10 +1957,10 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 				command->setCmdType(RCUCMD);
 			}	break;
 			
-			case 't': { 	// --trigclear
+			case 'e': { 	// --trigrelease
 				if (command) delete command;
-				TrigclrCmd* trigclrcmd = new TrigclrCmd(itsServerPort);
-				command = trigclrcmd;
+				TrigReleaseCmd* trigreleasecmd = new TrigReleaseCmd(itsServerPort);
+				command = trigreleasecmd;
 				if (optarg) {
 					int channel = 0;
 					int numitems = sscanf(optarg, "%d",&channel);
@@ -1580,6 +1977,81 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 				command->setCmdType(RCUCMD);
 			}	break;
 			
+			case 'g': { 	// --triggenerate
+				if (command) delete command;
+				TrigGenerateCmd* triggeneratecmd = new TrigGenerateCmd(itsServerPort);
+				command = triggeneratecmd;
+				command->setCmdType(RCUCMD);
+			}	break;
+			
+			case 't': { 	// --trigsetup
+				if (command) delete command;
+				TrigSetupCmd* trigsetupcmd = new TrigSetupCmd(itsServerPort);
+				command = trigsetupcmd;
+				if (optarg) {
+					int level = 0;
+					int mode = 0;
+					int filter = 0;
+					int window = 0;
+					int dummy = 0;
+					int numitems = sscanf(optarg, "%x,%x,%x,%x,%x",&level, &mode, &filter, &window, &dummy);
+					if (numitems < 5 || numitems == EOF) {
+						logMessage(cerr,"Error: invalid number of arguments. Should be of the format "
+								"'--trigsetup=level,mode,filter,window,dummy'  (all hex values)");  
+						exit(EXIT_FAILURE);
+					}
+					trigsetupcmd->setLevel(static_cast<uint32>(level));
+					trigsetupcmd->setMode(static_cast<uint32>(mode));
+					trigsetupcmd->setFilter(static_cast<uint32>(filter));
+					trigsetupcmd->setWindow(static_cast<uint32>(window));
+					trigsetupcmd->setDummy(static_cast<uint32>(dummy));
+				}
+				command->setCmdType(BOARDCMD);
+			}	break;
+			
+			case 'c': { 	// --trigcoef
+				if (command) delete command;
+				TrigCoefficientCmd* trigcoefficientcmd = new TrigCoefficientCmd(itsServerPort);
+				command = trigcoefficientcmd;
+				if (optarg) {
+					int c0 = 0;
+					int c1 = 0;
+					int c2 = 0;
+					int c3 = 0;
+					int numitems = sscanf(optarg, "%x,%x,%x,%x",&c0, &c1, &c2, &c3);
+					if (numitems < 4 || numitems == EOF) {
+						logMessage(cerr,"Error: invalid number of arguments. Should be of the format "
+								"'--trigcoef=c0,c1,c2,c3'   (all hex values)");  
+						exit(EXIT_FAILURE);
+					}
+					trigcoefficientcmd->setC0(static_cast<int16>(c0));
+					trigcoefficientcmd->setC1(static_cast<int16>(c1));
+					trigcoefficientcmd->setC2(static_cast<int16>(c2));
+					trigcoefficientcmd->setC3(static_cast<int16>(c3));
+				}
+				command->setCmdType(BOARDCMD);
+			}	break;
+			
+			case 'I': { 	// --triginfo
+				if (command) delete command;
+				TrigInfoCmd* triginfocmd = new TrigInfoCmd(itsServerPort);
+				command = triginfocmd;
+				if (optarg) {
+					int channel = 0;
+					int numitems = sscanf(optarg, "%d",&channel);
+					if (numitems < 1 || numitems == EOF) {
+						logMessage(cerr,"Error: invalid number of arguments. Should be of the format "
+								"'--triginfo=rcu' ");  
+						exit(EXIT_FAILURE);
+					}
+					select.clear();
+		  		select.push_back(channel);
+					command->setSelected(true);
+				}
+				command->setCmdType(RCUCMD);
+			}	break;
+			
+			
 			case 'R': { 	// --read
 				if (command) delete command;
 				ReadCmd* readcmd = new ReadCmd(itsServerPort);
@@ -1882,6 +2354,31 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 				}
 				command->setCmdType(BOARDCMD);
 			}	break;
+			
+			case '9': { 	// --testddr
+				if (command) delete command;
+				TestDdrCmd* testddrcmd = new TestDdrCmd(itsServerPort);
+				command = testddrcmd;
+				if (optarg) {
+					int32 board = 0;
+										
+					int numitems = sscanf(optarg, "%d", &board);
+					if (numitems < 1 || numitems == EOF || board < 0 || board > 11) {
+						logMessage(cerr,"Error: invalid write ddr value. Should be of the format "
+								"'--testddr=board' where board= 0..11");  
+						exit(EXIT_FAILURE);
+					}
+					select.clear();
+		  		select.push_back(board);
+		  		command->setSelected(true);
+				}	else {
+					logMessage(cerr,"Error: invalid write ddr value. Should be of the format "
+								"'--testddr=board' where board= 0..11");
+						exit(EXIT_FAILURE);
+				}
+				command->setCmdType(BOARDCMD);
+			}	break;
+			
 			/*
 			case '6': { 	// --readr
 				if (command) delete command;
@@ -1904,6 +2401,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 			case '?':
 			default:
 			{
+				help();
 				exit(EXIT_FAILURE);
 			} break;
 		}
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
index 98f504ce58c6d13f11af168bc8fa4a0ededce4db..da6c72e79a02a869ab06987923f03b688c24e090 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
@@ -313,11 +313,73 @@ class StopCmd : public Command
 };
 
 //-----------------------------------------------------------------------------
-class TrigclrCmd : public Command
+class TrigReleaseCmd : public Command
 {
 	public:
-		TrigclrCmd(GCFPortInterface& port);
-		virtual ~TrigclrCmd() { }
+		TrigReleaseCmd(GCFPortInterface& port);
+		virtual ~TrigReleaseCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+	private:
+};
+
+//-----------------------------------------------------------------------------
+class TrigGenerateCmd : public Command
+{
+	public:
+		TrigGenerateCmd(GCFPortInterface& port);
+		virtual ~TrigGenerateCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+	private:
+};
+
+//-----------------------------------------------------------------------------
+class TrigSetupCmd : public Command
+{
+	public:
+		TrigSetupCmd(GCFPortInterface& port);
+		virtual ~TrigSetupCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+		void setLevel(uint32 level) { itsLevel = level; }
+		void setMode(uint32 mode) { itsMode = mode; }
+		void setFilter(uint32 filter) { itsFilter = filter; }
+		void setWindow(uint32 window) { itsWindow = window; }
+		void setDummy(uint32 dummy) { itsDummy = dummy; }
+	private:
+		uint32 itsLevel;
+		uint32 itsMode;
+		uint32 itsFilter;
+		uint32 itsWindow;
+		uint32 itsDummy;
+};
+
+//-----------------------------------------------------------------------------
+class TrigCoefficientCmd : public Command
+{
+	public:
+		TrigCoefficientCmd(GCFPortInterface& port);
+		virtual ~TrigCoefficientCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+		void setC0(int16 c0) { itsC0 = c0; }
+		void setC1(int16 c1) { itsC1 = c1; }
+		void setC2(int16 c2) { itsC2 = c2; }
+		void setC3(int16 c3) { itsC3 = c3; }
+	private:
+		int16 itsC0;
+		int16 itsC1;
+		int16 itsC2;
+		int16 itsC3;
+};
+
+//-----------------------------------------------------------------------------
+class TrigInfoCmd : public Command
+{
+	public:
+		TrigInfoCmd(GCFPortInterface& port);
+		virtual ~TrigInfoCmd() { }
 		virtual void send();
 		virtual GCFEvent::TResult ack(GCFEvent& e);
 	private:
@@ -516,6 +578,24 @@ class WritewCmd : public Command
 		uint32	itsWordHi;
 };
 
+//-----------------------------------------------------------------------------
+class TestDdrCmd : public Command
+{
+	public:
+		TestDdrCmd(GCFPortInterface& port);
+		virtual ~TestDdrCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+	private:
+		int32		itsCmdStage;
+		uint32	itsMp;
+		uint32	itsAddr;
+		uint32	itsAddrLine;
+		uint32	itsTestPatern;
+		uint32	itsWordLo;
+		uint32	itsWordHi;
+};
+
 //-----------------------------------------------------------------------------
 class ReadrCmd : public Command
 {