diff --git a/openflow/ctl/src/main/java/org/onlab/onos/openflow/drivers/impl/OFOpticalSwitchImplLINC13.java b/openflow/ctl/src/main/java/org/onlab/onos/openflow/drivers/impl/OFOpticalSwitchImplLINC13.java
index 79a162e..d65a15f 100644
--- a/openflow/ctl/src/main/java/org/onlab/onos/openflow/drivers/impl/OFOpticalSwitchImplLINC13.java
+++ b/openflow/ctl/src/main/java/org/onlab/onos/openflow/drivers/impl/OFOpticalSwitchImplLINC13.java
@@ -6,6 +6,7 @@
 import org.onlab.onos.openflow.controller.Dpid;
 import org.onlab.onos.openflow.controller.driver.AbstractOpenFlowSwitch;
 import org.projectfloodlight.openflow.protocol.OFBarrierRequest;
+import org.projectfloodlight.openflow.protocol.OFCircuitPortStatus;
 import org.projectfloodlight.openflow.protocol.OFCircuitPortsReply;
 import org.projectfloodlight.openflow.protocol.OFCircuitPortsRequest;
 import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
@@ -14,7 +15,10 @@
 import org.projectfloodlight.openflow.protocol.OFMessage;
 import org.projectfloodlight.openflow.protocol.OFOxmList;
 import org.projectfloodlight.openflow.protocol.OFPortDesc;
+import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFPortOptical;
+import org.projectfloodlight.openflow.protocol.OFStatsReply;
+import org.projectfloodlight.openflow.protocol.OFStatsType;
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 import org.projectfloodlight.openflow.protocol.action.OFActionCircuit;
 import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
@@ -43,12 +47,13 @@
     private final AtomicBoolean driverHandshakeComplete;
     private long barrierXidToWaitFor = -1;
 
+    private OFPortDescStatsReply wPorts;
+
     private final Logger log =
             LoggerFactory.getLogger(OFOpticalSwitchImplLINC13.class);
 
     OFOpticalSwitchImplLINC13(Dpid dpid, OFDescStatsReply desc) {
         super(dpid);
-        //setAttribute("optical", "true");
         driverHandshakeComplete = new AtomicBoolean(false);
         setSwitchDescription(desc);
     }
@@ -62,7 +67,7 @@
 
     @Override
     public void startDriverHandshake() {
-        log.debug("Starting driver handshake for sw {}", getStringId());
+        log.warn("Starting driver handshake for sw {}", getStringId());
         if (startDriverHandshakeCalled) {
             throw new SwitchDriverSubHandshakeAlreadyStarted();
         }
@@ -70,6 +75,8 @@
         try {
             sendHandshakeOFExperimenterPortDescRequest();
         } catch (IOException e) {
+            log.error("LINC-OE exception while sending experimenter port desc:",
+                     e.getMessage());
             e.printStackTrace();
         }
     }
@@ -84,7 +91,7 @@
 
     @Override
     public void processDriverHandshakeMessage(OFMessage m) {
-        if (!startDriverHandshakeCalled) {
+         if (!startDriverHandshakeCalled) {
             throw new SwitchDriverSubHandshakeNotStarted();
         }
         if (driverHandshakeComplete.get()) {
@@ -109,38 +116,49 @@
             case PACKET_IN:
                 break;
             case PORT_STATUS:
+                log.warn("****LINC-OE Port Status {} {}", getStringId(), m);
+                processOFPortStatus((OFCircuitPortStatus) m);
                 break;
             case QUEUE_GET_CONFIG_REPLY:
                 break;
             case ROLE_REPLY:
                 break;
             case STATS_REPLY:
-                log.debug("LINC-OE : Received stats reply message {}", m);
-                processHandshakeOFExperimenterPortDescRequest(
-                        (OFCircuitPortsReply) m);
-                driverHandshakeComplete.set(true);
-                try {
+                OFStatsReply stats = (OFStatsReply) m;
+                if (stats.getStatsType() == OFStatsType.EXPERIMENTER) {
+                    log.warn("LINC-OE : Received stats reply message {}", m);
+                    processHandshakeOFExperimenterPortDescRequest(
+                            (OFCircuitPortsReply) m);
+                    driverHandshakeComplete.set(true);
+                }
+                /*try {
                     testMA();
                     testReverseMA();
                 } catch (IOException e) {
                     e.printStackTrace();
-                }
+                }*/
                 break;
             default:
-                log.debug("Received message {} during switch-driver " +
-                                  "subhandshake " + "from switch {} ... " +
-                                  "Ignoring message", m,
-                          getStringId());
+                log.warn("Received message {} during switch-driver " +
+                                 "subhandshake " + "from switch {} ... " +
+                                 "Ignoring message", m,
+                         getStringId());
 
         }
     }
 
+    //Todo
+    public void processOFPortStatus(OFCircuitPortStatus ps) {
+        log.debug("LINC-OE ..OF Port Status :", ps);
+
+    }
 
     private void processHandshakeOFExperimenterPortDescRequest(
             OFCircuitPortsReply sr) {
         Collection<OFPortOptical> entries = sr.getEntries();
         List<OFPortDesc> ofPortDescList = new ArrayList<>(entries.size());
         for (OFPortOptical entry : entries) {
+            log.warn("LINC:OE port message {}", entry.toString());
             ofPortDescList.add(factory().buildPortDesc().
                     setPortNo(entry.getPortNo())
                                            .setConfig(entry.getConfig())
@@ -148,11 +166,16 @@
                                            .setHwAddr(entry.getHwAddr())
                                            .setName(entry.getName())
                                            .build());
+
         }
-        setPortDescReply(factory().buildPortDescStatsReply().
+        setExperimenterPortDescReply(factory().buildPortDescStatsReply().
                 setEntries(ofPortDescList).build());
     }
 
+    private void setExperimenterPortDescReply(OFPortDescStatsReply reply) {
+        wPorts = reply;
+    }
+
 
     private void sendHandshakeOFExperimenterPortDescRequest() throws
             IOException {
@@ -160,11 +183,22 @@
         OFCircuitPortsRequest circuitPortsRequest = factory()
                 .buildCircuitPortsRequest().setXid(getNextTransactionId())
                 .build();
-        log.debug("LINC-OE : Sending experimented circuit port stats " +
-                          "message " +
-                          "{}",
-                  circuitPortsRequest.toString());
-        sendMsg(Collections.<OFMessage>singletonList(circuitPortsRequest));
+        log.warn("LINC-OE : Sending experimented circuit port stats " +
+                         "message " +
+                         "{}",
+                 circuitPortsRequest.toString());
+        this.write(Collections.<OFMessage>singletonList(circuitPortsRequest));
+    }
+
+
+    @Override
+    public List<OFPortDesc> getPorts() {
+        List<OFPortDesc> portEntries = new ArrayList<>();
+        portEntries.addAll(ports.getEntries());
+        if (wPorts != null) {
+            portEntries.addAll(wPorts.getEntries());
+        }
+        return Collections.unmodifiableList(portEntries);
     }
 
 
@@ -533,7 +567,7 @@
 
     @Override
     public void write(OFMessage msg) {
-        this.sendMsg(msg);
+        this.channel.write(Collections.singletonList(msg));
     }
 
     @Override
@@ -546,4 +580,10 @@
         return false;
     }
 
+    @Override
+    public boolean isOptical() {
+        return true;
+    }
+
+
 }
