diff --git a/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java b/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
index ecae8dd..f9207d3 100644
--- a/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
+++ b/apps/powermanagement/src/main/java/org/onosproject/powermanagement/PowerConfigWebResource.java
@@ -213,12 +213,12 @@
                     componentName = component.toString();
                 }
                 ObjectNode powerConfigNode = mapper.createObjectNode()
-                        .put(CURRENT_POWER, powerConfig.currentPower(port, component).orElse(0L))
-                        .put(TARGET_POWER, powerConfig.getTargetPower(port, component).orElse(0L))
+                        .put(CURRENT_POWER, powerConfig.currentPower(port, component).orElse(0.0))
+                        .put(TARGET_POWER, powerConfig.getTargetPower(port, component).orElse(0.0))
                         .put(INPUT_POWER_RANGE, powerConfig.getInputPowerRange(port,
-                                component).orElse(Range.closed(0L, 0L)).toString())
+                                component).orElse(Range.closed(0.0, 0.0)).toString())
                         .put(TARGET_POWER_RANGE, powerConfig.getTargetPowerRange(port,
-                                component).orElse(Range.closed(0L, 0L)).toString());
+                                component).orElse(Range.closed(0.0, 0.0)).toString());
                 powerConfigComponents.set(componentName, powerConfigNode);
             }
             powerConfigPorts.set(port.toString(), powerConfigComponents);
@@ -268,7 +268,7 @@
                     if (!powerNode.isObject()) {
                         throw new IllegalArgumentException(JSON_INVALID);
                     }
-                    Long targetPower = powerNode.get(TARGET_POWER).asLong();
+                    Double targetPower = powerNode.get(TARGET_POWER).asDouble();
                     if (direction != null) {
                         powerConfig.setTargetPower(portNumber, direction, targetPower);
                     }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
index e13b2c7..cbe2927 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
@@ -39,15 +39,15 @@
 public class DistributedRoadmStore implements RoadmStore {
     private static Logger log = LoggerFactory.getLogger(DistributedRoadmStore.class);
 
-    private ConsistentMap<DeviceId, Map<PortNumber, Long>> distPowerMap;
-    private Map<DeviceId, Map<PortNumber, Long>> powerMap;
+    private ConsistentMap<DeviceId, Map<PortNumber, Double>> distPowerMap;
+    private Map<DeviceId, Map<PortNumber, Double>> powerMap;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY)
     protected StorageService storageService;
 
     @Activate
     public void activate() {
-        distPowerMap = storageService.<DeviceId, Map<PortNumber, Long>>consistentMapBuilder()
+        distPowerMap = storageService.<DeviceId, Map<PortNumber, Double>>consistentMapBuilder()
                 .withName("onos-roadm-distributed-store")
                 .withSerializer(Serializer.using(KryoNamespaces.API))
                 .build();
@@ -77,8 +77,8 @@
 
 
     @Override
-    public void setTargetPower(DeviceId deviceId, PortNumber portNumber, long targetPower) {
-        Map<PortNumber, Long> portMap = powerMap.get(deviceId);
+    public void setTargetPower(DeviceId deviceId, PortNumber portNumber, double targetPower) {
+        Map<PortNumber, Double> portMap = powerMap.get(deviceId);
         if (portMap != null) {
             portMap.put(portNumber, targetPower);
             powerMap.put(deviceId, portMap);
@@ -88,8 +88,8 @@
     }
 
     @Override
-    public Long getTargetPower(DeviceId deviceId, PortNumber portNumber) {
-        Map<PortNumber, Long> portMap = powerMap.get(deviceId);
+    public Double getTargetPower(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, Double> portMap = powerMap.get(deviceId);
         if (portMap != null) {
             return portMap.get(portNumber);
         }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
index c21841c..d53bb63 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmFlowViewMessageHandler.java
@@ -183,14 +183,14 @@
         private String getCurrentPower(DeviceId deviceId, ChannelData channelData) {
             if (hasAttenuation(deviceId, channelData)) {
                 // report channel power if channel exists
-                Long currentPower = roadmService.getCurrentChannelPower(deviceId,
+                Double currentPower = roadmService.getCurrentChannelPower(deviceId,
                         channelData.outPort(), channelData.ochSignal());
                 return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
             }
             // otherwise, report port power
             Type devType = deviceService.getDevice(deviceId).type();
             PortNumber port = devType == Type.FIBER_SWITCH ? channelData.inPort() : channelData.outPort();
-            Long currentPower = roadmService.getCurrentPortPower(deviceId, port);
+            Double currentPower = roadmService.getCurrentPortPower(deviceId, port);
             return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
         }
 
@@ -199,7 +199,7 @@
             if (signal == null) {
                 return RoadmUtil.NA;
             }
-            Long attenuation = roadmService.getAttenuation(deviceId, channelData.outPort(), signal);
+            Double attenuation = roadmService.getAttenuation(deviceId, channelData.outPort(), signal);
             return RoadmUtil.objectToString(attenuation, RoadmUtil.UNKNOWN);
         }
 
@@ -236,8 +236,8 @@
             ChannelData channelData = ChannelData.fromFlow(entry);
             PortNumber port = channelData.outPort();
             OchSignal signal = channelData.ochSignal();
-            Range<Long> range = roadmService.attenuationRange(deviceId, port, signal);
-            Long attenuation = payload.get(ATTENUATION).asLong();
+            Range<Double> range = roadmService.attenuationRange(deviceId, port, signal);
+            Double attenuation = payload.get(ATTENUATION).asDouble();
             boolean validAttenuation = range != null && range.contains(attenuation);
             if (validAttenuation) {
                 roadmService.setAttenuation(deviceId, port, signal, attenuation);
@@ -315,7 +315,7 @@
             ChannelSpacing spacing = channelSpacing((int) number(chNode, CHANNEL_SPACING_INDEX));
             int multiplier = (int) number(flowNode, CHANNEL_MULTIPLIER);
             OchSignal och = OchSignal.newDwdmSlot(spacing, multiplier);
-            long att = number(flowNode, ATTENUATION);
+            double att = number(flowNode, ATTENUATION);
 
             boolean showItems = deviceService.getDevice(did).type() != Type.FIBER_SWITCH;
             boolean validInPort = roadmService.validInputPort(did, inPort);
@@ -355,7 +355,7 @@
 
                 // Construct error for attenuation
                 if (!validAttenuation) {
-                    Range<Long> range = roadmService.attenuationRange(did, outPort, och);
+                    Range<Double> range = roadmService.attenuationRange(did, outPort, och);
                     if (range != null) {
                         attenuationMessage = String.format(ATTENUATION_ERR_MSG, range.toString());
                     }
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 7f1a559..191f608 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
@@ -189,7 +189,7 @@
 
 
     @Override
-    public void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, long power) {
+    public void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, double power) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
@@ -202,11 +202,11 @@
     }
 
     @Override
-    public Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double getTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         // Request target port power when it doesn't exist. Inactive updating mode.
-        Long power = roadmStore.getTargetPower(deviceId, portNumber);
+        Double power = roadmStore.getTargetPower(deviceId, portNumber);
         if (power == null) {
             return syncTargetPortPower(deviceId, portNumber);
         }
@@ -214,12 +214,12 @@
     }
 
     @Override
-    public Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double syncTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> pl = powerConfig.getTargetPower(portNumber, Direction.ALL);
+            Optional<Double> pl = powerConfig.getTargetPower(portNumber, Direction.ALL);
             if (pl.isPresent()) {
                 roadmStore.setTargetPower(deviceId, portNumber, pl.get());
                 return pl.get();
@@ -232,7 +232,7 @@
 
     @Override
     public void setAttenuation(DeviceId deviceId, PortNumber portNumber,
-                               OchSignal ochSignal, long attenuation) {
+                               OchSignal ochSignal, double attenuation) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
@@ -246,13 +246,13 @@
     }
 
     @Override
-    public Long getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Double getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> attenuation = powerConfig.getTargetPower(portNumber, ochSignal);
+            Optional<Double> attenuation = powerConfig.getTargetPower(portNumber, ochSignal);
             if (attenuation.isPresent()) {
                 return attenuation.get();
             }
@@ -261,12 +261,12 @@
     }
 
     @Override
-    public Long getCurrentPortPower(DeviceId deviceId, PortNumber portNumber) {
+    public Double getCurrentPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> currentPower = powerConfig.currentPower(portNumber, Direction.ALL);
+            Optional<Double> currentPower = powerConfig.currentPower(portNumber, Direction.ALL);
             if (currentPower.isPresent()) {
                 return currentPower.get();
             }
@@ -275,13 +275,13 @@
     }
 
     @Override
-    public Long getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Double getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Long> currentPower = powerConfig.currentPower(portNumber, ochSignal);
+            Optional<Double> currentPower = powerConfig.currentPower(portNumber, ochSignal);
             if (currentPower.isPresent()) {
                 return currentPower.get();
             }
@@ -375,8 +375,8 @@
 
     @Override
     public FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
-                                   int timeout, PortNumber inPort, PortNumber outPort,
-                                   OchSignal ochSignal, long attenuation) {
+                                 int timeout, PortNumber inPort, PortNumber outPort,
+                                 OchSignal ochSignal, Double attenuation) {
         checkNotNull(deviceId);
         checkNotNull(inPort);
         checkNotNull(outPort);
@@ -404,32 +404,32 @@
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             return range.isPresent();
         }
         return false;
     }
 
     @Override
-    public boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, long power) {
+    public boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, double power) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             return range.isPresent() && range.get().contains(power);
         }
         return false;
     }
 
     @Override
