diff --git a/I2Cdevices.py b/I2Cdevices.py
index edd7c03d223d2a59bddb3f6f49e3482036e3165b..1648240fa1ad54a4cd34533b2c6db89c5a3544f7 100644
--- a/I2Cdevices.py
+++ b/I2Cdevices.py
@@ -1,11 +1,6 @@
-from hwdev import hwdev;
+from hwdev import *;
 import numpy as np
 
-def Find(L,name,value):
-  for x in L:
-    if x[name]==value:
-        return x;
-  return False;
 
 def GetField(D,name,dev_number):
     X=D.get(name)
@@ -224,7 +219,13 @@ class I2Cdevices(hwdev):
         makesinglevalue=((len(value)==1) and (l1>1));
         if makesinglevalue: value2=[0 for x in range(l1)]
         else: value2=value
-        if not(I2Ccallback(Addr,value2,reg=Reg['reg_addr'],read=l1)): return False;
+        reg=Reg['reg_addr']
+        if reg>255: #This is for the monitor ADC
+          if not(I2Ccallback(Addr,int2bytes(reg),read=2)): return False;
+          I2Ccallback(Addr,[250],read=3)
+          if not(I2Ccallback(Addr,value2,read=1)): return False;
+        else:
+          if not(I2Ccallback(Addr,value2,reg=Reg['reg_addr'],read=1)): return False;
         if value2[0] is None:  return False
         if makesinglevalue: value[0]=bytes2int(value2)
         else: value[:]=value2[:];
diff --git a/I2Cswitch.py b/I2Cswitch.py
index ccdcdf75893839475a36449eb075a9988e14b741..01dcc5d61da79c24449b0e2d3cf846eeb65204f8 100644
--- a/I2Cswitch.py
+++ b/I2Cswitch.py
@@ -1,11 +1,17 @@
-from hwdev import hwdev;
+from hwdev import *;
 import numpy as np
+
+def I2C_dummy(addr,data,reg=None,read=0):
+#            print("I2C dummy",addr,data)
+            return True;
+
 class I2Cswitch(hwdev):
     def SetChannel(self,channel,I2Ccallback):
         if not(hasattr(self,'CurrentChannel')): self.CurrentChannel=0
-        if (1<<channel)==self.CurrentChannel: return True;
-        self.CurrentChannel=(1<<channel)
-        return I2Ccallback(self.D['dev_address'],[self.CurrentChannel])
+        print("SetChannel",channel,self.CurrentChannel)
+        if (channel)==self.CurrentChannel: return True;
+        self.CurrentChannel=channel
+        return I2Ccallback(self.D['dev_address'],[channel])
         
 #    def GetVarNames(self,parentname,callback):
 #        for c in self.D['dev_children']:
@@ -18,28 +24,107 @@ class I2Cswitch(hwdev):
 #        return True;
 
     def GetVarValue(self,name,value,I2Ccallback):
+        def I2Ccallback2(addr,data,reg=None,read=0):
+#            print("Getvarcallback",x)
+            if (read==2):
+                if (cnt>0): return True;
+                if not(self.SetChannel(gchannel,I2Ccallback)): return False;
+            elif (read==3):
+                if (cnt>0): return True;
+                return I2Ccallback(addr,data,reg,read)
+            elif not(self.SetChannel(cchannel,I2Ccallback)): return False;
+            return I2Ccallback(addr,data,reg,read)
+
         childname=name.split('_')[0]
