Index: trunk/FACT++/src/HeadersFTM.h
===================================================================
--- trunk/FACT++/src/HeadersFTM.h	(revision 16770)
+++ trunk/FACT++/src/HeadersFTM.h	(revision 16771)
@@ -36,8 +36,9 @@
         enum StateMachine
         {
-            kDisconnected = 1, //= ConnectionFTM::kDisconnected,
-            kConnected,        //= ConnectionFTM::kConnected,
-            kIdle,             //= ConnectionFTM::kIdle,
-            kTriggerOn,        //= ConnectionFTM::kTriggerOn,
+            kDisconnected = 1,
+            kConnected,
+            kIdle,
+            kValid,
+            kTriggerOn,
             kConfiguring1,
             kConfiguring2,
@@ -261,4 +262,6 @@
             return memcmp(this, &d, sizeof(StaticData))==0;
         }
+
+        bool valid() const { static StaticData empty; return memcmp(this, &empty, sizeof(FTM::StaticData))!=0; }
 
         void clear() { reset(*this); }
Index: trunk/FACT++/src/ftmctrl.cc
===================================================================
--- trunk/FACT++/src/ftmctrl.cc	(revision 16770)
+++ trunk/FACT++/src/ftmctrl.cc	(revision 16771)
@@ -51,9 +51,9 @@
     FTM::Header      fHeader;
     FTM::FtuList     fFtuList;
-    FTM::StaticData  fStaticData;
+    FTM::StaticData  fStaticData;    // fStaticBufferTx
     FTM::DynamicData fDynamicData;
     FTM::Error       fError;
 
-    FTM::StaticData  fBufStaticData;
+    FTM::StaticData  fBufStaticData; // fStaticBufferRx
 
     virtual void UpdateFirstHeader()
@@ -314,4 +314,9 @@
 
                 fStaticData = fBuffer;
+
+                // is this the first received static data block?
+                if (!fBufStaticData.valid())
+                    fBufStaticData = fStaticData;
+
                 UpdateStaticData();
                 break;
@@ -670,5 +675,5 @@
         if (patch<0)
         {
-            FTM::StaticData data(fStaticData);
+            FTM::StaticData data(fBufStaticData);
 
             bool ident = true;
@@ -714,4 +719,54 @@
         return true;
     }
+    /*
+    bool SetSelectedThresholds(const int32_t *th)
+    {
+        for (int i=0; i<FTM::StaticData::kMaxPatchIdx; i++)
+            if (th[i]<0 || th[i]>FTM::StaticData::kMaxDAC)
+                return false;
+
+        FTM::StaticData data(fBufStaticData);
+
+        for (int i=0; i<=FTM::StaticData::kMaxPatchIdx; i++)
+        {
+            if (fBufStaticData[i/4].fDac[i%4]!=th[i])
+            {
+
+                // Calculate offset in static data block
+                const uint16_t addr = (uintptr_t(&fStaticData[i/4].fDAC[i%4])-uintptr_t(&fStaticData))/2;
+
+                // From CmdSetRegister
+                const array<uint16_t, 2> data = {{ addr, uint16_t(th[i]) }};
+                PostCmd(data, FTM::kCmdWrite, FTM::kCmdRegister);
+
+                reinterpret_cast<uint16_t*>(&fBufStaticData)[addr] = th[i];
+            }
+        }
+
+        // Now execute change before the static data is requested back
+        PostCmd(FTM::kCmdConfigFTU, (patch/40) | (((patch/4)%10)<<8));
+
+        //CmdGetRegister(addr);
+        CmdReqStatDat();
+
+        return true;
+    }*/
+
+
+    bool SetAllThresholds(const int32_t *th)
+    {
+        for (int i=0; i<FTM::StaticData::kMaxPatchIdx; i++)
+            if (th[i]<0 || th[i]>FTM::StaticData::kMaxDAC)
+                return false;
+
+        FTM::StaticData data(fBufStaticData);
+
+        for (int i=0; i<=FTM::StaticData::kMaxPatchIdx; i++)
+            data[i/4].fDAC[i%4] = th[i];
+
+        CmdSendStatDat(data);
+
+        return true;
+    }
 
     bool SetNoutof4(int32_t patch, int32_t value)