-    public boolean attenuationInRange(DeviceId deviceId, PortNumber outPort, long att) {
+    public boolean attenuationInRange(DeviceId deviceId, PortNumber outPort, double att) {
         checkNotNull(deviceId);
         checkNotNull(outPort);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
             OchSignal stubOch = OchSignal.newDwdmSlot(ChannelSpacing.CHL_50GHZ, 0);
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(outPort, stubOch);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(outPort, stubOch);
             return range.isPresent() && range.get().contains(att);
         }
         return false;
@@ -441,7 +441,7 @@
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
             return range.isPresent();
         }
         return false;
@@ -486,12 +486,12 @@
     }
 
     @Override
-    public Range<Long> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
+    public Range<Double> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -500,13 +500,13 @@
     }
 
     @Override
-    public Range<Long> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
+    public Range<Double> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         checkNotNull(ochSignal);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, ochSignal);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, ochSignal);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -515,12 +515,12 @@
     }
 
     @Override
-    public Range<Long> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
+    public Range<Double> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
         PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
         if (powerConfig != null) {
-            Optional<Range<Long>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getInputPowerRange(portNumber, Direction.ALL);
             if (range.isPresent()) {
                 return range.get();
             }
@@ -588,13 +588,13 @@
             return;
         }
 
-        Optional<Range<Long>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
+        Optional<Range<Double>> range = powerConfig.getTargetPowerRange(portNumber, Direction.ALL);
         if (!range.isPresent()) {
             log.warn("No target power range found for port {} on device {}", portNumber, deviceId);
             return;
         }
 
