diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
index fbbe05fa2174b2d7c6bb896cc62889bff5fd4dc9..56045a29e51e1dc332eabbb9f660fa64ad776430 100644
--- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
+++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc
@@ -22,25 +22,35 @@
 
 #include <lofar_config.h>
 #include <Common/LofarLogger.h>
+#include <GCF/TM/GCF_ETHRawPort.h>
+#include <GCF/TM/GCF_DevicePort.h>
+#include <GCF/TM/GCF_TimerPort.h>
 
 #include <APL/TBB_Protocol/TBB_Protocol.ph>
 #include "BoardCmdHandler.h"
 
+
+
 using namespace LOFAR;
 using namespace TBB_Protocol;
 using	namespace TBB;
 
-BoardCmdHandler::BoardCmdHandler()
+BoardCmdHandler::BoardCmdHandler(GCFTimerPort* port)
   : GCFFsm((State)&BoardCmdHandler::idle_state)
 {		
+	itsSleepTimer = port;
 	TS	= TbbSettings::instance();
 	itsDone = true;
 	itsRetries = 0;
 	itsClientPort	= 0;
-	itsCmd = 0;		
+	itsCmd = 0;
+			
 }
 
-BoardCmdHandler::~BoardCmdHandler() {  }
+BoardCmdHandler::~BoardCmdHandler()
+{
+	delete itsSleepTimer;
+}
 
 
 GCFEvent::TResult BoardCmdHandler::idle_state(GCFEvent& event, GCFPortInterface& port)
@@ -127,6 +137,11 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa
 		}	break;
 		    
 		case F_TIMER: {
+			if (&port == itsSleepTimer) {
+				TRAN(BoardCmdHandler::send_state);	
+				break;
+			}
+			
 			// time-out, retry
 			if ((itsRetries < TS->maxRetries()) && !itsCmd->isDone()) {
 				LOG_DEBUG("=TIME-OUT=");
@@ -135,7 +150,12 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa
 				LOG_DEBUG_STR(formatString("itsRetries[%d] = %d", itsCmd->getBoardNr(), itsRetries));	
 			}	else {
 				itsCmd->saveTpAckEvent(event); // max retries or done, save zero's
-				TRAN(BoardCmdHandler::send_state);
+				if (itsCmd->getSleepTime()) {
+					itsSleepTimer->setTimer((long)itsCmd->getSleepTime());
+					itsCmd->setSleepTime(0);
+				} else {
+					TRAN(BoardCmdHandler::send_state);
+				}
 			}
 		}	break;
 		
@@ -146,8 +166,12 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa
 			if (itsCmd->isValid(event)) {
 				port.cancelAllTimers();
 				itsCmd->saveTpAckEvent(event);
-				
-				TRAN(BoardCmdHandler::send_state);
+				if (itsCmd->getSleepTime()) {
+					itsSleepTimer->setTimer((long)itsCmd->getSleepTime());
+					itsCmd->setSleepTime(0);
+				} else {
+					TRAN(BoardCmdHandler::send_state);
+				}
 			}	else {
 				status = GCFEvent::NOT_HANDLED;
 			}
diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
index 79334bcdc4bcd56ca6b0350a32794d29f129cc8c..6b9f2556369e7a4869817fb84f73d2025ac54f63 100644
--- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
+++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h
@@ -37,6 +37,9 @@
 #define BOARDCMDHANDLER_H_
 
 #include <GCF/TM/GCF_Control.h>
+#include <GCF/TM/GCF_ETHRawPort.h>
+#include <GCF/TM/GCF_DevicePort.h>
+#include <GCF/TM/GCF_TimerPort.h>
 
 #include "Command.h"
 #include "DriverSettings.h"
@@ -50,7 +53,7 @@ namespace LOFAR {
 			public:
 				// Constructors for a SyncAction object.
 				// Default direction is read.
-				BoardCmdHandler();
+				BoardCmdHandler(GCFTimerPort* port);
 
 				// Destructor for SyncAction. */
 				~BoardCmdHandler();
@@ -66,16 +69,17 @@ namespace LOFAR {
 			protected:
 
 			private:
-				TbbSettings 			*TS;
+				TbbSettings* 			TS;
 				bool							itsDone;
 				bool							itsFlashMode;
 				// variables
 				int32							 itsRetries;
-				GCFPortInterface  *itsClientPort; // return port of the actual commmand
-				Command						*itsCmd; // command to use			
+				GCFPortInterface* itsClientPort; // return port of the actual commmand
+				Command* itsCmd; // command to use
+				GCFTimerPort* itsSleepTimer;			
 				
 		};
 	} // end TBB namespace
 } // end LOFAR namespace
 
-#endif /* BOARDACTION_H_ */
+#endif
diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
index 8f62dd6c43dcb7d4c6e1c16fa0e3e172d7ffa374..01f7b716a82505e13d3b2864d4134ad82a278699 100644
--- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc
@@ -107,6 +107,9 @@ void ClearCmd::saveTpAckEvent(GCFEvent& event)
 	delete itsTPackE;
 	
 	nextBoardNr();
