diff --git a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc
index b79ed87b2849ff9681b2ec6f31d85ae8fc249a5b..bea9a3425d23e5dad5ddffe706307ebd3df59750 100644
--- a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc
@@ -204,11 +204,12 @@ void TbbSettings::setMaxBoards (int32 maxboards)
 		// initialize filter settings
 		itsChannelInfo[ch].TriggerReleased = false;
 		itsChannelInfo[ch].Triggered = false;
-		itsChannelInfo[ch].TriggerLevel = 0;
+		itsChannelInfo[ch].TriggerLevel = 2047;
 		itsChannelInfo[ch].TriggerStartMode = 0;
 		itsChannelInfo[ch].TriggerStopMode = 0;
 		itsChannelInfo[ch].FilterSelect = 0;
 		itsChannelInfo[ch].DetectWindow = 0;
+		itsChannelInfo[ch].TriggerMode = 0;
 		itsChannelInfo[ch].OperatingMode = 0;
 		for (int i = 0; i < 4; i++) {
 			itsChannelInfo[ch].Coefficient[i] = 0;
@@ -216,7 +217,6 @@ void TbbSettings::setMaxBoards (int32 maxboards)
 	}
 	
 	itsBoardSetup  = false;
-	itsTriggerMode = 0;	
 		
 	if (itsBoardInfo) delete itsBoardInfo;
 	itsBoardInfo = new BoardInfo[itsMaxBoards];
@@ -322,7 +322,20 @@ void TbbSettings::clearRcuSettings(int32 boardnr)
 		itsChannelInfo[(boardnr * 16) + cn].Status = 0;
 		itsChannelInfo[(boardnr * 16) + cn].State = 'F';
 		itsChannelInfo[(boardnr * 16) + cn].StartAddr = 0;
-		itsChannelInfo[(boardnr * 16) + cn].PageSize = 0;	
+		itsChannelInfo[(boardnr * 16) + cn].PageSize = 0;
+		
+		itsChannelInfo[(boardnr * 16) + cn].TriggerReleased = false;
+		itsChannelInfo[(boardnr * 16) + cn].Triggered = false;
+		itsChannelInfo[(boardnr * 16) + cn].TriggerLevel = 2047;
+		itsChannelInfo[(boardnr * 16) + cn].TriggerStartMode = 0;
+		itsChannelInfo[(boardnr * 16) + cn].TriggerStopMode = 0;
+		itsChannelInfo[(boardnr * 16) + cn].FilterSelect = 0;
+		itsChannelInfo[(boardnr * 16) + cn].DetectWindow = 0;
+		itsChannelInfo[(boardnr * 16) + cn].TriggerMode = 0;
+		itsChannelInfo[(boardnr * 16) + cn].OperatingMode = 0;
+		for (int i = 0; i < 4; i++) {
+			itsChannelInfo[(boardnr * 16) + cn].Coefficient[i] = 0;
+		}
 	}
 }
 
