diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index 1931e8c..3c9b71d 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -22,6 +22,8 @@
 import static org.onosproject.net.MastershipRole.MASTER;
 import static org.onosproject.net.MastershipRole.NONE;
 import static org.onosproject.net.MastershipRole.STANDBY;
+import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
+import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription;
 import static org.onosproject.security.AppGuard.checkPermission;
 import static org.onosproject.security.AppPermission.Type.DEVICE_READ;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -74,8 +76,14 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceStore;
 import org.onosproject.net.device.DeviceStoreDelegate;
+import org.onosproject.net.device.OchPortDescription;
+import org.onosproject.net.device.OduCltPortDescription;
+import org.onosproject.net.device.OmsPortDescription;
+import org.onosproject.net.device.OtuPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.device.PortStatistics;
+import org.onosproject.net.optical.device.OmsPortHelper;
+import org.onosproject.net.optical.device.OtuPortHelper;
 import org.onosproject.net.provider.AbstractListenerProviderRegistry;
 import org.onosproject.net.provider.AbstractProviderService;
 import org.slf4j.Logger;
@@ -420,6 +428,60 @@
             }
         }
 
+        /**
+         * Transforms optical specific PortDescription to generic PortDescription.
+         *
+         * @param descr PortDescription
+         * @return generic PortDescription
+         * @deprecated in Goldeneye (1.6.0)
+         */
+        @Deprecated
+        private PortDescription ensureGeneric(PortDescription descr) {
+            switch (descr.type()) {
+            case OCH:
+                if (descr instanceof OchPortDescription) {
+                    OchPortDescription och = (OchPortDescription) descr;
+                    return ochPortDescription(och,
+                                              och.signalType(),
+                                              och.isTunable(),
+                                              och.lambda(),
+                                              och.annotations());
+                }
+                break;
+            case ODUCLT:
+                if (descr instanceof OduCltPortDescription) {
+                    OduCltPortDescription clt = (OduCltPortDescription) descr;
+                    return oduCltPortDescription(clt,
+                                                 clt.signalType(),
+                                                 clt.annotations());
+                }
+                break;
+            case OMS:
+                if (descr instanceof OmsPortDescription) {
+                    OmsPortDescription oms = (OmsPortDescription) descr;
+                    return OmsPortHelper.omsPortDescription(oms,
+                                                            oms.minFrequency(),
+                                                            oms.maxFrequency(),
+                                                            oms.grid(),
+                                                            oms.annotations());
+                }
+                break;
+            case OTU:
+                if (descr instanceof OtuPortDescription) {
+                    OtuPortDescription otu = (OtuPortDescription) descr;
+                    return OtuPortHelper.otuPortDescription(otu,
+                                                            otu.signalType(),
+                                                            otu.annotations());
+                }
+                break;
+
+            default:
+                // no-op
+                break;
+            }
+            return descr;
+        }
+
         @Override
         public void updatePorts(DeviceId deviceId,
                                 List<PortDescription> portDescriptions) {
@@ -434,6 +496,7 @@
             }
             portDescriptions = portDescriptions.stream()
                     .map(e -> consolidate(deviceId, e))
+                    .map(this::ensureGeneric)
                     .collect(Collectors.toList());
             List<DeviceEvent> events = store.updatePorts(this.provider().id(),
                                                          deviceId, portDescriptions);
