Index: /trunk/FACT++/src/HeadersFTM.h
===================================================================
--- /trunk/FACT++/src/HeadersFTM.h	(revision 11518)
+++ /trunk/FACT++/src/HeadersFTM.h	(revision 11519)
@@ -52,4 +52,5 @@
         kCmdCrateReset     = 0x0020, ///< Reboot (no power cycle) all FTUs and FADs of one crate
         kCmdDisableReports = 0x0040, ///< Disable transmission of rate-reports (dynamic data)
+        kCmdConfigFTU      = 0x0080, ///< Configure single FTU board
         kCmdToggleLed      = 0xc000,
 
@@ -260,5 +261,5 @@
         bool IsEnabled(GeneralSettings type) const { return fGeneralSettings&uint16_t(type); }
 
-        void EnablePixel(int idx, bool enable)
+        uint16_t *EnablePixel(int idx, bool enable)
         {
             const int pixel = idx%9;
@@ -272,4 +273,6 @@
             else
                 pix &= ~(1<<pixel);
+
+            return &pix;
         }
 
Index: /trunk/FACT++/src/ftmctrl.cc
===================================================================
--- /trunk/FACT++/src/ftmctrl.cc	(revision 11518)
+++ /trunk/FACT++/src/ftmctrl.cc	(revision 11519)
@@ -554,5 +554,5 @@
         PostCmd(data, FTM::kCmdWrite, FTM::kCmdRegister);
 
-        fBufStaticData.clear();
+        reinterpret_cast<uint16_t*>(&fBufStaticData)[addr] = val;
 
         // Request the changed configuration to ensure the
@@ -600,4 +600,5 @@
     }
 
+
     void SetVerbose(bool b)
     {
@@ -670,8 +671,8 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
-
         if (patch<0)
         {
+            FTM::StaticData data(fStaticData);
+
             bool ident = true;
             for (int i=0; i<160; i++)
@@ -687,15 +688,35 @@
             for (int i=0; i<160; i++)
                 data[i/4].fDAC[i%4] = value;
-        }
-        else
-        {
-            if (data[patch/4].fDAC[patch%4] == value)
-                return true;
-
-            data[patch/4].fDAC[patch%4] = value;
-        }
-
-        // Maybe move to a "COMMIT" command?
-        CmdSendStatDat(data);
+
+            // Maybe move to a "COMMIT" command?
+            CmdSendStatDat(data);
+
+            return true;
+        }
+
+        /*
+         if (data[patch/4].fDAC[patch%4] == value)
+            return true;
+
+         data[patch/4].fDAC[patch%4] = value;
+
+         CmdSendStatDat(data);
+         return true;
+         */
+
+        // Calculate offset in static data block
+        const uint16_t addr = (uintptr_t(&fStaticData[patch/4].fDAC[patch%4])-uintptr_t(&fStaticData))/2;
+
+        // From CmdSetRegister
+        const array<uint16_t, 2> data = {{ addr, uint16_t(value) }};
+        PostCmd(data, FTM::kCmdWrite, FTM::kCmdRegister);
+
+        reinterpret_cast<uint16_t*>(&fBufStaticData)[addr] = value;
+
+        // Now execute change before the static data is requested back
+        PostCmd(FTM::kCmdConfigFTU, (patch/40) | (((patch/4)%10)<<8));
+
+        CmdGetRegister(addr);
+        //CmdReqStatDat();
 
         return true;
@@ -939,13 +960,42 @@
             return false;
 
-        FTM::StaticData data(fStaticData);
-
         if (idx==-1)
+        {
+            FTM::StaticData data(fStaticData);
+
             for (int i=0; i<=FTM::StaticData::kMaxPixelIdx; i++)
                 data.EnablePixel(i, enable);
-        else
-            data.EnablePixel(idx, enable);
-
-        CmdSendStatDat(data);
+
+            CmdSendStatDat(data);
+
+            return true;
+        }
+
+        /*
+         data.EnablePixel(idx, enable);
+         CmdSendStatDat(data);
+         return true;
+         */
+
+        FTM::StaticData data(fStaticData);
+
+        const uintptr_t base = uintptr_t(&data);
+        const uint16_t *mem  = data.EnablePixel(idx, enable);
+
+        // Calculate offset in static data block
+        const uint16_t addr = (uintptr_t(mem)-base)/2;
+
+        // From CmdSetRegister
+        const array<uint16_t, 2> cmd = {{ addr, *mem }};
+        PostCmd(cmd, FTM::kCmdWrite, FTM::kCmdRegister);
+
+        reinterpret_cast<uint16_t*>(&fBufStaticData)[addr] = *mem;
+
+        // Now execute change before the static data is requested back
+        PostCmd(FTM::kCmdConfigFTU, (idx/360) | (((idx/36)%10)<<8));
+
+        // Now request the register back to ensure consistency
+        CmdGetRegister(addr);
+        //CmdReqStatDat();
 
         return true;
@@ -1776,5 +1826,5 @@
              "|status[bool]:disable or enable that the FTM sends rate reports (yes/no)");
 
-        T::AddEvent("SET_THRESHOLD", "I:2", FTM::kIdle)
+       T::AddEvent("SET_THRESHOLD", "I:2", FTM::kIdle, FTM::kTakingData)
             (bind(&StateMachineFTM::SetThreshold, this, placeholders::_1))
             ("Set the comparator threshold"
@@ -1793,9 +1843,9 @@
              "|Enable[bool]:Whether FTU should be enabled or disabled (yes/no)");
 
-        T::AddEvent("DISABLE_PIXEL", "S:1", FTM::kIdle)
+        T::AddEvent("DISABLE_PIXEL", "S:1", FTM::kIdle, FTM::kTakingData)
             (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, false))
             ("(-1 or all)");
 
-        T::AddEvent("ENABLE_PIXEL", "S:1", FTM::kIdle)
+        T::AddEvent("ENABLE_PIXEL", "S:1", FTM::kIdle, FTM::kTakingData)
             (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, true))
             ("(-1 or all)");