-        for c in self.D['dev_children']:
-          if childname==c['child_name']:
-              if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False; 
-              return c['obj'].GetVarValue(name[len(childname)+1:],value,I2Ccallback)
+        child=Find(self.D['dev_children'],'child_name',childname)
+        if child:
+              if not(self.SetChannel(1<<child['child_addr'],I2Ccallback)): return False; 
+              return child['obj'].GetVarValue(name[len(childname)+1:],value,I2Ccallback)
+        group=Find(self.D['dev_groups'],'group_name',childname)
+        if group:
+              devcnt=len(group['group_members'])
+              stride=len(value)//devcnt;
+              gchannel=0;
+              for childname2 in group['group_members']:
+                   gchannel+=1<<(Find(self.D['dev_children'],'child_name',childname2)['child_addr'])
+
+              for cnt,childname2 in enumerate(group['group_members']):
+                    child=Find(self.D['dev_children'],'child_name',childname2)
+                    if not(child): return False;
+                    print("Get:",childname2)
+                    cchannel=1<<child['child_addr']
+                    value2=value[cnt*stride:(cnt+1)*stride]
+                    if not(child['obj'].GetVarValue(name[len(childname)+1:],value2,I2Ccallback2)): return False; 
+                    value[cnt*stride:(cnt+1)*stride]=value2
+              return True;
         return False
 
     def SetVarValue(self,name,value,I2Ccallback):
         childname=name.split('_')[0]
-        for c in self.D['dev_children']:
-          if childname==c['child_name']: 
-              if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False; 
-              return c['obj'].SetVarValue(name[len(childname)+1:],value,I2Ccallback)
+        child=Find(self.D['dev_children'],'child_name',childname)
+        if child:
+              if not(self.SetChannel(1<<child['child_addr'],I2Ccallback)): return False; 
+              return child['obj'].SetVarValue(name[len(childname)+1:],value,I2Ccallback)
+        group=Find(self.D['dev_groups'],'group_name',childname)
+        if group:
+              devcnt=len(group['group_members'])
+              stride=len(value)//devcnt;
+              AllSame=True;
+              for x in range(devcnt-1):
+                  for y in range(stride):
+                      if value[x*stride+y]!=value[(x+1)*stride+y]: AllSame=False;
+              if AllSame: 
+                print("Allsame");              
+                channel=0;
+                for childname2 in group['group_members']:
+                    channel+=1<<(Find(self.D['dev_children'],'child_name',childname2)['child_addr'])
+                print(channel)
+                if not(self.SetChannel(channel,I2Ccallback)): return False; 
+                for x,childname2 in enumerate(group['group_members']):
+                    child=Find(self.D['dev_children'],'child_name',childname2)
+                    if not(child): return False;
+                    callback=(I2Ccallback if x==0 else I2C_dummy)
+                    if not(child['obj'].SetVarValue(name[len(childname)+1:],value[:stride],callback)): return false; 
+                return True;
+              else:
+                for x,childname2 in enumerate(group['group_members']):
+                    child=Find(self.D['dev_children'],'child_name',childname2)
+                    if not(child): return False;
+                    print("Set:",childname2)
+                    if not(self.SetChannel(1<<child['child_addr'],I2Ccallback)): return False; 
+                    if not(child['obj'].SetVarValue(name[len(childname)+1:],value[x*stride:(x+1)*stride],I2Ccallback)): return false; 
+                return True;
         return False
 
     def CallMethod(self,name,params,I2Ccallback):
         childname=name.split('_')[0]
-        for c in self.D['dev_children']:
-           if not(self.SetChannel(c['child_addr'],I2Ccallback)): return False; 
-           if childname==c['child_name']: return c['obj'].CallMethod(name[len(childname)+1:],params,I2Ccallback)
-        return False
-
-
+        child=Find(self.D['dev_children'],'child_name',childname)
+        if child:
+            if not(self.SetChannel(1<<child['child_addr'],I2Ccallback)): return False; 
+            return child['obj'].CallMethod(name[len(childname)+1:],params,I2Ccallback)
+        group=Find(self.D['dev_groups'],'group_name',childname)
+        if group:
+              channel=0;
+              for childname2 in group['group_members']:
+                 channel+=1<<(Find(self.D['dev_children'],'child_name',childname2)['child_addr'])
+              if not(self.SetChannel(channel,I2Ccallback)): return False; 
+              for x,childname2 in enumerate(group['group_members']):
+                 child=Find(self.D['dev_children'],'child_name',childname2)
+                 if not(child): return False;
+                 callback=(I2Ccallback if x==0 else I2C_dummy)
+                 if not(child['obj'].CallMethod(name[len(childname)+1:],params,callback)): return false; 
+              return True;
+        return False;
 
+    def GetVarNames(self,parentname,callback):
+        if not(hwdev.GetVarNames(self,parentname,callback)): return False;
+        def AddVar(name,dtype=0,RW=3,cnt=1):
+            callback(name,dtype,RW,cnt*devcnt)
+        for group in self.D['dev_groups']:
+                childname=group['group_members'][0]
+                devcnt=len(group['group_members'])
+                child=Find(self.D['dev_children'],'child_name',childname)
+                if not(child): return False;
+                child['obj'].GetVarNames(parentname+group['group_name']+'_',AddVar)
+        return True;
      
diff --git a/hwdev.py b/hwdev.py
index e3fa85aa38a52f46ff1edfd7743a6456ab4aa14b..78305f67473abb9805771afb2237b4bdba3534a8 100644
--- a/hwdev.py
+++ b/hwdev.py
@@ -1,10 +1,11 @@
 import yaml;
 import importlib
 import sys, inspect
+YAMLDIR='yaml/'
 class hwdev:
     def __init__(self,configfile):
         print("Loading:",configfile)
-        self.D=yaml.load(open(configfile))
+        self.D=yaml.load(open(YAMLDIR+configfile))
         self.loadchildren(self.D)
     def loadchildren(self,D):
       self.children=[]
@@ -53,3 +54,8 @@ class hwdev:
             elif cname[:-1]==childname: return child.CallMethod(name[len(childname)+1:],params,I2Ccallback)
         return False
 
+def Find(L,name,value):
+  for x in L:
+    if x[name]==value:
+        return x;
+  return False;
\ No newline at end of file
diff --git a/opcuaserv.py b/opcuaserv.py
index 723e13c77b49f8d1717df036bd4087ac379a8ff4..9c243fe88f465876c92fdf1a43da0064fd1508ed 100644
--- a/opcuaserv.py
+++ b/opcuaserv.py
@@ -6,14 +6,16 @@ import time
 from opcua import ua, Server
 from datetime import datetime;
 
+
 import pypcc;
+#import pypcc_test as pypcc;
 P1=pypcc.pypcc("LTS_pypcc.yaml")
 
 
 if True:
 # setup our server
     server = Server()
-    server.set_endpoint("opc.tcp://0.0.0.0:4848/PCC/")
+    server.set_endpoint("opc.tcp://0.0.0.0:4842/PCC/")
 
     idx = server.register_namespace("http://lofar.eu")
 #    uri = "http://examples.freeopcua.github.io"
@@ -33,18 +35,27 @@ if True:
 #Vars[1]='123'
 #print(Vars)
 #exit()
-def ValCallback(nodeid):
-    vname,myvar=Vars_R[nodeid.Identifier]
-    print("Value callback",vname)
+def ValCallback(nodeid,force=False):
+    vname,myvar,oldvalue=Vars_R[nodeid.Identifier]
+#    print("Value callback",vname)
 #    vname=vname[vname.find('_')+1:]
-#    print("RCU variable:",vname)
+#    print("RCU variable:",vname,oldvalue)
 #    X=RCU1.Getvar2(vname)
-    a=[0]
-    res=P1.GetVarValue(vname,a)
-    print("Result from RCU:",res,a)
+#    if not(running): 
+    if False: 
+        myvar.Value.Value=(oldvalue[0] if len(oldvalue)==1 else oldvalue)
+        myvar.SourceTimestamp = datetime.utcnow()
+        return myvar
+    timenow=datetime.utcnow()
+    timediff=(timenow-myvar.SourceTimestamp).total_seconds()
+#    print(timediff)
+    if not(force) and timediff<90: return myvar;
+    res=P1.GetVarValue(vname,oldvalue)
+    print("Read callback",vname,": Result:",res,oldvalue)
     if res:
-        myvar.Value.Value=a[0]
+        myvar.Value.Value=(oldvalue[0] if len(oldvalue)==1 else oldvalue)
         myvar.SourceTimestamp = datetime.utcnow()
+#        Vars_R[nodeid.Identifier][3]=oldvalue
     return myvar
 
 
@@ -56,10 +67,22 @@ class SubHandler(object):
 
     def datachange_notification(self, node, val, data):
 #        print("Python: New data change event", node, val,data)
