diff --git a/pypcc/pypcc.py b/pypcc/pypcc.py
index d09e0d0389be0798dc17508b1620cb49fb6400a0..dcbaba6db7871284103b4499e3838e9dff50a1ba 100755
--- a/pypcc/pypcc.py
+++ b/pypcc/pypcc.py
@@ -7,158 +7,160 @@ import threading
 import time
 from pypcc.simpleflock import simpleflock
 
-parser = argparse.ArgumentParser()
-parser.add_argument("-s", "--simulator", help="Do not connect to I2c, but simulate behaviour.", action="store_true")
-parser.add_argument("-t", "--test", help="Do not start OPC-UA server.", action="store_true")
-parser.add_argument("-p", "--port", help="Port number to listen on [%(default)s].", type=int, default=4842)
-parser.add_argument("-l", "--loglevel", help="Log level [%(default)s].", type=str, choices=["DEBUG","INFO","WARNING","ERROR"], default="WARNING")
-parser.add_argument("--loghost", help="Logstash host to which to forward logs [%(default)s]",type=str, default='')
-parser.add_argument("--lockfile", help="Lock while using I2C [%(default)s]",type=str, default='')
-parser.add_argument("-c", "--config", help="YAML config files, comma seperated [%(default)s]",type=str, default='RCU')
-args = parser.parse_args()
-
-#Todo test logstash
-#from logconfig import configure_logger
-#log_extra = {
-#    "simulator": args.simulator, 
-#    "test": args.test,
-#    "port": args.port,
-#    "config": args.config,
-#    "lofar_id": f"pypcc - {args.config}",
-#}
-#configure_logger(logstash_host=args.loghost,level=args.loglevel, log_extra=log_extra)
-logging.getLogger().setLevel(args.loglevel)
-git_hash=metadata.metadata("pypcc")["Summary"]
-logging.info("Git Hash="+git_hash)
-
-from pypcc.opcuaserv import opcuaserv
-from pypcc.opcuaserv import i2client
-from pypcc.opcuaserv import yamlreader
-#from opcuaserv import pypcc2
-from pypcc.i2cserv import i2cthread
-
-RunTimer=True;
-def signal_handler(sig, frame):
-    logging.warn('Stop signal received!')
-    global RunTimer; 
-    RunTimer=False
-signal.signal(signal.SIGINT, signal_handler)
-
-#Start i2c processes as soon as possible to have minimum duplication
-logging.info("Start I2C processes")   
-
-if not(args.simulator):
-  logging.info("Make I2C lock")   
-  import multiprocessing as mp
-#  lock=mp.Lock()
-#else:
-#lock=None;
-lock = None if args.lockfile=='' else simpleflock(args.lockfile,10)
-
-#I2Cports=['UNB2','RCU','CLK']
-#I2Cports=['RCU']
-I2Cports=[x for x in args.config.split(',')]
-I2C_process=[]
-I2Cclients=[]
-for name in I2Cports:
-    RCU_I2C=i2client.i2client(name=name) 
-    if not(args.simulator):  
-        thread1=i2cthread.start(*RCU_I2C.GetInfo(),lock=lock) #Start a new I2C process
-        I2C_process.append(thread1)
-    I2Cclients.append(RCU_I2C)
-#Initialise OPCUA server and load variables
-logging.info("Initialised OPC-UA Server")   
-configs=[]
-I2C_threads=[]
-if not(args.test):  
-    handler=opcuaserv.InitServer(port=args.port)
-    logging.info("Load OPCUA variables & start i2c listing thread")   
-    opcuaserv.AddVarR("TR_software_version_R",git_hash+"_"+args.config,[],False)
-    for i,name in enumerate(I2Cports):
-        RCU_I2C=I2Cclients[i]
-        RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
-        RCU_conf.AddVars(opcuaserv.AddVarR,opcuaserv.AddVarW)
-        RCU_conf.AddMethod(opcuaserv.Addmethod)
-        RCU_conf.CallInit();
-        configs.append(RCU_conf);
-
-        thread2=threading.Thread(target=RCU_conf.getvar); #Thread on OPC-UA side of pipe
-        thread2.start()
-        I2C_threads.append(thread2)
-    time.sleep(1)
-    logging.info("Start OPC-UA server")
-    opcuaserv.start()
-logging.getLogger().setLevel("WARNING")
-
-if False:
-   opcuaserv.server.stop()
-   exit()
-
-def stop_process(thread):
-  thread.join(10)
-  if thread.exitcode is None:
-    logging.warning("Kill thread")
-    thread.kill()
-    thread.join(1)
-  if thread.exitcode is None:
-    logging.warning("Terminate thread")
-    thread.terminate() 
-  return thread.exitcode
-
-def restart_I2C(i):
-              logging.warning("Restarting I2C process!")
-              RCU_I2C=I2Cclients[i];
-              RCU_I2C.restart() #make new Queues
-              stop_process(I2C_process[i])
-
-              logging.getLogger().setLevel(args.loglevel)
-              logging.info("Start new I2C process")
-              thread1=i2cthread.start(*RCU_I2C.GetInfo(),lock=lock) #Start a new I2C process
-              I2C_process[i]=thread1
-
-              RCU_conf=configs[i]
-              logging.info("Wait for I2C thread")
-              I2C_threads[i].join()
-              logging.info("Start new I2C thread")
-              RCU_conf.CallInit()
-              thread2=threading.Thread(target=RCU_conf.getvar) #start new I2C thread
-              thread2.start()
-              I2C_threads[i]=thread2
-
-              RCU_conf.lastRecv=time.time()
-              logging.getLogger().setLevel("WARNING")
-#cnt=0
-try:
- while RunTimer:
-    if not(args.test): 
-        handler.check_datachange(0.1);
-    else:
-        time.sleep(0.1);
-    for c in configs:
-        if c.Monitor(): continue
-    if not(args.simulator) and not(args.test):  
-        for i,c in enumerate(configs):
-           timeout=c.watchdog()
-           if timeout>10:
-                 print(i,timeout)
-           if timeout>60:
-              logging.error("I2C timeout!")
-#               restart_I2C(i)
-              RunTimer=False
-#    cnt+=1;
-#    if cnt==60*10*2: 
-#      print("****** restart test *****")
-#      restart_I2C(0)
-          
-finally:
-   if not(args.test):
-       logging.info("Stop OPC-UA server")
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-s", "--simulator", help="Do not connect to I2c, but simulate behaviour.", action="store_true")
+    parser.add_argument("-t", "--test", help="Do not start OPC-UA server.", action="store_true")
+    parser.add_argument("-p", "--port", help="Port number to listen on [%(default)s].", type=int, default=4842)
+    parser.add_argument("-l", "--loglevel", help="Log level [%(default)s].", type=str, choices=["DEBUG","INFO","WARNING","ERROR"], default="WARNING")
+    parser.add_argument("--loghost", help="Logstash host to which to forward logs [%(default)s]",type=str, default='')
+    parser.add_argument("--lockfile", help="Lock while using I2C [%(default)s]",type=str, default='')
+    parser.add_argument("-c", "--config", help="YAML config files, comma seperated [%(default)s]",type=str, default='RCU')
+    args = parser.parse_args()
+
+    #Todo test logstash
+    #from logconfig import configure_logger
+    #log_extra = {
+    #    "simulator": args.simulator, 
+    #    "test": args.test,
+    #    "port": args.port,
+    #    "config": args.config,
+    #    "lofar_id": f"pypcc - {args.config}",
+    #}
+    #configure_logger(logstash_host=args.loghost,level=args.loglevel, log_extra=log_extra)
+    logging.getLogger().setLevel(args.loglevel)
+    git_hash=metadata.metadata("pypcc")["Summary"]
+    logging.info("Git Hash="+git_hash)
+
+    from pypcc.opcuaserv import opcuaserv
+    from pypcc.opcuaserv import i2client
+    from pypcc.opcuaserv import yamlreader
+    #from opcuaserv import pypcc2
+    from pypcc.i2cserv import i2cthread
+
+    RunTimer=True;
+    def signal_handler(sig, frame):
+        logging.warn('Stop signal received!')
+        global RunTimer; 
+        RunTimer=False
+    signal.signal(signal.SIGINT, signal_handler)
+
+    #Start i2c processes as soon as possible to have minimum duplication
+    logging.info("Start I2C processes")   
+
+    if not(args.simulator):
+      logging.info("Make I2C lock")   
+      import multiprocessing as mp
+    #  lock=mp.Lock()
+    #else:
+    #lock=None;
+    lock = None if args.lockfile=='' else simpleflock(args.lockfile,10)
+
+    #I2Cports=['UNB2','RCU','CLK']
+    #I2Cports=['RCU']
+    I2Cports=[x for x in args.config.split(',')]
+    I2C_process=[]
+    I2Cclients=[]
+    for name in I2Cports:
+        RCU_I2C=i2client.i2client(name=name) 
+        if not(args.simulator):  
+            thread1=i2cthread.start(*RCU_I2C.GetInfo(),lock=lock) #Start a new I2C process
+            I2C_process.append(thread1)
+        I2Cclients.append(RCU_I2C)
+    #Initialise OPCUA server and load variables
+    logging.info("Initialised OPC-UA Server")   
+    configs=[]
+    I2C_threads=[]
+    if not(args.test):  
+        handler=opcuaserv.InitServer(port=args.port)
+        logging.info("Load OPCUA variables & start i2c listing thread")   
+        opcuaserv.AddVarR("TR_software_version_R",git_hash+"_"+args.config,[],False)
+        for i,name in enumerate(I2Cports):
+            RCU_I2C=I2Cclients[i]
+            RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
+            RCU_conf.AddVars(opcuaserv.AddVarR,opcuaserv.AddVarW)
+            RCU_conf.AddMethod(opcuaserv.Addmethod)
+            RCU_conf.CallInit();
+            configs.append(RCU_conf);
+
+            thread2=threading.Thread(target=RCU_conf.getvar); #Thread on OPC-UA side of pipe
+            thread2.start()
+            I2C_threads.append(thread2)
+        time.sleep(1)
+        logging.info("Start OPC-UA server")
+        opcuaserv.start()
+    logging.getLogger().setLevel("WARNING")
+
+    if False:
        opcuaserv.server.stop()