+	if (isDone()) {
+		setSleepTime(3); // clearing the registers will last 3 seconds
+	}
 }
 
 // ----------------------------------------------------------------------------
@@ -116,6 +119,5 @@ void ClearCmd::sendTbbAckEvent(GCFPortInterface* clientport)
 		if (itsTBBackE->status_mask[boardnr] == 0)
 			itsTBBackE->status_mask[boardnr] = TBB_SUCCESS;
 	}
-	sleep(3);
 	clientport->send(*itsTBBackE);
 }
diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc
index 7db70b694d6abe8e0122e263b9519cd42b41c74a..1cd1cb18927d11f0434243190089332393cda14a 100644
--- a/MAC/APL/PIC/TBBDriver/src/Command.cc
+++ b/MAC/APL/PIC/TBBDriver/src/Command.cc
@@ -29,7 +29,8 @@ using namespace LOFAR;
 using namespace TBB;
 			
 Command::Command() : 
-	itsWaitAck(false), itsDone(false), itsAllPorts(false), itsBoard(-1), itsChannel(-1), itsBoardMask(0)
+	itsWaitAck(false), itsDone(false), itsAllPorts(false), itsBoard(-1), 
+	itsChannel(-1), itsBoardMask(0), itsSleepTime(0)
 {
 	TS = TbbSettings::instance();
 }
@@ -103,6 +104,18 @@ void Command::setWaitAck(bool waitack)
 	itsWaitAck = waitack;
 }
 
+// ----------------------------------------------------------------------------
+void Command::setSleepTime(uint32 sleeptime)
+{
+	itsSleepTime = sleeptime;
+}
+
+// ----------------------------------------------------------------------------
+uint32 Command::getSleepTime()
+{
+	return (itsSleepTime);
+}
+
 // ----------------------------------------------------------------------------
 void Command::setBoardMask(uint32 mask)
 {
diff --git a/MAC/APL/PIC/TBBDriver/src/Command.h b/MAC/APL/PIC/TBBDriver/src/Command.h
index b9749232b356121c8fce42f829f24a1081d08363..d9e40f3736685ba1c979a8e401aa83d9957d1e80 100644
--- a/MAC/APL/PIC/TBBDriver/src/Command.h
+++ b/MAC/APL/PIC/TBBDriver/src/Command.h
@@ -55,6 +55,10 @@ namespace LOFAR {
 			
 			void setWaitAck(bool waitack);
 			
+			void setSleepTime(uint32 sleeptime);
+			
+			uint32	getSleepTime();
+			
 			bool isDone();
 			
 			void setDone(bool done);
@@ -88,6 +92,7 @@ namespace LOFAR {
     	int32		itsBoard;
 			int32		itsChannel;
 			uint32	itsBoardMask;
+			uint32	itsSleepTime;
     };
 	} // 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 58f46e019a4595b464597f7cc2644ed83ed4aaf8..2a93573d4bee7110290bed82a628c6a0d0061a23 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc
@@ -52,7 +52,7 @@ TbbSettings* TbbSettings::instance()
 // Default constructor
 //
 TbbSettings::TbbSettings() :
-	itsDriverVersion(112),				// set cvs version of TBBDriver.c (now 1.12)
+	itsDriverVersion(DRIVER_VERSION),				// set cvs version of TBBDriver.c (now 1.13)
 	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
@@ -185,7 +185,8 @@ void TbbSettings::setMaxBoards (int32 maxboards)
 		itsChannelInfo[ch].TriggerReleased = false;
 		itsChannelInfo[ch].Triggered = false;
 		itsChannelInfo[ch].TriggerLevel = 0;
-		itsChannelInfo[ch].TriggerMode = 0;
+		itsChannelInfo[ch].TriggerStartMode = 0;
+		itsChannelInfo[ch].TriggerStopMode = 0;
 		itsChannelInfo[ch].FilterSelect = 0;
 		itsChannelInfo[ch].DetectWindow = 0;
 		itsChannelInfo[ch].TriggerDummy = 0;
diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
index 0ae1dba66822f2186431dbdb7dc8bf8128be16b5..8f7a580b2d8f9328c3b36a344f99506e1217b6bf 100644
--- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
+++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h
@@ -35,6 +35,8 @@
 namespace LOFAR {
   namespace TBB {
 
+static const int DRIVER_VERSION = 113; // 1.13 in cvs
+
 enum SetupStateT {boardReset,boardCleared,boardFreed,boardReady};
 
 // info for all channels
@@ -52,12 +54,13 @@ struct ChannelInfo
 	// settings for the trigger system
 	bool	TriggerReleased;
 	bool	Triggered;
-	uint32	TriggerLevel;
-	uint32	TriggerMode;
-	uint32	FilterSelect;
-	uint32	DetectWindow;
-	uint32	TriggerDummy;
-	uint32	Coefficient[4];
+	uint16	TriggerLevel;
+	uint8	TriggerStartMode;
+	uint8	TriggerStopMode;
+	uint8	FilterSelect;
+	uint8	DetectWindow;
+	uint16	TriggerDummy;
+	uint16	Coefficient[4];
 };
 
 struct BoardInfo
@@ -111,12 +114,13 @@ public:
 	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);
+	uint16 getChTriggerLevel(int32 channelnr);
+	uint8 getChTriggerStartMode(int32 channelnr);
+	uint8 getChTriggerStopMode(int32 channelnr);
+	uint8 getChFilterSelect(int32 channelnr);
+	uint8 getChDetectWindow(int32 channelnr);
+	uint16 getChTriggerDummy(int32 channelnr);
+	uint16 getChFilterCoefficient(int32 channelnr, int32 coef_nr);
 	
 	string getIfName();
 	string getSrcIp(int32 boardnr);
@@ -137,12 +141,13 @@ public:
 	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 setChTriggerLevel(int32 channelnr, uint16 level);
+	void setChTriggerStartMode(int32 channelnr, uint8 mode);
+	void setChTriggerStopMode(int32 channelnr, uint8 mode);
+	void setChFilterSelect(int32 channelnr, uint8 filter_select);
+	void setChDetectWindow(int32 channelnr, uint8 detect_window);
+	void setChTriggerDummy(int32 channelnr, uint16 dummy);
+	void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef);
 	
 	void clearRcuSettings(int32 boardnr);
 	
