+class Connection:
+    __instance = None
+    @staticmethod
+    def getInstance():
+        """ Static access method. """
+        if Connection.__instance == None:
+            Connection()
+        return Connection.__instance
+
+    def __init__(self):
+        """ Virtually private constructor. """
+        if Connection.__instance != None:
+            raise Exception("This class is a singleton!")
+        else:
+            from binhoHostAdapter import binhoHostAdapter
+            from binhoHostAdapter import binhoUtilities
+
+            utilities = binhoUtilities.binhoUtilities()
+            devices = utilities.listAvailableDevices()
+
+            if len(devices) > 0:
+                Connection.__instance = binhoHostAdapter.binhoHostAdapter(devices[0])
+            else:
+                raise RuntimeError('No Binho host adapter found!')
\ No newline at end of file
 
-#from adafruit_blinka.microcontroller.nova.pin import Pin
-
 class I2C:
 
     def __init__(self):
-        # change GPIO controller to I2C
-        from binhoHostAdapter import binhoHostAdapter
-        from binhoHostAdapter import binhoUtilities
-
-        utilities = binhoUtilities.binhoUtilities()
-        devices = utilities.listAvailableDevices()
-
-        if len(devices) > 0:
-
-            self._nova = binhoHostAdapter.binhoHostAdapter(devices[0])
-            self._nova.setNumericalBase(10)
-            self._nova.setOperationMode(0, "I2C")
-            self._nova.setPullUpStateI2C(0, "EN")
-            self._nova.setClockI2C(0, 400000)
-
-        else:
-            raise RuntimeError('No Binho host adapter found!')
+        from adafruit_blinka.microcontroller.nova import Connection
+        self._nova = Connection.getInstance()
+        self._nova.setNumericalBase(10)
+        self._nova.setOperationMode(0, "I2C")
+        self._nova.setPullUpStateI2C(0, "EN")
+        self._nova.setClockI2C(0, 400000)
 
     def scan(self):
 
 
 
     def __init__(self, pin_id=None):
         if not Pin._nova:
-            from binhoHostAdapter import binhoHostAdapter
-            from binhoHostAdapter import binhoUtilities
-
-            utilities = binhoUtilities.binhoUtilities()
-            devices = utilities.listAvailableDevices()
-
-            if len(devices) > 0:
-                Pin._nova = binhoHostAdapter.binhoHostAdapter(devices[0])
+            from adafruit_blinka.microcontroller.nova import Connection
+            Pin._nova = Connection.getInstance()
         # check if pin is valid
         if pin_id > 4:
             raise ValueError("Invalid pin {}.".format(pin_id))
 IO4 = Pin(4)
 
 PWM0 = IO0
-PWM1 = IO1
+# No PWM support on IO1
 PWM2 = IO2
-# No PWM support on IO3
+PWM3 = IO3
 PWM4 = IO4
 
-pwmOuts = ( ((1, 0), PWM0), ((1, 1), PWM1), ((1, 2), PWM2), ((1, 4), PWM4) )
\ No newline at end of file
+pwmOuts = ( ((1, 0), PWM0), ((1, 2), PWM2), ((1, 3), PWM3), ((1, 4), PWM4) )
\ No newline at end of file
 
 
         """
         if PWMOut._nova is None:
-            if Pin._nova is not None:
-                # check if Pin already connected to Binho Nova
-                PWMOut._nova = Pin._nova
-            else:
-                from binhoHostAdapter import binhoHostAdapter
-                from binhoHostAdapter import binhoUtilities
-
-                utilities = binhoUtilities.binhoUtilities()
-                devices = utilities.listAvailableDevices()
-
-                if len(devices) > 0:
-                    PWMOut._nova = binhoHostAdapter.binhoHostAdapter(devices[0])
-                else:
-                    raise RuntimeError('No Binho Host Adapter found!')
+            from adafruit_blinka.microcontroller.nova import Connection
+            PWMOut._nova = Connection.getInstance()
 
         self._pwmpin = None
         self._open(pin, duty_cycle, frequency, variable_frequency)
 
         # set frequency
         self.frequency = freq
-        PWMOut._nova.setIOpinPWMFreq(self._pwmpin, self.frequency)
         # set period
         self._period = self._get_period()
 
         if self._channel is not None:
             #self.duty_cycle = 0
             self._set_enabled(False) # make to disable before unexport
-            """
-            try:
-                #unexport_path = os.path.join(channel_path, self._unexport_path)
-                with open(os.path.join(channel_path, self._unexport_path), "w") as f_unexport:
-                    f_unexport.write("%d\n" % self._pwmpin)
-            except IOError as e:
-                raise PWMError(e.errno, "Unexporting PWM pin: " + e.strerror)
-                """
+
       except Exception as e:
           # due to a race condition for which I have not yet been
           # able to find the root cause, deinit() often fails
 
-#from adafruit_blinka.microcontroller.nova.pin import Pin
-
 class SPI:
     PAYLOAD_MAX_LENGTH = 64
 
     def __init__(self, clock):
-        from binhoHostAdapter import binhoHostAdapter
-        from binhoHostAdapter import binhoUtilities
-
-        utilities = binhoUtilities.binhoUtilities()
-        devices = utilities.listAvailableDevices()
-
-        if len(devices) > 0:
-            self._nova = binhoHostAdapter.binhoHostAdapter(devices[0])
-            self._nova.setOperationMode(0, 'SPI')
-            self._nova.setClockSPI(0, clock)
-            self._nova.setModeSPI(0, 0)
-            self._nova.setIOpinMode(0, 'DOUT')
-            self._nova.setIOpinValue(0, 'HIGH')
-            self._nova.beginSPI(0)
-            # Cpol and Cpha set by mode
-            # Mode  Cpol Cpha
-            #  0     0    0
-            #  1     0    1
-            #  2     1    0
-            #  3     1    1
-
-        else:
-            raise RuntimeError('No Binho host adapter found!')
+        from adafruit_blinka.microcontroller.nova import Connection
+        self._nova = Connection.getInstance()
+        self._nova.setOperationMode(0, 'SPI')
+        self._nova.setClockSPI(0, clock)
+        self._nova.setModeSPI(0, 0)
+        self._nova.setIOpinMode(0, 'DOUT')
+        self._nova.setIOpinValue(0, 'HIGH')
+        self._nova.beginSPI(0)
+        # Cpol and Cpha set by mode
+        # Mode  Cpol Cpha
+        #  0     0    0
+        #  1     0    1
+        #  2     1    0
+        #  3     1    1
 
     def init(self, baudrate=100000, polarity=0, phase=0, bits=8,
                   firstbit=MSB, sck=None, mosi=None, miso=None):