diff --git a/APSPU_I2C.py b/APSPU_I2C.py
index 7d3584dea5e1b107bf10cb281de6694f7b0722f8..ca6f97e258fae7fc30adf186a1893b04c53ac4b5 100644
--- a/APSPU_I2C.py
+++ b/APSPU_I2C.py
@@ -37,9 +37,9 @@ VOUT_POLS = {"CTR_LBA":  8.0,
              "CTR_RCU2_A": 5.60009765625,
              "CTR_RCU2_D": 3.2998046875}
 
-IOUT_POLS = {"CTR_LBA":  0.45,
-             "CTR_RCU2_A": 0.7,
-             "CTR_RCU2_D": 0.3}
+IOUT_POLS = {"CTR_LBA":  0.2,
+             "CTR_RCU2_A": 0.6,
+             "CTR_RCU2_D": 0.2}
 
 LP_VIN = 0x88
 LP_VOUT_MODE = 0x20
@@ -56,7 +56,8 @@ LP_VOUT_UV_LIMIT = 0x44
 LP_STORE_USER_ALL = 0x15
 LP_ON_OFF_CONFIG = 0x02
 LP_OPERATION = 0x01
-
+LP_WRITE_PROTECT = 0x10
+LP_STORE_DEFAULT_ALL = 0x12
 #
 # Central I2C Devices
 #
diff --git a/I2C_serial_pi.py b/I2C_serial_pi.py
index 7d22124fd1e224f856ba29d290ad8fe59f104b89..d4cc4cccb0550528e753cc89ef9c46d8d9fa1f1b 100644
--- a/I2C_serial_pi.py
+++ b/I2C_serial_pi.py
@@ -51,7 +51,7 @@ class I2C:
             ret_ack = 0
             ret_value = 'ffff'
             if DEBUG:
-                print("Reading error")
+                print("Reading IO-error")
         return ret_ack, ret_value
 
     
@@ -81,8 +81,10 @@ class I2C:
   
     def write_bytes(self, register, data):
         bus = smbus.SMBus(self.bus_nr)
+        if type(data) is not list:
+            data = [data]
         try:
-            bus.write_i2c_block_data(self.I2C_Address, register, [data])
+            bus.write_i2c_block_data(self.I2C_Address, register, data)
             ret_ack = 1
             if SLOW:
                 sleep(0.3)
@@ -95,7 +97,7 @@ class I2C:
             ret_ack = 0
             ret_value = 0
             if DEBUG:
-                print("Write error")
+                print("Write IO-error")
         return ret_ack
 
     def write_register(self, register):
@@ -114,7 +116,7 @@ class I2C:
             ret_ack = 0
             ret_value = 0
             if DEBUG:
-                print("Write error")
+                print("Write IO-error")
         return ret_ack
 
     def write_pointer(self, register):
@@ -133,7 +135,7 @@ class I2C:
             ret_ack = 0
             ret_value = 0
             if DEBUG:
-                print("Write error")
+                print("Write IO-error")
         return ret_ack
 
     def ack_check(self):
@@ -153,7 +155,7 @@ class I2C:
             ret_ack = 0
             ret_value = 0
             if DEBUG:
-                print("No ACK")
+                print("No ACK IO-Error")
         return ret_ack
 
 if __name__ == "__main__":
diff --git a/I2C_serial_pi2.py b/I2C_serial_pi2.py
index 5ae5af3976e9d28807f0eaa4b0f894a72ff1b8ec..4da3bf406cf0a3e554eeb2dc3232ff5b96b915d3 100644
--- a/I2C_serial_pi2.py
+++ b/I2C_serial_pi2.py
@@ -97,7 +97,8 @@ class I2C:
     def write_pointer(self, register):
         bus = pi.i2c_open(self.bus_nr, self.I2C_Address)
         try:
-            pi.i2c_read_device(bus, 1)
+#            pi.i2c_read_device(bus, 1)
+            pi.i2c_read_device(bus, register)
             ret_ack = 1
             if SLOW:
                 sleep(0.3)