diff --git a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h
index 939e0a4dd388ff76116cdca13c1dc3901267a2b6..1a85320c5dcc0e5a7ddf4a3563ac8dd951aa67d0 100644
--- a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h
+++ b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h
@@ -35,7 +35,7 @@ namespace LOFAR {
 	using GCF::TM::GCFPortInterface;
 	namespace TBB {
 
-static const int DRIVER_VERSION = 221; // TBBDriver V2.21
+static const int DRIVER_VERSION = 222; // TBBDriver V2.22
 
 enum BoardStateT {noBoard,
 				  setImage1, image1Set,
@@ -66,6 +66,7 @@ struct ChannelInfo
 	uint8  TriggerStopMode;
 	uint8  FilterSelect;
 	uint8  DetectWindow;
+	uint8  TriggerMode;
 	uint8  OperatingMode;
 	uint16 Coefficient[4];
 };
@@ -133,9 +134,9 @@ public:
 	uint8 getChTriggerStopMode(int32 channelnr);
 	uint8 getChFilterSelect(int32 channelnr);
 	uint8 getChDetectWindow(int32 channelnr);
+	uint8 getChTriggerMode(int32 channelnr);
 	uint8 getChOperatingMode(int32 channelnr);
 	uint16 getChFilterCoefficient(int32 channelnr, int32 coef_nr);
-	uint16 getTriggerMode();
 	
 	string getIfName();
 	string getDstMac(int32 boardnr);
@@ -178,9 +179,9 @@ public:
 	void setChTriggerStopMode(int32 channelnr, uint8 mode);
 	void setChFilterSelect(int32 channelnr, uint8 filter_select);
 	void setChDetectWindow(int32 channelnr, uint8 detect_window);
+	void setChTriggerMode(int32 channelnr, uint8 trigger_mode);
 	void setChOperatingMode(int32 channelnr, uint8 operating_mode);
 	void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef);
-	void setTriggerMode(uint16 trigger_mode);
 	
 	void clearRcuSettings(int32 boardnr);
 	
@@ -236,7 +237,6 @@ private:
 	BoardInfo   *itsBoardInfo;
 	ChannelInfo *itsChannelInfo;
 	bool        itsBoardSetup;
-	uint16      itsTriggerMode;
 	string      itsIfName;
 	
 	static TbbSettings *theirTbbSettings;
@@ -293,9 +293,9 @@ inline	uint8 TbbSettings::getChTriggerStartMode(int32 channelnr) { return (itsCh
 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	uint8 TbbSettings::getChTriggerMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerMode); }
 inline	uint8 TbbSettings::getChOperatingMode(int32 channelnr) { return (itsChannelInfo[channelnr].OperatingMode); }
 inline	uint16 TbbSettings::getChFilterCoefficient(int32 channelnr, int32 coef_nr) { return (itsChannelInfo[channelnr].Coefficient[coef_nr]); }
-inline	uint16 TbbSettings::getTriggerMode() { return (itsTriggerMode); }
 inline	string TbbSettings::getIfName() { return(itsIfName); }
 inline	string TbbSettings::getDstMac(int32 boardnr) { return(itsBoardInfo[boardnr].dstMac); }
 inline	string TbbSettings::getSrcIpCep(int32 boardnr) { return(itsBoardInfo[boardnr].srcIpCep); }
@@ -321,9 +321,9 @@ inline	void TbbSettings::setChTriggerStartMode(int32 channelnr, uint8 mode){ its
 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::setChTriggerMode(int32 channelnr, uint8 trigger_mode){ itsChannelInfo[channelnr].TriggerMode = trigger_mode; }
 inline	void TbbSettings::setChOperatingMode(int32 channelnr, uint8 operating_mode){ itsChannelInfo[channelnr].OperatingMode = operating_mode; }
 inline	void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef){ itsChannelInfo[channelnr].Coefficient[coef_nr] = coef; }
-inline	void TbbSettings::setTriggerMode(uint16 triggermode){ itsTriggerMode = triggermode; }
 //---- inline functions for board information ------------
 inline	uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); }
 inline	void TbbSettings::setMemorySize(int32 boardnr,uint32 pages) { itsBoardInfo[boardnr].memorySize = pages; }
diff --git a/MAC/APL/PIC/TBB_Driver/src/Makefile.am b/MAC/APL/PIC/TBB_Driver/src/Makefile.am
index 64134b0057025572edb66f3a19e36da57e221cc0..8ec30ad44bc96c54792a36054019c798782076ac 100644
--- a/MAC/APL/PIC/TBB_Driver/src/Makefile.am
+++ b/MAC/APL/PIC/TBB_Driver/src/Makefile.am
@@ -41,7 +41,9 @@ libtbbdriver_la_SOURCES = Package__Version.cc \
 	TrigReleaseCmd.cc \
 	TrigGenCmd.cc\
 	TrigSetupCmd.cc\
+	TrigSetupSameCmd.cc\
 	TrigCoefCmd.cc\
+	TrigCoefSameCmd.cc\
 	TrigInfoCmd.cc\
 	ReadCmd.cc \
 	UdpCmd.cc \
@@ -89,7 +91,9 @@ noinst_HEADERS = \
 	TrigReleaseCmd.h \
 	TrigGenCmd.h\
 	TrigSetupCmd.h\
+	TrigSetupSameCmd.h\
 	TrigCoefCmd.h\
