diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumFlowRule.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumFlowRule.java
index 1d29f13..224184f 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumFlowRule.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumFlowRule.java
@@ -122,9 +122,6 @@
                 .findAny()
                 .orElse(null);
 
-        checkArgument(ochSignal.slotGranularity() == 4 || ochSignal.slotGranularity() == 8,
-        "Lumentum device, only supports 50 GHz and 100 GHz frequency slots");
-
         inputPort = criteria.stream()
                 .filter(c -> c instanceof PortCriterion)
                 .map(c -> ((PortCriterion) c).port())
@@ -155,7 +152,7 @@
             isAddRule = false;
         }
 
-        connectionName =  "inPort" + inputPort.toString() + "-ochSig-" + ochSignal.centralFrequency().toString();
+        connectionName =  "inPort-" + getOchPort().toString() + "-centralFreq-" + ochSignal.centralFrequency().asGHz();
     }
 
     public PortNumber addDrop() {
@@ -178,6 +175,14 @@
         return outputPort;
     }
 
+    public PortNumber getOchPort() {
+        if (isAddRule) {
+            return inputPort;
+        } else {
+            return outputPort;
+        }
+    }
+
     public String getConnectionName() {
         return connectionName;
     }
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmDiscovery.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmDiscovery.java
index 6b8fdf1..34655d47 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmDiscovery.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmDiscovery.java
@@ -34,6 +34,8 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.AnnotationKeys;
+import org.onosproject.net.OduSignalType;
+import org.onosproject.net.OchSignal;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceDescription;
@@ -53,6 +55,7 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription;
+import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -328,12 +331,21 @@
                             (annotations.build().value(AnnotationKeys.PORT_NAME)).contains(LINE_PORT_NAME))) {
 
                 //These are the ports supporting OchSignals
-                portDescriptions.add(omsPortDescription(portNum,
-                        isEnabled,
-                        START_CENTER_FREQ_50,
-                        END_CENTER_FREQ_50,
-                        CHANNEL_SPACING_50.frequency(),
-                        annotations.build()));
+                if (portNum.toLong() != 3001) {
+                    portDescriptions.add(ochPortDescription(portNum,
+                            isEnabled,
+                            OduSignalType.ODU4,
+                            true,
+                            OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 1),
+                            annotations.build()));
+                } else {
+                    portDescriptions.add(omsPortDescription(portNum,
+                            isEnabled,
+                            START_CENTER_FREQ_50,
+                            END_CENTER_FREQ_50,
+                            CHANNEL_SPACING_50.frequency(),
+                            annotations.build()));
+                }
             } else {
                 //These are COPPER ports, or FIBER ports not supporting OchSignals
                 DefaultPortDescription.Builder portDescriptionBuilder = DefaultPortDescription.builder();
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmFlowRuleProgrammable.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmFlowRuleProgrammable.java
index d119cfa..940eac8 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmFlowRuleProgrammable.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumNetconfRoadmFlowRuleProgrammable.java
@@ -25,19 +25,15 @@
 import org.onosproject.drivers.utilities.XmlConfigParser;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.OchSignal;
-import org.onosproject.net.OchSignalType;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.GridType;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.DefaultFlowEntry;
-import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.FlowEntry;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleProgrammable;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.criteria.Criteria;
 import org.onosproject.netconf.NetconfController;
 import org.onosproject.netconf.NetconfException;
 import org.onosproject.netconf.NetconfSession;
@@ -103,7 +99,7 @@
                 .collect(Collectors.toList());
 
         //Print out number of rules actually found on the device that are also included in the cache
-        log.debug("Device {} getFlowEntries fetched connections {}", did(), fetched.size());
+        log.info("Device {} getFlowEntries fetched connections {}", did(), fetched.size());
 
         return fetched;
     }
@@ -130,12 +126,13 @@
             if (rpcAddConnection(lumFlowRule)) {
                 added.add(lumFlowRule);
                 getConnectionCache().add(did(), lumFlowRule.getConnectionName(), lumFlowRule);
-                log.debug("Adding connection with selector {}", lumFlowRule.selector());
+                log.info("Adding connection with selector {}", lumFlowRule.selector());
+                log.info("Adding connection with name {}", lumFlowRule.getConnectionName());
             }
         }
 
         //Print out number of rules sent to the device (without receiving errors)
