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 23aba6a..cd3c543 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
@@ -19,19 +19,22 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.mastership.MastershipEvent;
@@ -46,11 +49,13 @@
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.config.Config;
 import org.onosproject.net.config.NetworkConfigEvent;
 import org.onosproject.net.config.NetworkConfigListener;
 import org.onosproject.net.config.NetworkConfigService;
+import org.onosproject.net.config.PortConfigOperator;
+import org.onosproject.net.config.PortConfigOperatorRegistry;
 import org.onosproject.net.config.basics.BasicDeviceConfig;
-import org.onosproject.net.config.basics.OpticalPortConfig;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceAdminService;
 import org.onosproject.net.device.DeviceDescription;
@@ -62,29 +67,23 @@
 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.onosproject.net.provider.Provider;
 import org.slf4j.Logger;
 
+import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.Futures;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Multimaps.newListMultimap;
+import static com.google.common.collect.Multimaps.synchronizedListMultimap;
 import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 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;
@@ -96,7 +95,7 @@
 @Service
 public class DeviceManager
         extends AbstractListenerProviderRegistry<DeviceEvent, DeviceListener, DeviceProvider, DeviceProviderService>
-        implements DeviceService, DeviceAdminService, DeviceProviderRegistry {
+        implements DeviceService, DeviceAdminService, DeviceProviderRegistry, PortConfigOperatorRegistry {
 
     private static final String DEVICE_ID_NULL = "Device ID cannot be null";
     private static final String PORT_NUMBER_NULL = "Port number cannot be null";
@@ -130,6 +129,20 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigService networkConfigService;
 
+
+    /**
+     * List of all registered PortConfigOperator.
+     */
+    private final List<PortConfigOperator> portOps = new CopyOnWriteArrayList<>();
+
+    /**
+     * Index to look up PortConfigOperator from Config each PortConfigOperator uses.
+     */
+    private final Multimap<Class<? extends Config<ConnectPoint>>, PortConfigOperator> portOpsIndex
+        = synchronizedListMultimap(
+           newListMultimap(new ConcurrentHashMap<>(), CopyOnWriteArrayList::new));
+
+
     @Activate
     public void activate() {
         backgroundService = newSingleThreadScheduledExecutor(
@@ -445,60 +458,6 @@
             }
         }
 
-        /**
-         * 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) {
@@ -512,8 +471,7 @@
                 return;
             }
             portDescriptions = portDescriptions.stream()
-                    .map(e -> consolidate(deviceId, e))
-                    .map(this::ensureGeneric)
+                    .map(e -> applyAllPortOps(deviceId, e))
                     .collect(Collectors.toList());
             List<DeviceEvent> events = store.updatePorts(this.provider().id(),
                                                          deviceId, portDescriptions);
@@ -552,30 +510,16 @@
                                                          portDescription.isEnabled());
             }
 
-            portDescription = consolidate(deviceId, portDescription);
+            portDescription = applyAllPortOps(deviceId, portDescription);
             final DeviceEvent event = store.updatePortStatus(this.provider().id(),
                                                              deviceId,
-                                                             ensureGeneric(portDescription));
+                                                             portDescription);
             if (event != null) {
                 log.info("Device {} port {} status changed", deviceId, event.port().number());
                 post(event);
             }
         }
 
-        // merges the appropriate PortConfig with the description.
-        private PortDescription consolidate(DeviceId did, PortDescription desc) {
-            switch (desc.type()) {
-                case COPPER:
-                case VIRTUAL:
-                    return desc;
-                default:
-                    // TODO: add plugin mechanism in order to decouple this
-                    OpticalPortConfig opc = networkConfigService.getConfig(
-                            new ConnectPoint(did, desc.portNumber()), OpticalPortConfig.class);
-                    return OpticalPortOperator.combine(opc, desc);
-            }
-        }
-
         @Override
         public void receivedRoleReply(DeviceId deviceId, MastershipRole requested,
                                       MastershipRole response) {
@@ -835,7 +779,7 @@
             return (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED
                     || event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)
                     && (event.configClass().equals(BasicDeviceConfig.class)
-                        || event.configClass().equals(OpticalPortConfig.class));
+                        || portOpsIndex.containsKey(event.configClass()));
         }
 
         @Override
@@ -857,20 +801,17 @@
                     }
                 }
             }
-            if (event.configClass().equals(OpticalPortConfig.class)) {
+            if (portOpsIndex.containsKey(event.configClass())) {
                 ConnectPoint cpt = (ConnectPoint) event.subject();
                 DeviceId did = cpt.deviceId();
-                Provider provider = getProvider(did);
-                Port dpt = getPort(did, cpt.port());
 
-                if (dpt != null && provider != null) {
-                    OpticalPortConfig opc = networkConfigService.getConfig(cpt, OpticalPortConfig.class);
-                    PortDescription desc = store.getPortDescription(provider.id(), did, cpt.port());
-                    desc = OpticalPortOperator.combine(opc, desc);
-                    if (desc != null) {
-                        de = store.updatePortStatus(getProvider(did).id(), did, desc);
-                    }
-                }
+                // Note: assuming PortOperator can modify existing port,
+                //       but cannot add new port purely from Config.
+                de = Optional.ofNullable(getProvider(did))
+                        .map(provider -> store.getPortDescription(provider.id(), did, cpt.port()))
+                        .map(desc -> applyAllPortOps(cpt, desc))
+                        .map(desc -> store.updatePortStatus(getProvider(did).id(), did, desc))
+                        .orElse(null);
             }
 
             if (de != null) {
@@ -888,4 +829,78 @@
         }
     }
 
+    @Override
+    @SafeVarargs
+    public final void registerPortConfigOperator(PortConfigOperator portOp,
+                                                              Class<? extends Config<ConnectPoint>>...configs) {
+        checkNotNull(portOp);
+
+        portOp.bindService(networkConfigService);
+
+        // update both portOpsIndex and portOps
+        synchronized (portOpsIndex) {
+            for (Class<? extends Config<ConnectPoint>> config : configs) {
+                portOpsIndex.put(config, portOp);
+            }
+
+            portOps.add(portOp);
+        }
+
+        // TODO: Should we be applying to all existing Ports?
+        Tools.stream(store.getAvailableDevices())
+            .map(Device::id)
+            .filter(mastershipService::isLocalMaster)
+            // for each locally managed Device, update all port descriptions
+            .map(did -> {
+                List<PortDescription> pds
+                    = store.getPortDescriptions(getProvider(did).id(), did)
+                        .map(pdesc -> applyAllPortOps(did, pdesc))
+                        .collect(Collectors.toList());
+                return store.updatePorts(getProvider(did).id(), did, pds);
+                })
+            // ..and port port update event if necessary
+            .forEach(evts -> evts.forEach(this::post));
+    }
+
+    @Override
+    public void unregisterPortConfigOperator(PortConfigOperator portOp) {
+        checkNotNull(portOp);
+
+
+        // remove all portOp
+        synchronized (portOpsIndex) {
+            portOps.remove(portOp);
+
+            // had to do this since COWArrayList iterator doesn't support remove
+            portOpsIndex.keySet().forEach(key -> portOpsIndex.remove(key, portOp));
+        }
+
+    }
+
+    /**
+     * Merges the appropriate PortConfig with the description.
+     *
+     * @param did  ID of the Device where the port is attached
+     * @param desc {@link PortDescription}
+     * @return merged {@link PortDescription}
+     */
+    private PortDescription applyAllPortOps(DeviceId did, PortDescription desc) {
+        return applyAllPortOps(new ConnectPoint(did, desc.portNumber()), desc);
+    }
+
+    /**
+     * Merges the appropriate PortConfig with the description.
+     *
+     * @param cpt   ConnectPoint where the port is attached
+     * @param desc  {@link PortDescription}
+     * @return merged {@link PortDescription}
+     */
+    private PortDescription applyAllPortOps(ConnectPoint cpt, PortDescription desc) {
+        PortDescription work = desc;
+        for (PortConfigOperator portOp : portOps) {
+            work = portOp.combine(cpt, work);
+        }
+        return work;
+    }
+
 }