@@ -109,6 +110,20 @@ class I2C:
         pi.i2c_close(bus)
         return ret_ack
 
+    def write_register(self, register):
+        bus = pi.i2c_open(self.bus_nr, self.I2C_Address)
+        try:
+            ret_value = pi.i2c_write_device(bus, [register])
+            ret_ack = 1
+            if SLOW:
+                sleep(0.3)
+        except IOError:
+            ret_ack = 0
+            ret_value = 0
+            if DEBUG:
+                print("No ACK")
+        return ret_ack
+
     def ack_check(self):
         bus = smbus.SMBus(self.bus_nr)
         try:
diff --git a/I2C_serial_pi3.py b/I2C_serial_pi3.py
new file mode 100644
index 0000000000000000000000000000000000000000..adfa428918bf52094dd9ea55c851782bc7ad8668
--- /dev/null
+++ b/I2C_serial_pi3.py
@@ -0,0 +1,146 @@
+'''
+Copyright 2021 Stichting Nederlandse Wetenschappelijk Onderzoek Instituten,
+ASTRON Netherlands Institute for Radio Astronomy
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+I2C_serial_Pi
+Started by Gijs
+
+Class for using the I2C bus of the I2C. This class is used for the
+basic I2C scripts to read and write the RCU2, PCC etc.
+
+'''
+import smbus2
+import sys
+from time import *
+
+DEBUG = False #True
+SLOW = False
+
+
+class I2C:
+
+    def __init__(self, ADDRESS='040',BUSNR=3):
+        self.I2C_Address = ADDRESS
+        self.bus_nr = BUSNR
+
+    def close(self):
+        bus = smbus2.SMBus(self.bus_nr)
+        bus.close()
+        return True
+
+    def open(self):
+        bus = smbus2.SMBus(self.bus_nr)
+        bus.open(self.bus_nr)
+        return True
+
+    def read_bytes(self, register, bytes_to_read=2):
+        bus = smbus2.SMBus(self.bus_nr)
+        try:
+            rd_value = bus.read_i2c_block_data(self.I2C_Address, register, bytes_to_read)
+            ret_value = ''
+            for cnt in range(bytes_to_read):
+                ret_value += (hex(rd_value[cnt])[2:])
+            ret_ack = 1
+            if SLOW:
+                sleep(0.2)
+        except IOError:
+            ret_ack = 0
+            ret_value = 'ffff'
+            if DEBUG:
+                print("Reading IO-error")
+        return ret_ack, ret_value
+
+    
+    def read_last_reg(self, bytes_to_read):
+        bus = smbus2.SMBus(self.bus_nr)
+        rd_value = []
+        ret_value = ''
+        for cnt in range(bytes_to_read):
+            try:
+                rd_value.append(bus.read_byte(self.I2C_Address))
+                ret_ack = 1
+                if SLOW:
+                    sleep(0.2)
+            except IOError:
+                ret_ack = 0
+                rd_value.append(0)
+                if DEBUG:
+                    print("IO-Reading error")
+        for cnt in range(bytes_to_read):
+            ret_value += (hex(rd_value[cnt])[2:])
+        return ret_ack,ret_value
+  
+    def write_bytes(self, register, data):
+        bus = smbus2.SMBus(self.bus_nr)
+        if type(data) is not list:
+            data = [data]
+        try:
+            bus.write_i2c_block_data(self.I2C_Address, register, data)
+            ret_ack = 1
+            if SLOW:
+                sleep(0.3)
+        except IOError:
+            ret_ack = 0
+            ret_value = 0
+            if DEBUG:
+                print("Write IO-error")
+        return ret_ack
+
+    def write_register(self, register):
+        bus = smbus2.SMBus(self.bus_nr)
+        try:
+            bus.write_byte(self.I2C_Address, register)
+#            print(f"Wrote {register:x}")
+            ret_ack = 1
+            if SLOW:
+                sleep(0.3)
+        except IOError:
+            ret_ack = 0
+            ret_value = 0
+#            if DEBUG:
+            print("Write IO-error")
+        return ret_ack
+
+    def write_pointer(self, register):
+        bus = smbus2.SMBus(self.bus_nr)
+        try:
+            ret_value = bus.read_i2c_block_data(self.I2C_Address, register, 1)
+            ret_ack = 1
+            if SLOW:
+                sleep(0.3)
+        except IOError:
+            ret_ack = 0
+            ret_value = 0
+            if DEBUG:
+                print("Write IO-error")
+        return ret_ack
+
+    def ack_check(self):
+        bus = smbus2.SMBus(self.bus_nr)
+        try:
+            print("check ACK")
+            ret_value = bus.write_quick(self.I2C_Address)
+            ret_ack = 1
+            if SLOW:
+                sleep(0.3)
+        except IOError:
+            ret_ack = 0
+            ret_value = 0
+            if DEBUG:
+                print("No ACK IO-Error")
+        return ret_ack
+
+if __name__ == "__main__":
+    I2C_Device = I2C(0x40)
+    I2C_Device.write_bytes(0x00, 0x00)
+    ret_ack, ret_value = I2C_Device.read_bytes(0x8C, 2)
+    print(ret_value)
diff --git a/apspu_lib.py b/apspu_lib.py
index 4cb45a8d5f7e0a2d38a0112e5440a46fe04bb973..be387ca6acb956d38e17198ba0911ad2e271b97a 100644
--- a/apspu_lib.py
+++ b/apspu_lib.py
@@ -25,13 +25,13 @@ from APSPU_I2C import *
 
 
 if os.name == "posix":
