diff --git a/config/CLK.yaml b/config/CLK.yaml
index 2470e5dfc325bb7a92ca79e5ca892b92be76ad01..446fde4db1633bc6e46dfa4d29e3c628523e46cb 100644
--- a/config/CLK.yaml
+++ b/config/CLK.yaml
@@ -8,6 +8,7 @@ drivers:
  - name: I2C_CLK
    type: i2c_dev #I2C devices
    parent: I2C
+   mask: CLK_I2C_OK
  - name: SPIbb1 
    type: spibitbang2 #SPI bitbang via GPIO expander: CLK, SDI,SDO,CS
    parent: I2C_CLK
@@ -42,7 +43,7 @@ device_registers:
 
 
 variables:
-  - name: CLK_I2C_STATUS
+  - name: CLK_I2C_OK
     driver: I2C_CLK
     rw:  variable #server RW variable, not linked to IO
     dtype: boolean
@@ -93,13 +94,22 @@ variables:
     dtype: uint8
     debug: True
 
+  - name: RCU_IO1_GPIO1
+    driver: I2C_CLK
+    devreg:  IO1.GPIO1
+    width: 8
+    rw:  ro
+    dtype: uint8
+    mask: RCU_mask
+    debug: True
 
 methods:
   - name: Init #Called after startup to load. Should have all stored registers  
     driver: I2C_CLK
     hidden: True
     instructions:   
-    - IO1.GPIO1: Update
+      - RCU_IO1_GPIO1 : Update
+      - IO1.CONF1: Update
 
   - name: CLK_on  
     driver: I2C_CLK
diff --git a/config/RCU.yaml b/config/RCU.yaml
index 4507b0ded90c4408b1c2a23a8bbd963aa14b0595..c17fd0b83e8f0e6228ac64ccd775feb8e1ca2962 100644
--- a/config/RCU.yaml
+++ b/config/RCU.yaml
@@ -205,6 +205,7 @@ variables:
      driver: I2C_RCU
      rw:  variable #server RW variable, not linked to IO
      dtype: boolean
+     mask: RCU_mask
      dim: 32
 
    - name: RCU_state
@@ -342,19 +343,23 @@ variables:
      dim: 96
      mask: Ant_mask
 
-
-
 methods:
   - name: Init #Called after startup to load. Should have all stored registers  
     driver: I2C_RCU
     hidden: True
     instructions:   
     - RCU_IO1_GPIO1: Update
-    - IO1.GPIO2: Update
-    - IO2.GPIO1: Update
-    - IO2.GPIO2: Update
-    - IO3.GPIO1: Update
-    - IO3.GPIO2: Update
+    - RCU_IO1_GPIO2: Update
+    - RCU_IO2_GPIO1: Update
+    - RCU_IO2_GPIO2: Update
+    - RCU_IO3_GPIO1: Update
+    - RCU_IO3_GPIO2: Update
+#    - IO1.GPIO2: Update
+#    - IO2.GPIO1: Update
+#    - IO2.GPIO2: Update
+#    - IO3.GPIO1: Update
+#    - IO3.GPIO2: Update
+    - IO3.CONF1: Update
 
   - name: RCU_on
     driver: I2C_RCU
diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py
index a9c3a2aec20bf76f902592865b22b504e85c0090..976274a8a3222952a1fcc08257a017e0a5e7b3c3 100644
--- a/i2cserv/i2c_array.py
+++ b/i2cserv/i2c_array.py
@@ -11,15 +11,10 @@ def GetSteps(V1):
               Step2=V1.get('dim',1)*((V1.get('width',8)+7)//8)//Step #int(V1.size/V1.nVars)
               logging.debug(str(("GetStep",Step,Step2)));
               return Step,Step2
-def list_different(A,B):
-      if not(len(A)==len(B)): return True;
-      for i,m in enumerate(B): 
-          if not(m==A[i]): return True
-      return False
 
 class i2c_array(i2c_dev):
     def __init__(self,config):
-        hwdev.__init__(self,config);
+        i2c_dev.__init__(self,config);
 #        self.Qout=Qout;
 #        self.Qin=Qin;
 #        self.I2Ccallback=I2Ccallback
@@ -29,26 +24,14 @@ class i2c_array(i2c_dev):
         self.RCU_Switch1=range(pars[0],pars[1]+1);
         self.N=len(self.RCU_Switch1);
         self.I2Cmask=[True]*self.N
-        self.I2Cmaskid=config.get('maskid')
-        if not(self.I2Cmaskid): logging.warn(config['name']+" I2C mask not found!")
+
 #        self.devregs,RCU_storeReg=DevRegList(yaml)
 #        print("Init",config['name'],'len=',len(self.RCU_Switch1),' stored reg=',RCU_storeReg)
 #        self.previous   =np.zeros([self.N,RCU_storeReg],dtype='int')
-    def OPCUASetVariable(self,varid,var1,data,mask):
-      oldmask=self.I2Cmask.copy()
-      Data=i2c_dev.OPCUASetVariable(self,varid,var1,data,mask)
-      if list_different(self.I2Cmask,oldmask):
-           Data.append(OPCUAset(varid,InstType.varSet,self.I2Cmask,[]))
-      return Data
 
     def OPCUAReadVariable(self,varid,var1,mask):
       if len(mask)==0: mask=[True]*self.N; 
-      oldmask=self.I2Cmask.copy()
-      Data=i2c_dev.OPCUAReadVariable(self,varid,var1,mask)
-      if list_different(self.I2Cmask,oldmask):
-        if self.I2Cmaskid:
-           Data.append(OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask,[]))
-      return Data
+      return i2c_dev.OPCUAReadVariable(self,varid,var1,mask)
 
     def SetSwitch(self,RCUi):
         self.conf['parentcls'].SetSW1(self.RCU_Switch1[RCUi]);