@@ -725,5 +780,5 @@
         if (patch<0)
         {
-            FTM::StaticData data(fStaticData);
+            FTM::StaticData data(fBufStaticData);
 
             bool ident = true;
@@ -780,5 +835,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         bool ident = true;
@@ -806,5 +861,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         if (board<0)
@@ -835,5 +890,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         data.ToggleFTU(board);
@@ -853,5 +908,5 @@
             return true;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         dest = reinterpret_cast<uint16_t*>(&data) + (dest - reinterpret_cast<uint16_t*>(&fStaticData));
@@ -866,5 +921,5 @@
     bool SetTriggerInterval(uint32_t val)
     {
-        return SetVal(&fStaticData.fTriggerInterval, val,
+        return SetVal(&fBufStaticData.fTriggerInterval, val,
                       FTM::StaticData::kMaxTriggerInterval);
     }
@@ -872,5 +927,5 @@
     bool SetTriggerDelay(uint32_t val)
     {
-        return SetVal(&fStaticData.fDelayTrigger, val,
+        return SetVal(&fBufStaticData.fDelayTrigger, val,
                       FTM::StaticData::kMaxDelayTrigger);
     }
@@ -878,5 +933,5 @@
     bool SetTimeMarkerDelay(uint32_t val)
     {
-        return SetVal(&fStaticData.fDelayTimeMarker, val,
+        return SetVal(&fBufStaticData.fDelayTimeMarker, val,
                       FTM::StaticData::kMaxDelayTimeMarker);
     }
@@ -884,5 +939,5 @@
     bool SetDeadTime(uint32_t val)
     {
-        return SetVal(&fStaticData.fDeadTime, val,
+        return SetVal(&fBufStaticData.fDeadTime, val,
                       FTM::StaticData::kMaxDeadTime);
     }
@@ -893,5 +948,5 @@
         //    return;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
         data.Enable(type, enable);
         CmdSendStatDat(data);
@@ -905,5 +960,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         /*
@@ -929,8 +984,8 @@
             return false;
 
-        if (n==fStaticData.fMultiplicityPhysics)
-            return true;
-
-        FTM::StaticData data(fStaticData);
+        //if (n==fBufStaticData.fMultiplicityPhysics)
+        //    return true;
+
+        FTM::StaticData data(fBufStaticData);
 
         data.fMultiplicityPhysics = n;
@@ -946,8 +1001,8 @@
             return false;
 
-        if (win==fStaticData.fWindowPhysics)
-            return true;
-
-        FTM::StaticData data(fStaticData);
+        //if (win==fStaticData.fWindowPhysics)
+        //    return true;
+
+        FTM::StaticData data(fBufStaticData);
 
         data.fWindowPhysics = win;
@@ -963,8 +1018,8 @@
             return false;
 
-        if (n==fStaticData.fMultiplicityCalib)
-            return true;
-
-        FTM::StaticData data(fStaticData);
+        //if (n==fStaticData.fMultiplicityCalib)
+        //    return true;
+
+        FTM::StaticData data(fBufStaticData);
 
         data.fMultiplicityCalib = n;
@@ -980,8 +1035,8 @@
             return false;
 
-        if (win==fStaticData.fWindowCalib)
-            return true;
-
-        FTM::StaticData data(fStaticData);
+        //if (win==fStaticData.fWindowCalib)
+        //    return true;
+
+        FTM::StaticData data(fBufStaticData);
 
         data.fWindowCalib = win;
@@ -994,5 +1049,5 @@
     bool SetClockRegister(const uint64_t reg[])
     {
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         for (int i=0; i<8; i++)
@@ -1012,5 +1067,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         if (lp==FTM::StaticData::kLPint)
@@ -1033,5 +1088,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         if (lp==FTM::StaticData::kLPint)
@@ -1053,5 +1108,5 @@
         if (idx==-1)
         {
-            FTM::StaticData data(fStaticData);
+            FTM::StaticData data(fBufStaticData);
 
             for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
@@ -1069,5 +1124,5 @@
          */
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         const uintptr_t base = uintptr_t(&data);
@@ -1098,5 +1153,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
@@ -1113,5 +1168,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
@@ -1128,5 +1183,5 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
+        FTM::StaticData data(fBufStaticData);
 
         for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
@@ -1144,7 +1199,7 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
-
-        data.EnablePixel(idx, !fStaticData.Enabled(idx));
+        FTM::StaticData data(fBufStaticData);
+
+        data.EnablePixel(idx, !fBufStaticData.Enabled(idx));
 
         CmdSendStatDat(data);
@@ -1161,5 +1216,5 @@
         {
         case FTM::kFtmUndefined:  // 0
-            return kConnected;    // rc=2
+            return fBufStaticData.valid() ? kConnected :  kDisconnected;    // rc=2
 
         case FTM::kFtmRunning:    // 3
@@ -1178,5 +1233,5 @@
     //bool IsLocked() const { return fHeader.fState&FTM::kFtmLocked; }
 
-    int GetCounter(FTM::Types type) { return fCounter[type]; }
+    uint32_t GetCounter(FTM::Types type) { return fCounter[type]; }
 
     const FTM::StaticData &GetStaticData() const { return fStaticData; }
@@ -1577,4 +1632,20 @@
     }
 
+    int SetAllThresholds(const EventImp &evt)
+    {
+        if (!CheckEventSize(evt.GetSize(), "SetAllThresholds", 160*4))
+            return T::kSM_FatalError;
+
+        const int32_t *data = evt.Ptr<int32_t>();
+        if (!fFTM.SetAllThresholds(data))
+        {
+            ostringstream msg;
+            msg << "SetAllThresholds - Value out of range [0; 0xffff]";
+            T::Warn(msg);
+        }
+
+        return T::GetCurrentState();
+    }
+
     int SetNoutof4(const EventImp &evt)
     {
@@ -1901,6 +1972,6 @@
     }*/
 
-    int64_t fCounterReg;
-    int64_t fCounterStat;
+    uint32_t fCounterReg;
+    uint32_t fCounterStat;
 
     typedef map<string, FTM::StaticData> Configs;
@@ -1971,6 +2042,6 @@
         case FTM::State::kConfiguring2:
         case FTM::State::kConfigured:
-            // If FTM has received an anwer to the stop_run command
-            // the counter for the registers has been increased
+            // If FTM has received an anwer to the CmdSendStatDat
+            // the counter for static data has been increased
             if (fFTM.GetCounter(FTM::kStaticData)<=fCounterStat)
                 break;
@@ -1989,5 +2060,5 @@
                 T::Message("Sending new configuration was successfull.");
             else
-                T::Message("Configuration successfull updated.");
+                T::Message("Configuration successfully updated.");
 
             // Next state is: wait for the answer to our configuration
@@ -2003,8 +2074,8 @@
             {
             case ConnectionFTM::kIdle:         return FTM::State::kIdle;
-            case ConnectionFTM::kConfigured:   return FTM::State::kIdle;
+            case ConnectionFTM::kConfigured:   return FTM::State::kValid;
             case ConnectionFTM::kTriggerOn:    return FTM::State::kTriggerOn;
             default:
-                throw runtime_error("StateMachienFTM - Execute() - Inavlid state.");
+                throw runtime_error("StateMachineFTM - Execute() - Inavlid state.");
             }
         }
@@ -2038,4 +2109,7 @@
         T::AddStateName(FTM::State::kIdle, "Idle",
                         "Ethernet connection to FTM established, FTM in idle state.");
+
+        T::AddStateName(FTM::State::kValid, "Valid",
+                        "FTM in idle state and the last sent and received static data block are bitwise identical.");
 
         T::AddStateName(FTM::State::kConfiguring1, "Configuring1",
@@ -2054,26 +2128,26 @@
 
         // FTM Commands
-        T::AddEvent("TOGGLE_LED", FTM::State::kIdle)
+        T::AddEvent("TOGGLE_LED", FTM::State::kIdle, FTM::State::kValid)
             (Wrapper(bind(&ConnectionFTM::CmdToggleLed, &fFTM)))
             ("toggle led");
 
-        T::AddEvent("PING", FTM::State::kIdle)
+        T::AddEvent("PING", FTM::State::kIdle, FTM::State::kValid)
             (Wrapper(bind(&ConnectionFTM::CmdPing, &fFTM)))
             ("send ping");
 
-        T::AddEvent("REQUEST_DYNAMIC_DATA", FTM::State::kIdle)
+        T::AddEvent("REQUEST_DYNAMIC_DATA", FTM::State::kIdle, FTM::State::kValid)
             (Wrapper(bind(&ConnectionFTM::CmdReqDynDat, &fFTM)))
             ("request transmission of dynamic data block");
 
-        T::AddEvent("REQUEST_STATIC_DATA", FTM::State::kIdle)
+        T::AddEvent("REQUEST_STATIC_DATA", FTM::State::kIdle, FTM::State::kValid)
             (Wrapper(bind(&ConnectionFTM::CmdReqStatDat, &fFTM)))
             ("request transmission of static data from FTM to memory");
 
-        T::AddEvent("GET_REGISTER", "I", FTM::State::kIdle)
+        T::AddEvent("GET_REGISTER", "I", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::GetRegister, this, placeholders::_1))
             ("read register from address addr"
             "|addr[short]:Address of register");
 
-        T::AddEvent("SET_REGISTER", "I:2", FTM::State::kIdle)
+        T::AddEvent("SET_REGISTER", "I:2", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetRegister, this, placeholders::_1))
             ("set register to value"
@@ -2081,5 +2155,5 @@
             "|val[short]:Value to be set");
 
-        T::AddEvent("START_TRIGGER", FTM::State::kIdle, FTM::State::kConfigured)
+        T::AddEvent("START_TRIGGER", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
             (Wrapper(bind(&ConnectionFTM::CmdStartRun, &fFTM)))
             ("start a run (start distributing triggers)");
@@ -2089,14 +2163,14 @@
             ("stop a run (stop distributing triggers)");
 
-        T::AddEvent("TAKE_N_EVENTS", "I", FTM::State::kIdle)
+        T::AddEvent("TAKE_N_EVENTS", "I", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::TakeNevents, this, placeholders::_1))
             ("take n events (distribute n triggers)|number[int]:Number of events to be taken");
 
-        T::AddEvent("DISABLE_REPORTS", "B", FTM::State::kIdle)
+        T::AddEvent("DISABLE_REPORTS", "B", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::DisableReports, this, placeholders::_1))
             ("disable sending rate reports"
              "|status[bool]:disable or enable that the FTM sends rate reports (yes/no)");
 
-        T::AddEvent("SET_THRESHOLD", "I:2", FTM::State::kIdle, FTM::State::kConfigured, FTM::State::kTriggerOn)
+        T::AddEvent("SET_THRESHOLD", "I:2", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured, FTM::State::kTriggerOn)
             (bind(&StateMachineFTM::SetThreshold, this, placeholders::_1))
             ("Set the comparator threshold"
@@ -2104,5 +2178,10 @@
              "|Threshold[counts]:Threshold to be set in binary counts");
 
-        T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM::State::kIdle, FTM::State::kTriggerOn)
+        T::AddEvent("SET_ALL_THRESHOLDS", "I:160", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured, FTM::State::kTriggerOn)
+            (bind(&StateMachineFTM::SetAllThresholds, this, placeholders::_1))
+            ("Set the comparator thresholds"
+             "|Thresholds[counts]:Threshold to be set in binary counts");
+
+        T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
             (bind(&StateMachineFTM::SetNoutof4, this, placeholders::_1))
             ("Set the comparator threshold"
@@ -2110,10 +2189,10 @@
              "|Threshold[counts]:Threshold to be set in binary counts");
 
-        T::AddEvent("SET_PRESCALING", "I:1", FTM::State::kIdle)
+        T::AddEvent("SET_PRESCALING", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetPrescaling, this, placeholders::_1))
             ("Sets the FTU readout time intervals"
              "|time[0.5s]:The interval is given in units of 0.5s, i.e. 1 means 0.5s, 2 means 1s, ...");
 