+	TrigCoefSameCmd.h\
 	TrigInfoCmd.h\
 	ReadCmd.h \
 	UdpCmd.h \
diff --git a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc
index dd1ac4f1053e3192115504c929c7c6fa7d8ed42b..f93aa93aeb65bde4641fe17da9fc59aa0953a6bd 100644
--- a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc
@@ -46,7 +46,8 @@ StatusCmd::StatusCmd()
 		itsTmp1[boardnr] = 0;
 		itsTmp2[boardnr] = 0;
 		itsTmp3[boardnr] = 0;
-		itsImage[boardnr] = 0;
+		itsCurrentImage[boardnr] = 0;
+		itsFlashState[boardnr] = 0;
 		itsWatchDogMode[boardnr] = 0;
 		itsPgood[boardnr] = 0;
 	}
@@ -108,7 +109,8 @@ void StatusCmd::saveTpAckEvent(GCFEvent& event)
 			itsTmp1[getBoardNr()] = tp_ack.Tmp1;
 			itsTmp2[getBoardNr()] = tp_ack.Tmp2;
 			itsTmp3[getBoardNr()] = tp_ack.Tmp3;
-			itsImage[getBoardNr()] = TS->getImageNr(getBoardNr());
+			itsCurrentImage[getBoardNr()] = TS->getImageNr(getBoardNr());
+			itsFlashState[getBoardNr()] = ((tp_ack.info[5] >> 8) & 0xff);
 			itsWatchDogMode[getBoardNr()] = ((tp_ack.info[5] >> 16) & 0xf);
 			itsPgood[getBoardNr()] = tp_ack.info[0];
 				
@@ -136,7 +138,8 @@ void StatusCmd::sendTbbAckEvent(GCFPortInterface* clientport)
 		tbb_ack.Tmp1[i] = itsTmp1[i];
 		tbb_ack.Tmp2[i] = itsTmp2[i];
 		tbb_ack.Tmp3[i] = itsTmp3[i];
-		tbb_ack.Image[i] = itsImage[i];
+		tbb_ack.CurrentImage[i] = itsCurrentImage[i];
+		tbb_ack.FlashState[i] = itsFlashState[i];
 		tbb_ack.WatchDogMode[i] = itsWatchDogMode[i];
 		tbb_ack.Pgood[i] = itsPgood[i];
 	}
diff --git a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h
index 580fdf30bc6a2180c53c0ac92551193e8bfa9877..c61bd19c4917b7b6fd2117e9545a84a224c83ad1 100644
--- a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h
+++ b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h
@@ -68,7 +68,8 @@ private:
 	uint32 itsTmp1[MAX_N_TBBOARDS];
 	uint32 itsTmp2[MAX_N_TBBOARDS];
 	uint32 itsTmp3[MAX_N_TBBOARDS];
-	uint32 itsImage[MAX_N_TBBOARDS];
+	uint32 itsCurrentImage[MAX_N_TBBOARDS];
+	uint32 itsFlashState[MAX_N_TBBOARDS];
 	uint32 itsWatchDogMode[MAX_N_TBBOARDS];
 	uint32 itsPgood[MAX_N_TBBOARDS];
 };
diff --git a/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc b/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc
index 55e9efdc7ea581bc6e4a0a51396995e844dcf3b8..0d1d65f9539511a4a9e1247e53328aa9f7f08b18 100644
--- a/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc
@@ -43,7 +43,9 @@
 #include "TrigReleaseCmd.h"
 #include "TrigGenCmd.h"
 #include "TrigSetupCmd.h"
+#include "TrigSetupSameCmd.h"
 #include "TrigCoefCmd.h"
+#include "TrigCoefSameCmd.h"
 #include "TrigInfoCmd.h"
 #include "ReadCmd.h"
 #include "UdpCmd.h"
@@ -470,9 +472,6 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
 			int board = TS->port2Board(&port); // get board nr
 			itsBoard[board].cancelAllTimers();
 			TS->setBoardState(board,modeSet);
-			for (int i = 0; i < TS->maxChannels(); i++) {
-				TS->setChOperatingMode(i,static_cast<uint8>(TBB_MODE_TRANSIENT));
-			}
 			TS->setSetupWaitTime(board, 0);
 			TS->setSetupCmdDone(board, true);
 		} break;