-        vname,myvar=Vars_W[node.nodeid.Identifier]
-        print("Value callback",vname,val)
         if not(running): return
-        P1.SetVarValue(vname,[val])
+        vname,myvar=Vars_W[node.nodeid.Identifier]
+        val=(val if isinstance(val, list) else [val] )
+        print("Write callback",vname,val)
+        P1.SetVarValue(vname,val)
+        #readback
+#        if True:
+#        print(Vars_R,Vars_R.values())
+        for vname2,myvar2,oldvalue in Vars_R.values():
+            if vname2==vname:
+              res=P1.GetVarValue(vname,val)
+              print("Read callback",vname,": Result:",res,oldvalue)
+              if res:
+                myvar2.Value.Value=(val[0] if len(val)==1 else val)
+                myvar2.SourceTimestamp = datetime.utcnow()
+
 
     def event_notification(self, event):
         print("Python: New event", event)
@@ -75,58 +98,34 @@ def CallMethod(ObjectID,name):
 #P1.SetVarValue("Band1",3)
 Vars_R={}
 Vars_W={}
-def AddVar(name,dtype=0,RW=0):
+def AddVar(name,dtype=0,RW=0,cnt=1):
+   if dtype==1:
+          varvalue2=([0.0] if cnt<=1 else cnt*[0.0])
+   else:
+          varvalue2=([0] if cnt<=1 else cnt*[0])
    if RW in [1,3]:
         vname=name+"_R";
         if dtype==1:
-          myvar = PCCobj.add_variable(idx, vname, 0.0)
+            myvar = (PCCobj.add_variable(idx, vname, 0.0) if cnt<=1 else PCCobj.add_variable(idx, vname, cnt*[0.0]))
         else:
-          myvar = PCCobj.add_variable(idx, vname, 0)
+            myvar = (PCCobj.add_variable(idx, vname, 0)   if cnt<=1 else PCCobj.add_variable(idx, vname, cnt*[0]))
         print("Variable added: ",vname)
-        Vars_R[myvar.nodeid.Identifier]=[name,myvar.get_data_value()]
-        ValCallback(myvar.nodeid)
+        Vars_R[myvar.nodeid.Identifier]=[name,myvar.get_data_value(),varvalue2]
+        ValCallback(myvar.nodeid,force=True)
 #        print(myvar.get_value())
         server.set_attribute_callback(myvar.nodeid, ValCallback)
-        varvalue=myvar.get_data_value().Value
-   else:
-        if dtype==1:
-          varvalue=0.0
-        else:
-          varvalue=0
+#        varvalue=myvar.get_data_value().Value
+#        Vars_R[myvar.nodeid.Identifier][2]=varvalue
+#        print(varvalue2,varvalue)
 
    if RW in [2,3]:
         vname=name+"_RW";
-        print("Variable added: ",vname,'=',varvalue)
-        myvar2 = PCCobj.add_variable(idx, vname, varvalue)
+        print("Variable added: ",vname)#,'=',varvalue2)
+        myvar2 = PCCobj.add_variable(idx, vname, (varvalue2[0] if len(varvalue2)==1 else varvalue2))
         myvar2.set_writable()
         Vars_W[myvar2.nodeid.Identifier]=[name,myvar2.get_data_value()]
         handle = sub.subscribe_data_change(myvar2)
 
-if False:
-        varvalue=[0.0 if dtype==1 else 0];
- #  if RW in [1,3]:
-        vname=name+"_R";
-        if dtype==1:
-          myvar = PCCobj.add_variable(idx, vname, varvalue)
-        else:
-          myvar = PCCobj.add_variable(idx, vname, varvalue)
-        Vars_R[myvar.nodeid.Identifier]=[name,myvar.get_data_value()]
-#        ValCallback(myvar.nodeid)
-#        print(myvar.get_value())
-        server.set_attribute_callback(myvar.nodeid, ValCallback)
-        varvalue=myvar.get_data_value().Value
-        print("Variable added: ",vname,varvalue)
-
- #  if RW in [2,3]:
-        vname=name+"_RW";
-        print("Variable added: ",vname,'=',varvalue)
-        myvar2 = PCCobj.add_variable(idx, vname, varvalue)
-        myvar2.set_writable()
-        Vars_W[myvar2.nodeid.Identifier]=[name,myvar2.get_data_value()]
-        handle = sub.subscribe_data_change(myvar2)
-#        print(myvar.value_callback)
-#        myvar.value=1
-#        myvar.value_callback=ValCallback;
 
 def AddMethod(name):
         vname=name;