@@ -234,12 +239,13 @@ inline	uint32 TbbSettings::getChStartAddr(int32 channelnr) { return (itsChannelI
 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	uint16 TbbSettings::getChTriggerLevel(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerLevel); }
+inline	uint8 TbbSettings::getChTriggerStartMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerStartMode); }
+inline	uint8 TbbSettings::getChTriggerStopMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerStopMode); }
+inline	uint8 TbbSettings::getChFilterSelect(int32 channelnr) { return (itsChannelInfo[channelnr].FilterSelect); }
+inline	uint8 TbbSettings::getChDetectWindow(int32 channelnr) { return (itsChannelInfo[channelnr].DetectWindow); }
+inline	uint16 TbbSettings::getChTriggerDummy(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerDummy); }
+inline	uint16 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); }
@@ -253,12 +259,13 @@ inline	void TbbSettings::setChStartAddr(int32 channelnr, uint32 startaddr){ itsC
 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	void TbbSettings::setChTriggerLevel(int32 channelnr, uint16 level){ itsChannelInfo[channelnr].TriggerLevel = level; }
+inline	void TbbSettings::setChTriggerStartMode(int32 channelnr, uint8 mode){ itsChannelInfo[channelnr].TriggerStartMode = mode; }
+inline	void TbbSettings::setChTriggerStopMode(int32 channelnr, uint8 mode){ itsChannelInfo[channelnr].TriggerStopMode = mode; }
+inline	void TbbSettings::setChFilterSelect(int32 channelnr, uint8 select){ itsChannelInfo[channelnr].FilterSelect = select; }
+inline	void TbbSettings::setChDetectWindow(int32 channelnr, uint8 window){ itsChannelInfo[channelnr].DetectWindow = window; }
+inline	void TbbSettings::setChTriggerDummy(int32 channelnr, uint16 dummy){ itsChannelInfo[channelnr].TriggerDummy = dummy; }
+inline	void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 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/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
index e4c66cce3b328380bbfe66a44ea76a013617b1ea..45a401696192326705a4221968688f5996638c31 100644
--- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc
@@ -117,7 +117,7 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event)
 			char info[256];
 			memset(info,0,256);
 			memcpy(info,&itsTPackE->data,256);
-			LOG_DEBUG_STR(formatString("ImageInfoCmd: %s",info)); 
+			LOG_DEBUG_STR("ImageInfoCmd: " << info); 
 			
 			itsTBBackE->image_version[itsImage]= itsTPackE->data[0];	  
 			itsTBBackE->write_date[itsImage] = itsTPackE->data[1];	
@@ -126,7 +126,8 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event)
 						 &itsTBBackE->tp_file_name[itsImage][0],
 						 &itsTBBackE->mp_file_name[itsImage][0]);
 						
-			
+			LOG_DEBUG_STR("tp_file_name: " << itsTBBackE->tp_file_name[itsImage]);
+			LOG_DEBUG_STR("mp_file_name: " << itsTBBackE->mp_file_name[itsImage]);
 			//itsTBBackE->image_version[itsImage]= itsTPackE->data[0];	  
 			//itsTBBackE->write_date[itsImage] = itsTPackE->data[1];		  		
 		
diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
index 65e99f75644a25052c7c9b920b8988006befc10f..1975e4a0ad167c886938124ada8dacad15d33fa2 100644
--- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc
@@ -81,6 +81,8 @@ void ResetCmd::saveTbbEvent(GCFEvent& event)
 	}
 	TS->setActiveBoardsMask(boardmask);
 	setDone(true);
+	setSleepTime(3);  // full reset will take 3 seconds
+	
 	delete itsTBBE;	
 }
 
@@ -105,6 +107,5 @@ void ResetCmd::sendTbbAckEvent(GCFPortInterface* clientport)
 		if (itsTBBackE->status_mask[boardnr] == 0)
 			itsTBBackE->status_mask[boardnr] = TBB_SUCCESS;
 	}
-	sleep(3);
 	clientport->send(*itsTBBackE);
 }
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
index 9c391d5e7e6284f74a627e9edbc296ad7d31a632..4f020bb36cd1415f3814671bf96a8791eadbff3f 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc
@@ -1,23 +1,23 @@
-//#  TBBDriver.cc: one line description
+//#  TBBDriver.cc: one line description 
+//# 
+//#  Copyright (C) 2006 
+//#  ASTRON (Netherlands Foundation for Research in Astronomy) 
+//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl 
+//# 
+//#  This program is free software; you can redistribute it and/or modify 
+//#  it under the terms of the GNU General Public License as published by 
+//#  the Free Software Foundation; either version 2 of the License, or 
+//#  (at your option) any later version. 
+//# 
+//#  This program is distributed in the hope that it will be useful, 
+//#  but WITHOUT ANY WARRANTY; without even the implied warranty of 
+//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
+//#  GNU General Public License for more details. 
+//# 
+//#  You should have received a copy of the GNU General Public License 
+//#  along with this program; if not, write to the Free Software 
+//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 //# 
-//#  Copyright (C) 2006
-//#  ASTRON (Netherlands Foundation for Research in Astronomy)
-//#  P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
-//#
-//#  This program is free software; you can redistribute it and/or modify
-//#  it under the terms of the GNU General Public License as published by
-//#  the Free Software Foundation; either version 2 of the License, or
-//#  (at your option) any later version.
-//#
-//#  This program is distributed in the hope that it will be useful,
-//#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//#  GNU General Public License for more details.
-//#
-//#  You should have received a copy of the GNU General Public License
-//#  along with this program; if not, write to the Free Software
-//#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-//#
 //#  $Id$
 
 //# Always #include <lofar_config.h> first!
@@ -171,10 +171,11 @@ TBBDriver::TBBDriver(string name)
 	
 	itsAliveTimer = new GCFTimerPort(*this, "AliveTimer");
 	itsSetupTimer = new GCFTimerPort(*this, "SetupTimer");
+	itsCmdTimer = new GCFTimerPort(*this, "CmdTimer");
 	
-	 // create cmd & msg handler
+  	// create cmd & msg handler
 	LOG_DEBUG_STR("initializing handlers");
-	cmdhandler = new BoardCmdHandler();
+	cmdhandler = new BoardCmdHandler(itsCmdTimer);
 	msghandler = new MsgHandler();
 	
 	itsResetCount = new int32[TS->maxBoards()];
@@ -504,6 +505,25 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port)
 			port.send(ack); 
 		} break;
 		