@@ -1083,6 +1082,7 @@ bool TBBDriver::sendInfo(GCFEvent& event, GCFPortInterface& port)
 		case TBB_TRIG_SETTINGS: {
 			if (TS->activeBoardsMask() != 0) {
 				TBBTrigSettingsAckEvent ack;
+				ack.status_mask = TS->activeBoardsMask();
 				int rcu;
 				for (int32 ch = 0; ch < TS->maxChannels(); ch++) {
 					rcu = TS->getChRcuNr(ch);
@@ -1092,6 +1092,7 @@ bool TBBDriver::sendInfo(GCFEvent& event, GCFPortInterface& port)
 					ack.setup[rcu].stop_mode = TS->getChTriggerStopMode(ch);
 					ack.setup[rcu].filter_select = TS->getChFilterSelect(ch);
 					ack.setup[rcu].window = TS->getChDetectWindow(ch);
+					ack.setup[rcu].trigger_mode = TS->getChTriggerMode(ch);
 					ack.setup[rcu].operating_mode = TS->getChOperatingMode(ch);
 					ack.coefficients[rcu].c0 = TS->getChFilterCoefficient(ch,0);
 					ack.coefficients[rcu].c1 = TS->getChFilterCoefficient(ch,1);
@@ -1128,7 +1129,9 @@ bool TBBDriver::addTbbCommandToQueue(GCFEvent& event, GCFPortInterface& port)
 		case TBB_TRIG_RELEASE:
 		case TBB_TRIG_GENERATE:
 		case TBB_TRIG_SETUP:
+		case TBB_TRIG_SETUP_SAME:
 		case TBB_TRIG_COEF:
+		case TBB_TRIG_COEF_SAME:
 		case TBB_TRIG_SETTINGS:
 		case TBB_TRIG_INFO:
 		case TBB_READ:
@@ -1230,6 +1233,12 @@ bool TBBDriver::SetTbbCommand(unsigned short signal)
 			itsCmd = new TrigSetupCmd();
 			itsCmdHandler->setTpCmd(itsCmd);
 		} break;
+		
+		case TBB_TRIG_SETUP_SAME:  {
+			TrigSetupSameCmd *itsCmd;
+			itsCmd = new TrigSetupSameCmd();
+			itsCmdHandler->setTpCmd(itsCmd);
+		} break;
 
 		case TBB_TRIG_COEF: {
 			TrigCoefCmd *itsCmd;
@@ -1237,6 +1246,12 @@ bool TBBDriver::SetTbbCommand(unsigned short signal)
 			itsCmdHandler->setTpCmd(itsCmd);
 		} break;
 
+		case TBB_TRIG_COEF_SAME: {
+			TrigCoefSameCmd *itsCmd;
+			itsCmd = new TrigCoefSameCmd();
+			itsCmdHandler->setTpCmd(itsCmd);
+		} break;
+
 		case TBB_TRIG_INFO: {
 			TrigInfoCmd *itsCmd;
 			itsCmd = new TrigInfoCmd();
diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc b/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc
index 0bfa9a037a7aa93f13b57cf0e867a2feaebb9ecd..cf9726274e48b6dd681fb1ef0c680d9626432576 100644
--- a/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc
@@ -70,9 +70,8 @@ void TrigSetupCmd::saveTbbEvent(GCFEvent& event)
 		TS->setChTriggerStopMode(channel, (tbb_event.setup[rcunr].stop_mode));
 		TS->setChFilterSelect(channel, tbb_event.setup[rcunr].filter_select);
 		TS->setChDetectWindow(channel, tbb_event.setup[rcunr].window);
-		TS->setChOperatingMode(channel, tbb_event.setup[rcunr].operating_mode);
+		TS->setChTriggerMode(channel, tbb_event.setup[rcunr].trigger_mode);
 	}
-	TS->setTriggerMode(tbb_event.trigger_mode);
 	
 	std::bitset<MAX_N_RCUS> channels;
 	channels.set();
@@ -96,7 +95,7 @@ void TrigSetupCmd::sendTpEvent()
 														  (TS->getChTriggerStopMode(getChannelNr() + i) << 4)));
 		tp_event.channel[i].filter_select = static_cast<uint32>(TS->getChFilterSelect(getChannelNr() + i));
 		tp_event.channel[i].window = static_cast<uint32>(TS->getChDetectWindow(getChannelNr() + i));