-        Long power = roadmStore.getTargetPower(deviceId, portNumber);
+        Double power = roadmStore.getTargetPower(deviceId, portNumber);
         if (power == null) {
             // Set default to middle of the range
             power = (range.get().lowerEndpoint() + range.get().upperEndpoint()) / 2;
@@ -615,9 +615,9 @@
 
         List<Port> ports = deviceService.getPorts(deviceId);
         for (Port port : ports) {
-            Optional<Range<Long>> range = powerConfig.getTargetPowerRange(port.number(), Direction.ALL);
+            Optional<Range<Double>> range = powerConfig.getTargetPowerRange(port.number(), Direction.ALL);
             if (range.isPresent()) {
-                Long power = roadmStore.getTargetPower(deviceId, port.number());
+                Double power = roadmStore.getTargetPower(deviceId, port.number());
                 if (power == null) {
                     // Set default to middle of the range
                     power = (range.get().lowerEndpoint() + range.get().upperEndpoint()) / 2;
@@ -633,7 +633,7 @@
     // Delay the call to setTargetPower because the flow may not be in the store yet
     // Tested with Lumentum ROADM-20 1 seconds was not enough, increased to 5 seconds
     private void delayedSetAttenuation(DeviceId deviceId, PortNumber outPort,
-                                       OchSignal ochSignal, long attenuation) {
+                                       OchSignal ochSignal, Double attenuation) {
         Runnable setAtt = () -> {
             try {
                 TimeUnit.SECONDS.sleep(5);
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 f0d0183..54d1a59 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
@@ -204,7 +204,7 @@
         // If the port is RX direction then acquire the input power range from driver.
         // Otherwise there will be a TX direction port, thus acquire the target power range.
         private String getPowerRange(DeviceId deviceId, PortNumber portNumber) {
-            Range<Long> range = roadmService.inputPortPowerRange(deviceId, portNumber);
+            Range<Double> range = roadmService.inputPortPowerRange(deviceId, portNumber);
             if (range == null) {
                 range = roadmService.targetPortPowerRange(deviceId, portNumber);
             }
@@ -213,7 +213,7 @@
 
         // Returns the current power as a string, Unknown if no value can be found.
         private String getCurrentPower(DeviceId deviceId, PortNumber portNumber) {
-            Long currentPower = roadmService.getCurrentPortPower(deviceId, portNumber);
+            Double currentPower = roadmService.getCurrentPortPower(deviceId, portNumber);
             return RoadmUtil.objectToString(currentPower, RoadmUtil.UNKNOWN);
         }
 
@@ -223,7 +223,7 @@
             if (!roadmService.hasPortTargetPower(deviceId, portNumber)) {
                 return RoadmUtil.NA;
             }
-            Long targetPower = roadmService.getTargetPortPower(deviceId, portNumber);
+            Double targetPower = roadmService.getTargetPortPower(deviceId, portNumber);
             return RoadmUtil.objectToString(targetPower, RoadmUtil.UNKNOWN);
         }
 
@@ -253,12 +253,12 @@
         public void process(ObjectNode payload) {
             DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
             PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
-            Range<Long> range = roadmService.targetPortPowerRange(deviceId, portNumber);
+            Range<Double> range = roadmService.targetPortPowerRange(deviceId, portNumber);
             if (range == null) {
                 log.warn("Unable to determine target power range for device {}", deviceId);
                 return;
             }
-            Long targetPower = payload.get(TARGET_POWER).asLong();
+            Double targetPower = payload.get(TARGET_POWER).asDouble();
             boolean validTargetPower = range.contains(targetPower);
             if (validTargetPower) {
                 roadmService.setTargetPortPower(deviceId, portNumber, targetPower);
@@ -284,7 +284,7 @@
         public void process(ObjectNode payload) {
             DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
             PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
-            Long targetPower = roadmService.syncTargetPortPower(deviceId, portNumber);
+            Double targetPower = roadmService.syncTargetPortPower(deviceId, portNumber);
             String power = RoadmUtil.objectToString(targetPower, RoadmUtil.UNKNOWN);
             ObjectNode rootNode = objectNode();
             rootNode.put(ID, payload.get(ID).asText())
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 d116391..7662626 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
@@ -91,7 +91,7 @@
      * @param portNumber PortNumber of the port to configure
      * @param power value to set target power to
      */
-    void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, long power);
+    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.
@@ -100,7 +100,7 @@
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
-    Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double getTargetPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Sync-up the target power for a port if the operator want to check the configuration.
@@ -108,7 +108,7 @@
      * @param portNumber PortNumber of the port to configure
      * @return the target power if the port has a target power, null otherwise
      */
-    Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double syncTargetPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Sets the attenuation of a connection. This does not check that attenuation
@@ -119,7 +119,7 @@
      * @param ochSignal channel to set attenuation for
      * @param attenuation attenuation value to set to
      */
-    void setAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal, long attenuation);
+    void setAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal, double attenuation);
 
     /**
      * Returns the attenuation of a connection.
@@ -129,7 +129,7 @@
      * @param ochSignal channel to search for
      * @return attenuation if found, null otherwise
      */
-    Long getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Double getAttenuation(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the current port power.
@@ -138,7 +138,7 @@
      * @param portNumber PortNumber of the port
      * @return current power if found, null otherwise
      */
-    Long getCurrentPortPower(DeviceId deviceId, PortNumber portNumber);
+    Double getCurrentPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Returns the current channel power.
@@ -148,7 +148,7 @@
      * @param ochSignal channel to search for
      * @return channel power if found, null otherwise
      */
-    Long getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Double getCurrentChannelPower(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the channels supported by a port.
@@ -217,7 +217,7 @@
      */
     FlowId createConnection(DeviceId deviceId, int priority, boolean isPermanent,
                           int timeout, PortNumber inPort, PortNumber outPort,
-                          OchSignal ochSignal, long attenuation);
+                          OchSignal ochSignal, Double attenuation);
 
     /**
      * Removes an internal connection from a device by matching the FlowId and
@@ -250,7 +250,7 @@
      * @return true if value is within the acceptable target power range, false
      * otherwise
      */
-    boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, long power);
+    boolean portTargetPowerInRange(DeviceId deviceId, PortNumber portNumber, double power);
 
     /**
      * Returns true if value is within the acceptable attenuation range of a
@@ -264,7 +264,7 @@
      * @return true if value is within the acceptable attenuation range, false
      * otherwise
      */
-    boolean attenuationInRange(DeviceId deviceId, PortNumber portNumber, long att);
+    boolean attenuationInRange(DeviceId deviceId, PortNumber portNumber, double att);
 
     /**
      * Returns true if the port is an input port.
@@ -324,7 +324,7 @@
      * @param portNumber PortNumber of the port
      * @return range if found, null otherwise
      */
-    Range<Long> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber);
+    Range<Double> targetPortPowerRange(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Returns the acceptable attenuation range for a connection.
@@ -334,7 +334,7 @@
      * @param ochSignal channel to check
      * @return range if found, null otherwise
      */
-    Range<Long> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
+    Range<Double> attenuationRange(DeviceId deviceId, PortNumber portNumber, OchSignal ochSignal);
 
     /**
      * Returns the expected input power range for an input port.
@@ -343,5 +343,5 @@
      * @param portNumber PortNumber of an input port
      * @return range if found, null otherwise
      */
-    Range<Long> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber);
+    Range<Double> inputPortPowerRange(DeviceId deviceId, PortNumber portNumber);
 }
diff --git a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
index 6c7abac..764131b 100644
--- a/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
+++ b/apps/roadm/app/src/main/java/org/onosproject/roadm/RoadmStore.java
@@ -52,7 +52,7 @@
      * @param portNumber PortNumber of the port
      * @param targetPower target port power to store
      */
-    void setTargetPower(DeviceId deviceId, PortNumber portNumber, long targetPower);
+    void setTargetPower(DeviceId deviceId, PortNumber portNumber, double targetPower);
 
     /**
      * Returns the targetPower for a port on a device. The device needs to be added
@@ -63,7 +63,7 @@
      * @param portNumber PortNumber of the port
      * @return target power if target power has already been set, null otherwise
      */
-    Long getTargetPower(DeviceId deviceId, PortNumber portNumber);
+    Double getTargetPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
      * Remove the targetPower for a port on a device. The power value is removed,
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 79e2fb5..db86b57 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
@@ -67,8 +67,8 @@
                     <td colId="name">Name</td>
                     <td colId="type">Type</td>
                     <td colId="enabled">Enabled</td>
-                    <td colId="minFreq">Min Freq (GHz)</td>
-                    <td colId="maxFreq">Max Freq (GHz)</td>
+                    <td colId="minFreq">Min Freq (THz)</td>
+                    <td colId="maxFreq">Max Freq (THz)</td>
                     <td colId="grid">Grid (GHz)</td>
                     <td colId="modulation">Modulation</td>
                     <td colId="powerRange">Power Range (dBm)</td>
@@ -105,10 +105,10 @@
                         </form>
                     </td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.powerRange}}</td>
-                    <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.currentPower}}</td>
+                    <td [ngClass]="(isDelta() ? 'delta' : '')">{{port.currentPower | number: '1.2-2'}}</td>
                     <td [ngClass]="(isDelta() ? 'delta' : '')">
                         <form [formGroup]="powerForm" (ngSubmit)="submitPower(devId, port.id)" *ngIf="port.type=='OCH'">
-                            <input type="number" step="any" style="width:50px" value="{{port.targetPower}}" formControlName="newPower" required>
+                            <input type="number" step="any" style="width:50px" value="{{port.targetPower | number: '1.2-2'}}" formControlName="newPower" required>
                             <button type="submit">Submit</button>
                         </form>
                     </td>
diff --git a/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java b/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
index 817bba8..901cd21 100644
--- a/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/PowerConfigCommand.java
@@ -58,7 +58,7 @@
 
     @Argument(index = 2, name = "value", description = "target-output-power value. Unit: dBm",
             required = false, multiValued = false)
-    private Long value = null;
+    private Double value = null;
 
     @Override
     protected void doExecute() throws Exception {
@@ -81,28 +81,28 @@
         // FIXME the parameter "component" equals NULL now, because there is one-to-one mapping between
         //  <component> and <optical-channel>.
         if (operation.equals("get")) {
-            Optional<Long> val = powerConfig.getTargetPower(cp.port(), Direction.ALL);
+            Optional<Double> val = powerConfig.getTargetPower(cp.port(), Direction.ALL);
             if (val.isPresent()) {
-                long power = val.orElse(Long.MIN_VALUE);
-                print("The target-output-power value in port %s on device %s is %d.",
+                double power = val.orElse(Double.MIN_VALUE);
+                print("The target-output-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), power);
             }
-            Optional<Long> currentPower = powerConfig.currentPower(cp.port(), Direction.ALL);
+            Optional<Double> currentPower = powerConfig.currentPower(cp.port(), Direction.ALL);
             if (currentPower.isPresent()) {
-                long currentPowerVal = currentPower.orElse(Long.MIN_VALUE);
-                print("The current-output-power value in port %s on device %s is %d.",
+                double currentPowerVal = currentPower.orElse(Double.MIN_VALUE);
+                print("The current-output-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), currentPowerVal);
             }
-            Optional<Long> currentInputPower = powerConfig.currentInputPower(cp.port(), Direction.ALL);
+            Optional<Double> currentInputPower = powerConfig.currentInputPower(cp.port(), Direction.ALL);
             if (currentInputPower.isPresent()) {
-                long inputPowerVal = currentInputPower.orElse(Long.MIN_VALUE);
-                print("The current-input-power value in port %s on device %s is %d.",
+                double inputPowerVal = currentInputPower.orElse(Double.MIN_VALUE);
+                print("The current-input-power value in port %s on device %s is %f.",
                         cp.port().toString(), cp.deviceId().toString(), inputPowerVal);
             }
         } else if (operation.equals("edit-config")) {
             checkNotNull(value);
             powerConfig.setTargetPower(cp.port(), Direction.ALL, value);
-            print("Set %s power on port", value, connectPoint);
+            print("Set %f power on port", value, connectPoint);
         } else {
             print("Operation %s are not supported now.", operation);
         }
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
index 92bfba6..7e04198 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/PowerConfig.java
@@ -43,7 +43,7 @@
      * @param component the port component
      * @return target power in .01 dBm
      */
-    Optional<Long> getTargetPower(PortNumber port, T component);
+    Optional<Double> getTargetPower(PortNumber port, T component);
 
     /**
      * Set the target power on the component.
@@ -52,7 +52,7 @@
      * @param component the port component
      * @param power target power in .01 dBm
      */
-    void setTargetPower(PortNumber port, T component, long power);
+    void setTargetPower(PortNumber port, T component, double power);
 
     /**
      * Get the current output power on the component.
@@ -61,7 +61,7 @@
      * @param component the port component
      * @return power power in .01 dBm
      */
-    Optional<Long> currentPower(PortNumber port, T component);
+    Optional<Double> currentPower(PortNumber port, T component);
 
     /**
      * Get the current input power on the component.
@@ -69,7 +69,7 @@
      * @param component the port component
      * @return power in .01 dBm
      */
-    default Optional<Long> currentInputPower(PortNumber port, T component)  {
+    default Optional<Double> currentInputPower(PortNumber port, T component)  {
         return Optional.empty();
     }
 
@@ -82,7 +82,7 @@
      * @return the accepted target power range, null if the component's power is
      * not configurable. For example the port target power can only be set on TX ports.
      */
-    default Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    default Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         return Optional.empty();
     }
 
@@ -96,7 +96,7 @@
      * a specified input power range. For example input power range only applies
      * to RX ports.
      */
-    default Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    default Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         return Optional.empty();
     }
 
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
index 7bc44c6..f495a21 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumPowerConfig.java
@@ -46,13 +46,13 @@
 
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         return Optional.ofNullable(acquireTargetPower(port, component));
     }
 
     //Used by the ROADM app to set the "attenuation" parameter
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             setConnectionTargetPower(port, (OchSignal) component, power);
         } else {
@@ -61,12 +61,12 @@
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         return Optional.ofNullable(acquireCurrentPower(port, component));
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber portNumber, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber portNumber, T component) {
 
         log.debug("Lumentum getTargetPowerRange {}", portNumber);
         //TODO automatically read if a port is input or output
@@ -87,7 +87,7 @@
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber portNumber, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber portNumber, T component) {
 
         log.debug("Lumentum getInputPowerRange {}", portNumber);
         //TODO automatically read if a port is input or output
@@ -110,7 +110,7 @@
     //TODO implement actual get configuration from the device
     //This is used by ROADM application to retrieve attenuation parameter, with T instanceof OchSignal
     //The ROADM app expresses the attenuation in 0.01 dB units
-    private Long acquireTargetPower(PortNumber port, T component) {
+    private Double acquireTargetPower(PortNumber port, T component) {
         log.debug("Lumentum get port {} target power...", port);
 
         if (component instanceof OchSignal) {
@@ -120,7 +120,7 @@
 
             if (rules == null) {
                 log.error("Lumentum NETCONF fail to retrieve attenuation signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 rule = rules.stream()
                         .filter(c -> ((LumentumFlowRule) c).getOutputPort() == port)
@@ -131,20 +131,20 @@
 
             if (rule == null) {
                 log.error("Lumentum NETCONF fail to retrieve attenuation signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 log.debug("Lumentum NETCONF on port {} attenuation {}", port,
                         (((LumentumFlowRule) rule).attenuation * 100));
-                return ((long) (((LumentumFlowRule) rule).attenuation * 100));
+                return ((LumentumFlowRule) rule).attenuation * 100;
             }
         }
 
-        return 0L;
+        return 0.0;
     }
 
     //TODO implement actual get configuration from the device
     //This is used by ROADM application to retrieve power parameter, with T instanceof OchSignal
-    private Long acquireCurrentPower(PortNumber port, T component) {
+    private Double acquireCurrentPower(PortNumber port, T component) {
         log.debug("Lumentum get port {} current power...", port);
 
         if (component instanceof OchSignal) {
@@ -154,7 +154,7 @@
 
             if (rules == null) {
                 log.error("Lumentum NETCONF fail to retrieve power signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 rule = rules.stream()
                         .filter(c -> ((LumentumFlowRule) c).getInputPort() == port)
@@ -165,38 +165,38 @@
 
             if (rule == null) {
                 log.error("Lumentum NETCONF fail to retrieve power signal {} port {}", component, port);
-                return 0L;
+                return 0.0;
             } else {
                 log.debug("Lumentum NETCONF on port {} power {}", port, (((LumentumFlowRule) rule).inputPower));
-                return ((long) (((LumentumFlowRule) rule).inputPower * 100));
+                return ((double) (((LumentumFlowRule) rule).inputPower * 100));
             }
         }
 
-        return 0L;
+        return 0.0;
     }
 
     //TODO implement actual get configuration from the device
     //Return PowerRange -60 dBm to 60 dBm
-    private Range<Long> getTxPowerRange(PortNumber port, T component) {
+    private Range<Double> getTxPowerRange(PortNumber port, T component) {
         log.debug("Get port {} tx power range...", port);
-        return Range.closed(-60L, 60L);
+        return Range.closed(-60.0, 60.0);
     }
 
     //TODO implement actual get configuration from the device
     //Return PowerRange -60dBm to 60 dBm
-    private Range<Long> getRxPowerRange(PortNumber port, T component) {
+    private Range<Double> getRxPowerRange(PortNumber port, T component) {
         log.debug("Get port {} rx power range...", port);
-        return Range.closed(-60L, 60L);
+        return Range.closed(-60.0, 60.0);
     }
 
     //TODO implement configuration on the device
     //Nothing to do
-    private void setPortTargetPower(PortNumber port, long power) {
+    private void setPortTargetPower(PortNumber port, double power) {
         log.debug("Set port {} target power {}", port, power);
     }
 
     //Used by the ROADM app to set the "attenuation" parameter
-    private void setConnectionTargetPower(PortNumber port, OchSignal signal, long power) {
+    private void setConnectionTargetPower(PortNumber port, OchSignal signal, double power) {
         log.debug("Set connection target power {} ochsignal {} port {}", power, signal, port);
 
         Set<FlowRule> rules = getConnectionCache().get(did());
@@ -231,7 +231,7 @@
 
     //Following Lumentum documentation <edit-config> operation to edit connection parameter
     //Currently only edit the "attenuation" parameter
-    private boolean editConnection(int moduleId, int connectionId, long attenuation) {
+    private boolean editConnection(int moduleId, int connectionId, double attenuation) {
 
         double attenuationDouble = ((double) attenuation);
 
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 7b312bf..24251e6 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
@@ -58,8 +58,6 @@
 
     private static final String RPC_CLOSE_TAG = "</rpc>";
 
-    private static final long NO_POWER = -50;
-
     private static final Logger log = getLogger(CassiniTerminalDevicePowerConfig.class);
 
     private ComponentType state = ComponentType.DIRECTION;
@@ -122,37 +120,37 @@
      * @return target power value
      */
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPower(port, component);
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         checkState(component);
         state.setTargetPower(port, component, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         checkState(component);
         return state.currentPower(port, component);
     }
 
     @Override
-    public Optional<Long> currentInputPower(PortNumber port, T component) {
+    public Optional<Double> currentInputPower(PortNumber port, T component) {
         checkState(component);
         return state.currentInputPower(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPowerRange(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getInputPowerRange(port, component);
     }
@@ -195,12 +193,12 @@
          */
         DIRECTION() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         },
@@ -210,12 +208,12 @@
          */
         OCHSIGNAL() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         };
@@ -230,7 +228,7 @@
          * @param component component
          * @return target power
          */
-        Optional<Long> getTargetPower(PortNumber port, Object component) {
+        Optional<Double> getTargetPower(PortNumber port, Object component) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String filter = parsePort(cassini, port, null, null);
@@ -253,7 +251,10 @@
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/config");
-                long power = Float.valueOf(config.getString("target-output-power")).longValue();
+                if (config == null || config.getString("target-output-power") == null) {
+                    return Optional.empty();
+                }
+                double power = Float.valueOf(config.getString("target-output-power")).doubleValue();
                 return Optional.of(power);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -267,7 +268,7 @@
          * @param component component
          * @param power     target value
          */
-        void setTargetPower(PortNumber port, Object component, long power) {
+        void setTargetPower(PortNumber port, Object component, double power) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String editConfig = parsePort(cassini, port, null, power);
@@ -301,13 +302,16 @@
          * @param component the component.
          * @return current output power.
          */
-        Optional<Long> currentPower(PortNumber port, Object component) {
+        Optional<Double> currentPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<output-power><instant/></output-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/output-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                if (config == null || config.getString("instant") == null) {
+                    return Optional.empty();
+                }
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -321,28 +325,31 @@
          * @param component the component
          * @return current input power
          */
-        Optional<Long> currentInputPower(PortNumber port, Object component) {
+        Optional<Double> currentInputPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power><instant/></input-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                if (config == null || config.getString("instant") == null) {
+                    return Optional.empty();
+                }
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
             }
         }
 
-        Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-            long targetMin = -30;
-            long targetMax = 1;
+        Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+            double targetMin = -30;
+            double targetMax = 1;
             return Optional.of(Range.open(targetMin, targetMax));
         }
 
-        Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-            long targetMin = -30;
-            long targetMax = 1;
+        Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+            double targetMin = -30;
+            double targetMax = 1;
             return Optional.of(Range.open(targetMin, targetMax));
         }
 
@@ -409,7 +416,7 @@
          * @return filtering string in xml format
          */
         private static String parsePort(CassiniTerminalDevicePowerConfig pc, PortNumber portNumber,
-                                        Object component, Long power) {
+                                        Object component, Double power) {
             if (component == null) {
                 String name = ocName(pc, portNumber);
                 StringBuilder sb = new StringBuilder("<components xmlns=\"http://openconfig.net/yang/platform\">");
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
index 0029fff..b823e0c 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/CassiniTerminalDevicePowerConfigExt.java
@@ -56,7 +56,7 @@
 
     private static final String RPC_CLOSE_TAG = "</rpc>";
 
-    private static final long NO_POWER = -50;
+    private static final double NO_POWER = -50;
 
     private static final Logger log = getLogger(CassiniTerminalDevicePowerConfigExt.class);
 
@@ -119,37 +119,37 @@
      * @return target power value
      */
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPower(port, component);
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         checkState(component);
         state.setTargetPower(port, component, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         checkState(component);
         return state.currentPower(port, component);
     }
 
     @Override
-    public Optional<Long> currentInputPower(PortNumber port, T component) {
+    public Optional<Double> currentInputPower(PortNumber port, T component) {
         checkState(component);
         return state.currentInputPower(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getTargetPowerRange(port, component);
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         checkState(component);
         return state.getInputPowerRange(port, component);
     }
@@ -191,11 +191,11 @@
          */
         DIRECTION() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         },
@@ -205,12 +205,12 @@
          */
         OCHSIGNAL() {
             @Override
-            public Optional<Long> getTargetPower(PortNumber port, Object component) {
+            public Optional<Double> getTargetPower(PortNumber port, Object component) {
                 return super.getTargetPower(port, component);
             }
 
             @Override
-            public void setTargetPower(PortNumber port, Object component, long power) {
+            public void setTargetPower(PortNumber port, Object component, double power) {
                 super.setTargetPower(port, component, power);
             }
         };
@@ -225,7 +225,7 @@
          * @param component component
          * @return target power
          */
-        Optional<Long> getTargetPower(PortNumber port, Object component) {
+        Optional<Double> getTargetPower(PortNumber port, Object component) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String filter = parsePort(cassini, port, null, null);
@@ -241,7 +241,7 @@
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/config");
-                long power = Float.valueOf(config.getString("target-output-power")).longValue();
+                double power = Float.valueOf(config.getString("target-output-power")).doubleValue();
                 return Optional.of(power);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -254,7 +254,7 @@
          * @param component component
          * @param power target value
          */
-        void setTargetPower(PortNumber port, Object component, long power) {
+        void setTargetPower(PortNumber port, Object component, double power) {
             NetconfSession session = cassini.getNetconfSession(cassini.did());
             checkNotNull(session);
             String editConfig = parsePort(cassini, port, null, power);
@@ -281,13 +281,13 @@
          * @param component the component.
          * @return current output power.
          */
-        Optional<Long> currentPower(PortNumber port, Object component) {
+        Optional<Double> currentPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                                     cassini, port, "<output-power><instant/></output-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/output-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -300,27 +300,27 @@
          * @param component the component
          * @return current input power
          */
-        Optional<Long> currentInputPower(PortNumber port, Object component) {
+        Optional<Double> currentInputPower(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power><instant/></input-power>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power");
-                long currentPower = Float.valueOf(config.getString("instant")).longValue();
+                double currentPower = Float.valueOf(config.getString("instant")).doubleValue();
                 return Optional.of(currentPower);
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
             }
         }
 
-        Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
+        Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<target-power-range/>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/target-power-range");
-                long targetMin = Float.valueOf(config.getString("min")).longValue();
-                long targetMax = Float.valueOf(config.getString("max")).longValue();
+                double targetMin = Float.valueOf(config.getString("min")).doubleValue();
+                double targetMax = Float.valueOf(config.getString("max")).doubleValue();
                 return Optional.of(Range.open(targetMin, targetMax));
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -328,14 +328,14 @@
 
         }
 
-        Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
+        Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
             XMLConfiguration xconf = getOpticalChannelState(
                     cassini, port, "<input-power-range/>");
             try {
                 HierarchicalConfiguration config =
                         xconf.configurationAt("data/components/component/optical-channel/state/input-power-range");
-                long inputMin = Float.valueOf(config.getString("min")).longValue();
-                long inputMax = Float.valueOf(config.getString("max")).longValue();
+                double inputMin = Float.valueOf(config.getString("min")).doubleValue();
+                double inputMax = Float.valueOf(config.getString("max")).doubleValue();
                 return Optional.of(Range.open(inputMin, inputMax));
             } catch (IllegalArgumentException e) {
                 return Optional.empty();
@@ -395,7 +395,7 @@
          * @return filtering string in xml format
          */
         private static String parsePort(CassiniTerminalDevicePowerConfigExt pc, PortNumber portNumber,
-                                        Object component, Long power) {
+                                        Object component, Double power) {
             if (component == null) {
                 String name = ocName(pc, portNumber);
                 StringBuilder sb = new StringBuilder("<components xmlns=\"http://openconfig.net/yang/platform\">");
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
index 110096c..dba2f6f 100644
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
@@ -69,38 +69,54 @@
     private static final Logger log = getLogger(OplinkOpticalPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
-            setChannelTargetPower(port, (OchSignal) component, power);
+            setChannelTargetPower(port, (OchSignal) component, (long) power);
         } else {
-            setPortTargetPower(port, power);
+            setPortTargetPower(port, (long) power);
         }
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     private String getPortPowerFilter(PortNumber port, String selection) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
                 .append(xmlEmpty(selection))
                 .append(xmlClose(KEY_PORT))
@@ -112,7 +128,7 @@
     private String getChannelPowerFilter(PortNumber port, OchSignal channel) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_OCMS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_OCMSTATS))
                 .append(xml(KEY_CHNUM, Integer.toString(channel.spacingMultiplier())))
                 .append(xmlEmpty(KEY_CHSTATS))
@@ -135,7 +151,7 @@
     private String getPowerRangeFilter(PortNumber port, String direction) {
         return new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
                 .append(xml(KEY_PORTDIRECT, direction))
                 .append(xmlEmpty(KEY_PORTPROPERTY))
@@ -194,9 +210,9 @@
         log.debug("Set port{} target power...", port);
         String cfg = new StringBuilder(xmlOpen(KEY_OPENOPTICALDEV_XMLNS))
                 .append(xmlOpen(KEY_PORTS))
-                .append(xml(KEY_PORTID, Long.toString(port.toLong())))
+                .append(xml(KEY_PORTID, Double.toString(port.toLong())))
                 .append(xmlOpen(KEY_PORT))
-                .append(xml(KEY_PORTTARPWR, Long.toString(power)))
+                .append(xml(KEY_PORTTARPWR, Double.toString(power)))
                 .append(xmlClose(KEY_PORT))
                 .append(xmlClose(KEY_PORTS))
                 .append(xmlClose(KEY_OPENOPTICALDEV))
@@ -209,7 +225,7 @@
         FlowRuleService service = handler().get(FlowRuleService.class);
         Iterable<FlowEntry> entries = service.getFlowEntries(data().deviceId());
         for (FlowEntry entry : entries) {
-            OplinkCrossConnect crossConnect  = OplinkOpticalUtility.fromFlowRule(this, entry);
+            OplinkCrossConnect crossConnect = OplinkOpticalUtility.fromFlowRule(this, entry);
             // The channel port might be input port or output port.
             if ((port.equals(crossConnect.getInPort()) || port.equals(crossConnect.getOutPort())) &&
                     channel.spacingMultiplier() == crossConnect.getChannel()) {
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
index 6aabf17..762d1be 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkEdfaPowerConfig.java
@@ -25,40 +25,55 @@
 
 /**
  * Port Power (Gain and attenuation) implementation for Oplink EDFA device.
- *
+ * <p>
  * An Oplink EDFA port exposes Direction resources.
  * Set gain(attenuation) at AGC mode or set output level at APC mode.
- *
  */
 
 public class OplinkEdfaPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
     // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        oplinkUtil.setTargetPower(port, component, power);
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
index 157ec8a..b750bf1 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkRoadmPowerConfig.java
@@ -25,40 +25,54 @@
 
 /**
  * Port Power (Gain and attenuation) implementation for Oplink 1-SLOT-8D ROADM.
- *
+ * <p>
  * An Oplink ROADM port exposes OchSignal resources.
  * Optical Power can be set at port level or channel/wavelength level (attenuation).
- *
  */
 
 public class OplinkRoadmPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
-    // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        oplinkUtil.setTargetPower(port, component, power);
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
index 2946fb1..ab7b8e5 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/power/OplinkSwitchPowerConfig.java
@@ -25,50 +25,65 @@
 
 /**
  * Port Power implementation for Oplink protection switch device.
- *
+ * <p>
  * Intruduction:
- *                                       _____
- *             _____________________    |     | 0  VIRTUAL
- *            |                     |   |  1  |
- *   CLIENT   |                     |---|-----|--- PRIMARY
+ * _____
+ * _____________________    |     | 0  VIRTUAL
+ * |                     |   |  1  |
+ * CLIENT   |                     |---|-----|--- PRIMARY
  * -----------|         OPS         |   |     |                NETWORK
- *      3     |                     |---|-----|--- SECONDARY
- *            |_____________________|   |  2  |
- *                                      |_____|
+ * 3     |                     |---|-----|--- SECONDARY
+ * |_____________________|   |  2  |
+ * |_____|
  * Uses flow to set switch path.
  * network port = 0, client port = 3, AUTO mode.
  * network port = 1 or 2, client port = 3, MANUAL mode.
- *
  */
 
 public class OplinkSwitchPowerConfig extends AbstractHandlerBehaviour
-                                    implements PowerConfig<Object> {
+        implements PowerConfig<Object> {
 
     // oplink power config utility
     private OplinkPowerConfigUtil oplinkUtil = new OplinkPowerConfigUtil(this);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, Object component) {
-        return Optional.ofNullable(null);
+    public Optional<Double> getTargetPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getTargetPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, Object component) {
+        Long power = oplinkUtil.getCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, Object component, long power) {
-        return;
+    public void setTargetPower(PortNumber port, Object component, double power) {
+        oplinkUtil.setTargetPower(port, component, (long) power);
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getTargetPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getTargetPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, Object component) {
-        return Optional.ofNullable(oplinkUtil.getInputPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, Object component) {
+        Range<Long> power = oplinkUtil.getInputPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 }
diff --git a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
index 61a3727..05df59a 100644
--- a/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
+++ b/drivers/polatis/netconf/src/main/java/org/onosproject/drivers/polatis/netconf/PolatisPowerConfig.java
@@ -58,7 +58,7 @@
  * Set target port power or channel attenuation to an optical netconf device.
  */
 public class PolatisPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final String KEY_POWER = "power";
     private static final String KEY_ATTEN_LEVEL = "atten-level";
@@ -68,32 +68,48 @@
     private static final Logger log = getLogger(PolatisPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             log.warn("Channel power is not applicable.");
             return;
         }
-        setPortTargetPower(port, power);
+        setPortTargetPower(port, (long) power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
diff --git a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
index 2255ba0..9ac2504 100644
--- a/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
+++ b/drivers/polatis/openflow/src/main/java/org/onosproject/drivers/polatis/openflow/OpenFlowPowerConfig.java
@@ -53,12 +53,12 @@
  * Set target port power or channel attenuation to an openflow device.
  */
 public class OpenFlowPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final Logger log = getLogger(OpenFlowPowerConfig.class);
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
         // TODO: OpenFlow does not seem to have the concept of retrieving this
         // information as only the current power is returned in the port stats
         // reply. This can be different from the configured value. Perhaps, the
@@ -68,12 +68,12 @@
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         setPortTargetPower(port, power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
+    public Optional<Double> currentPower(PortNumber port, T component) {
         // TODO: Ideally, this needs to read the port stats output for real-time
         // data or as a short-term workaround, it could get the last read value
         // from the port stats polling.
@@ -81,14 +81,14 @@
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
         for (OFPortDesc pd : getPortDescs()) {
             if (pd.getPortNo().getPortNumber() == port.toLong()) {
                 for (OFPortDescProp prop : pd.getProperties()) {
                     if (prop instanceof OFPortDescPropOptical) {
                         OFPortDescPropOptical oprop = (OFPortDescPropOptical) prop;
-                        long txMin = oprop.getTxPwrMin();
-                        long txMax = oprop.getTxPwrMax();
+                        double txMin = oprop.getTxPwrMin();
+                        double txMax = oprop.getTxPwrMax();
                         return Optional.of(Range.closed(txMin, txMax));
                     }
                 }
@@ -104,7 +104,7 @@
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
         log.warn("Unsupported as OpenFlow does not seem to have the concept of input (presumably rx) power range.");
         return Optional.empty();
     }
@@ -129,7 +129,7 @@
     }
 
     private OFPortMod.Builder makePortMod(OpenFlowSwitch sw, PortNumber portNumber,
-                                boolean enable) {
+                                          boolean enable) {
         OFPortMod.Builder pmb = sw.factory().buildPortMod();
         OFPort port = OFPort.of((int) portNumber.toLong());
         pmb.setPortNo(port);
@@ -151,7 +151,7 @@
         return pmb;
     }
 
-    private boolean setPortTargetPower(PortNumber port, long power) {
+    private boolean setPortTargetPower(PortNumber port, double power) {
         DeviceId deviceId = handler().data().deviceId();
         final Dpid dpid = dpid(deviceId.uri());
         OpenFlowSwitch sw = handler().get(OpenFlowController.class).getSwitch(dpid);
@@ -167,9 +167,9 @@
             }
         }
         OFPortMod.Builder pmb = makePortMod(sw, port, enable);
-        long configure = OFOpticalPortFeaturesSerializerVer14.TX_PWR_VAL;
+        double configure = OFOpticalPortFeaturesSerializerVer14.TX_PWR_VAL;
         OFPortModPropOptical.Builder property = sw.factory().buildPortModPropOptical();
-        property.setTxPwr(power);
+        property.setTxPwr((long) power);
 
         List<OFPortModProp> properties = new ArrayList<>();
         properties.add(property.build());
diff --git a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
index 4de4a88..4a3b749 100644
--- a/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
+++ b/drivers/polatis/snmp/src/main/java/org/onosproject/drivers/polatis/snmp/PolatisPowerConfig.java
@@ -50,7 +50,7 @@
  * Set target port power or channel attenuation to an optical snmp device.
  */
 public class PolatisPowerConfig<T> extends AbstractHandlerBehaviour
-    implements PowerConfig<T> {
+        implements PowerConfig<T> {
 
     private static final int VOA_STATE_ABSOLUTE = 2;
 
@@ -64,32 +64,48 @@
     private final Logger log = getLogger(getClass());
 
     @Override
-    public Optional<Long> getTargetPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireTargetPower(port, component));
+    public Optional<Double> getTargetPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public void setTargetPower(PortNumber port, T component, long power) {
+    public void setTargetPower(PortNumber port, T component, double power) {
         if (component instanceof OchSignal) {
             log.warn("Channel power is not applicable.");
             return;
         }
-        setPortTargetPower(port, power);
+        setPortTargetPower(port, (long) power);
     }
 
     @Override
-    public Optional<Long> currentPower(PortNumber port, T component) {
-        return Optional.ofNullable(acquireCurrentPower(port, component));
+    public Optional<Double> currentPower(PortNumber port, T component) {
+        Long power = acquireCurrentPower(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(power.doubleValue());
     }
 
     @Override
-    public Optional<Range<Long>> getTargetPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getTxPowerRange(port, component));
+    public Optional<Range<Double>> getTargetPowerRange(PortNumber port, T component) {
+        Range<Long> power = getTxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
-    public Optional<Range<Long>> getInputPowerRange(PortNumber port, T component) {
-        return Optional.ofNullable(getRxPowerRange(port, component));
+    public Optional<Range<Double>> getInputPowerRange(PortNumber port, T component) {
+        Range<Long> power = getRxPowerRange(port, component);
+        if (power == null) {
+            return Optional.empty();
+        }
+        return Optional.of(Range.closed((double) power.lowerEndpoint(), (double) power.upperEndpoint()));
     }
 
     @Override
@@ -158,7 +174,7 @@
         DeviceId deviceId = handler().data().deviceId();
         Long targetPower = 0L;
         try {
-          targetPower = Long.valueOf(get(handler(), VOA_LEVEL_OID + "." + port.toLong()).toInt());
+            targetPower = Long.valueOf(get(handler(), VOA_LEVEL_OID + "." + port.toLong()).toInt());
         } catch (IOException e) {
             log.error("Error reading target power for device {} exception {}", deviceId, e);
         }
@@ -175,7 +191,7 @@
         DeviceId deviceId = handler().data().deviceId();
         Long power = 0L;
         try {
-          power = Long.valueOf(get(handler(), OPM_POWER_OID + "." + port.toLong()).toInt());
+            power = Long.valueOf(get(handler(), OPM_POWER_OID + "." + port.toLong()).toInt());
         } catch (IOException e) {
             log.error("Error reading current power for device {} exception {}", deviceId, e);
         }