+		case TBB_TRIG_SETTINGS: {
+			TBBTrigSettingsAckEvent ack;
+			int rcu;
+			for (int32 ch = 0; ch < TS->maxChannels(); ch++) {
+				rcu = TS->getChRcuNr(ch);
+				
+				ack.setup[rcu].level = TS->getChTriggerLevel(ch);
+				ack.setup[rcu].start_mode = TS->getChTriggerStartMode(ch);
+				ack.setup[rcu].stop_mode = TS->getChTriggerStopMode(ch);
+				ack.setup[rcu].filter_select = TS->getChFilterSelect(ch);
+				ack.setup[rcu].window = TS->getChDetectWindow(ch);
+				ack.coefficients[rcu].c0 = TS->getChFilterCoefficient(ch,0);
+				ack.coefficients[rcu].c1 = TS->getChFilterCoefficient(ch,1);
+				ack.coefficients[rcu].c2 = TS->getChFilterCoefficient(ch,2);
+				ack.coefficients[rcu].c3 = TS->getChFilterCoefficient(ch,3);
+			}
+			port.send(ack); 
+		} break;
+		
 		case TBB_SUBSCRIBE: {
 			msghandler->addClient(port)	;
 			TBBSubscribeAckEvent subscribeack;
diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
index 5f6356270cd7bc619214a0efa7d2123ee80b4404..b346fd5ed30e0d4930eeea53073cdf32940ba6fe 100644
--- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
+++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h
@@ -103,7 +103,7 @@ namespace LOFAR{
 			
 			// define some variables
 			TPAliveEvent			*itsAlive;
-	  	BoardCmdHandler		*cmdhandler;
+			BoardCmdHandler		*cmdhandler;
 			MsgHandler				*msghandler;
 			Command 					*cmd;
 			bool							itsAliveCheck;
@@ -126,6 +126,7 @@ namespace LOFAR{
 			GCFETHRawPort*	itsBoard;        // array of ports, one for each TBB board
 			GCFTimerPort*		itsAliveTimer;
 			GCFTimerPort*		itsSetupTimer;
+			GCFTimerPort*		itsCmdTimer;
 			std::list<GCFPortInterface*> itsClientList;  // list of clients
     };
 	} // end TBB namespace
diff --git a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
index ce2e8b6376e76892fdeb2797acf8ce4729c7064d..78f0249aef88840965341f7268f390e5b9e49f2f 100644
--- a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
+++ b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc
@@ -76,7 +76,8 @@ void TrigSetupCmd::saveTbbEvent(GCFEvent& event)
 		channel = (board * TS->nrChannelsOnBoard()) + board_channel;
 		
 		TS->setChTriggerLevel(channel, itsTBBE->setup[rcunr].level);
-		TS->setChTriggerMode(channel, itsTBBE->setup[rcunr].td_mode);
+		TS->setChTriggerStartMode(channel, (itsTBBE->setup[rcunr].start_mode));
+		TS->setChTriggerStopMode(channel, (itsTBBE->setup[rcunr].stop_mode));
 		TS->setChFilterSelect(channel, itsTBBE->setup[rcunr].filter_select);
 		TS->setChDetectWindow(channel, itsTBBE->setup[rcunr].window);
 		TS->setChTriggerDummy(channel, itsTBBE->setup[rcunr].dummy);
@@ -110,14 +111,11 @@ void TrigSetupCmd::sendTpEvent()
 		itsTPE->mp = TS->getChMpNr(getChannelNr());
 		for (int ch = 0; ch < 4; ch++) {
 			itsTPE->channel[ch].level = static_cast<uint32>(TS->getChTriggerLevel(getChannelNr() + ch));
-			itsTPE->channel[ch].td_mode = static_cast<uint32>(TS->getChTriggerMode(getChannelNr() + ch));
+			itsTPE->channel[ch].td_mode = static_cast<uint32>((TS->getChTriggerStartMode(getChannelNr() + ch) +
+																		(TS->getChTriggerStopMode(getChannelNr() + ch) << 4)));
 			itsTPE->channel[ch].filter_select = static_cast<uint32>(TS->getChFilterSelect(getChannelNr() + ch));
 			itsTPE->channel[ch].window = static_cast<uint32>(TS->getChDetectWindow(getChannelNr() + ch));
 			itsTPE->channel[ch].dummy = static_cast<uint32>(TS->getChTriggerDummy(getChannelNr() + ch));
-			
-			LOG_DEBUG_STR(formatString("TrigSetup --> board[%d],channel[%d],level[%08X],mode[%08X],filter[%08X],window[%08X],dummy[%08X]",
-			getBoardNr(), (getChannelNr() + ch), TS->getChTriggerLevel(getChannelNr() + ch), TS->getChTriggerMode(getChannelNr() + ch),
-			TS->getChFilterSelect(getChannelNr() + ch), TS->getChDetectWindow(getChannelNr() + ch), TS->getChTriggerDummy(getChannelNr() + ch)));
 		}
 		
 		TS->boardPort(getBoardNr()).send(*itsTPE);
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
index e206901c52ec8ae555d11beca98a5119b12a9a68..aa9deefd853115cad1b9a0a7d33abb2cc51cc783 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc
@@ -56,6 +56,8 @@ using namespace LOFAR;
 using namespace TBB_Protocol;
 using namespace TbbCtl;
 
+static const long DELAY = 1; 
+
 //---- ALLOC  ----------------------------------------------------------------
 AllocCmd::AllocCmd(GCFPortInterface& port) : Command(port)
 {
@@ -72,7 +74,7 @@ void AllocCmd::send()
 	if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -124,7 +126,7 @@ void ChannelInfoCmd::send()
 {
 	TBBRcuInfoEvent event;
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -175,7 +177,7 @@ void FreeCmd::send()
 	if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -229,7 +231,7 @@ void RecordCmd::send()
 	if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -285,7 +287,7 @@ void StopCmd::send()
 	if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used
 	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -323,6 +325,49 @@ GCFEvent::TResult StopCmd::ack(GCFEvent& e)
 	return(GCFEvent::HANDLED);
 }
 
+//---- TRIGGERSETTINGS --------------------------------------------------------
+TriggerSettingsCmd::TriggerSettingsCmd(GCFPortInterface& port) : Command(port)
+{
+	cout << endl;
+	cout << "== TBB ===================================================== rcu info =======" << endl;
+	cout << endl;
+}
+
+//-----------------------------------------------------------------------------
+void TriggerSettingsCmd::send()
+{
+	TBBTrigSettingsEvent event;
+	itsPort.send(event);
+	itsPort.setTimer(DELAY);
+}
+
+//-----------------------------------------------------------------------------
+GCFEvent::TResult TriggerSettingsCmd::ack(GCFEvent& e)
+{
+	TBBTrigSettingsAckEvent ack(e);
+	
+	int32 bnr = 0;
+	int32 oldbnr = -1;
+	for (int rcu=0; rcu < getMaxSelections(); rcu++) {
+ 		bnr = static_cast<int32>(rcu / 16);
+		if (isSelected(rcu) ) {
+			if (bnr != oldbnr) {
+				cout << "Rcu  Board  level   start   stop    filter  window  c0      c1      c2      c3" << endl;
+				cout << "---  -----  ------  ------  ------  ------  ------  ------  ------  ------  ------" << endl;
+			}
+			cout << formatString("%3d  %5d  %6d  %6d  %6d  %6d  %6d  %6d  %6d  %6d  %6d",
+					rcu, bnr, ack.setup[rcu].level, ack.setup[rcu].start_mode, ack.setup[rcu].stop_mode,
+					ack.setup[rcu].filter_select, ack.setup[rcu].window, ack.coefficients[rcu].c0, 
+					ack.coefficients[rcu].c1, ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl;
+		}
+		oldbnr = bnr;
+	}
+	cout << endl;
+	
+	setCmdDone(true);
+	return(GCFEvent::HANDLED);
+}
+
 //---- TRIGRELEASE ------------------------------------------------------------
 TrigReleaseCmd::TrigReleaseCmd(GCFPortInterface& port) : Command(port)
 {
@@ -340,7 +385,7 @@ void TrigReleaseCmd::send()
 		event.rcu_start_mask = getRcuMask();
 	}
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -388,7 +433,7 @@ void TrigGenerateCmd::send()
 		event.rcu_mask = getRcuMask();
 	}	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -415,7 +460,7 @@ GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e)
 
 //---- TRIGSETUP --------------------------------------------------------------
 TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port),