@@ -147,38 +146,7 @@ P1.GetMethodNames("",AddMethod);
 time.sleep(1)
 running=True;
 
-#RCU=[]
-#for key, value in RCUs.items():
-if False:
- RCU1=rcu.RCU()
- RCU1.loadfile(value)
- RCU1.number=key
- RCU.append(RCU1)
-
- print("Add variables:")
- vals=RCU1.GetVars()
- for v in vals:
-        vname='RCU'+str(key)+"_"+v;
-        myvar = PCCobj.add_variable(idx, vname, 0)
-        Vars[myvar.nodeid.Identifier]=[RCU1,vname,myvar.get_data_value()]
-        ValCallback(myvar.nodeid)
-#        print(myvar.get_value())
-        server.set_attribute_callback(myvar.nodeid, ValCallback)
-
-        vname='RCU'+str(key)+"_"+v;
-        myvar = PCCobj.add_variable(idx, vname, 0)
-
-#        print(myvar.value_callback)
-#        myvar.value=1
-#        myvar.value_callback=ValCallback;
-        print(vname)
- print("Add modes:")
- vals=RCU1.GetModes()
- for v in vals:
-        vname='RCU'+str(key)+"_"+str(v);
-        myvar = PCCobj.add_method(idx, vname, lambda parent: RCU1.changemode(v), [],[] )
-        print(vname)
-      
+print("Server started")   
     
 try:
     while True:
diff --git a/pypcc.py b/pypcc.py
index 59c3d9886da3e441c0f32f1878f27903aeab573c..deeda96f488ae6cd2f31db9df5be354712ecd9a5 100644
--- a/pypcc.py
+++ b/pypcc.py
@@ -2,29 +2,27 @@ from hwdev import hwdev;
 import pylibi2c;
 import time
 #bus = pylibi2c.I2CDevice('/dev/i2c-1'
+#read=0: write to register
+#read=1: read from register
+#read=2: write to register (common in group)
+#read=3: wait ms second
 def I2C1server(addr,data,reg=None,read=0):
   try:
+       if read==3:
+           time.sleep(data[0]/1000.)
+           return True
 #       print("I2C",addr,reg,data,read)
        bus=pylibi2c.I2CDevice('/dev/i2c-1',addr)
-       if reg is None: 
-             bus.iaddr_bytes=0
-             reg=0;
-       IsADC=(reg>256)  #This is a hack to get ADC timing right!!
-#       print((bytearray([0x0102])))
-       if read>0:
+       if read==1:
          length=len(data)
-#         if reg>256:
-#         data[:]=bus.ioctl_read(reg,length)
          bus.iaddr_bytes=0
-         if IsADC:
-            time.sleep(0.25) #Neet to be at least 200ms
-            bus.ioctl_write(0,str(bytearray([reg>>8,reg%256])))
-            time.sleep(0.25)
-         else:
-            bus.ioctl_write(0,str(bytearray([reg])))
+         if not(reg is None):
+             bus.ioctl_write(0,str(bytearray([reg])))
          data[:]=[int(x) for x in bus.ioctl_read(0,length)]
-#         print(data)
        else:
+            if reg is None: 
+               bus.iaddr_bytes=0
+               reg=0;
             bus.ioctl_write(reg,str(bytearray(data)))
        return True;
   except:
diff --git a/pypcc_test.py b/pypcc_test.py
index e06e28a82a7d71484a7cbcfe7c49471b1eaeae4b..b07342ff05a27cdef32b088766d90bab2d170100 100644
--- a/pypcc_test.py
+++ b/pypcc_test.py
@@ -2,6 +2,7 @@ from hwdev import hwdev;
 import time
 
 def I2C1server(addr,data,reg=None,read=0):