-        T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM::State::kIdle, FTM::State::kConfigured)
+        T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
             (bind(&StateMachineFTM::EnableFTU, this, placeholders::_1))
             ("Enable or disable FTU"
@@ -2121,58 +2200,58 @@
              "|Enable[bool]:Whether FTU should be enabled or disabled (yes/no)");
 
-        T::AddEvent("DISABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn)
+        T::AddEvent("DISABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
             (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, false))
             ("(-1 or all)");
 
-        T::AddEvent("ENABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn)
+        T::AddEvent("ENABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kTriggerOn)
             (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, true))
             ("(-1 or all)");
 
-        T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM::State::kIdle)
+        T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::DisableAllPixelsExcept, this, placeholders::_1))
             ("");
 
-        T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM::State::kIdle)
+        T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::DisableAllPatchesExcept, this, placeholders::_1))
             ("");
 
-        T::AddEvent("ENABLE_PATCH", "S:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_PATCH", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, true))
             ("");
 
-        T::AddEvent("DISABLE_PATCH", "S:1", FTM::State::kIdle)
+        T::AddEvent("DISABLE_PATCH", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, false))
             ("");
 
-        T::AddEvent("TOGGLE_PIXEL", "S:1", FTM::State::kIdle)
+        T::AddEvent("TOGGLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::TogglePixel, this, placeholders::_1))
             ("");
 
-        T::AddEvent("TOGGLE_FTU", "I:1", FTM::State::kIdle)
+        T::AddEvent("TOGGLE_FTU", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::ToggleFTU, this, placeholders::_1))
             ("Toggle status of FTU (this is mainly meant to be used in the GUI)"
              "|Board[idx]:Index of the board (0-39)");
 