-	itsLevel(0), itsMode(0), itsFilter(0), itsWindow(0), itsDummy(0)
+	itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsDummy(0)
 {
 	cout << endl;
 	cout << "== TBB ============================ trigger system setup for selected rcu's ====" << endl;
@@ -429,14 +474,15 @@ void TrigSetupCmd::send()
 	if (isSelectionDone()) {
 		for (int cnr=0; cnr < getMaxSelections(); cnr++) {	
 			event.setup[cnr].level = itsLevel;
-			event.setup[cnr].td_mode = itsMode;
+			event.setup[cnr].start_mode = itsStartMode;
+			event.setup[cnr].stop_mode = itsStopMode;
 			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);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -487,7 +533,7 @@ void TrigCoefficientCmd::send()
 		}
 	}
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -530,7 +576,7 @@ void TrigInfoCmd::send()
 		event.rcu = getRcu();
 	}
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -605,7 +651,7 @@ void ListenCmd::send()
 		default: {
 		} break;
 	}
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -667,7 +713,7 @@ void ReadCmd::send()
 	event.prepages = itsPrePages;
 	event.postpages = itsPostPages;
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -707,7 +753,7 @@ void ModeCmd::send()
 	event.board = (uint32)getBoard();
 	event.rec_mode = itsRecMode;
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -741,7 +787,7 @@ void VersionCmd::send()
   TBBVersionEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
-  itsPort.setTimer((long)1);
+  itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -791,7 +837,7 @@ void SizeCmd::send()
   TBBSizeEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
-  itsPort.setTimer((long)1);
+  itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -832,7 +878,7 @@ void StatusCmd::send()
   TBBStatusEvent event;
   event.boardmask = getBoardMask();
   itsPort.send(event);
-  itsPort.setTimer((long)1);
+  itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1129,7 +1175,7 @@ void ImageInfoCmd::send()
 	TBBImageInfoEvent event;
 	event.board = getBoard();
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1159,7 +1205,8 @@ GCFEvent::TResult ImageInfoCmd::ack(GCFEvent& e)
 									 	t.tm_mday,t.tm_mon+1,t.tm_year+1900,
 										t.tm_hour,t.tm_min,t.tm_sec,
 										ack.tp_file_name[image],
-										ack.mp_file_name[image]) << endl;;
+										ack.mp_file_name[image]) << endl;
+				cout << "TP: " << ack.tp_file_name[image] <<  ",  MP: " << ack.mp_file_name[image] << endl;
 			}
 		}
 	}	else {	
@@ -1191,7 +1238,7 @@ void ReadwCmd::send()
 	event.mp = itsMp;
 	event.addr = itsAddr;
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1239,7 +1286,7 @@ void WritewCmd::send()
 	event.wordlo = itsWordLo;
 	event.wordhi = itsWordHi;
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1334,7 +1381,7 @@ void TestDdrCmd::send()
 		default: break;
 	}
 	
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1465,7 +1512,7 @@ void ReadrCmd::send()
 	event.regid = itsRegId;
 	
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1520,7 +1567,7 @@ void WriterCmd::send()
 		event.data[i] = itsData[i];
 	}
 	itsPort.send(event);
-	itsPort.setTimer((long)1);
+	itsPort.setTimer(DELAY);
 }
 
 //-----------------------------------------------------------------------------
@@ -1549,7 +1596,7 @@ GCFEvent::TResult WriterCmd::ack(GCFEvent& e)
 	return(GCFEvent::HANDLED);
 }
 
-//---- READPAGE ------------------------------------------------------------------
+//---- EADPAGE ------------------------------------------------------------------
 ReadPageCmd::ReadPageCmd(GCFPortInterface& port) : Command(port),
 	itsRcu(0),itsStartPage(0),itsPages(1),itsCmdStage(0),itsPage(0),itsTotalSize(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0),
 	itsStationId(0),itsRspId(0),itsRcuId(0),itsSampleFreq(0),itsTime(0),itsSampleNr(0),itsSamplesPerFrame(0),
@@ -1569,14 +1616,14 @@ void ReadPageCmd::send()
 		case 0: {	// get info about allocated RCU's
 			TBBRcuInfoEvent send;
 			itsPort.send(send);
-			itsPort.setTimer((long)1);
+			itsPort.setTimer(DELAY);
 		} break;
 		
 		case 1: {	// get total memmory size
   		TBBSizeEvent send;
   		send.boardmask = (1 << itsBoard);
   		itsPort.send(send);
-  		itsPort.setTimer((long)1);
+  		itsPort.setTimer(DELAY);
 		} break;
 		
 		case 2: {	// write page address to board
@@ -1592,7 +1639,7 @@ void ReadPageCmd::send()
 			send.data[1] = 0; 
 			send.data[2] = 0;
 			itsPort.send(send);
-			itsPort.setTimer((long)1);
+			itsPort.setTimer(DELAY);
 			
 			LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.data[0]));
@@ -1608,7 +1655,7 @@ void ReadPageCmd::send()
 			send.data[1] = 0; 
 			send.data[2] = 0;
 			itsPort.send(send);
-			itsPort.setTimer((long)1);
+			itsPort.setTimer(DELAY);
 			
 			LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.data[0]));
@@ -1623,7 +1670,7 @@ void ReadPageCmd::send()
 			send.pagelength = 256;
 			send.pageaddr = 0;
 			itsPort.send(send);
-			itsPort.setTimer((long)1);
+			itsPort.setTimer(DELAY);
 			
 			LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.pagelength,send.pageaddr));
@@ -1638,7 +1685,7 @@ void ReadPageCmd::send()
 			send.pagelength = 256;
 			send.pageaddr = 256;
 			itsPort.send(send);
-			itsPort.setTimer((long)1);
+			itsPort.setTimer(DELAY);
 			
 			LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", 
 				send.mp,send.pid,send.regid,send.pagelength,send.pageaddr));
@@ -1787,14 +1834,18 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e)
 			
 			// print size of progressbar on screen
 			bar_interval = itsPages / bar_size;
+			int recvtime = static_cast<int>((1043. / 262144.) * itsPages);  // measured 262144 pages in 1043 seconds
+			int hours = recvtime / (60 * 60);
+			int mins = (recvtime - (hours * 60 * 60)) / 60;
+			int secs = recvtime - (hours * 60 * 60) - (mins * 60) + 1; // 1 second for overhead
 			cout << endl;
-			cout <<   "Progress |";
+			cout << "          Estimated receive time " << formatString("%d:%02d:%02d",hours, mins, secs) << endl;
+			cout << "Progress |";
 			for (int i = 0; i < bar_size; i++) {
 				cout << "-";
 			}
 			cout << "|" << endl ;
-			cout <<   "         |";
-						
+			cout <<   "         |" << flush;
 			
 			snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId);
 		}
@@ -1964,6 +2015,7 @@ void TBBCtl::commandHelp(int level)
 	cout << " tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages      # transfer recorded data from rcunr to CEP, " << endl;
 	cout << "                                                                    # use first --mode to setup UDP/IP header" << endl;   
 	cout << "______| TRIGGER |_________________________________________________________________________________________________________" << endl;
+	cout << " tbbctl --settings [--select=<set>]                                 # list trigger settings for selected rcu's" << endl;
 	cout << " tbbctl --release [--select=<set>]                                  # release trigger system for selected rcu's" << endl;
 	cout << " tbbctl --generate [--select=<set>]                                 # generate a trigger for selected rcu's" << endl;	
 	cout << " tbbctl --setup=level,start,stop,filter,window,x [--select=<set>]   # setup trigger system for selected rcu's, x = dummy" << endl;