-		tp_event.channel[i].dummy = static_cast<uint32>(TS->getChOperatingMode(getChannelNr() + i));
+		tp_event.channel[i].dummy = static_cast<uint32>(TS->getChTriggerMode(getChannelNr() + i));
 	}
 	
 	TS->boardPort(getBoardNr()).send(tp_event);
diff --git a/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc b/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc
index 8ee9000eec72286a9d163643c41201226856b244..31e2ba05708f25b4e59778082938577aa3805849 100644
--- a/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc
@@ -63,9 +63,7 @@ void UdpCmd::saveTbbEvent(GCFEvent& event)
 	setBoards(0xFFF);
 	
 	itsMode = tbb_event.rec_mode;
-	for (int i = 0; i < TS->maxChannels(); i++) {
-		TS->setChOperatingMode(i,static_cast<uint8>(itsMode));
-	}
+	
 	nextBoardNr();
 }
 
@@ -104,7 +102,12 @@ void UdpCmd::saveTpAckEvent(GCFEvent& event)
 		if (tp_ack.status != 0) {
 			setStatus(getBoardNr(), (tp_ack.status << 24));
 		}
-		
+		else {
+			int start_channel = getBoardNr() * TS->nrChannelsOnBoard();
+			for (int i = 0; i < TS->nrChannelsOnBoard();++i) {
+				TS->setChOperatingMode((start_channel + i), itsMode);
+			}
+		}
 		LOG_DEBUG_STR(formatString("Received UdpAck from boardnr[%d]", getBoardNr()));
 	}
 	nextBoardNr();
diff --git a/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc b/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc
index 11278d5a5e035323908178e86d32829535dc5ba6..a9a09db20ac8317a87526a0e46746c9c4122f611 100644
--- a/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc
+++ b/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc
@@ -349,18 +349,31 @@ GCFEvent::TResult TriggerSettingsCmd::ack(GCFEvent& e)
 
 	int32 bnr = 0;
 	int32 oldbnr = -1;
+	
+	char trig_mode[4][10] = {"shot RSP","cont RSP","shot Ext","cont Ext"};
+	char oper_mode[4][10] = {"?","transient","subbands","?"};
+	
 	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  mode   c0     c1     c2     c3" << endl;
-				cout << "---  -----  -----  -----  -----  ------  ------  -----  -----  -----  -----  -----" << endl;
-			}
-			cout << formatString("%3d  %5d  %5d  %5d  %5d  %5d  %5d  %5d  %5d  %5d  %5d  %5d",
-					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.setup[rcu].operating_mode,
-					ack.coefficients[rcu].c0, ack.coefficients[rcu].c1,
-					ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl;
+				if (ack.status_mask & (1 << bnr)) {
+					cout << "Rcu  Board  level  start  stop   filter  window  mode                 c0     c1     c2     c3" << endl;
+					cout << "---  -----  -----  -----  -----  ------  ------  -------------------  -----  -----  -----  -----" << endl;
+				}
+				else {
+					cout << formatString("board-%d not active",bnr) << endl;
+				}
+			}
+			if (ack.status_mask & (1 << bnr)) {
+				cout << formatString("%3d  %5d  %5d  %5d  %5d  %6d  %6d  %8s, %9s  %5d  %5d  %5d  %5d",
+						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,
+						trig_mode[ack.setup[rcu].trigger_mode],
+						oper_mode[ack.setup[rcu].operating_mode],
+						ack.coefficients[rcu].c0, ack.coefficients[rcu].c1,
+						ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl;
+			}
 		}
 		oldbnr = bnr;
 	}
@@ -476,7 +489,7 @@ GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e)
 
 //---- TRIGSETUP --------------------------------------------------------------
 TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port),