+       exit()
+
+    def stop_process(thread):
+      thread.join(10)
+      if thread.exitcode is None:
+        logging.warning("Kill thread")
+        thread.kill()
+        thread.join(1)
+      if thread.exitcode is None:
+        logging.warning("Terminate thread")
+        thread.terminate() 
+      return thread.exitcode
+
+    def restart_I2C(i):
+                  logging.warning("Restarting I2C process!")
+                  RCU_I2C=I2Cclients[i];
+                  RCU_I2C.restart() #make new Queues
+                  stop_process(I2C_process[i])
+
+                  logging.getLogger().setLevel(args.loglevel)
+                  logging.info("Start new I2C process")
+                  thread1=i2cthread.start(*RCU_I2C.GetInfo(),lock=lock) #Start a new I2C process
+                  I2C_process[i]=thread1
+
+                  RCU_conf=configs[i]
+                  logging.info("Wait for I2C thread")
+                  I2C_threads[i].join()
+                  logging.info("Start new I2C thread")
+                  RCU_conf.CallInit()
+                  thread2=threading.Thread(target=RCU_conf.getvar) #start new I2C thread
+                  thread2.start()
+                  I2C_threads[i]=thread2
+
+                  RCU_conf.lastRecv=time.time()
+                  logging.getLogger().setLevel("WARNING")
+    #cnt=0
+    try:
+     while RunTimer:
+        if not(args.test): 
+            handler.check_datachange(0.1);
+        else:
+            time.sleep(0.1);
+        for c in configs:
+            if c.Monitor(): continue
+        if not(args.simulator) and not(args.test):  
+            for i,c in enumerate(configs):
+               timeout=c.watchdog()
+               if timeout>10:
+                     print(i,timeout)
+               if timeout>60:
+                  logging.error("I2C timeout!")
+    #               restart_I2C(i)
+                  RunTimer=False
+    #    cnt+=1;
+    #    if cnt==60*10*2: 
+    #      print("****** restart test *****")
+    #      restart_I2C(0)
+              
+    finally:
+       if not(args.test):
+           logging.info("Stop OPC-UA server")
+           opcuaserv.server.stop()
 
-logging.info("Stop threads")
-for i2c in I2Cclients:
-    i2c.stop()
-for thread1 in I2C_process:
-    stop_process(thread1)
-for thread1 in I2C_threads:
-    thread1.join()
+    logging.info("Stop threads")
+    for i2c in I2Cclients:
+        i2c.stop()
+    for thread1 in I2C_process:
+        stop_process(thread1)
+    for thread1 in I2C_threads:
+        thread1.join()