@@ -462,12 +525,14 @@
             if ((Device.Type.ROADM.equals(device.type())) ||
                 (Device.Type.OTN.equals(device.type()))) {
                 Port port = getPort(deviceId, portDescription.portNumber());
+                // FIXME This is ignoring all other info in portDescription given as input??
                 portDescription = OpticalPortOperator.descriptionOf(port, portDescription.isEnabled());
             }
 
             portDescription = consolidate(deviceId, portDescription);
             final DeviceEvent event = store.updatePortStatus(this.provider().id(),
-                                                             deviceId, portDescription);
+                                                             deviceId,
+                                                             ensureGeneric(portDescription));
             if (event != null) {
                 log.info("Device {} port {} status changed", deviceId, event.port().number());
                 post(event);
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceDescriptions.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceDescriptions.java
index c0bd97b..c19c468 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceDescriptions.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/DeviceDescriptions.java
@@ -17,11 +17,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onosproject.net.DefaultAnnotations.union;
-import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
-import static org.onosproject.net.optical.device.OduCltPortHelper.oduCltPortDescription;
-import static org.onosproject.net.optical.device.OmsPortHelper.omsPortDescription;
-import static org.onosproject.net.optical.device.OtuPortHelper.otuPortDescription;
-
 import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -32,10 +27,6 @@
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.OchPortDescription;
-import org.onosproject.net.device.OduCltPortDescription;
-import org.onosproject.net.device.OmsPortDescription;
-import org.onosproject.net.device.OtuPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.store.Timestamp;
 import org.onosproject.store.impl.Timestamped;
@@ -105,78 +96,9 @@
         if (oldOne != null) {
             SparseAnnotations merged = union(oldOne.value().annotations(),
                                              newDesc.value().annotations());
-            newOne = null;
-            switch (newDesc.value().type()) {
-                case OMS:
-                    if (newDesc.value() instanceof OmsPortDescription) {
-                        // remove if-block after deprecation is complete
-                        OmsPortDescription omsDesc = (OmsPortDescription) (newDesc.value());
-                        newOne = new Timestamped<>(
-                                omsPortDescription(omsDesc,
-                                                   omsDesc.minFrequency(),
-                                                   omsDesc.maxFrequency(),
-                                                   omsDesc.grid(), merged),
-                                newDesc.timestamp());
-                    } else {
-                        // same as default case
-                        newOne = new Timestamped<>(
-                                new DefaultPortDescription(newDesc.value(), merged),
-                                newDesc.timestamp());
-                    }
-                    break;
-                case OCH:
-                    if (newDesc.value() instanceof OchPortDescription) {
-                        // remove if-block after Och related deprecation is complete
-                        OchPortDescription ochDesc = (OchPortDescription) (newDesc.value());
-                        newOne = new Timestamped<>(
-                                ochPortDescription(ochDesc,
-                                                   ochDesc.signalType(),
-                                                   ochDesc.isTunable(),
-                                                   ochDesc.lambda(), merged),
-                                newDesc.timestamp());
-                    } else {
-                        // same as default case
-                        newOne = new Timestamped<>(
-                                new DefaultPortDescription(newDesc.value(), merged),
-                                newDesc.timestamp());
-                    }
-                    break;
-                case ODUCLT:
-                    if (newDesc.value() instanceof OduCltPortDescription) {
-                        // remove if-block after deprecation is complete
-                        OduCltPortDescription ocDesc = (OduCltPortDescription) (newDesc.value());
-                        newOne = new Timestamped<>(
-                                oduCltPortDescription(ocDesc,
-                                                      ocDesc.signalType(),
-                                                      merged),
-                                newDesc.timestamp());
-                    } else {
-                        // same as default case
-                        newOne = new Timestamped<>(
-                                new DefaultPortDescription(newDesc.value(), merged),
-                                newDesc.timestamp());
-                    }
-                    break;
-                case OTU:
-                    if (newDesc.value() instanceof OtuPortDescription) {
-                        // remove if-block after deprecation is complete
-                        OtuPortDescription otuDesc = (OtuPortDescription) (newDesc.value());
-                        newOne = new Timestamped<>(
-                                otuPortDescription(
-                                                   otuDesc, otuDesc.signalType(), merged),
-                                newDesc.timestamp());
-                    } else {
-                        // same as default case
-                        newOne = new Timestamped<>(
-                                new DefaultPortDescription(newDesc.value(), merged),
-                                newDesc.timestamp());
-                    }
-                    break;
-                default:
-                    newOne = new Timestamped<>(
+            newOne = new Timestamped<>(
                             new DefaultPortDescription(newDesc.value(), merged),
                             newDesc.timestamp());
-            }
         }
         portDescs.put(newOne.value().portNumber(), newOne);
     }