-	itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsOperatingMode(0), itsTriggerMode(0)
+	itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsTriggerMode(0)
 {
 	cout << endl;
 	cout << "== TBB ============================ trigger system setup for selected rcu's ====" << endl;
@@ -486,17 +499,16 @@ TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port),
 //-----------------------------------------------------------------------------
 void TrigSetupCmd::send()
 {
-	TBBTrigSetupEvent event;
+	TBBTrigSetupSameEvent event;
+	
 	if (isSelectionDone()) {
-		for (int cnr=0; cnr < getMaxSelections(); cnr++) {
-			event.setup[cnr].level = itsLevel;
-			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].operating_mode = itsOperatingMode;
-			event.trigger_mode = itsTriggerMode;
-		}
+		event.rcu_mask = getRcuMask(); // if select cmd is used
+		event.setup.level = itsLevel;
+		event.setup.start_mode = itsStartMode;
+		event.setup.stop_mode = itsStopMode;
+		event.setup.filter_select = itsFilter;
+		event.setup.window = itsWindow;
+		event.setup.trigger_mode = itsTriggerMode;
 	}
 	itsPort.send(event);
 	itsPort.setTimer(DELAY);
@@ -505,8 +517,8 @@ void TrigSetupCmd::send()
 //-----------------------------------------------------------------------------
 GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e)
 {
-	if (e.signal == TBB_TRIG_SETUP_ACK) {
-		TBBTrigSetupAckEvent ack(e);
+	if (e.signal == TBB_TRIG_SETUP_SAME_ACK) {
+		TBBTrigSetupSameAckEvent ack(e);
 		cout << "TBB  Info" << endl;
 		cout << "---  -------------------------------------------------------" << endl;
 		int32 bnr = 0;
@@ -516,7 +528,7 @@ GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e)
 
 			if (bnr != oldbnr) {
 				if (ack.status_mask[bnr] == TBB_SUCCESS) {
-					cout << formatString(" %2d  setup trigger system for all rcu's",bnr ) << endl;
+					cout << formatString(" %2d  setup trigger system for all selected rcu's",bnr ) << endl;
 				} else {
 					cout << formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl;
 				}
@@ -540,14 +552,13 @@ TrigCoefficientCmd::TrigCoefficientCmd(GCFPortInterface& port) : Command(port),
 //-----------------------------------------------------------------------------
 void TrigCoefficientCmd::send()
 {
-	TBBTrigCoefEvent event;
+	TBBTrigCoefSameEvent event;
 	if (isSelectionDone()) {
-		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;
-		}
+		event.rcu_mask = getRcuMask(); // if select cmd is used
+		event.coefficients.c0 = itsC0;
+		event.coefficients.c1 = itsC1;
+		event.coefficients.c2 = itsC2;
+		event.coefficients.c3 = itsC3;
 	}
 	itsPort.send(event);
 	itsPort.setTimer(DELAY);
@@ -556,7 +567,7 @@ void TrigCoefficientCmd::send()
 //-----------------------------------------------------------------------------
 GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e)
 {
-	TBBTrigCoefAckEvent ack(e);
+	TBBTrigCoefSameAckEvent ack(e);
 	cout << "TBB  Info" << endl;
 	cout << "---  -------------------------------------------------------" << endl;
 	int32 bnr = 0;
@@ -566,7 +577,7 @@ GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e)
 
 		if (bnr != oldbnr) {
 			if (ack.status_mask[bnr] == TBB_SUCCESS) {
-				cout << formatString(" %2d  setup trigger system for all rcu's",bnr ) << endl;
+				cout << formatString(" %2d  setup trigger system for all selected rcu's",bnr ) << endl;
 			} else {
 				cout << formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl;
 			}
@@ -664,7 +675,7 @@ void ListenCmd::send()
 			cout << "-release all trigger systems, and waiting  (STOP WAITING WITH CTRL-C)" << endl;
 			setCmdSendNext(false);
 			TBBTrigReleaseEvent release;
-			release.rcu_stop_mask.reset();
+			release.rcu_stop_mask = getRcuMask();
 			release.rcu_start_mask = getRcuMask();
 			itsPort.send(release);
 			cout << endl;
@@ -1103,16 +1114,16 @@ GCFEvent::TResult StatusCmd::ack(GCFEvent& e)
 {
 	TBBStatusAckEvent ack(e);
 
-	cout << "TBB  Image  WD mode  V 1.2  V 2.5  V 3.3  PCB   TP    MP0      MP1      MP2      MP3  " << endl;
-	cout << "---  -----  -------  -----  -----  -----  ----  ----  -------  -------  -------  -------" << endl;
+	cout << "TBB  Image  WDmode  V 1.2  V 2.5  V 3.3  PCB   TP    MP0      MP1      MP2      MP3      Flash" << endl;
+	cout << "---  -----  ------  -----  -----  -----  ----  ----  -------  -------  -------  -------  -----" << endl;
 	for (int bnr=0; bnr < getMaxSelections(); bnr++) {
 		if (isSelected(bnr) ) {
 			if (ack.status_mask[bnr] == TBB_SUCCESS) {
 
-				cout << formatString(" %2d    %2d    %s   %4.2fV  %4.2fV  %4.2fV  %2u'C  %2u'C  %2u'C %s  %2u'C %s  %2u'C %s  %2u'C %s",
+				cout << formatString("%3d  %5d  %6s  %4.2fV  %4.2fV  %4.2fV  %2u'C  %2u'C  %2u'C %s  %2u'C %s  %2u'C %s  %2u'C %s   0x%2x",
 						bnr,
-						ack.Image[bnr],
-						ack.WatchDogMode[bnr]?" ETH ":"clock",
+						ack.CurrentImage[bnr],
+						ack.WatchDogMode[bnr]?"ETH":"clock",
 						((double)ack.V12[bnr] * (2.5 / 192.)), // MAX6652 pin-2:  2.5 / 192  = 0.0130 / count
 						((double)ack.V25[bnr] * (3.3 / 192.)), // MAX6652 pin-3:  3.3 / 192  = 0.0172 / count
 						((double)ack.V33[bnr] * (5.0 / 192.)), // MAX6652 pin-1:  5.0 / 192  = 0.0625 / count
@@ -1121,7 +1132,8 @@ GCFEvent::TResult StatusCmd::ack(GCFEvent& e)
 						ack.Tmp0[bnr], (ack.Pgood[bnr] & 0x1)?"Pg":"Pb",
 						ack.Tmp1[bnr], (ack.Pgood[bnr] & 0x2)?"Pg":"Pb",
 						ack.Tmp2[bnr], (ack.Pgood[bnr] & 0x4)?"Pg":"Pb",
-						ack.Tmp3[bnr], (ack.Pgood[bnr] & 0x8)?"Pg":"Pb" ) << endl;
+						ack.Tmp3[bnr], (ack.Pgood[bnr] & 0x8)?"Pg":"Pb",
+						ack.FlashState[bnr]) << endl;
 			} else {
 				cout << formatString(" %2d  %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl;
 			}
@@ -2531,9 +2543,9 @@ void TBBCtl::commandHelp(int level)
 	cout << " tbbctl --stop [--select=<set>]                                     # stop recording on selected rcu's" << endl;
 	cout << endl;
 	cout << "______| CEP |_____________________________________________________________________________________________________________" << endl;
-		cout << " tbbctl --mode=[transient | subbands]                               # set mode to configure UDP/IP header for CEP tranport" << endl;
-	cout << "        # before using: --read, readall, --arp or --arpmode," << endl;
-	cout << "        # first use --mode to setup UDP/IP header" << endl;
+	cout << " tbbctl --mode=[transient | subbands]                               # set mode to configure UDP/IP header for CEP tranport" << endl;
+	cout << "      # before using: --read, readall, --arp or --arpmode," << endl;
+	cout << "      # first use --mode to setup UDP/IP header" << endl;
 	cout << " tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages      # transfer recorded data from rcunr to CEP, " << endl;
 	cout << " tbbctl --readall=pages [--select=<set>]                            # transfer number of pages from all selected rcunr to CEP, " << endl;
 	cout << " tbbctl --stopcep [--select=<set>]                                  # stop sending data to CEP" << endl;
@@ -2748,7 +2760,9 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port)
 		case TBB_TRIG_SETTINGS_ACK:
 		case TBB_TRIG_RELEASE_ACK:
 		case TBB_TRIG_SETUP_ACK:
+		case TBB_TRIG_SETUP_SAME_ACK:
 		case TBB_TRIG_COEF_ACK:
+		case TBB_TRIG_COEF_SAME_ACK:
 		case TBB_TRIG_GENERATE_ACK:
 		case TBB_TRIG_INFO_ACK:
 		case TBB_TRIGGER:
@@ -2976,7 +2990,7 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 					int numitems = sscanf(optarg, "%u,%u,%u,%u,%u,%u",&level, &start, &stop, &filter, &window, &triggermode);
 					// check if valid arguments
 					if ( numitems < 6 || numitems == EOF
-							|| level < 1 || level > 255
+							|| level < 1 || level > 2047
 							|| start < 1 || start > 15
 							|| stop < 1 || stop > 15
 							|| window > 8
@@ -2984,31 +2998,22 @@ Command* TBBCtl::parse_options(int argc, char** argv)
 					{
 						cout << "Error: invalid number of arguments. Should be of the format " << endl;
 						cout << "       '--trigsetup=level, start, stop, filter, window, mode' (use decimal values)" << endl;
-						cout << "       level=1..255,  start=1..15,  stop=1..15,  filter=0(in) or 1(bypassed)" << endl;
+						cout << "       level=1..2047,  start=1..15,  stop=1..15,  filter=0(in) or 1(bypassed)" << endl;
 						cout << "       window=0..8, mode=0..3 (b0=0 single shot),(b0=1 continues)" << endl;
 						cout << "                              (b1=0 RSP input),(b1=1 external input)" << endl;
 						exit(EXIT_FAILURE);
 					}
 	
-					//================================================
-					// set triggermode to single shot, continues mode
-					// will give more than 6000 triggers per second per
-					// board, if level is chosen to low, the driver can't
-					// handle that amount of trigger per board.
-					if ((triggermode == 1) && (level < 3)){
-						cout << "mode=1 with level < 3 can generate to many triggers, auto corrected to level = 3" << endl;
-						level = 3;
+					if ((triggermode & 1) && (level < 4)){
+						cout << "mode=continues with level < 4 can generate to many triggers, auto corrected to level = 4" << endl;
+						level = 4;
 					}
-					
-					//================================================
-	
 	
 					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->setOperatingMode(static_cast<uint16>(triggermode));
 					trigsetupcmd->setTriggerMode(static_cast<uint16>(triggermode));
 				}
 	
diff --git a/MAC/APL/PIC/TBB_Driver/src/tbbctl.h b/MAC/APL/PIC/TBB_Driver/src/tbbctl.h
index 4d2ce1b4445b1a9d4d35e75cd7f6dc2cafe6ca2d..226547967214d31ddaf443e5f5c8ddad64acfbce 100644
--- a/MAC/APL/PIC/TBB_Driver/src/tbbctl.h
+++ b/MAC/APL/PIC/TBB_Driver/src/tbbctl.h
@@ -44,7 +44,7 @@ namespace LOFAR {
 
 GCFTimerPort* itsCmdTimer;
 
-static const int TBBCTL_VERSION = 220; // tbbctl V2.20
+static const int TBBCTL_VERSION = 222; // tbbctl V2.22
 
 // MAX_N_TBBOARDS and MAX_N_RCUS come from TBB_protocol.ph
 
@@ -455,16 +455,14 @@ public:
 	void setStopMode(uint8 mode) { itsStopMode = mode; }
 	void setFilter(uint8 filter) { itsFilter = filter; }
 	void setWindow(uint8 window) { itsWindow = window; }
-	void setOperatingMode(uint16 mode) { itsOperatingMode = mode; }
-	void setTriggerMode(uint16 mode) { itsTriggerMode = mode; }
+	void setTriggerMode(uint8 mode) { itsTriggerMode = mode; }
 private:
 	uint16 itsLevel;
 	uint8 itsStartMode;
 	uint8 itsStopMode;
 	uint8 itsFilter;
 	uint8 itsWindow;
-	uint8 itsOperatingMode;
-	uint16 itsTriggerMode;
+	uint8 itsTriggerMode;
 };
 
 //-----------------------------------------------------------------------------