diff --git a/I2C.py b/i2c/I2C.py
similarity index 100%
rename from I2C.py
rename to i2c/I2C.py
diff --git a/I2C_dummy.py b/i2c/I2C_dummy.py
similarity index 100%
rename from I2C_dummy.py
rename to i2c/I2C_dummy.py
diff --git a/I2Cswitch1.py b/i2c/I2Cswitch1.py
similarity index 86%
rename from I2Cswitch1.py
rename to i2c/I2Cswitch1.py
index a877678ceec748bc6525de130e530655533ffb00..87382d058750dae14f50100d0fca3a1f1e55458a 100644
--- a/I2Cswitch1.py
+++ b/i2c/I2Cswitch1.py
@@ -1,6 +1,7 @@
 import numpy as np
 import logging
-import HWconf
+#import HWconf
+SWaddr=0x70
 class I2Cswitch1():
     def __init__(self,callback1):
         self.callback1=callback1;
@@ -10,7 +11,7 @@ class I2Cswitch1():
         if (channel)==self.CurrentChannel: return True;
         logging.debug(str(("SetChannel",channel,self.CurrentChannel)))
         self.CurrentChannel=channel
-        return self.callback1(HWconf.SW1_ch.Addr,[channel])
+        return self.callback1(SWaddr,[channel])
 
     def I2Ccallback(self,RCU,addr,data,reg=None,read=0):
         self.callback1(addr,data,reg,read)    
diff --git a/opcuaserv.py b/opcuaserv.py
index 94d685e7ab2a9e81ecb97a72331828327a0634dc..46a0a9ff9e009fff6c10b7c8b9dc0ab6d0b01e77 100644
--- a/opcuaserv.py
+++ b/opcuaserv.py
@@ -6,13 +6,13 @@ import time
 from opcua import ua, Server
 from datetime import datetime;
 import logging
-import Vars
+#import Vars
 #import HWconf
 
 Vars_R={}
 Vars_W={}
-EventPipes=[]
 running=False