-        T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM::State::kIdle)
+        T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTriggerInterval, this, placeholders::_1))
             ("Sets the trigger interval which is the distance between two consecutive artificial triggers."
              "|interval[ms]:The applied trigger interval in millisecond (min 1ms / 10bit)");
 
-        T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM::State::kIdle)
+        T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTriggerDelay, this, placeholders::_1))
             (""
              "|delay[int]:The applied trigger delay is: delay*4ns+8ns");
 
-        T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM::State::kIdle)
+        T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTimeMarkerDelay, this, placeholders::_1))
             (""
             "|delay[int]:The applied time marker delay is: delay*4ns+8ns");
 
-        T::AddEvent("SET_DEAD_TIME", "I:1", FTM::State::kIdle)
+        T::AddEvent("SET_DEAD_TIME", "I:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetDeadTime, this, placeholders::_1))
             (""
             "|dead_time[int]:The applied dead time is: dead_time*4ns+8ns");
 
-        T::AddEvent("ENABLE_TRIGGER", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_TRIGGER", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kTrigger))
             ("Switch on the physics trigger"
@@ -2180,5 +2259,5 @@
 
         // FIXME: Switch on/off depending on sequence
-        T::AddEvent("ENABLE_EXT1", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_EXT1", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt1))
             ("Switch on the triggers through the first external line"
@@ -2186,40 +2265,40 @@
 
         // FIXME: Switch on/off depending on sequence
-        T::AddEvent("ENABLE_EXT2", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_EXT2", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt2))
             ("Switch on the triggers through the second external line"
              "|Enable[bool]:Enable ext2 trigger (yes/no)");
 
-        T::AddEvent("ENABLE_VETO", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_VETO", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kVeto))
             ("Enable veto line"
              "|Enable[bool]:Enable veto (yes/no)");
 
-        T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kClockConditioner))
             ("Enable clock conidtioner output in favor of time marker output"
              "|Enable[bool]:Enable clock conditioner (yes/no)");
 
-        T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup1))
             ("");
-        T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup1))
             ("");
-        T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup2))
             ("");