-        log.debug("Device {} applyFlowRules added {}", did(), added.size());
+        log.info("Device {} applyFlowRules added {}", did(), added.size());
 
         return added;
     }
@@ -163,7 +160,7 @@
         }
 
         //Print out number of removed rules from the device (without receiving errors)
-        log.debug("Device {} removeFlowRules removed {}", did(), removed.size());
+        log.info("Device {} removeFlowRules removed {}", did(), removed.size());
 
         return removed;
     }
@@ -250,42 +247,30 @@
             return null;
         }
 
-        log.debug("Lumentum NETCONF - retrieved FlowRule module {} connection {}", moduleId, connId);
+        log.info("Lumentum NETCONF - retrieved FlowRule module {} connection {}", moduleId, connId);
 
         HierarchicalConfiguration config = connection.configurationAt(CONFIG);
         double startFreq = config.getDouble(START_FREQ);
         double endFreq = config.getDouble(END_FREQ);
-        String inputPortReference = config.getString(INPUT_PORT_REFERENCE);
-        String outputPortReference = config.getString(OUTPUT_PORT_REFERENCE);
+        String inputPort = config.getString(INPUT_PORT_REFERENCE);
+        String outputPort = config.getString(OUTPUT_PORT_REFERENCE);
 
         HierarchicalConfiguration state = connection.configurationAt(STATE);
         double attenuation = state.getDouble(CHANNEL_ATTENUATION);
         double inputPower = state.getDouble(CHANNEL_INPUT_POWER);
         double outputPower = state.getDouble(CHANNEL_OUTPUT_POWER);
 
-        PortNumber portNumber = getPortNumber(moduleId, inputPortReference, outputPortReference);
+        OchSignal signal = toOchSignal(startFreq, endFreq);
 
-        //If rule is on module 1 it means input port in the Flow rule is contained in portNumber.
-        //Otherwise the input port in the Flow rule must is the line port.
-        TrafficSelector selector = DefaultTrafficSelector.builder()
-                .matchInPort(moduleId == 1 ? portNumber : LINE_PORT_NUMBER)
-                .add(Criteria.matchOchSignalType(OchSignalType.FIXED_GRID))
-                .add(Criteria.matchLambda(toOchSignal(startFreq, endFreq)))
-                .build();
+        PortNumber portNumber = getPortNumber(moduleId, inputPort, outputPort);
+        double central = signal.centralFrequency().asGHz();
 
-        log.debug("Lumentum NETCONF - retrieved FlowRule startFreq {} endFreq {}", startFreq, endFreq);
-        log.debug("Lumentum NETCONF - retrieved FlowRule selector {}", selector);
+        String connectionName =  "inPort-" + portNumber.toStringWithoutName() + "-centralFreq-" + central;
+        log.info("Lumentum NETCONF - retrieved connection with name {}", connectionName);
+        log.info("Lumentum NETCONF - retrieved connection startFreq {} endFreq {}", startFreq, endFreq);
 
-        //Lookup of connection
-        //Retrieved rules, cached rules are considered equal if the selector is equal
         FlowRule cacheRule = null;
