diff --git a/config/RCU.yaml b/config/RCU.yaml
index 0b11fb16c87f59bc56db3f6b43ad9a38f87414c5..eabe9c73d831f7d197309455992adc3a0c58c1ff 100644
--- a/config/RCU.yaml
+++ b/config/RCU.yaml
@@ -294,7 +294,7 @@ variables:
 
    - name: HBA_element_beamformer_delays
      description: Delays of each frontend
-     driver: I2C_RCU
+     driver: I2C_HBAT
      devreg:  [HBAT1.XY,HBAT2.XY,HBAT3.XY]
      bitoffset: [2,2,2]
      width: 5
@@ -302,6 +302,7 @@ variables:
      dtype: uint8
      dim: 3072
      mask: Ant_mask
+     wait: 100 #ms
 
    - name: RCU_ID
      description: Unique RCU ID
diff --git a/i2cserv/hba1.py b/i2cserv/hba1.py
index 09fa4f0345c67fa7c2c331c0610827827da69d0d..1a0524b35767457a6b60a237ab7775bfcf3e2fb1 100644
--- a/i2cserv/hba1.py
+++ b/i2cserv/hba1.py
@@ -3,13 +3,25 @@ from .hwdev import hwdev
 import logging
 from .i2c_array import ApplyMask
 from time import sleep
+from queuetypes import *
 
 class hba1(hwdev):
   def __init__(self,config):
     hwdev.__init__(self,config);
-    logging.info("HBA1 not tested yet!")
+    logging.info("HBA1 driver loaded")
 #    self.previousHBA=np.zeros([32,3,32],dtype='int')
 
+  def OPCUASetVariable(self,varid,var1,data,mask):
+       logging.info(str(("HBA set Var",var1['name'],data[:32*3],mask[:12])))
+       self.conf['parentcls'].SetGetVarValueMask(var1,data,mask,getalso=False)
+       #Wait for PPS if required else wait a bit
+       if var1.get('wait'):
+         logging.debug("Wait %i ms",var1.get('wait')) 
+         sleep(var1['wait']/100.)
+       data,mask2=self.conf['parentcls'].GetVarValueMask(var1,mask)
+       Data=OPCUAset(varid,InstType.varSet,data.copy(),mask2.copy())
+       return [Data]
+
   def i2csetget(self,addr,data,reg=None,read=0):
     if read==0: return self.sethba(addr,reg,data)
     elif read==1: return self.gethba(addr,reg,data)
@@ -19,7 +31,7 @@ class hba1(hwdev):
   def sethba(self,addr,reg,data):
       logging.debug("SetHba addr=0x%x reg=0x%x",addr,reg)
       I2Ccallback=self.conf['parentcls'].i2csetget
-      I2Ccallback(0x40,[],reg=0,read=1)#wakeup, do nothing
+      I2Ccallback(0x40,[0],read=1)#wakeup, do nothing
       sleep(0.01) 
       I2Ccallback(addr,data[:16],reg=reg)
       if len(data)>16:
diff --git a/i2cserv/i2c_array.py b/i2cserv/i2c_array.py
index aee041c815a1689ae3da317c7a74919273da116f..e35cda13d2c8f0e12b74e1f554345848142bc3ae 100644
--- a/i2cserv/i2c_array.py
+++ b/i2cserv/i2c_array.py
@@ -43,7 +43,7 @@ class i2c_array(i2c_dev):
                m|=1<<self.RCU_Switch1[RCUi];
         self.conf['parentcls'].SetChannel(m);
 
-    def SetGetVarValueMask(self,var1,data,mask):
+    def SetGetVarValueMask(self,var1,data,mask,getalso=True):
         Step,Step2=GetSteps(var1);
         value1=[0]*Step*Step2;
         if len(data)==Step:
@@ -77,13 +77,14 @@ class i2c_array(i2c_dev):
                   self.I2Cmask[RCUi]=res;
                   mask[RCUi*Step+Vari]=False;
                   continue;