-        T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM::State::kIdle)
+        T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup2))
             ("");
-        T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPint))
             ("");
-        T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPext))
             ("");
 
 
-        T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM::State::kIdle)
+        T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTriggerSeq, this, placeholders::_1))
             ("Setup the sequence of artificial triggers produced by the FTM"
@@ -2228,27 +2307,27 @@
              "|LPint[short]:number of triggers of the internal light pulser");
 
-        T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTriggerMultiplicity, this, placeholders::_1))
             ("Setup the Multiplicity condition for physcis triggers"
              "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)");
 
-        T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetTriggerWindow, this, placeholders::_1))
             ("");
 
-        T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetCalibMultiplicity, this, placeholders::_1))
             ("Setup the Multiplicity condition for artificial (calibration) triggers"
              "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)");
 
-        T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetCalibWindow, this, placeholders::_1))
             ("");
 
-        T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM::State::kIdle)
+        T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetClockFrequency, this, placeholders::_1))
             ("");
 
-        T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM::State::kIdle)
+        T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SetClockRegister, this, placeholders::_1))
             ("");
@@ -2256,5 +2335,5 @@
         // A new configure will first stop the FTM this means
         // we can allow it in idle _and_ taking data
-        T::AddEvent("CONFIGURE", "C", FTM::State::kIdle, FTM::State::kConfiguring1, FTM::State::kConfiguring2, FTM::State::kConfigured, FTM::State::kTriggerOn)
+        T::AddEvent("CONFIGURE", "C")(FTM::State::kIdle)(FTM::State::kValid)(FTM::State::kConfiguring1)(FTM::State::kConfiguring2)(FTM::State::kConfigured)(FTM::State::kTriggerOn)
             (bind(&StateMachineFTM::ConfigureFTM, this, placeholders::_1))
             ("");
