diff --git a/voltha/adapters/microsemi/PAS5211_comm.py b/voltha/adapters/microsemi/PAS5211_comm.py
index 0529fbe..d604077 100644
--- a/voltha/adapters/microsemi/PAS5211_comm.py
+++ b/voltha/adapters/microsemi/PAS5211_comm.py
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 import netifaces
+import select
 from scapy.layers.l2 import Dot3
 from scapy.sendrecv import srp1
 import structlog
@@ -69,6 +70,13 @@
             frame = constructPAS5211Frames(msg, self.seqgen.next(), self.src_mac,
                                            self.dst_mac, channel_id=self.channel_id,
                                            **kwargs)
-            return srp1(frame, timeout=timeout, iface=self.iface)
+            try:
+                return srp1(frame, timeout=timeout, iface=self.iface)
+            except IOError as exc:
+                log.info('Can not communicate to ruby on mac {} because {}'
+                         .format(self.dst_mac, exc.message))
+            except select.error as exc:
+                log.info('Can not communicate to ruby on mac {} because {}'
+                         .format(self.dst_mac, exc))
         else:
             log.info('Unknown src mac for {}'.format(self.iface))
diff --git a/voltha/adapters/microsemi/RubyAdapter.py b/voltha/adapters/microsemi/RubyAdapter.py
index bc1d0be..1083265 100644
--- a/voltha/adapters/microsemi/RubyAdapter.py
+++ b/voltha/adapters/microsemi/RubyAdapter.py
@@ -17,11 +17,12 @@
 """
 Microsemi/Celestica Ruby vOLTHA adapter.
 """
+import time
 import structlog
 from twisted.internet import reactor
 from voltha.adapters.interface import IAdapterInterface
 from voltha.adapters.microsemi.PAS5211_comm import PAS5211Communication
-from voltha.adapters.microsemi.StateMachine import Disconnected
+from voltha.adapters.microsemi.StateMachine import Disconnected, States
 
 from voltha.protos import third_party
 from voltha.protos.adapter_pb2 import Adapter, AdapterConfig, DeviceTypes
@@ -86,8 +87,16 @@
         raise NotImplementedError()
 
     def init_olt(self):
-        self.olt.run()
-        self.olt = self.olt.transition()
-        self.olt.run()
-        self.olt = self.olt.transition()
-        self.olt.run()
\ No newline at end of file
+        olt = self.olt
+        while not olt.abandon():
+            if olt.state() == States.DISCONNECTED or olt.state() == States.FETCH_VERSION:
+                olt.run()
+                olt = olt.transition()
+            elif olt.state() == States.CONNECTED:
+                olt.run()
+                break
+        if olt.abandon():
+            #TODO Add more info here
+            log.info('Disconnecting this OLT')
+            self.stop()
+        self.olt = olt
diff --git a/voltha/adapters/microsemi/StateMachine.py b/voltha/adapters/microsemi/StateMachine.py
index 67ffb2f..d2f4a50 100644
--- a/voltha/adapters/microsemi/StateMachine.py
+++ b/voltha/adapters/microsemi/StateMachine.py
@@ -17,15 +17,21 @@
 """
 Base OLT State machine class
 """
-import threading
 import time
+
 from structlog import get_logger
 from twisted.internet import reactor, task
 from voltha.adapters.microsemi.PAS5211 import PAS5211MsgGetProtocolVersion, PAS5211MsgGetOltVersion
 
 log = get_logger()
 
+class States(object):
+    DISCONNECTED = 0
+    FETCH_VERSION = 1
+    CONNECTED = 2
+
 class State(object):
+
     def __init__(self):
         pass
 
@@ -36,13 +42,19 @@
         raise NotImplementedError()
 
     """
-    Distates which state to transtion to.
+    Dictates which state to transtion to.
     Predicated on the run operation to be successful.
     """
     def transition(self):
         raise NotImplementedError()
 
     """
+    Returns the current state name
+    """
+    def state(self):
+        raise NotImplementedError()
+
+    """
     Returns any useful information for the given State
     """
     def value(self):
@@ -60,26 +72,43 @@
     def disconnect(self):
         raise NotImplementedError()
 
+    """
+    Indicates whether to abandon trying to connect.
+    """
+    def abandon(self):
+        raise  NotImplementedError()
+
 """
 Represents an OLT in disconnected or pre init state.
 """
 class Disconnected(State):
 
-    def __init__(self, pas_comm):
+    def __init__(self, pas_comm, retry=3):
         self.comm = pas_comm
         self.completed = False
         self.packet = None
+        self.retry = retry
+        self.attempt = 1
 
     def run(self):
         self.packet = self.comm.communicate(PAS5211MsgGetProtocolVersion())
-        self.packet.show()
         if self.packet is not None:
+            self.packet.show()
             self.completed = True
+        else:
+            if self.attempt <= self.retry:
+                time.sleep(self.attempt)
+                self.attempt += 1
         return self.completed
 
     def transition(self):
         if self.completed:
             return Fetch_Version(self.comm)
+        else:
+            return self
+
+    def state(self):
+        return States.DISCONNECTED
 
     def value(self):
         # TODO return a nicer value than the packet.
@@ -89,7 +118,10 @@
         raise NotImplementedError()
 
     def disconnect(self):
-        raise NotImplementedError()
+        pass
+
+    def abandon(self):
+        return self.attempt > self.retry
 
 """
 Fetches the OLT version
@@ -102,14 +134,19 @@
 
     def run(self):
         self.packet = self.comm.communicate(PAS5211MsgGetOltVersion())
-        self.packet.show()
         if self.packet is not None:
+            self.packet.show()
             self.completed = True
         return self.completed
 
     def transition(self):
         if self.completed:
             return Connected(self.comm)
+        else:
+            return self
+
+    def state(self):
+        return States.FETCH_VERSION
 
     def value(self):
         # TODO return a nicer value than the packet.
@@ -121,6 +158,9 @@
     def disconnect(self):
         raise NotImplementedError()
 
+    def abandon(self):
+        return False
+
 
 """
 OLT is in connected State
@@ -130,14 +170,22 @@
         self.comm = pas_comm
         self.completed = False
         self.packet = None
+        self.scheduled = False
         self.scheduledTask = task.LoopingCall(self.keepalive)
 
     def run(self):
-        self.scheduledTask.start(1.0)
+        if not self.scheduled:
+            self.scheduled = True
+            self.scheduledTask.start(1.0)
 
     def transition(self):
         if self.completed:
             return Disconnected(self.comm)
+        else:
+            return self
+
+    def state(self):
+        return States.CONNECTED
 
     def value(self):
         # TODO return a nicer value than the packet.
@@ -151,10 +199,17 @@
             log.info('OLT has been disconnected')
             return
         self.packet = self.comm.communicate(PAS5211MsgGetOltVersion())
-        self.packet.show()
         if self.packet is None:
             self.completed = True
+        else:
+            self.packet.show()
 
     def disconnect(self):
         print "Disconnecting OLT"
-        self.scheduledTask.stop()
+        if self.scheduled:
+            self.completed = True
+            self.scheduledTask.stop()
+        return self.transition()
+
+    def abandon(self):
+        return False
\ No newline at end of file
