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()) {