-    from I2C_serial_pi2 import *
+    from I2C_serial_pi3 import *
 else:
     from I2C_serial import *
 
 I2CBUSNR = 1    # Bus used on the Pi
 DEBUG = False   # Set True to print debug information on the screen
-
+I_OK_MARGIN = 0.5 # I_error in Amps
 
 class ApspuClass:
     #
@@ -84,6 +84,7 @@ class ApspuClass:
                       f"set {1.2*VOUT_POLS[pol.name]} read back {ov_out}")
                 exit()
             pol.set_on_off_config()
+            pol.on_off(True)
             pol.write_to_nvm()
         print("Done")
     
@@ -269,6 +270,7 @@ class PolClass:
         #
         ret_ack = False
         if self.status:
+            ret_ack = self.pol_dev.write_bytes(LP_WRITE_PROTECT, [0])
             set_value = int(value * (2**11))
             hex_set_value = hex(set_value)
             wr_value = (hex_set_value[4:6] + hex_set_value[2:4])
@@ -306,7 +308,16 @@ class PolClass:
         #
         # return is always True
         #
-        ret_ack = self.pol_dev.write_bytes(LP_STORE_USER_ALL, 0)
+        print(f"Store to NVM for POL {self.name}")
+        if False:
+            ret_ack = self.pol_dev.write_register(0x15)
+            sleep(1)
+        else:
+            self.pol_dev.close()
+            command = f"i2cset -y 1 0x{CTR_POLS[self.name]:02X} 0x15 cp" 
+            os.system(command)
+            os.system(command)
+            self.pol_dev.open()
         return True
 
     def read_vin(self):
@@ -460,8 +471,8 @@ class PolClass:
             check_ok = False
             print(f"POL {self.name:10} TEMP not OK, expected {temp_low} C - {temp_high} C, measured {self.temp} C ")
             return check_ok
-        i_low = 0.75*IOUT_POLS[self.name]
-        i_high = 1.25*IOUT_POLS[self.name]
+        i_low = (1-I_OK_MARGIN)*IOUT_POLS[self.name]
+        i_high = (1+I_OK_MARGIN)*IOUT_POLS[self.name]
         if i_low < self.iout < i_high:
             check_ok = True
         else: