diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
index 9f50458..568df72 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
@@ -32,6 +32,7 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.GridType;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -41,8 +42,11 @@
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.optical.OchPort;
+import org.onosproject.net.optical.device.OchPortHelper;
 
 import java.util.Map;
+import java.util.Optional;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -63,6 +67,7 @@
     private static final String CH_25 = "25";
     private static final String CH_50 = "50";
     private static final String CH_100 = "100";
+    public static final long BASE_FREQUENCY = 193100000;   //Working in Mhz
 
     private static final Map<String, ChannelSpacing> CHANNEL_SPACING_MAP = ImmutableMap
             .<String, ChannelSpacing>builder()
@@ -83,18 +88,18 @@
     @Completion(OpticalConnectPointCompleter.class)
     String connectPointString = "";
 
+    @Argument(index = 2, name = "value",
+            description = "Optical Signal or wavelength. Provide wavelenght in MHz, while Och Format = "
+                    + SIGNAL_FORMAT, required = false, multiValued = false)
+    String parameter = "";
 
-    @Argument(index = 2, name = "signal",
-            description = "Optical Signal. Format = " + SIGNAL_FORMAT,
-            required = true, multiValued = false)
-    String signal = "";
 
     private OchSignal createOchSignal() throws IllegalArgumentException {
-        if (signal == null) {
+        if (parameter == null) {
             return null;
         }
         try {
-            String[] splitted = signal.split("/");
+            String[] splitted = parameter.split("/");
             checkArgument(splitted.length == 4,
                     "signal requires 4 parameters: " + SIGNAL_FORMAT);
             int slotGranularity = Integer.parseInt(splitted[0]);
@@ -111,12 +116,54 @@
              * are subclasses of RuntimeException.
              */
             String msg = String.format("Invalid signal format: %s, expected format is %s.",
-                    signal, SIGNAL_FORMAT);
+                    parameter, SIGNAL_FORMAT);
             print(msg);
             throw new IllegalArgumentException(msg, e);
         }
     }
 
+    private OchSignal createOchSignalFromWavelength(DeviceService deviceService, ConnectPoint cp) {
+        long wavelength = Long.parseLong(parameter);
+        if (wavelength == 0L) {
+            return null;
+        }
+        Port port = deviceService.getPort(cp);
+        Optional<OchPort> ochPortOpt = OchPortHelper.asOchPort(port);
+
+        if (ochPortOpt.isPresent()) {
+            OchPort ochPort = ochPortOpt.get();
+            GridType gridType = ochPort.lambda().gridType();
+            ChannelSpacing channelSpacing = ochPort.lambda().channelSpacing();
+            int slotGranularity = ochPort.lambda().slotGranularity();
+            int multiplier = getMultplier(wavelength, gridType, channelSpacing, slotGranularity);
+            return new OchSignal(gridType, channelSpacing, multiplier, slotGranularity);
+        } else {
+            print("Connect point %s is not OChPort", cp);
+            return null;
+        }
+
+    }
+
+    private int getMultplier(long wavelength, GridType gridType, ChannelSpacing channelSpacing, int slotGranularity) {
+        long baseFreq;
+        switch (gridType) {
+            case DWDM:
+                baseFreq = BASE_FREQUENCY;
+                break;
+            case CWDM:
+            case FLEX:
+            case UNKNOWN:
+            default:
+                baseFreq = 0L;
+                break;
+        }
+        if (wavelength > baseFreq) {
+            return (int) ((wavelength - baseFreq) / (channelSpacing.frequency().asMHz()));
+        } else {
+            return (int) ((baseFreq - wavelength) / (channelSpacing.frequency().asMHz()));
+        }
+    }
+
 
     @Override
     protected void doExecute() throws Exception {
@@ -133,8 +180,19 @@
 
             // an empty traffic selector
             TrafficSelector trafficSelector = trafficSelectorBuilder.matchInPort(cp.port()).build();
-            OchSignal ochSignal = createOchSignal();
-
+            OchSignal ochSignal;
+            if (parameter.contains("/")) {
+                ochSignal = createOchSignal();
+            } else if (parameter.matches("-?\\d+(\\.\\d+)?")) {
+                ochSignal = createOchSignalFromWavelength(deviceService, cp);
+            } else {
+                print("Signal or wavelength %s are in uncorrect format");
+                return;
+            }
+            if (ochSignal == null) {
+                print("Error in creating OchSignal");
+                return;
+            }
             TrafficTreatment trafficTreatment = trafficTreatmentBuilder
                     .add(Instructions.modL0Lambda(ochSignal))
                     .add(Instructions.createOutput(deviceService.getPort(cp).number()))
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
index 191f608..d6812ba 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmManager.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Range;
+import org.onlab.util.Frequency;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.ChannelSpacing;
@@ -48,7 +49,9 @@
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.criteria.Criteria;
+import org.onosproject.net.flow.instructions.Instruction;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.flow.instructions.L0ModificationInstruction;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -64,6 +67,7 @@
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.StreamSupport;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.optical.OpticalAnnotations.INPUT_PORT_STATUS;
@@ -375,8 +379,8 @@
 
     @Override
     public FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
-                                 int timeout, PortNumber inPort, PortNumber outPort,
-                                 OchSignal ochSignal, Double attenuation) {
+                                   int timeout, PortNumber inPort, PortNumber outPort,
+                                   OchSignal ochSignal, Double attenuation) {
         checkNotNull(deviceId);
         checkNotNull(inPort);
         checkNotNull(outPort);
@@ -386,6 +390,39 @@
     }
 
     @Override
+    public Frequency getWavelength(DeviceId deviceId, PortNumber portNumber) {
+        checkNotNull(deviceId);
+        checkNotNull(portNumber);
+        Optional<FlowEntry> optFlow = StreamSupport
+                .stream(flowRuleService.getFlowEntries(deviceId).spliterator(), false)
+                .filter(flow -> {
+                    return flow.treatment().allInstructions().stream().filter(instr -> {
+                        if (instr.type().equals(Instruction.Type.OUTPUT)) {
+                            return ((Instructions.OutputInstruction) instr).port().equals(portNumber);
+                        } else if (instr.type().equals(Instruction.Type.L0MODIFICATION)) {
+                            return ((L0ModificationInstruction) instr).subtype()
+                                    .equals(L0ModificationInstruction.L0SubType.OCH);
+                        }
+                        return false;
+                    }).count() == 2;
+                }).findFirst();
+        if (optFlow.isPresent()) {
+            Optional<Instruction> instruction = optFlow.get().treatment().allInstructions().stream().filter(instr -> {
+                if (instr.type().equals(Instruction.Type.L0MODIFICATION)) {
+                    return ((L0ModificationInstruction) instr).subtype()
+                            .equals(L0ModificationInstruction.L0SubType.OCH);
+                }
+                return false;
+            }).findAny();
+            if (instruction.isPresent()) {
+                return ((L0ModificationInstruction.ModOchSignalInstruction) instruction.get()).lambda()
+                        .centralFrequency();
+            }
+        }
+        return null;
+    }
+
+    @Override
     public void removeConnection(DeviceId deviceId, FlowId flowId) {
         checkNotNull(deviceId);
         checkNotNull(flowId);
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
index 1a27fd3..3a648c4 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
@@ -85,6 +85,7 @@
     private static final String MIN_FREQ = "minFreq";
     private static final String MAX_FREQ = "maxFreq";
     private static final String GRID = "grid";
+    private static final String CURR_FREQ = "currFreq";
     private static final String POWER_RANGE = "powerRange";
     private static final String CURRENT_POWER = "currentPower";
     private static final String CURRENT_INPUT_POWER = "currentInputPower";
@@ -94,7 +95,7 @@
     private static final String SERVICE_STATE = "serviceState";
 
     private static final String[] COLUMN_IDS = {
-            ID, REVERSE_PORT, TYPE, NAME, ENABLED, MIN_FREQ, MAX_FREQ, GRID, POWER_RANGE,
+            ID, REVERSE_PORT, TYPE, NAME, ENABLED, MIN_FREQ, MAX_FREQ, GRID, CURR_FREQ, POWER_RANGE,
             CURRENT_POWER, CURRENT_INPUT_POWER, SERVICE_STATE, TARGET_POWER, MODULATION, HAS_TARGET_POWER
     };
 
@@ -161,6 +162,7 @@
                     .cell(MIN_FREQ, RoadmUtil.asTHz(minFreq))
                     .cell(MAX_FREQ, RoadmUtil.asTHz(maxFreq))
                     .cell(GRID, RoadmUtil.asGHz(channelSpacing))
+                    .cell(CURR_FREQ, getWavelength(deviceId, portNum))
                     .cell(POWER_RANGE, getPowerRange(deviceId, portNum))
                     .cell(CURRENT_POWER, getCurrentPower(deviceId, portNum))
                     .cell(CURRENT_INPUT_POWER, getCurrentInputPower(deviceId, portNum))
@@ -187,7 +189,7 @@
             return RoadmUtil.UNKNOWN;
         }
 
-        private Frequency minFreq = null, maxFreq = null, channelSpacing = null;
+        private Frequency minFreq = null, maxFreq = null, channelSpacing = null, currFreq = null;
 
         // Gets min frequency, max frequency, channel spacing
         private void getFrequencyLimit(DeviceId deviceId, PortNumber portNumber) {
@@ -253,6 +255,17 @@
             }
             return RoadmUtil.objectToString(modulation, RoadmUtil.UNKNOWN);
         }
+
+        // Returns modulation as a string, Unknown if modulation is expected but
+        // cannot be found
+        private String getWavelength(DeviceId deviceId, PortNumber portNumber) {
+            Frequency currentFrequency = roadmService.getWavelength(deviceId, portNumber);
+            if (currentFrequency == null) {
+                return "0";
+            } else {
+                return String.valueOf(currentFrequency.asTHz());
+            }
+        }
     }
 
 
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
index 7662626..0b31e71 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmService.java
@@ -16,6 +16,7 @@
 package org.onosproject.roadm;
 
 import com.google.common.collect.Range;
+import org.onlab.util.Frequency;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.ModulationScheme;
@@ -29,19 +30,19 @@
 
 /**
  * ROADM service interface. Provides an interface for ROADM power configuration.
- *
+ * <p>
  * This application relies on the PowerConfig and LambdaQuery behaviours.
- *
+ * <p>
  * The device's PowerConfig implementation should be parameterized as
  * {@code PowerConfig<Object>} in order to support both Direction and OchSignal.
  * For a reference implementation of PowerConfig, please see
  * OplinkRoadmPowerConfig
- *
+ * <p>
  * In this application, a "connection" refers to the selection of a channel
  * to direct from an input to an output port. Connections are implemented
  * using FlowRules with an input port selector, optical channel selector,
  * and output port treatment (see RoadmManager#createConnection()).
- *
+ * <p>
  * This application currently only supports fixed grid channels.
  */
 public interface RoadmService {
@@ -50,7 +51,7 @@
      * Attempts to manually switch working path to the one specified by {@code index}.
      *
      * @param deviceId DeviceId of the device to configure
-     * @param index working path index to switch to
+     * @param index    working path index to switch to
      * @deprecated 1.11.0
      */
     @Deprecated
@@ -59,7 +60,7 @@
     /**
      * Retrieves protection switch specified port's service status.
      *
-     * @param deviceId DeviceId of the device to configure
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber the port
      * @return port service status
      * @deprecated 1.11.0
@@ -70,15 +71,16 @@
     /**
      * Attempts to config protection switch by specified {@code operation} and {@code index}.
      *
-     * @param deviceId DeviceId of the device to configure
-     * @param operation switch configuration, automatic, force or manual
+     * @param deviceId   DeviceId of the device to configure
+     * @param operation  switch configuration, automatic, force or manual
      * @param identifier {@link ConnectPoint} for the virtual Port representing protected path endpoint
-     * @param index working path index to switch to
+     * @param index      working path index to switch to
      */
     void configProtectionSwitch(DeviceId deviceId, String operation, ConnectPoint identifier, int index);
 
     /**
      * Retrieves protection switch endpoint states.
+     *
      * @param deviceId DeviceId of the device to configure
      * @return map groups of underlying paths
      */
@@ -87,16 +89,16 @@
     /**
      * Set target power for a port if the port has configurable target power.
      *
-     * @param deviceId DeviceId of the device to configure
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
-     * @param power value to set target power to
+     * @param power      value to set target power to
      */
     void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, double power);
 
     /**
      * Returns the target power stored in storage for a port if the port has configurable target power.
      *
-     * @param deviceId DeviceId of the device to configure
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
@@ -104,7 +106,8 @@
 
     /**
      * Sync-up the target power for a port if the operator want to check the configuration.
-     * @param deviceId DeviceId of the device to configure
+     *
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
@@ -114,9 +117,9 @@
      * Sets the attenuation of a connection. This does not check that attenuation
      * is within the acceptable range.
      *
-     * @param deviceId DeviceId of the device to configure
-     * @param portNumber PortNumber of either the input or output port
-     * @param ochSignal channel to set attenuation for
+     * @param deviceId    DeviceId of the device to configure
+     * @param portNumber  PortNumber of either the input or output port
+     * @param ochSignal   channel to set attenuation for
      * @param attenuation attenuation value to set to
      */
     void setAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal, double attenuation);
@@ -124,9 +127,9 @@
     /**
      * Returns the attenuation of a connection.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of either the input or output port
-     * @param ochSignal channel to search for
+     * @param ochSignal  channel to search for
      * @return attenuation if found, null otherwise
      */
     Double getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
@@ -134,7 +137,7 @@
     /**
      * Returns the current port power.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of the port
      * @return current power if found, null otherwise
      */
@@ -143,9 +146,9 @@
     /**
      * Returns the current channel power.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of either the input or output port of the connection
-     * @param ochSignal channel to search for
+     * @param ochSignal  channel to search for
      * @return channel power if found, null otherwise
      */
     Double getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
@@ -153,7 +156,7 @@
     /**
      * Returns the channels supported by a port.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of the port
      * @return the set of supported channels
      */
@@ -162,7 +165,7 @@
     /**
      * Set modulation for a port if the port has configurable modulation.
      *
-     * @param deviceId DeviceId of the device to configure
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
      * @param modulation value to set modulation to
      */
@@ -171,7 +174,7 @@
     /**
      * Get modulation for a port if the port has configurable modulation.
      *
-     * @param deviceId DeviceId of the device to configure
+     * @param deviceId   DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
      * @return modulation scheme
      */
@@ -181,43 +184,52 @@
      * Creates a new internal connection on a device without attenuation. This does
      * not check that the connection is actually valid (e.g. an input port to an
      * output port).
-     *
+     * <p>
      * Connections are represented as flows with an input port, output port, and
      * channel.
      *
-     * @param deviceId DeviceId of the device to create this connection for
-     * @param priority priority of the flow
+     * @param deviceId    DeviceId of the device to create this connection for
+     * @param priority    priority of the flow
      * @param isPermanent permanence of the flow
-     * @param timeout timeout in seconds
-     * @param inPort input port
-     * @param outPort output port
-     * @param ochSignal channel to use
+     * @param timeout     timeout in seconds
+     * @param inPort      input port
+     * @param outPort     output port
+     * @param ochSignal   channel to use
      * @return FlowId of the FlowRule representing the connection
      */
     FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
-                          int timeout, PortNumber inPort, PortNumber outPort, OchSignal ochSignal);
+                            int timeout, PortNumber inPort, PortNumber outPort, OchSignal ochSignal);
 
     /**
      * Creates a new internal connection on a device with attenuation. This does
      * not check that the connection is actually valid (e.g. an input port to an
      * output port, attenuation if within the acceptable range).
-     *
+     * <p>
      * Connections are represented as flows with an input port, output port, and
      * channel. Implementation of attenuation is up to the vendor.
      *
-     * @param deviceId DeviceId of the device to create this connection for
-     * @param priority priority of the flow
+     * @param deviceId    DeviceId of the device to create this connection for
+     * @param priority    priority of the flow
      * @param isPermanent permanence of the flow
-     * @param timeout timeout in seconds
-     * @param inPort input port
-     * @param outPort output port
-     * @param ochSignal channel to use
+     * @param timeout     timeout in seconds
+     * @param inPort      input port
+     * @param outPort     output port
+     * @param ochSignal   channel to use
      * @param attenuation attenuation of the connection
      * @return FlowId of the FlowRule representing the connection
      */
     FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
-                          int timeout, PortNumber inPort, PortNumber outPort,
-                          OchSignal ochSignal, Double attenuation);
+                            int timeout, PortNumber inPort, PortNumber outPort,
+                            OchSignal ochSignal, Double attenuation);
+
+    /**
+     * Get wavelength for a port if the port has configurable modulation.
+     *
+     * @param deviceId   DeviceId of the device to configure
+     * @param portNumber PortNumber of the port to configure
+     * @return the frequency
+     */
+    Frequency getWavelength(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Removes an internal connection from a device by matching the FlowId and
@@ -225,14 +237,14 @@
      * from any device so FlowId should correspond with a connection flow.
      *
      * @param deviceId DeviceId of the device to remove the connection from
-     * @param flowId FlowId of the flow representing the connection to remove
+     * @param flowId   FlowId of the flow representing the connection to remove
      */
     void removeConnection(DeviceId deviceId, FlowId flowId);
 
     /**
      * Returns true if the target power for this port can be configured.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of the port to check
      * @return true if the target power for this port can be configured, false
      * otherwise
@@ -244,9 +256,9 @@
      * Returns false if the port does not have a configurable target
      * power.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId   DeviceId of the device to check
      * @param portNumber PortNumber of the port to check
-     * @param power value to check
+     * @param power      value to check
      * @return true if value is within the acceptable target power range, false
      * otherwise
      */
@@ -258,9 +270,9 @@
      * attenuation. The attenuation range is determined by either the input
      * or output port of the connection.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId   DeviceId of the device to check
      * @param portNumber PortNumber of either the input or output port of the connection
-     * @param att value to check
+     * @param att        value to check
      * @return true if value is within the acceptable attenuation range, false
      * otherwise
      */
@@ -269,7 +281,7 @@
     /**
      * Returns true if the port is an input port.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId   DeviceId of the device to check
      * @param portNumber PortNumber of the port to check
      * @return true if the port is an input port, false otherwise
      */
@@ -278,7 +290,7 @@
     /**
      * Returns true if the port is an output port.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId   DeviceId of the device to check
      * @param portNumber PortNumber of the port to check
      * @return true if the port is an output port, false otherwise
      */
@@ -288,9 +300,9 @@
      * Returns true if the channel is supported by the port. The port can be either
      * an input or output port.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId   DeviceId of the device to check
      * @param portNumber PortNumber of the port to check
-     * @param ochSignal channel to check
+     * @param ochSignal  channel to check
      * @return true if the channel is supported by the port, false otherwise
      */
     boolean validChannel(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
@@ -299,7 +311,7 @@
      * Returns true if the channel is not being used by a connection on the
      * device.
      *
-     * @param deviceId DeviceId of the device to check
+     * @param deviceId  DeviceId of the device to check
      * @param ochSignal channel to check
      * @return true if the channel is not in use, false otherwise
      */
@@ -311,8 +323,8 @@
      * respectively, valid input and output ports.
      *
      * @param deviceId DeviceId of the device to check
-     * @param inPort input port of the connection
-     * @param outPort output port of the connection
+     * @param inPort   input port of the connection
+     * @param outPort  output port of the connection
      * @return true if the connection is valid, false otherwise
      */
     boolean validConnection(DeviceId deviceId, PortNumber inPort, PortNumber outPort);
@@ -320,7 +332,7 @@
     /**
      * Returns the acceptable target port power range for a port.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of the port
      * @return range if found, null otherwise
      */
@@ -329,9 +341,9 @@
     /**
      * Returns the acceptable attenuation range for a connection.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of either the input or output port
-     * @param ochSignal channel to check
+     * @param ochSignal  channel to check
      * @return range if found, null otherwise
      */
     Range<Double> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
@@ -339,7 +351,7 @@
     /**
      * Returns the expected input power range for an input port.
      *
-     * @param deviceId DeviceId of the device
+     * @param deviceId   DeviceId of the device
      * @param portNumber PortNumber of an input port
      * @return range if found, null otherwise
      */
diff --git a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
index 1e16d57..26420ca 100644
--- a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
+++ b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.html
@@ -70,6 +70,7 @@
                     <td colId="minFreq">MIN FREQ (THz)</td>
                     <td colId="maxFreq">MAX FREQ (THz)</td>
                     <td colId="grid">GRID (GHz)</td>
+                    <td colId="currentFreq">CURRENT FREQ (THz)</td>
                     <td colId="modulation">MODULATION</td>
                     <td colId="powerRange">POWER RANGE (dBm)</td>
                     <td colId="currentPower">CURRENT POWER (dBm)</td>
@@ -96,6 +97,7 @@
                     <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.type=='OCH'?port.minFreq:""}}</td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.type=='OCH'?port.maxFreq:""}}</td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.type=='OCH'?port.grid:""}}</td>
+                    <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.type=='OCH'?port.currFreq:""}}</td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">
                         <form [formGroup]="modulationForm" (ngSubmit)="submitModulation(devId, port.id)" *ngIf="port.type=='OCH'">
                             <select [(ngModel)]="port.modulation" formControlName="newModulation">
diff --git a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.ts b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.ts
index 4a0d36e..56bd85c 100644
--- a/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.ts
+++ b/apps/roadm/web/roadm-gui/projects/roadm-gui-lib/src/lib/port/port.component.ts
@@ -44,6 +44,7 @@
     minFreq: string;
     maxFreq: string;
     grid: string;
+    currFreq: string;
     powerRange: string;
     currentPower: string;
     targetPower: string;
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniModulationOpenConfig.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniModulationOpenConfig.java
index c85e43e..d848379 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniModulationOpenConfig.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniModulationOpenConfig.java
@@ -17,6 +17,7 @@
  */
 package org.onosproject.drivers.odtn;
 
+import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
@@ -36,6 +37,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.StringWriter;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -84,7 +86,6 @@
 
 
     private NetconfSession getNetconfSession(DeviceId deviceId) {
-        log.info("Inside getNetconfSession () method for device : {}", deviceId);
         NetconfController controller = handler().get(NetconfController.class);
         NetconfDevice ncdev = controller.getDevicesMap().get(deviceId);
         if (ncdev == null) {
@@ -116,10 +117,30 @@
 
     private XMLConfiguration executeRpc(NetconfSession session, String message) {
         try {
+            if (log.isDebugEnabled()) {
+                try {
+                    StringWriter stringWriter = new StringWriter();
+                    XMLConfiguration xconf = (XMLConfiguration) XmlConfigParser.loadXmlString(message);
+                    xconf.setExpressionEngine(new XPathExpressionEngine());
+                    xconf.save(stringWriter);
+                    log.debug("Request {}", stringWriter.toString());
+                } catch (ConfigurationException e) {
+                    log.error("XML Config Exception ", e);
+                }
+            }
             CompletableFuture<String> fut = session.rpc(message);
             String rpcReply = fut.get();
             XMLConfiguration xconf = (XMLConfiguration) XmlConfigParser.loadXmlString(rpcReply);
             xconf.setExpressionEngine(new XPathExpressionEngine());
+            if (log.isDebugEnabled()) {
+                try {
+                    StringWriter stringWriter = new StringWriter();
+                    xconf.save(stringWriter);
+                    log.debug("Response {}", stringWriter.toString());
+                } catch (ConfigurationException e) {
+                    log.error("XML Config Exception ", e);
+                }
+            }
             return xconf;
         } catch (NetconfException ne) {
             log.error("Exception on Netconf protocol: {}.", ne);
@@ -178,7 +199,6 @@
         }
 
         state.cassini = this;
-        log.info("Setting the state with clsName :{} ", clsName);
     }
 
     /*
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
index 24251e6..f0f5d3a 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfig.java
@@ -94,12 +94,33 @@
      * @param message Netconf message in XML format
      * @return XMLConfiguration object
      */
+
     private XMLConfiguration executeRpc(NetconfSession session, String message) {
         try {
+            if (log.isDebugEnabled()) {
+                try {
+                    StringWriter stringWriter = new StringWriter();
+                    XMLConfiguration xconf = (XMLConfiguration) XmlConfigParser.loadXmlString(message);
+                    xconf.setExpressionEngine(new XPathExpressionEngine());
+                    xconf.save(stringWriter);
+                    log.debug("Request {}", stringWriter.toString());
+                } catch (ConfigurationException e) {
+                    log.error("XML Config Exception ", e);
+                }
+            }
             CompletableFuture<String> fut = session.rpc(message);
             String rpcReply = fut.get();
             XMLConfiguration xconf = (XMLConfiguration) XmlConfigParser.loadXmlString(rpcReply);
             xconf.setExpressionEngine(new XPathExpressionEngine());
+            if (log.isDebugEnabled()) {
+                try {
+                    StringWriter stringWriter = new StringWriter();
+                    xconf.save(stringWriter);
+                    log.debug("Response {}", stringWriter.toString());
+                } catch (ConfigurationException e) {
+                    log.error("XML Config Exception ", e);
+                }
+            }
             return xconf;
         } catch (NetconfException ne) {
             log.error("Exception on Netconf protocol: {}.", ne);
@@ -380,15 +401,7 @@
                     .append(underState)
                     .append("</state></optical-channel></component></components></filter></get>")
                     .append(RPC_CLOSE_TAG);
-            log.info("Getting Optical Channel State {}", rpcReq.toString());
-            StringWriter stringWriter = new StringWriter();
             XMLConfiguration xconf = pc.executeRpc(session, rpcReq.toString());
-            try {
-                xconf.save(stringWriter);
-            } catch (ConfigurationException e) {
-                log.error("XML Config Exception ", e);
-            }
-            log.info("Optical Channel State {}", stringWriter.toString());
             return xconf;
         }
 