-        if (getConnectionCache().size(did()) != 0) {
-            cacheRule = getConnectionCache().get(did()).stream()
-                    .filter(r -> (r.selector().equals(selector)))
-                    .findFirst()
-                    .orElse(null);
-        }
-
+        cacheRule = getConnectionCache().get(did(), connectionName);
 
         if (cacheRule == null) {
             //TODO consider a way to keep "external" FlowRules
@@ -294,7 +279,7 @@
             return null;
         } else {
             //Update monitored values
-            log.debug("Attenuation retrieved {} dB for connection {}",
+            log.info("Attenuation retrieved {} dB for connection {}",
                     attenuation, ((LumentumFlowRule) cacheRule).getConnectionId());
             ((LumentumFlowRule) cacheRule).setAttenuation(attenuation);
             ((LumentumFlowRule) cacheRule).setInputPower(inputPower);
@@ -360,15 +345,15 @@
         String module = pair.getLeft().toString();
         String connectionId = pair.getRight().toString();
 
-        log.debug("Lumentum driver new connection sent moduleId {} connId {}",
+        log.info("Lumentum driver new connection sent moduleId {} connId {}",
                 xc.getConnectionModule(),
                 xc.getConnectionId());
 
         //Conversion of ochSignal format (center frequency + diameter) to Lumentum frequency slot format (start - end)
-        Frequency freqRadius = Frequency.ofHz(xc.ochSignal().channelSpacing().frequency().asHz() / 2);
+        Frequency freqRadius = Frequency.ofGHz(xc.ochSignal().slotWidth().asGHz() / 2);
         Frequency center = xc.ochSignal().centralFrequency();
-        String startFreq = String.valueOf(center.subtract(freqRadius).asHz() / GHZ);
-        String endFreq = String.valueOf(center.add(freqRadius).asHz() / GHZ);
+        String startFreq = String.valueOf(center.subtract(freqRadius).asGHz());
+        String endFreq = String.valueOf(center.add(freqRadius).asGHz());
 
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">" + "\n");
@@ -397,7 +382,7 @@
         stringBuilder.append("</rpc>" + "\n");
 
         log.info("Lumentum ROADM20 - RPC add-connection sent to device {}", did());
-        log.debug("Lumentum ROADM20 - RPC add-connection sent to device {} {}", did(), stringBuilder);
+        log.info("Lumentum ROADM20 - RPC add-connection sent to device {} {}", did(), stringBuilder);
 
         return editCrossConnect(stringBuilder.toString());
     }
@@ -434,7 +419,7 @@
         stringBuilder.append("</rpc>" + "\n");
 
         log.info("Lumentum ROADM20 - edit-connection sent to device {}", did());
-        log.debug("Lumentum ROADM20 - edit-connection sent to device {} {}", did(), stringBuilder);
+        log.info("Lumentum ROADM20 - edit-connection sent to device {} {}", did(), stringBuilder);
 
         return editCrossConnect(stringBuilder.toString());
     }
@@ -467,7 +452,7 @@
         stringBuilder.append("</rpc>" + " \n");
 
         log.info("Lumentum ROADM20 - RPC delete-connection sent to device {}", did());
-        log.debug("Lumentum ROADM20 - - RPC delete-connection sent to device {} {}", did(), stringBuilder);
+        log.info("Lumentum ROADM20 - - RPC delete-connection sent to device {} {}", did(), stringBuilder);
 
         return editCrossConnect(stringBuilder.toString());
     }
@@ -485,7 +470,7 @@
         stringBuilder.append("</rpc>" + "\n");
 
         log.info("Lumentum ROADM20 - RPC delete-external-connection sent to device {}", did());
-        log.debug("Lumentum ROADM20 - - RPC delete-external-connection sent to device {} {}", did(), stringBuilder);
+        log.info("Lumentum ROADM20 - - RPC delete-external-connection sent to device {} {}", did(), stringBuilder);
 
         return editCrossConnect(stringBuilder.toString());
     }
@@ -503,7 +488,7 @@
         } catch (NetconfException e) {
             log.error("Failed to edit the CrossConnect edit-cfg for device {}",
                       handler().data().deviceId(), e);
-            log.debug("Failed configuration {}", xcString);
+            log.info("Failed configuration {}", xcString);
             return false;
         }
     }
@@ -522,7 +507,7 @@
         int slots = (int) ((end - start) / ChannelSpacing.CHL_12P5GHZ.frequency().asGHz());
         int multiplier = 0;
 
-        //Conversion for 50 GHz slots
+        /*//Conversion for 50 GHz slots
         if (end - start == 50) {
             multiplier = (int) (((end - start) / 2 + start - Spectrum.CENTER_FREQUENCY.asGHz())
                     / ChannelSpacing.CHL_50GHZ.frequency().asGHz());
@@ -536,9 +521,15 @@
                     / ChannelSpacing.CHL_100GHZ.frequency().asGHz());
 
             return new OchSignal(GridType.DWDM, ChannelSpacing.CHL_100GHZ, multiplier, slots);
-        }
+        }*/
 
-        return null;
+        multiplier = (int) (((end - start) / 2 + start - Spectrum.CENTER_FREQUENCY.asGHz())
+                / ChannelSpacing.CHL_6P25GHZ.frequency().asGHz());
+
+        return new OchSignal(GridType.FLEX, ChannelSpacing.CHL_6P25GHZ, multiplier, slots);
+
+
+        //return null;
     }
 
     /**