diff --git a/i2cserv/i2c_dev.py b/i2cserv/i2c_dev.py
index 17be113387d560db73fd5bcc1b007c588f5d60a5..2d7ee15c4379e47749a7dbb35f357959648d6b0f 100644
--- a/i2cserv/i2c_dev.py
+++ b/i2cserv/i2c_dev.py
@@ -75,30 +75,54 @@ def DevRegList(D):
 #  print(devreglist)
   return devreglist,store
 
-
+def list_different(A,B):
+      if not(len(A)==len(B)): return True;
+      for i,m in enumerate(B): 
+          if not(m==A[i]): return True
+      return False
 
 class i2c_dev(hwdev):
     def __init__(self,config):
         hwdev.__init__(self,config);
+        self.I2Cmask=[True]
+        self.I2Cmaskid=config.get('maskid',None)
+        if self.I2Cmaskid is None: logging.warn(config['name']+" I2C mask not found!")
 
     def OPCUASetVariable(self,varid,var1,data,mask):
-       if var1['rw']=='variable': return;
+       if var1['rw']=='variable':
+          if varid==self.I2Cmaskid:
+              if len(mask)==0: mask=[True]*len(data);
+              if len(data)!=len(mask): 
+                logging.warn("Trying to set I2C OK with wrong mask length!")
+                return
+              for x,m in enumerate(mask):
+                if m: self.I2Cmask[x]=data[x];
+                return [OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])]
+          return;
        logging.info(str(("Set Var",var1['name'],data,mask)))
+       oldmask=self.I2Cmask.copy()
        data,mask2=self.SetGetVarValueMask(var1,data,mask);
 #       if len(mask)==len(mask2): mask[:]=mask2[:];
 #       elif len(mask)==0: (mask.append(x) for x in mask2);
-       Data=OPCUAset(varid,InstType.varSet,data,mask2)
-       return [Data]
+       Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
+       if list_different(self.I2Cmask,oldmask):
+           Data=[Data,OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])]
+       else: Data=[Data] 
+       return Data
 
     def OPCUAReadVariable(self,varid,var1,mask):
       logging.info(str(("Read Var",var1['name'],mask)))
       #data=self.GetVarValueAll(var1)
       #else:             
+      oldmask=self.I2Cmask.copy()
       data,mask2=self.GetVarValueMask(var1,mask);
 #      if len(mask)==len(mask2): mask[:]=mask2[:];
 #      elif len(mask)==0: (mask.append(x) for x in mask2);
-      Data=OPCUAset(varid,InstType.varSet,data,mask2)
-      return [Data]
+      Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
+      if list_different(self.I2Cmask,oldmask):
+           Data=[Data,OPCUAset(self.I2Cmaskid,InstType.varSet,self.I2Cmask.copy(),[])]
+      else: Data=[Data] 
+      return Data
 
 #    def OPCUAcallMethod(self,var1,data,mask):
 #       print("Call Method",var1)
@@ -121,15 +145,25 @@ class i2c_dev(hwdev):
             return;
         for Vari in range(Step):
                 if not(mask[Vari]): continue
+                if not(self.I2Cmask[0]):
+                  mask[Vari]=False;
+                  continue;
                 i0=(Vari)*Step
                 i1=(Vari+1)*Step
                 devreg=var1['devreg'][Vari];
                 width=var1.get('width',8)
                 bitoffset=GetField(var1,'bitoffset',Vari,0)
-                mask[Vari]=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
-                if not(mask[Vari]): continue
+                res=self.SetVarValue(devreg,width,bitoffset,data[i0:i1])
+                if not(res):
+                  self.I2Cmask[0]=False;
+                  mask[Vari]=False;
+                  continue;
                 value2=value1[i0:i1]
-                mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2)
+                res=self.GetVarValue(devreg,width,bitoffset,value2)
+                if not(res):
+                  self.I2Cmask[0]=False;
+                  mask[Vari]=False;
+                  continue;
                 value1[i0:i1]=value2
         return value1,mask
 
@@ -146,13 +180,20 @@ class i2c_dev(hwdev):
             return;
         for Vari in range(Step):
                 if not(mask[Vari]): continue