@@ -2266,10 +2345,10 @@
 
 
-        T::AddEvent("RESET_CRATE", "S:1", FTM::State::kIdle, FTM::State::kConfigured)
+        T::AddEvent("RESET_CRATE", "S:1", FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
             (bind(&StateMachineFTM::ResetCrate, this, placeholders::_1))
             ("Reset one of the crates 0-3"
              "|crate[short]:Crate number to be reseted (0-3)");
 
-        T::AddEvent("RESET_CAMERA", FTM::State::kIdle)
+        T::AddEvent("RESET_CAMERA", FTM::State::kIdle, FTM::State::kValid)
             (Wrapper(bind(&ConnectionFTM::CmdResetCamera, &fFTM)))
             ("Reset all crates. The commands are sent in the order 0,1,2,3");
@@ -2277,10 +2356,10 @@
 
         // Load/save static data block
-        T::AddEvent("SAVE", "C", FTM::State::kIdle)
+        T::AddEvent("SAVE", "C", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::SaveStaticData, this, placeholders::_1))
             ("Saves the static data (FTM configuration) from memory to a file"
              "|filename[string]:Filename (can include a path), .bin is automatically added");
 
-        T::AddEvent("LOAD", "C", FTM::State::kIdle)
+        T::AddEvent("LOAD", "C", FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::LoadStaticData, this, placeholders::_1))
             ("Loads the static data (FTM configuration) from a file into memory and sends it to the FTM"
@@ -2307,9 +2386,9 @@
 
         // Conenction commands
-        T::AddEvent("DISCONNECT", FTM::State::kConnected, FTM::State::kIdle)
+        T::AddEvent("DISCONNECT", FTM::State::kConnected, FTM::State::kIdle, FTM::State::kValid)
             (bind(&StateMachineFTM::Disconnect, this))
             ("disconnect from ethernet");
 
-        T::AddEvent("RECONNECT", "O", FTM::State::kDisconnected, FTM::State::kConnected, FTM::State::kIdle, FTM::State::kConfigured)
+        T::AddEvent("RECONNECT", "O", FTM::State::kDisconnected, FTM::State::kConnected, FTM::State::kIdle, FTM::State::kValid, FTM::State::kConfigured)
             (bind(&StateMachineFTM::Reconnect, this, placeholders::_1))
             ("(Re)connect ethernet connection to FTM, a new address can be given"