+
 class SubHandler(object):
     """
     Subscription Handler. To receive events from server for a subscription
@@ -20,14 +20,14 @@ class SubHandler(object):
     def datachange_notification(self, node, val, data):
 #        print("Python: New data change event", node, val,data)
         if not(running): return
-        vname,myvar,VarD=Vars_W[node.nodeid.Identifier]
+        vname,myvar,VarD,Q1=Vars_W[node.nodeid.Identifier]
 #        val=(val if isinstance(val, list) else [val] )
         logging.info(str(("Datachange callback",vname,val)))
 #        myvar2.Value.Value=val
 #        myvar2.SourceTimestamp = datetime.utcnow()
 
         Inst=Vars.Instr(Vars.DevType.Var,VarD,len(val),val)
-        EventPipes[0].put(Inst)
+        Q1.put(Inst)
  #       P1.SetVarValue(vname,val)
         #readback
 #        if True:
@@ -42,10 +42,10 @@ class SubHandler(object):
         logging.info(str(("Python: New event", event)))
 
 
-def CallMethod(ObjectID,instrs):
-        logging.info(str(("Callmethod",ObjectID,instrs)))
-        Inst1=Vars.Instr(Vars.DevType.Instr,instrs,0,[])
-        EventPipes[0].put(Inst1)
+def CallMethod(ObjectID,name,Inst1,Q1):
+        logging.info(str(("Callmethod",ObjectID,name)))
+#        Inst1=Vars.Instr(Vars.DevType.Instr,instrs,0,[])
+        Q1.put(Inst1)
 
 #        P1.CallMethod(name,None)
 
@@ -54,10 +54,29 @@ def AddVar(name,value):
     myvar2.set_writable()
     return myvar2
 
+def AddVarR(vname,varvalue2,v):
+    myvar = PCCobj.add_variable(idx, vname, varvalue2)
+    logging.info(str(("Variable added: ",vname,len(varvalue2))))
+    Vars_R[myvar.nodeid.Identifier]=[v.name,myvar.get_data_value(),varvalue2,v]
+    return myvar
+
+def AddVarW(vname,varvalue2,v,Q1):
+    logging.info(str(("Variable added: ",vname)))#,'=',varvalue2)
+    myvar2 = PCCobj.add_variable(idx, vname, varvalue2)
+    myvar2.set_writable()
+    Vars_W[myvar2.nodeid.Identifier]=[v.name,myvar2.get_data_value(),v,Q1]
+    handle = sub.subscribe_data_change(myvar2)
+    return myvar2
+
+
+def Addmethod(vname,v,Q1):
+    myvar = PCCobj.add_method(idx, vname, lambda ObjectId,name=vname,inst=v,Q1=Q1 : CallMethod(ObjectId,name,inst,Q1), [],[] )
+    logging.info(str(("AddMethod:",vname)))
+
 def InitServer(port=4840):
 
 # setup our server
-    global server,running,PCCobj,idx;
+    global server,running,PCCobj,idx,sub;
     server = Server()
     server.set_endpoint("opc.tcp://0.0.0.0:{}/PCC/".format(port))
 
@@ -80,51 +99,15 @@ def InitServer(port=4840):
     logging.info("Add variables:")
 #P1.GetVarNames("",AddVar);
 
-    for v in Vars.OPC_devvars:
-#  print(v)
-        dim=v.Vars[0].MPaddr.nI2C*v.Vars[0].MPaddr.nSwitch*v.nVars
-        #print(v.name,dim)
-        varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0])
-        if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]:
-            vname=v.name+"_R";
-            myvar = PCCobj.add_variable(idx, vname, varvalue2)
-            logging.info(str(("Variable added: ",vname,dim)))
-            Vars_R[myvar.nodeid.Identifier]=[v.name,myvar.get_data_value(),varvalue2,v]
-            v.OPCR=myvar
-
-            #Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
-            #RCU.SetVar(Inst1)
-            Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim,varvalue2)
-            EventPipes[0].put(Inst)
-
-#        ValCallback(myvar.nodeid,force=True)
-#        print(myvar.get_value())
-#        server.set_attribute_callback(myvar.nodeid, ValCallback)
-#        varvalue=myvar.get_data_value().Value
-#        Vars_R[myvar.nodeid.Identifier][2]=varvalue
-#        print(varvalue2,varvalue)
-        if v.RW in [Vars.RW.WriteOnly,Vars.RW.ReadWrite]:
-            vname=v.name+"_RW";
-            logging.info(str(("Variable added: ",vname)))#,'=',varvalue2)
-            myvar2 = PCCobj.add_variable(idx, vname, varvalue2)
-            myvar2.set_writable()
-            v.OPCW=myvar2
-            Vars_W[myvar2.nodeid.Identifier]=[v.name,myvar2.get_data_value(),v]
-        handle = sub.subscribe_data_change(myvar2)
-
-
-    for v in Vars.OPC_methods:
-        vname=v.name;
-        myvar = PCCobj.add_method(idx, vname, lambda ObjectId,inst=v : CallMethod(ObjectId,inst), [],[] )
-        logging.info(str(("AddMethod:",vname)))
-
-
-    time.sleep(1)
-    running=True
-    return Vars_R,Vars_W
-
+#    time.sleep(1)
+#    running=True
+#    return Vars_R,Vars_W
+    return
 #exit()
 
+def start():
+    running=True
+
 #print("Add modes:")
 #P1.GetMethodNames("",AddMethod);
 
diff --git a/pypcc2.py b/pypcc2.py
index 233bd91e527d481ebc5adfad23becef3bbda7840..de1112f63c751a8d3e1885e288676b9c8fa0c011 100644
--- a/pypcc2.py
+++ b/pypcc2.py
@@ -3,13 +3,13 @@ try:
  import queue
 except ImportError:
  import Queue as queue;
-import RCU
-import I2Cswitch1
+from rcu import RCU
+from i2c import I2Cswitch1
 import threading
 import signal
 import sys
 import time
-import Vars
+#import Vars
 import logging
 import argparse
 
@@ -27,57 +27,33 @@ if not isinstance(loglevel_nr, int):
 
 logging.basicConfig(level=loglevel_nr,format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
 if args.simulator:
-    import I2C_dummy as I2C
+    from i2c import I2C_dummy as I2C
 else:
-    import I2C
+    from i2c import I2C
 
 #Queue used to pass instructions from opc-ua server to RCU
 Q1=queue.Queue()
 
 #Setup OPCUA server (running in its own thread)
-opcuaserv.EventPipes.append(Q1)
 opcuaserv.InitServer(port=args.port)
 logging.info("OPC-UA Server started")   
 
-
 SW1=I2Cswitch1.I2Cswitch1(I2C.I2C1server)
 
 RCU=RCU.RCU1(32,I2C.I2C1server,SW1.SetChannel)
 
-#Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0]
-#Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0]
-
-Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
-RCU.SetVar(Inst1)
-
-#Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
-#RCU.SetVar(Inst1)
-
-#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_off,0,[])
-#RCU.SetVar(Inst1)
+RCU.AddVars(Q1,opcuaserv.AddVarR,opcuaserv.AddVarW)
+RCU.AddMethod(Q1,opcuaserv.Addmethod)
 
-#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_on,0,[])
-#RCU.SetVar(Inst1)
+RCU.load() #Load current register values from HW
 
-#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.ADC1_on,0,[])
-#RCU.SetVar(Inst1)
-
-#print(Vars.RCU)
-logging.debug(str(("I2C bytes=",I2C.I2Ccounter)))
+#logging.debug(str(("I2C bytes=",I2C.I2Ccounter)))
 
 if False:
   opcuaserv.server.stop()
   exit()
 
-def RCUthread(Q1,RCU):
-    while True:
-      item = Q1.get()
-      if item is None: break;
-      RCU.SetVar(item)
-    logging.info("End RCU thread")
-
-RCUthread1 = threading.Thread(target=RCUthread, args=(Q1,RCU))
-RCUthread1.start()
+RCUthread1=RCU.start(Q1)
 
 RunTimer=True;
 def TimerThread(Q1,RCU):
@@ -93,10 +69,7 @@ def TimerThread(Q1,RCU):
          if Q1.qsize()>3: continue;
          cnt=0;
          logging.debug(str(("I2C bytes=",I2C.I2Ccounter," Qlength=",Q1.qsize())))
-         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32)
-         Q1.put(Inst1)
-         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96)
-         Q1.put(Inst1)
+         RCU.Queue_Monitor(Q1)
 
     logging.info("End Timer thread")
 
@@ -112,6 +85,9 @@ def signal_handler(sig, frame):
     RunTimer=False
 signal.signal(signal.SIGINT, signal_handler)
 
+time.sleep(1)
+opcuaserv.start()
+
 try:
 #Do nothing.
  while RunTimer:
diff --git a/HWconf.py b/rcu/HWconf.py
similarity index 100%
rename from HWconf.py
rename to rcu/HWconf.py
diff --git a/RCU.py b/rcu/RCU.py
similarity index 82%
rename from RCU.py
rename to rcu/RCU.py
index 977aab8118ae52acad109590c527672f1dd13cad..130db8735a5915c73e81ff79847d19cf21022136 100644
--- a/RCU.py
+++ b/rcu/RCU.py
@@ -1,7 +1,9 @@
-import Vars
+from . import Vars
 import numpy as np
 import logging
-from spibitbang1 import *
+from .spibitbang1 import *
+import threading
+
 
 def ApplyMask(value,width=8,bitoffset=0,previous=0):
     mask=(1<<width)-1
@@ -35,6 +37,29 @@ class RCU1():
         self.SWcallback=Switchcallback
         self.previous=np.zeros([number,Vars.RCU_storeReg],dtype='int')
 
+    def load(self):
+        Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
+        self.SetVar(Inst1)
+#Vars.RCU_mask.OPCW.get_data_value().Value.Value=[1,1,0,0]
+#Vars.Ant_mask.OPCW.get_data_value().Value.Value=[1,1,0,0,0,0,0,0,0,0,1,0]
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_init,0,[])  #Read the current status of GPIO IOs
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Var,Vars.RCU_att,12,[0,1,2,3,4,5,6,7,8,9,11])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_off,0,[])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.RCU_on,0,[])
+#RCU.SetVar(Inst1)
+
+#Inst1=Vars.Instr(Vars.DevType.Instr,Vars.ADC1_on,0,[])
+#RCU.SetVar(Inst1)
+
+#print(Vars.RCU)
+
     def SetVar(self,Instr,Mask=[]):
         if Instr.type==Vars.DevType.Instr:
               #Execute instructions
@@ -243,5 +268,42 @@ class RCU1():
         #else: value[0]=value2[0]
         return True;
 
+    def start(self,Q1):
+      def RCUthread(Q1):
+         while True:
+           item = Q1.get()
+           if item is None: break;
+           self.SetVar(item)
+         logging.info("End RCU thread")
+
+      RCUthread1 = threading.Thread(target=RCUthread, args=(Q1,))
+      RCUthread1.start()
+      
+      return RCUthread1 
+ 
+    def Queue_Monitor(self,Q1):
+         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_temp,32,[0]*32)
+         Q1.put(Inst1)
+         Inst1=Vars.Instr(Vars.DevType.VarUpdate,Vars.RCU_ADC_lock,96,[0]*96)
+         Q1.put(Inst1)
+
+
+    def AddVars(self,Q1,AddVarR,AddVarW):
+     for v in Vars.OPC_devvars:
+        dim=v.Vars[0].MPaddr.nI2C*v.Vars[0].MPaddr.nSwitch*v.nVars
+        #print(v.name,dim)
+        varvalue2=(dim*[0.0] if v.type==Vars.datatype.dfloat else dim*[0])
+        if v.RW in [Vars.RW.ReadOnly,Vars.RW.ReadWrite]:
+            var1=AddVarR(v.name+"_R",varvalue2,v)
+            v.OPCR=var1
+            Inst=Vars.Instr(Vars.DevType.VarUpdate,v,dim,varvalue2)
+            Q1.put(Inst)
 
+        if v.RW in [Vars.RW.WriteOnly,Vars.RW.ReadWrite]:
+            var1=AddVarW(v.name+"_RW",varvalue2,v,Q1)
+            v.OPCW=var1
 
+    def AddMethod(self,Q1,Addmethod):
+      for v in Vars.OPC_methods:
+        Inst1=Vars.Instr(Vars.DevType.Instr,v,0,[])
+        Addmethod(v.name,Inst1,Q1)
diff --git a/Vars.py b/rcu/Vars.py
similarity index 99%
rename from Vars.py
rename to rcu/Vars.py
index 6024ac6ecc9af4959949453a811f37dae1de1f08..966a5de5c366c39041fb57f27a4ba98c221235e5 100644
--- a/Vars.py
+++ b/rcu/Vars.py
@@ -1,7 +1,7 @@
 from collections import namedtuple
 from recordclass import recordclass
 from enum import Enum
-from HWconf import *
+from .HWconf import *
 
 #OPCUA variables
 class RW(Enum):
diff --git a/spibitbang1.py b/rcu/spibitbang1.py
similarity index 100%
rename from spibitbang1.py
rename to rcu/spibitbang1.py