+       print("I2C:",addr,data,reg,read)
        return True;
 
 class pypcc(hwdev):
diff --git a/test1.py b/test/test1.py
similarity index 100%
rename from test1.py
rename to test/test1.py
diff --git a/test2.py b/test/test2.py
similarity index 100%
rename from test2.py
rename to test/test2.py
diff --git a/test3.py b/test/test3.py
similarity index 100%
rename from test3.py
rename to test/test3.py
diff --git a/test/test_ADCs.py b/test/test_ADCs.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0c18ee84b543a7cc85afa692d4a3a92dfed3f63
--- /dev/null
+++ b/test/test_ADCs.py
@@ -0,0 +1,45 @@
+#import pypcc;
+import pypcc_test as pypcc;
+
+P1=pypcc.pypcc("LTS_pypcc.yaml")
+
+##Print all the visible methods
+def AddMethod(name):
+    print("Method:",name)
+P1.GetMethodNames("",AddMethod);
+
+##Print all the visible variables
+def AddVar(name,dtype=0,RW=0):
+    print("Var:",name,dtype,RW)
+P1.GetVarNames("",AddVar);
+
+a=[0]
+##Setup ADC RCU1
+P1.CallMethod("RCU01_RCU_off",None)
+P1.CallMethod("RCU01_RCU_on",None)
+#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC1_SYNC",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC1_CML",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC1_JESD",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC2_SYNC",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC2_CML",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC2_JESD",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC3_SYNC",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC3_CML",a);print(a[0]);
+P1.GetVarValue("RCU01_ADC3_JESD",a);print(a[0]);
+#P1.GetVarValue("RCU01_ADC1_JESD_control1",a);print(a[0]);
+#P1.GetVarValue("RCU01_ADC1_CML_level",a);print(a[0]);
+#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
+#P1.GetVarValue("RCU01_ADC1_locked",a);print(a[0]);
+#        - ADC1.SYNC_control: [1]  #Setup ADCs
+#        - ADC1.JESD_control1: [14]  #Setup ADCs
+#        - ADC1.CML_level: [0x7]
+#        - ADC1.Update: [1]       #Needed to update ADC registers
+
+exit()
+##Setup ADC RCU3
+P1.CallMethod("RCU01_RCU_off",None)
+P1.CallMethod("RCU03_RCU_on",None)
+P1.GetVarValue("RCU03_ADC1_locked",a);print(a[0]);
+P1.GetVarValue("RCU03_ADC2_locked",a);print(a[0]);
+P1.GetVarValue("RCU03_ADC3_locked",a);print(a[0]);
diff --git a/test_clk.py b/test/test_clk.py
similarity index 100%
rename from test_clk.py
rename to test/test_clk.py
diff --git a/test_dither.py b/test/test_dither.py
similarity index 100%
rename from test_dither.py
rename to test/test_dither.py
diff --git a/test_ADCs.py b/test_ADCs.py
index b0c18ee84b543a7cc85afa692d4a3a92dfed3f63..94c874699db3677108165e4fd01ef0a087fb66a3 100644
--- a/test_ADCs.py
+++ b/test_ADCs.py
@@ -1,5 +1,5 @@
-#import pypcc;
-import pypcc_test as pypcc;
+import pypcc;
+#import pypcc_test as pypcc;
 
 P1=pypcc.pypcc("LTS_pypcc.yaml")
 
@@ -9,8 +9,8 @@ def AddMethod(name):
 P1.GetMethodNames("",AddMethod);
 
 ##Print all the visible variables
-def AddVar(name,dtype=0,RW=0):
-    print("Var:",name,dtype,RW)
+def AddVar(name,dtype=0,RW=0,dim=1):
+    print("Var:",name,dtype,RW,dim)
 P1.GetVarNames("",AddVar);
 
 a=[0]