-                value2=value1[i0:i1]
-                res=self.GetVarValue(devreg,width,bitoffset,value2)
-                if not(res):
-                  self.I2Cmask[RCUi]=False;
-                  mask[RCUi*Step+Vari]=False;
-                  continue;
-                value1[i0:i1]=value2
+                if getalso:
+                  value2=value1[i0:i1]
+                  res=self.GetVarValue(devreg,width,bitoffset,value2)
+                  if not(res):
+                    self.I2Cmask[RCUi]=False;
+                    mask[RCUi*Step+Vari]=False;
+                    continue;
+                  value1[i0:i1]=value2
         return value1,mask
 
 
@@ -174,8 +175,8 @@ class i2c_array(i2c_dev):
                 previous=storearray[self.RCUi];
                 for x in range(len(value)):
                   value[x]=ApplyMask(value[x],width,bitoffset,previous);
-                storearray[self.RCUi]=value[0]
-                logging.debug("Stored value:"+str(value[0]))
+                storearray[self.RCUi]=(value[0] if len(value)==1 else value[:])
+                logging.debug("Stored value:"+str(storearray[self.RCUi]))
             #  devreg['drivercls'].i2csetget
             return devreg['drivercls'].i2csetget(devreg['addr'],value,reg=devreg['register_W'])
 
@@ -200,8 +201,8 @@ class i2c_array(i2c_dev):
         value[:]=value2[:];
         if devreg['store']:
              storearray=self.getstorearray(devreg,len(value));
-             storearray[self.RCUi]=value[0]
-             logging.debug(str(("Store buffer",self.RCUi,value[0])))
+             storearray[self.RCUi]=(value[0] if len(value)==1 else value[:])
+             logging.debug(str(("Store buffer",self.RCUi,storearray[self.RCUi])))
  #            print("Stored values:",self.getstorearray(devreg))
         if (width!=l1*8) or (bitoffset>0):
             if (width<8):
diff --git a/testHBA.py b/testHBA.py
new file mode 100644
index 0000000000000000000000000000000000000000..f61c8d588241ff56c2e59a782e71127c35a7b788
--- /dev/null
+++ b/testHBA.py
@@ -0,0 +1,61 @@
+import logging
+import argparse
+from opcuaserv import opcuaserv
+from opcuaserv import i2client
+from opcuaserv import yamlreader
+#from opcuaserv import pypcc2
+from i2cserv import i2cthread
+import threading
+import time
+import sys
+import signal
+from yamlconfig import Find;
+
+logging.basicConfig(level="DEBUG",format='%(asctime)s [%(levelname)-8s,%(filename)-20s:%(lineno)-3d] %(message)s')
+
+RunTimer=True;
+#def signal_handler(sig, frame):
+#    logging.warn('Stop signal received!')
+#    global RunTimer; 
+#    RunTimer=False
+#signal.signal(signal.SIGINT, signal_handler)
+
+logging.info("Start I2C processes")   
+threads=[]
+I2Cclients=[]
+name='RCU'
+RCU_I2C=i2client.i2client(name=name)
+thread1=i2cthread.start(*RCU_I2C.GetInfo())
+threads.append(thread1)
+I2Cclients.append(RCU_I2C)
+
+#Load yaml so that we know the variable names
+RCU_conf=yamlreader.yamlreader(RCU_I2C,yamlfile=name)
+#RCU_conf.CallInit()
+
+var1=RCU_conf.getmethodid('RCU_update');
+#var1=RCU_conf.getmethodid('RCU_on');
+#N=32;
+#mask=[i<2 for i in range(N)];
+#RCU_I2C.callmethod(var1,[])
+
+var1=RCU_conf.getvarid('HBA_element_beamformer_delays');
+N=32*3;
+data=list(range(32))*N;
+mask=[i<1*3 for i in range(N)];
+RCU_I2C.setvar(var1,data,mask);
+#RCU_I2C.readvar(var1,mask);
+
+
+time.sleep(5);
+
+while RCU_I2C.data_waiting():
+    varid,data,mask=RCU_I2C.readdata()
+    print("Results:",RCU_conf.getvar1(varid)['name'],data[:12],mask[:12])
+
+
+logging.info("Stop threads")
+for i2c in I2Cclients:
+    i2c.stop()
+for thread1 in threads:
+    thread1.join()