@@ -2042,7 +2094,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
     case F_ENTRY: {
     	if (!itsServerPort.isConnected()) {
       	itsServerPort.open();
-      	itsServerPort.setTimer((long)1);
+      	itsServerPort.setTimer(DELAY);
       }
     } break;
 
@@ -2075,7 +2127,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port)
 		} break;
 		
     case F_DISCONNECTED: {
-      //port.setTimer((long)1);
+      //port.setTimer(DELAY);
       port.close();
     } break;
 
@@ -2144,6 +2196,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
     case TBB_FREE_ACK:
     case TBB_RECORD_ACK:
     case TBB_STOP_ACK:
+    case TBB_TRIG_SETTINGS_ACK:	
     case TBB_TRIG_RELEASE_ACK:
     case TBB_TRIG_SETUP_ACK:	
     case TBB_TRIG_COEF_ACK:
@@ -2210,7 +2263,8 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 			{ "rcuinfo",		no_argument,				0,	'i' }, 
 			{ "free",				no_argument,				0,	'f' }, 
 		  { "record",			no_argument,				0,	'r' }, 
-		  { "stop",				no_argument,				0,	's' }, 
+		  { "stop",				no_argument,				0,	's' },
+		  { "settings",		no_argument,				0,	'b' }, 
 		  { "release",		no_argument,				0,	'e' }, 
 		  { "generate",		no_argument,				0,	'g' }, 
 		  { "setup",			required_argument,	0,	't' }, 
@@ -2242,7 +2296,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 
     int option_index = 0;
     int c = getopt_long(argc, argv,
-												"l:afrsegt:c:I:LR:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:hX",
+												"l:afrsbegt:c:I:LR:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:hX",
 				long_options, &option_index);
 		
     if (c == -1) {
@@ -2310,6 +2364,13 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 				command->setCmdType(RCUCMD);
 			}	break;
 			
+			case 'b': {
+				if (command) delete command;
+				TriggerSettingsCmd* trigsettingscmd = new TriggerSettingsCmd(itsServerPort);
+				command = trigsettingscmd;
+				command->setCmdType(RCUCMD);	
+			} break;
+			
 			case 'e': { 	// --trigrelease
 				if (command) delete command;
 				TrigReleaseCmd* trigreleasecmd = new TrigReleaseCmd(itsServerPort);
@@ -2361,11 +2422,12 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 						exit(EXIT_FAILURE);
 					}
 					
-					trigsetupcmd->setLevel(static_cast<uint32>(level));
-					trigsetupcmd->setMode(static_cast<uint32>(start + (stop << 4)));
-					trigsetupcmd->setFilter(static_cast<uint32>(filter));
-					trigsetupcmd->setWindow(static_cast<uint32>(window));
-					trigsetupcmd->setDummy(static_cast<uint32>(dummy));
+					trigsetupcmd->setLevel(static_cast<uint16>(level));
+					trigsetupcmd->setStartMode(static_cast<uint8>(start));
+					trigsetupcmd->setStopMode(static_cast<uint8>(stop));
+					trigsetupcmd->setFilter(static_cast<uint8>(filter));
+					trigsetupcmd->setWindow(static_cast<uint8>(window));
+					trigsetupcmd->setDummy(static_cast<uint16>(dummy));
 				}
 				command->setCmdType(RCUCMD);
 			}	break;
diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
index 05e6c82f198c2726946c5a8244e4f66653ec1670..d727d5f173a626d6cc81b4a2e8c9765bd25b80ea 100644
--- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h
+++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h
@@ -350,6 +350,17 @@ class StopCmd : public Command
 	private:
 };
 
+//-----------------------------------------------------------------------------
+class TriggerSettingsCmd : public Command
+{
+	public:
+		TriggerSettingsCmd(GCFPortInterface& port);
+		virtual ~TriggerSettingsCmd() { }
+		virtual void send();
+		virtual GCFEvent::TResult ack(GCFEvent& e);
+	private:
+};
+
 //-----------------------------------------------------------------------------
 class TrigReleaseCmd : public Command
 {
@@ -380,17 +391,19 @@ class TrigSetupCmd : public Command
 		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; }
+		void setLevel(uint16 level) { itsLevel = level; }
+		void setStartMode(uint8 mode) { itsStartMode = mode; }
+		void setStopMode(uint8 mode) { itsStopMode = mode; }
+		void setFilter(uint8 filter) { itsFilter = filter; }
+		void setWindow(uint8 window) { itsWindow = window; }
+		void setDummy(uint16 dummy) { itsDummy = dummy; }
 	private:
-		uint32 itsLevel;
-		uint32 itsMode;
-		uint32 itsFilter;
-		uint32 itsWindow;
-		uint32 itsDummy;
+		uint16 itsLevel;
+		uint8 itsStartMode;
+		uint8 itsStopMode;
+		uint8 itsFilter;
+		uint8 itsWindow;
+		uint16 itsDummy;
 };
 
 //-----------------------------------------------------------------------------