diff --git a/test_array.py b/test_array.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2f785208a089edd788b20e169afa8bda6e3997d
--- /dev/null
+++ b/test_array.py
@@ -0,0 +1,127 @@
+import pypcc;
+#import pypcc_test as pypcc;
+
+P1=pypcc.pypcc("LTS_pypcc.yaml")
+
+def Getvalue(name):
+  a=[0]
+  P1.GetVarValue("RCU01_"+name,a)
+  print("GET:",name,a[0])
+
+def Setvalue(name,value):
+  P1.SetVarValue("RCU01_"+name,[value])
+  print("SET:",name,value)
+
+
+def AddMethod(name):
+    print("Method:",name)
+P1.GetMethodNames("",AddMethod);
+
+def AddVar(name,dtype=0,RW=3,cnt=1):
+    Types={0:'int',1:'float'}
+    RWs={0:'hidden',1:'RO',2:'WO',3:'RW'}
+    print("Var:",name,Types[dtype],RWs[RW],cnt)
+P1.GetVarNames("",AddVar);
+#P1.CallMethod("RCUx_RCU_on",None)
+a=[1.,2.,3.]
+#assert(P1.SetVarValue("RCUx_LED0",[0,0,0]))
+#assert(P1.SetVarValue("RCUx_LED0",[0,0,1]))
+P1.GetVarValue("RCUx_Temperature",a)
+print(a)
+
+#a=[1,2,3]
+#assert(P1.SetVarValue("RCUx_LED0",[0,0,0]))
+#assert(P1.SetVarValue("RCUx_LED0",[0,0,1]))
+#P1.GetVarValue("RCUx_LED0",a)
+#print(a)
+exit()
+#P1.CallMethod("RCU01_Dither_on",None)
+#P1.CallMethod("RCU02_RCU_on",None)
+exit()
+if False:
+  P1.CallMethod("RCU01_Init_ADCR",None)
+  Getvalue("ADC_lock1")
+
+if False:
+ Setvalue("Band1",1)
+ Setvalue("Band2",0)
+ Setvalue("Band3",1)
+ Getvalue("Band1")
+ Getvalue("Band2")
+ Getvalue("Band3")
+#exit()
+
+if False:
+#  Setvalue("Dth3_Pwr",0)
+#  Setvalue("Dth2_Pwr",0)
+#  Setvalue("Dth3_Pwr",1)
+#  Setvalue("Dth2_Pwr",1)
+  P1.CallMethod("RCU01_Dither1_Setup",None)
+  P1.CallMethod("RCU01_Dither2_Setup",None)
+  P1.CallMethod("RCU01_Dither3_Setup",None)
+
+#  a=[0,0,0,0]
+#  P1.GetVarValue("RCU01_Dth1_FREQ",a)
+#  print("GET:",a[0])
+#  Getvalue("Dither1_Frequency")
+  Setvalue("Dither1_Frequency",101.0)
+  Setvalue("Dither2_Frequency",101.2)
+  Getvalue("Dither1_Frequency")
+  Getvalue("Dither2_Frequency")
+#  Getvalue("Dth1_FREQ")
+
+if False:
+#  a=[0,0,0]
+#  P1.GetVarValue("RCU01_V_x",a)
+#  print("GET:",a[0])
+#  import time
+#  time.sleep(0.2)
+#  Setvalue("V_x",0xC0)
+#  time.sleep(0.2)
+#  a=[0,0,0]
+#  P1.GetVarValue("RCU01_Temp",a)
+#  print("GET:",a[0])
+  Getvalue("Temp")
+#exit()
+if False:
+  P1.CallMethod("RCU01_ADC1_Switch_on",None)
+  Getvalue("ADC1_locked")
+  Getvalue("ADC2_locked")
+  Getvalue("ADC3_locked")
+#Getvalue("ADC_lock3")
+#Getvalue("ADC_lock1")
+#Setvalue("LED0",1)
+#Getvalue("LED0")
+#Setvalue("Band2",1)
+#Getvalue("Band2")
+#Getvalue("LED0")
+exit()
+
+#Setvalue("Dth3_Pwr",1)
+Setvalue("Dth2_Pwr",0)
+Setvalue("Dth2_SDA",0)
+Setvalue("Dth2_SCL",0)
+Setvalue("Dth3_Pwr",0)
+Setvalue("Dth3_SDA",0)
+Setvalue("Dth3_SCL",0)
+
+Setvalue("LED0",2)
+
+Setvalue("Att1",10)
+Setvalue("Att2",10)
+Setvalue("Att3",10)
+
+
+#Setvalue("Dth3_Pwr",1)
+#Setvalue("Dth2_SCL",1)
+
+#assert(a[0]==1)
+#print(P1.SetVarValue("RCU01_Band1",3))
+#print(P1.SetVarValue("RCU02_Band1",0))
+#print(P1.GetVarValue("RCU01_Band1",a))
+#print(a[0])
+#assert(a[0]==3)
+#print(P1.GetVarValue("RCU02_Band1",a))
+#assert(a[0]==0)
+
+
diff --git a/LTS_RCU2L.yaml b/yaml/LTS_RCU2L.yaml
similarity index 100%
rename from LTS_RCU2L.yaml
rename to yaml/LTS_RCU2L.yaml
diff --git a/LTS_RCU2_ADC.yaml b/yaml/LTS_RCU2_ADC.yaml
similarity index 96%
rename from LTS_RCU2_ADC.yaml
rename to yaml/LTS_RCU2_ADC.yaml
index a61c7f6468d62e34df3f39bb5434bc718fc55bea..111f6d900601827e176d2ea29491aad67835f9e0 100644
--- a/LTS_RCU2_ADC.yaml
+++ b/yaml/LTS_RCU2_ADC.yaml
@@ -23,6 +23,7 @@ Variables:
    - var_name: locked
      var_dev:  ADC1.PLL_stat
      var_width: 8