+                if not(self.I2Cmask[0]):
+                  mask[Vari]=False;
+                  continue;
                 i0=( Vari)*Step
                 i1=(Vari+1)*Step
                 devreg=var1['devreg'][Vari];
                 width=var1.get('width',8)
                 bitoffset=GetField(var1,'bitoffset',Vari,0)
                 value2=value1[i0:i1]
-                mask[Vari]=self.GetVarValue(devreg,width,bitoffset,value2)
+                res=self.GetVarValue(devreg,width,bitoffset,value2)
+                if not(res):
+                  self.I2Cmask[0]=False;
+                  mask[Vari]=False;
+                  continue;
                 value1[i0:i1]=value2
         return value1,mask
 
@@ -167,14 +208,22 @@ class i2c_dev(hwdev):
     def Setdevreg(self,devreg,value,mask=[]):
 #        if devreg.get('store'): logging.debug("Stored")
 #        print(devreg['store'])
+        if not(self.I2Cmask[0]): return False;
+        res=self.SetVarValue(devreg,8,0,value)
+        if not(res):
+          self.I2Cmask[0]=False;
+          return False;
         if devreg.get('store'):
            devreg['storeval']=value[0];
-        self.SetVarValue(devreg,8,0,value)
         return True;
 
     def Getdevreg(self,devreg,mask=[]):
         value=[0];
-        mask=self.GetVarValue(devreg,8,0,value)
+        if not(self.I2Cmask[0]): return False;
+        res=self.GetVarValue(devreg,8,0,value)
+        if not(res):
+          self.I2Cmask[0]=False;
+          return False;
         if devreg.get('store'):
                 devreg['storeval']=value[0];
                 logging.debug("Stored value:"+str(value[0]))
diff --git a/testCLK.py b/testCLK.py
index bc522458e010b02f703fadcb09517348f565cffc..34f5b9fcde37bf83f86f090c3ea0338b97c3802f 100644
--- a/testCLK.py
+++ b/testCLK.py
@@ -33,13 +33,16 @@ I2Cclients.append(RCU_I2C)
 RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
 RCU_conf.CallInit()
 
+var1=RCU_conf.getvarid('CLK_I2C_OK')
+#RCU_I2C.setvar(var1,[True])
 
 var1=RCU_conf.getvarid('CLK_PLL_locked')
 #RCU_I2C.readvar(var1,[])
 
+
 var1=RCU_conf.getvarid('CLK_PLL_locked_SPI')
 #var1=RCU_conf.getvarid('CLK_PLL_r3')
-#RCU_I2C.readvar(var1,[])
+RCU_I2C.readvar(var1,[])
 
 
 
@@ -51,7 +54,7 @@ time.sleep(2);
 
 while RCU_I2C.data_waiting():
     varid,data,mask=RCU_I2C.readdata()
-    print("Results:",RCU_conf.getvar1(varid)['name'],data)
+    print("Results:",RCU_conf.getvar1(varid)['name'],data,mask)
 
 
 logging.info("Stop threads")
diff --git a/testRCU.py b/testRCU.py
index 146ff23133340c08ec83a4faad5ade27cd66fba6..868e96ab3d25a8a2a3fd37a09b6794e37dd5c7f5 100644
--- a/testRCU.py
+++ b/testRCU.py
@@ -81,7 +81,7 @@ time.sleep(2);
 
 while RCU_I2C.data_waiting():
     varid,data,mask=RCU_I2C.readdata()
-    print("Results:",RCU_conf.getvar1(varid)['name'],data,mask)
+    print("Results:",RCU_conf.getvar1(varid)['name'],data[:12],mask[:12])
 
 
 logging.info("Stop threads")
diff --git a/yamlconfig.py b/yamlconfig.py
index 3f17a3d6f09c0311855805026a4b4f836278f69e..171ab94db81798e0095ea376dc189479ff839215 100644
--- a/yamlconfig.py
+++ b/yamlconfig.py
@@ -3,11 +3,11 @@ import struct
 import time
 import logging
 
-def Find(L,name,value):
+def Find(L,name,value,default=False):
   for x in L:
     if x[name]==value:
         return x;
-  return False;
+  return default;
 
 
 def GetField(D,name,dev_number,default=None):
@@ -38,8 +38,8 @@ class yamlconfig():
     def getvar1(self,varid):
         return self.conf['variables'][varid];
     def getvarid(self,name):
-        var1=Find(self.conf['variables'],'name',name);
-        return (var1['id'] if var1 else var1);
+        var1=Find(self.conf['variables'],'name',name,None);
+        return (var1['id'] if not(var1 is None) else None);
 
     def getmethod(self,methodid):
         return self.conf['methods'][methodid];
@@ -138,7 +138,7 @@ class yamlconfig():
             mask=D.get('mask');
             if not(mask): continue;
             mask=self.getvarid(mask)
-            if not(mask):
+            if mask is None:
                 logging.warn("Variable %s not found",mask) 
                 continue;
             D['maskid']=mask