+#     var_R/W:  RO
    - var_name: SYNC
      var_dev:  ADC1.SYNC_control
      var_width: 8
@@ -32,6 +33,7 @@ Variables:
    - var_name: JESD
      var_dev:  ADC1.JESD_control1
      var_width: 8
+     var_R/W:  RO
 
 Methods:
    - method_name: Setup
diff --git a/LTS_RCU2_dither.yaml b/yaml/LTS_RCU2_dither.yaml
similarity index 100%
rename from LTS_RCU2_dither.yaml
rename to yaml/LTS_RCU2_dither.yaml
diff --git a/LTS_RCU2dig.yaml b/yaml/LTS_RCU2dig.yaml
similarity index 100%
rename from LTS_RCU2dig.yaml
rename to yaml/LTS_RCU2dig.yaml
diff --git a/LTS_clk.yaml b/yaml/LTS_clk.yaml
similarity index 100%
rename from LTS_clk.yaml
rename to yaml/LTS_clk.yaml
diff --git a/LTS_clkPLL.yaml b/yaml/LTS_clkPLL.yaml
similarity index 100%
rename from LTS_clkPLL.yaml
rename to yaml/LTS_clkPLL.yaml
diff --git a/LTS_pypcc.yaml b/yaml/LTS_pypcc.yaml
similarity index 100%
rename from LTS_pypcc.yaml
rename to yaml/LTS_pypcc.yaml
diff --git a/LTS_switch.yaml b/yaml/LTS_switch.yaml
similarity index 72%
rename from LTS_switch.yaml
rename to yaml/LTS_switch.yaml
index 4b843b5f126778d3272161ff2a2b3cbd2e8ae1a5..eec8a3935bb327201e51b6d337abf968df45fd72 100644
--- a/LTS_switch.yaml
+++ b/yaml/LTS_switch.yaml
@@ -9,14 +9,18 @@ dev_children:
        child_addr: 1
      - child_name: RCU02
        child_dev: I2Cdevices
-       child_conf:  LTS_RCU2dig
+       child_conf:  LTS_RCU2L
        child_addr: 2
      - child_name: RCU03
        child_dev: I2Cdevices
-       child_conf:  LTS_RCU2dig
+       child_conf:  LTS_RCU2L
        child_addr: 3
      - child_name: CLK
        child_dev: I2Cdevices
        child_conf:  LTS_clk
        child_addr: 7
 
+dev_groups: #Must have the same config!
+ - group_name: RCUs
+   group_members: [RCU01,RCU02,RCU03]
+#   group_members: [RCU01]