diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
index 5d38203..939493b 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/AddOpticalIntentCommand.java
@@ -156,19 +156,6 @@
                     .signalType(signalType)
                     .bidirectional(bidirectional)
                     .build();
-        } else if (srcPort instanceof org.onosproject.net.OchPort &&
-                   dstPort instanceof org.onosproject.net.OchPort) {
-            print("WARN: encountered old OchPort model");
-            // old OchPort model can be removed when ready
-            OduSignalType signalType = ((org.onosproject.net.OchPort) srcPort).signalType();
-            intent = OpticalConnectivityIntent.builder()
-                    .appId(appId())
-                    .key(key())
-                    .src(ingress)
-                    .dst(egress)
-                    .signalType(signalType)
-                    .bidirectional(bidirectional)
-                    .build();
         } else {
             print("Unable to create optical intent between connect points %s and %s", ingress, egress);
             return;
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/config/OpticalPortOperator.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/config/OpticalPortOperator.java
index 8562737..c49de35 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/config/OpticalPortOperator.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/config/OpticalPortOperator.java
@@ -15,10 +15,6 @@
  */
 package org.onosproject.net.optical.config;
 
-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 static org.slf4j.LoggerFactory.getLogger;
 
 import java.util.Set;
@@ -36,10 +32,6 @@
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DefaultPortDescription;
-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.slf4j.Logger;
 
@@ -137,43 +129,6 @@
                                                      SparseAnnotations sa,
                                                      PortDescription descr) {
 
-        // TODO This switch can go away once deprecation is complete.
-        switch (descr.type()) {
-            case OMS:
-                if (descr instanceof OmsPortDescription) {
-                    OmsPortDescription oms = (OmsPortDescription) descr;
-                    return omsPortDescription(port, oms.isEnabled(), oms.minFrequency(),
-                                                  oms.maxFrequency(), oms.grid(), sa);
-                }
-                break;
-            case OCH:
-                // We might need to update lambda below with STATIC_LAMBDA.
-                if (descr instanceof OchPortDescription) {
-                    OchPortDescription och = (OchPortDescription) descr;
-                    return ochPortDescription(port, och.isEnabled(), och.signalType(),
-                            och.isTunable(), och.lambda(), sa);
-                }
-                break;
-            case ODUCLT:
-                if (descr instanceof OduCltPortDescription) {
-                    OduCltPortDescription odu = (OduCltPortDescription) descr;
-                    return oduCltPortDescription(port, odu.isEnabled(), odu.signalType(), sa);
-                }
-                break;
-            case PACKET:
-            case FIBER:
-            case COPPER:
-                break;
-            case OTU:
-                if (descr instanceof OtuPortDescription) {
-                    OtuPortDescription otu = (OtuPortDescription) descr;
-                    return otuPortDescription(port, otu.isEnabled(), otu.signalType(), sa);
-                }
-                break;
-            default:
-                log.warn("Unsupported optical port type {} - can't update", descr.type());
-                return descr;
-        }
         if (port.exactlyEquals(descr.portNumber()) && sa.equals(descr.annotations())) {
             // result is no-op
             return descr;
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OchPortMapper.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OchPortMapper.java
index badca9d..112c4e5 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OchPortMapper.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OchPortMapper.java
@@ -20,7 +20,6 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.optical.OchPort;
 import org.onosproject.net.optical.device.OchPortHelper;
-import org.onosproject.net.optical.impl.DefaultOchPort;
 
 import com.google.common.annotations.Beta;
 
@@ -49,15 +48,6 @@
     protected Optional<OchPort> mapPort(Port port) {
         if (port instanceof OchPort) {
             return Optional.of((OchPort) port);
-        } else if (port instanceof org.onosproject.net.OchPort) {
-            // TODO remove after deprecation of old OchPort is complete
-
-            // translate to new OchPort
-            org.onosproject.net.OchPort old = (org.onosproject.net.OchPort) port;
-            return Optional.of(new DefaultOchPort(old,
-                                                  old.signalType(),
-                                                  old.isTunable(),
-                                                  old.lambda()));
         }
 
         return OchPortHelper.asOchPort(port);
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OduCltPortMapper.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OduCltPortMapper.java
index 6eeb631..dffd432 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OduCltPortMapper.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OduCltPortMapper.java
@@ -20,7 +20,6 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.optical.OduCltPort;
 import org.onosproject.net.optical.device.OduCltPortHelper;
-import org.onosproject.net.optical.impl.DefaultOduCltPort;
 
 import com.google.common.annotations.Beta;
 
@@ -49,13 +48,6 @@
     protected Optional<OduCltPort> mapPort(Port port) {
         if (port instanceof OduCltPort) {
             return Optional.of((OduCltPort) port);
-        } else if (port instanceof org.onosproject.net.OduCltPort) {
-            // TODO remove after deprecation of old OduCltPort is complete
-
-            // translate to new OduCltPort
-            org.onosproject.net.OduCltPort old = (org.onosproject.net.OduCltPort) port;
-            return Optional.of(new DefaultOduCltPort(old,
-                                                     old.signalType()));
         }
 
         return OduCltPortHelper.asOduCltPort(port);
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OmsPortMapper.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OmsPortMapper.java
index 70a8aa9..e43c155 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OmsPortMapper.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OmsPortMapper.java
@@ -20,7 +20,6 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.optical.OmsPort;
 import org.onosproject.net.optical.device.OmsPortHelper;
-import org.onosproject.net.optical.impl.DefaultOmsPort;
 
 import com.google.common.annotations.Beta;
 
@@ -49,17 +48,7 @@
     protected Optional<OmsPort> mapPort(Port port) {
         if (port instanceof OmsPort) {
             return Optional.of((OmsPort) port);
-        } else if (port instanceof org.onosproject.net.OmsPort) {
-            // TODO remove after deprecation of old OmsPort is complete
-
-            // translate to new OmsPort
-            org.onosproject.net.OmsPort old = (org.onosproject.net.OmsPort) port;
-            return Optional.of(new DefaultOmsPort(old,
-                                                  old.minFrequency(),
-                                                  old.maxFrequency(),
-                                                  old.grid()));
         }
-
         return OmsPortHelper.asOmsPort(port);
     }
 
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OtuPortMapper.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OtuPortMapper.java
index c70033a..cfc3beb 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OtuPortMapper.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/device/port/OtuPortMapper.java
@@ -20,7 +20,6 @@
 import org.onosproject.net.Port;
 import org.onosproject.net.optical.OtuPort;
 import org.onosproject.net.optical.device.OtuPortHelper;
-import org.onosproject.net.optical.impl.DefaultOtuPort;
 
 import com.google.common.annotations.Beta;
 
@@ -49,13 +48,6 @@
     protected Optional<OtuPort> mapPort(Port port) {
         if (port instanceof OtuPort) {
             return Optional.of((OtuPort) port);
-        } else if (port instanceof org.onosproject.net.OtuPort) {
-            // TODO remove after deprecation of old OtuPort is complete
-
-            // translate to new OtuPort
-            org.onosproject.net.OtuPort old = (org.onosproject.net.OtuPort) port;
-            return Optional.of(new DefaultOtuPort(old,
-                                                  old.signalType()));
         }
 
         return OtuPortHelper.asOtuPort(port);
diff --git a/core/api/src/main/java/org/onosproject/net/OchPort.java b/core/api/src/main/java/org/onosproject/net/OchPort.java
deleted file mode 100644
index 1b544e6..0000000
--- a/core/api/src/main/java/org/onosproject/net/OchPort.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Implementation of OCh port (Optical Channel).
- * Also referred to as a line side port (L-port) or narrow band port.
- * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OchPort extends DefaultPort {
-
-    private final OduSignalType signalType;
-    private final boolean isTunable;
-    private final OchSignal lambda;
-
-    /**
-     * Creates an OCh port in the specified network element.
-     *
-     * @param element     parent network element
-     * @param number      port number
-     * @param isEnabled   port enabled state
-     * @param signalType  ODU signal type
-     * @param isTunable   tunable wavelength capability
-     * @param lambda      OCh signal
-     * @param annotations optional key/value annotations
-     */
-    public OchPort(Element element, PortNumber number, boolean isEnabled, OduSignalType signalType,
-                   boolean isTunable, OchSignal lambda, Annotations... annotations) {
-        super(element, number, isEnabled, Type.OCH, checkNotNull(signalType).bitRate(), annotations);
-        this.signalType = signalType;
-        this.isTunable = isTunable;
-        this.lambda = checkNotNull(lambda);
-    }
-
-    /**
-     * Returns ODU signal type.
-     *
-     * @return ODU signal type
-     */
-    public OduSignalType signalType() {
-        return signalType;
-    }
-
-    /**
-     * Returns true if port is wavelength tunable.
-     *
-     * @return tunable wavelength capability
-     */
-    public boolean isTunable() {
-        return isTunable;
-    }
-
-    /**
-     * Returns OCh signal.
-     *
-     * @return OCh signal
-     */
-    public OchSignal lambda() {
-        return lambda;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(number(), isEnabled(), type(), signalType, isTunable, lambda, annotations());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        // Subclass is considered as a change of identity, hence equals() will return false if class type don't match
-        if (obj != null && getClass() == obj.getClass()) {
-            final OchPort other = (OchPort) obj;
-            return Objects.equals(this.element().id(), other.element().id()) &&
-                    Objects.equals(this.number(), other.number()) &&
-                    Objects.equals(this.isEnabled(), other.isEnabled()) &&
-                    Objects.equals(this.signalType, other.signalType) &&
-                    Objects.equals(this.isTunable, other.isTunable) &&
-                    Objects.equals(this.lambda, other.lambda) &&
-                    Objects.equals(this.annotations(), other.annotations());
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("element", element().id())
-                .add("number", number())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .add("isTunable", isTunable)
-                .add("lambda", lambda)
-                .toString();
-    }
-}
diff --git a/core/api/src/main/java/org/onosproject/net/OduCltPort.java b/core/api/src/main/java/org/onosproject/net/OduCltPort.java
deleted file mode 100644
index 4af663c..0000000
--- a/core/api/src/main/java/org/onosproject/net/OduCltPort.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Implementation of ODU client port (Optical channel Data Unit).
- * Also referred to as a T-port or wide band port.
- * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OduCltPort extends DefaultPort {
-
-    private final CltSignalType signalType;
-
-    /**
-     * Creates an ODU client port in the specified network element.
-     *
-     * @param element           parent network element
-     * @param number            port number
-     * @param isEnabled         port enabled state
-     * @param signalType        ODU client signal type
-     * @param annotations       optional key/value annotations
-     */
-    public OduCltPort(Element element, PortNumber number, boolean isEnabled,
-                      CltSignalType signalType, Annotations... annotations) {
-        super(element, number, isEnabled, Type.ODUCLT, checkNotNull(signalType).bitRate(), annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Returns ODU client signal type.
-     *
-     * @return ODU client signal type
-     */
-    public CltSignalType signalType() {
-        return signalType;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(number(), isEnabled(), type(), signalType, annotations());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj != null && getClass() == obj.getClass()) {
-            final OduCltPort other = (OduCltPort) obj;
-            return Objects.equals(this.element().id(), other.element().id()) &&
-                    Objects.equals(this.number(), other.number()) &&
-                    Objects.equals(this.isEnabled(), other.isEnabled()) &&
-                    Objects.equals(this.signalType, other.signalType) &&
-                    Objects.equals(this.annotations(), other.annotations());
-        }
-        return false;
-    }
-
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("element", element().id())
-                .add("number", number())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .toString();
-    }
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/OmsPort.java b/core/api/src/main/java/org/onosproject/net/OmsPort.java
deleted file mode 100644
index e1e54ca..0000000
--- a/core/api/src/main/java/org/onosproject/net/OmsPort.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net;
-
-import org.onlab.util.Frequency;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Implementation of OMS port (Optical Multiplexing Section).
- * Also referred to as a WDM port or W-port.
- * See ITU G.709 "Interfaces for the Optical Transport Network (OTN)"
- *
- * Assumes we only support fixed grid for now.
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OmsPort extends DefaultPort {
-
-    private final Frequency minFrequency;     // Minimum frequency
-    private final Frequency maxFrequency;     // Maximum frequency
-    private final Frequency grid;             // Grid spacing frequency
-
-
-    /**
-     * Creates an OMS port in the specified network element.
-     *
-     * @param element       parent network element
-     * @param number        port number
-     * @param isEnabled     port enabled state
-     * @param minFrequency  minimum frequency
-     * @param maxFrequency  maximum frequency
-     * @param grid          grid spacing frequency
-     * @param annotations   optional key/value annotations
-     */
-    public OmsPort(Element element, PortNumber number, boolean isEnabled,
-                   Frequency minFrequency, Frequency maxFrequency, Frequency grid, Annotations... annotations) {
-        super(element, number, isEnabled, Type.OMS, 0, annotations);
-        this.minFrequency = checkNotNull(minFrequency);
-        this.maxFrequency = checkNotNull(maxFrequency);
-        this.grid = checkNotNull(grid);
-    }
-
-    /**
-     * Returns the total number of channels on the port.
-     *
-     * @return total number of channels
-     */
-    public short totalChannels() {
-        Frequency diff = maxFrequency.subtract(minFrequency);
-        return (short) (diff.asHz() / grid.asHz());
-    }
-
-    /**
-     * Returns the minimum frequency.
-     *
-     * @return minimum frequency
-     */
-    public Frequency minFrequency() {
-        return minFrequency;
-    }
-
-    /**
-     * Returns the maximum frequency.
-     *
-     * @return maximum frequency
-     */
-    public Frequency maxFrequency() {
-        return maxFrequency;
-    }
-
-    /**
-     * Returns the grid spacing frequency.
-     *
-     * @return grid spacing frequency
-     */
-    public Frequency grid() {
-        return grid;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(number(), isEnabled(), type(),
-                minFrequency, maxFrequency, grid, annotations());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj != null && getClass() == obj.getClass()) {
-            final OmsPort other = (OmsPort) obj;
-            return Objects.equals(this.element().id(), other.element().id()) &&
-                    Objects.equals(this.number(), other.number()) &&
-                    Objects.equals(this.isEnabled(), other.isEnabled()) &&
-                    Objects.equals(this.minFrequency, other.minFrequency) &&
-                    Objects.equals(this.maxFrequency, other.maxFrequency) &&
-                    Objects.equals(this.grid, other.grid) &&
-                    Objects.equals(this.annotations(), other.annotations());
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("element", element().id())
-                .add("number", number())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("minFrequency", minFrequency)
-                .add("maxFrequency", maxFrequency)
-                .add("grid", grid)
-                .toString();
-    }
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/OtuPort.java b/core/api/src/main/java/org/onosproject/net/OtuPort.java
deleted file mode 100644
index 60456cd..0000000
--- a/core/api/src/main/java/org/onosproject/net/OtuPort.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * Implementation of OTU port (Optical channel Transport Unit).
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OtuPort extends DefaultPort {
-
-    private final OtuSignalType signalType;
-
-    /**
-     * Creates an OTU port in the specified network element.
-     *
-     * @param element           parent network element
-     * @param number            port number
-     * @param isEnabled         port enabled state
-     * @param signalType        OTU signal type
-     * @param annotations       optional key/value annotations
-     */
-    public OtuPort(Element element, PortNumber number, boolean isEnabled,
-            OtuSignalType signalType, Annotations... annotations) {
-        super(element, number, isEnabled, Type.OTU, 0, annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Returns OTU signal type.
-     *
-     * @return OTU signal type
-     */
-    public OtuSignalType signalType() {
-        return signalType;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(number(), isEnabled(), type(), signalType, annotations());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj instanceof OtuPort) {
-            final OtuPort other = (OtuPort) obj;
-            return Objects.equals(this.element().id(), other.element().id()) &&
-                    Objects.equals(this.number(), other.number()) &&
-                    Objects.equals(this.isEnabled(), other.isEnabled()) &&
-                    Objects.equals(this.signalType, other.signalType) &&
-                    Objects.equals(this.annotations(), other.annotations());
-        }
-        return false;
-    }
-
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("element", element().id())
-                .add("number", number())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .toString();
-    }
-
-}
\ No newline at end of file
diff --git a/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java
deleted file mode 100644
index 6397764..0000000
--- a/core/api/src/main/java/org/onosproject/net/device/OchPortDescription.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net.device;
-
-import com.google.common.base.MoreObjects;
-
-import org.onosproject.net.OchSignal;
-import org.onosproject.net.OduSignalType;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Default implementation of immutable OCh port description.
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OchPortDescription extends DefaultPortDescription {
-
-    private final OduSignalType signalType;
-    private final boolean isTunable;
-    private final OchSignal lambda;
-
-    /**
-     * Creates OCH port description based on the supplied information.
-     *
-     * @param number      port number
-     * @param isEnabled   port enabled state
-     * @param signalType  ODU signal type
-     * @param isTunable   tunable wavelength capability
-     * @param lambda      OCh signal
-     * @param annotations optional key/value annotations map
-     *
-     * @deprecated in Goldeneye (1.6.0)
-     */
-    @Deprecated
-    public OchPortDescription(PortNumber number, boolean isEnabled, OduSignalType signalType,
-                              boolean isTunable, OchSignal lambda, SparseAnnotations... annotations) {
-        super(number, isEnabled, Port.Type.OCH, 0, annotations);
-        this.signalType = signalType;
-        this.isTunable = isTunable;
-        this.lambda = checkNotNull(lambda);
-    }
-
-    /**
-     * Creates OCH port description based on the supplied information.
-     *
-     * @param base        PortDescription to get basic information from
-     * @param signalType  ODU signal type
-     * @param isTunable   tunable wavelength capability
-     * @param lambda      OCh signal
-     * @param annotations optional key/value annotations map
-     *
-     * @deprecated in Goldeneye (1.6.0)
-     */
-    @Deprecated
-    public OchPortDescription(PortDescription base, OduSignalType signalType, boolean isTunable,
-                              OchSignal lambda, SparseAnnotations annotations) {
-        super(base, annotations);
-        this.signalType = signalType;
-        this.isTunable = isTunable;
-        this.lambda = checkNotNull(lambda);
-    }
-
-    /**
-     * Returns ODU signal type.
-     *
-     * @return ODU signal type
-     */
-    public OduSignalType signalType() {
-        return signalType;
-    }
-
-    /**
-     * Returns true if port is wavelength tunable.
-     *
-     * @return tunable wavelength capability
-     */
-    public boolean isTunable() {
-        return isTunable;
-    }
-
-    /**
-     * Returns OCh signal.
-     *
-     * @return OCh signal
-     */
-    public OchSignal lambda() {
-        return lambda;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("number", portNumber())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .add("isTunable", isTunable)
-                .add("lambda", lambda)
-                .add("annotations", annotations())
-                .toString();
-    }
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/device/OduCltPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/OduCltPortDescription.java
deleted file mode 100644
index e601a9f..0000000
--- a/core/api/src/main/java/org/onosproject/net/device/OduCltPortDescription.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net.device;
-
-import com.google.common.base.MoreObjects;
-import org.onosproject.net.CltSignalType;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-
-/**
- * Default implementation of immutable ODU client port description.
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OduCltPortDescription extends DefaultPortDescription {
-
-    private final CltSignalType signalType;
-
-    /**
-     * Creates ODU client port description based on the supplied information.
-     *
-     * @param number        port number
-     * @param isEnabled     port enabled state
-     * @param signalType    ODU client signal type
-     * @param annotations   optional key/value annotations map
-     */
-    public OduCltPortDescription(PortNumber number, boolean isEnabled, CltSignalType signalType,
-                                 SparseAnnotations... annotations) {
-        super(number, isEnabled, Port.Type.ODUCLT, 0, annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Creates ODU client port description based on the supplied information.
-     *
-     * @param base          PortDescription to get basic information from
-     * @param signalType    ODU client signal type
-     * @param annotations   optional key/value annotations map
-     */
-    public OduCltPortDescription(PortDescription base, CltSignalType signalType,
-                                 SparseAnnotations annotations) {
-        super(base, annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Returns ODU client signal type.
-     *
-     * @return ODU client signal type
-     */
-    public CltSignalType signalType() {
-        return signalType;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("number", portNumber())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .toString();
-    }
-
-}
diff --git a/core/api/src/main/java/org/onosproject/net/device/OmsPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/OmsPortDescription.java
deleted file mode 100644
index 4d88476..0000000
--- a/core/api/src/main/java/org/onosproject/net/device/OmsPortDescription.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net.device;
-
-import com.google.common.base.MoreObjects;
-import org.onlab.util.Frequency;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-
-/**
- * Default implementation of immutable OMS port description.
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OmsPortDescription extends DefaultPortDescription {
-
-    private final Frequency minFrequency;
-    private final Frequency maxFrequency;
-    private final Frequency grid;
-
-    /**
-     * Creates OMS port description based on the supplied information.
-     *
-     * @param number        port number
-     * @param isEnabled     port enabled state
-     * @param minFrequency  minimum frequency
-     * @param maxFrequency  maximum frequency
-     * @param grid          grid spacing frequency
-     * @param annotations   optional key/value annotations map
-     *
-     * @deprecated in Goldeneye (1.6.0)
-     */
-    @Deprecated
-    public OmsPortDescription(PortNumber number, boolean isEnabled, Frequency minFrequency, Frequency maxFrequency,
-                              Frequency grid, SparseAnnotations... annotations) {
-        super(number, isEnabled, Port.Type.OMS, 0, annotations);
-        this.minFrequency = minFrequency;
-        this.maxFrequency = maxFrequency;
-        this.grid = grid;
-    }
-
-    /**
-     * Creates OMS port description based on the supplied information.
-     *
-     * @param base          PortDescription to get basic information from
-     * @param minFrequency  minimum frequency
-     * @param maxFrequency  maximum frequency
-     * @param grid          grid spacing frequency
-     * @param annotations   optional key/value annotations map
-     *
-     * @deprecated in Goldeneye (1.6.0)
-     */
-    @Deprecated
-    public OmsPortDescription(PortDescription base, Frequency minFrequency, Frequency maxFrequency,
-                              Frequency grid, SparseAnnotations annotations) {
-        super(base, annotations);
-        this.minFrequency = minFrequency;
-        this.maxFrequency = maxFrequency;
-        this.grid = grid;
-    }
-
-    /**
-     * Returns minimum frequency.
-     *
-     * @return minimum frequency
-     */
-    public Frequency minFrequency() {
-        return minFrequency;
-    }
-
-    /**
-     * Returns maximum frequency.
-     *
-     * @return maximum frequency
-     */
-    public Frequency maxFrequency() {
-        return maxFrequency;
-    }
-
-    /**
-     * Returns grid spacing frequency.
-     *
-     * @return grid spacing frequency
-     */
-    public Frequency grid() {
-        return grid;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("number", portNumber())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("minFrequency", minFrequency)
-                .add("maxFrequency", maxFrequency)
-                .add("grid", grid)
-                .add("annotations", annotations())
-                .toString();
-    }
-
-}
-
diff --git a/core/api/src/main/java/org/onosproject/net/device/OtuPortDescription.java b/core/api/src/main/java/org/onosproject/net/device/OtuPortDescription.java
deleted file mode 100644
index 5495524..0000000
--- a/core/api/src/main/java/org/onosproject/net/device/OtuPortDescription.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.net.device;
-
-import com.google.common.base.MoreObjects;
-
-import org.onosproject.net.OtuSignalType;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
-
-/**
- * Default implementation of immutable OTU port description.
- *
- * @deprecated in Goldeneye (1.6.0)
- */
-@Deprecated
-public class OtuPortDescription extends DefaultPortDescription {
-
-    private final OtuSignalType signalType;
-
-    /**
-     * Creates OTU port description based on the supplied information.
-     *
-     * @param number        port number
-     * @param isEnabled     port enabled state
-     * @param signalType    OTU signal type
-     * @param annotations   optional key/value annotations map
-     */
-    public OtuPortDescription(PortNumber number, boolean isEnabled, OtuSignalType signalType,
-            SparseAnnotations... annotations) {
-        super(number, isEnabled, Port.Type.OTU, 0, annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Creates OTU port description based on the supplied information.
-     *
-     * @param base          PortDescription to get basic information from
-     * @param signalType    OTU signal type
-     * @param annotations   optional key/value annotations map
-     */
-    public OtuPortDescription(PortDescription base, OtuSignalType signalType,
-            SparseAnnotations annotations) {
-        super(base, annotations);
-        this.signalType = signalType;
-    }
-
-    /**
-     * Returns OTU signal type.
-     *
-     * @return OTU signal type
-     */
-    public OtuSignalType signalType() {
-        return signalType;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("number", portNumber())
-                .add("isEnabled", isEnabled())
-                .add("type", type())
-                .add("signalType", signalType)
-                .toString();
-    }
-
-}
\ No newline at end of file
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
index 6aa9733..30fae0b 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
@@ -42,9 +42,6 @@
 import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
-import org.onosproject.net.OchPort;
-import org.onosproject.net.OduCltPort;
-import org.onosproject.net.OmsPort;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DefaultPortStatistics;
@@ -53,9 +50,6 @@
 import org.onosproject.net.device.DeviceEvent;
 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.PortDescription;
 import org.onosproject.net.device.PortStatistics;
 import org.onosproject.net.provider.ProviderId;
@@ -529,40 +523,8 @@
 
     private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled,
             PortDescription description, Annotations annotations) {
-        // FIXME this switch need to go away once all ports are done.
-        switch (description.type()) {
-        case OMS:
-            if (description instanceof OmsPortDescription) {
-                // remove if-block once deprecation is complete
-                OmsPortDescription omsDesc = (OmsPortDescription) description;
-                return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(),
-                        omsDesc.maxFrequency(), omsDesc.grid(), annotations);
-            }
-            // same as default
-            return new DefaultPort(device, number, isEnabled, description.type(),
-                                   description.portSpeed(), annotations);
-        case OCH:
-            if (description instanceof OchPortDescription) {
-                // remove if-block once Och deprecation is complete
-                OchPortDescription ochDesc = (OchPortDescription) description;
-                return new OchPort(device, number, isEnabled, ochDesc.signalType(),
-                                   ochDesc.isTunable(), ochDesc.lambda(), annotations);
-            }
-            return new DefaultPort(device, number, isEnabled, description.type(),
-                                   description.portSpeed(), annotations);
-        case ODUCLT:
-            if (description instanceof OduCltPortDescription) {
-                // remove if-block once deprecation is complete
-                OduCltPortDescription oduDesc = (OduCltPortDescription) description;
-                return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations);
-            }
-            // same as default
-            return new DefaultPort(device, number, isEnabled, description.type(),
-                                   description.portSpeed(), annotations);
-        default:
             return new DefaultPort(device, number, isEnabled, description.type(),
                     description.portSpeed(), annotations);
-        }
     }
 
     @Override
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index 267ee48..eade6e0 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -43,10 +43,6 @@
 import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
-import org.onosproject.net.OchPort;
-import org.onosproject.net.OduCltPort;
-import org.onosproject.net.OmsPort;
-import org.onosproject.net.OtuPort;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DefaultPortStatistics;
@@ -55,10 +51,6 @@
 import org.onosproject.net.device.DeviceEvent;
 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.provider.ProviderId;
@@ -1205,49 +1197,8 @@
 
     private Port buildTypedPort(Device device, PortNumber number, boolean isEnabled,
                                  PortDescription description, Annotations annotations) {
-        // FIXME this switch need to go away once all ports are done.
-        switch (description.type()) {
-            case OMS:
-                if (description instanceof OmsPortDescription) {
-                    // remove if-block once deprecation is complete
-                    OmsPortDescription omsDesc = (OmsPortDescription) description;
-                    return new OmsPort(device, number, isEnabled, omsDesc.minFrequency(),
-                            omsDesc.maxFrequency(), omsDesc.grid(), annotations);
-                }
-                // same as default
-                return new DefaultPort(device, number, isEnabled, description.type(),
-                                       description.portSpeed(), annotations);
-            case OCH:
-                if (description instanceof OchPortDescription) {
-                    // remove if-block once Och deprecation is complete
-                    OchPortDescription ochDesc = (OchPortDescription) description;
-                    return new OchPort(device, number, isEnabled, ochDesc.signalType(),
-                                       ochDesc.isTunable(), ochDesc.lambda(), annotations);
-                }
-                return new DefaultPort(device, number, isEnabled, description.type(),
-                                       description.portSpeed(), annotations);
-            case ODUCLT:
-                if (description instanceof OduCltPortDescription) {
-                    // remove if-block once deprecation is complete
-                    OduCltPortDescription oduDesc = (OduCltPortDescription) description;
-                    return new OduCltPort(device, number, isEnabled, oduDesc.signalType(), annotations);
-                }
-                // same as default
-                return new DefaultPort(device, number, isEnabled, description.type(),
-                                       description.portSpeed(), annotations);
-            case OTU:
-                if (description instanceof OtuPortDescription) {
-                    // remove if-block once deprecation is complete
-                    OtuPortDescription otuDesc = (OtuPortDescription) description;
-                    return new OtuPort(device, number, isEnabled, otuDesc.signalType(), annotations);
-                }
-                // same as default
-                return new DefaultPort(device, number, isEnabled, description.type(),
-                                       description.portSpeed(), annotations);
-            default:
                 return new DefaultPort(device, number, isEnabled, description.type(),
                         description.portSpeed(), annotations);
-        }
     }
 
     /**
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 8e599c5..d59b859 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -76,14 +76,10 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.MarkerResource;
-import org.onosproject.net.OchPort;
 import org.onosproject.net.OchSignal;
 import org.onosproject.net.OchSignalType;
-import org.onosproject.net.OduCltPort;
 import org.onosproject.net.OduSignalId;
 import org.onosproject.net.OduSignalType;
-import org.onosproject.net.OmsPort;
-import org.onosproject.net.OtuPort;
 import org.onosproject.net.OtuSignalType;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
@@ -93,10 +89,6 @@
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DefaultPortStatistics;
-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.PortStatistics;
 import org.onosproject.net.domain.DomainIntent;
 import org.onosproject.net.flow.CompletedBatchOperation;
@@ -539,23 +531,15 @@
             .register(SetEvent.Type.class)
             .register(GroupId.class)
             .register(Annotations.class)
-            .register(OmsPort.class)
-            .register(OchPort.class)
             .register(OduSignalType.class)
             .register(OchSignalType.class)
             .register(GridType.class)
             .register(ChannelSpacing.class)
-            .register(OduCltPort.class)
             .register(CltSignalType.class)
             .register(OchSignal.class)
             .register(OduSignalId.class)
-            .register(OduCltPortDescription.class)
-            .register(OchPortDescription.class)
-            .register(OmsPortDescription.class)
             .register(TributarySlot.class)
-            .register(OtuPort.class)
             .register(OtuSignalType.class)
-            .register(OtuPortDescription.class)
             .register(
                     MplsIntent.class,
                     MplsPathIntent.class,
diff --git a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
index f68d0e0..bfe7815 100644
--- a/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
+++ b/core/store/serializers/src/test/java/org/onosproject/store/serializers/KryoSerializerTest.java
@@ -34,7 +34,6 @@
 import org.onosproject.mastership.MastershipTerm;
 import org.onosproject.net.Annotations;
 import org.onosproject.net.ChannelSpacing;
-import org.onosproject.net.CltSignalType;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.DefaultDevice;
@@ -47,14 +46,7 @@
 import org.onosproject.net.Link;
 import org.onosproject.net.LinkKey;
 import org.onosproject.net.MarkerResource;
-import org.onosproject.net.OchPort;
-import org.onosproject.net.OchSignal;
-import org.onosproject.net.OduCltPort;
-import org.onosproject.net.OmsPort;
-import org.onosproject.net.OtuPort;
-import org.onosproject.net.OtuSignalType;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.OduSignalType;
 import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -106,7 +98,6 @@
     private static final String MFR = "whitebox";
     private static final String HW = "1.1.x";
     private static final String SW1 = "3.8.1";
-    private static final String SW2 = "3.9.5";
     private static final String SN = "43311-12345";
     private static final ChassisId CID = new ChassisId();
     private static final Device DEV1 = new DefaultDevice(PID, DID1, Device.Type.SWITCH, MFR, HW,
@@ -119,8 +110,6 @@
             .remove("A1")
             .set("B3", "b3")
             .build();
-    private static final OchSignal OCH_SIGNAL1 = (OchSignal) org.onosproject.net.Lambda.ochSignal(
-            GridType.DWDM, ChannelSpacing.CHL_100GHZ, -8, 4);
     private static final VlanId VLAN1 = VlanId.vlanId((short) 100);
 
     private StoreSerializer serializer;
@@ -187,31 +176,6 @@
     }
 
     @Test
-    public void testOmsPort() {
-        testSerializedEquals(new OmsPort(DEV1, P1, true, Frequency.ofGHz(190_100), Frequency.ofGHz(197_300),
-                Frequency.ofGHz(100)));
-        testSerializedEquals(new OmsPort(DEV1, P1, true, Frequency.ofGHz(190_100), Frequency.ofGHz(197_300),
-                Frequency.ofGHz(100), A1_2));
-    }
-
-    @Test
-    public void testOchPort() {
-        testSerializedEquals(new OchPort(DEV1, P1, true, OduSignalType.ODU0, false, OCH_SIGNAL1));
-        testSerializedEquals(new OchPort(DEV1, P1, true, OduSignalType.ODU0, false, OCH_SIGNAL1, A1_2));
-    }
-
-    @Test
-    public void testOduCltPort() {
-        testSerializedEquals(new OduCltPort(DEV1, P1, true, CltSignalType.CLT_10GBE));
-        testSerializedEquals(new OduCltPort(DEV1, P1, true, CltSignalType.CLT_10GBE, A1_2));
-    }
-
-    @Test
-    public void testOtuPort() {
-        testSerializedEquals(new OtuPort(DEV1, P1, true, OtuSignalType.OTU2));
-        testSerializedEquals(new OtuPort(DEV1, P1, true, OtuSignalType.OTU2, A1_2));
-    }
-    @Test
     public void testDeviceId() {
         testSerializedEquals(DID1);
     }
diff --git a/drivers/optical/src/main/java/org/onosproject/driver/optical/query/DefaultTributarySlotQuery.java b/drivers/optical/src/main/java/org/onosproject/driver/optical/query/DefaultTributarySlotQuery.java
index c424272..ef0fb7c 100644
--- a/drivers/optical/src/main/java/org/onosproject/driver/optical/query/DefaultTributarySlotQuery.java
+++ b/drivers/optical/src/main/java/org/onosproject/driver/optical/query/DefaultTributarySlotQuery.java
@@ -82,15 +82,9 @@
 
     private Set<TributarySlot> queryOchTributarySlots(Port ochPort) {
         OduSignalType signalType = null;
-        if (ochPort instanceof org.onosproject.net.OchPort) {
-            // remove once deprecation of old OchPort model is done
-            signalType = ((org.onosproject.net.OchPort) ochPort).signalType();
-        }
         if (ochPort instanceof OchPort) {
             signalType = ((OchPort) ochPort).signalType();
-        }
-
-        if (signalType == null) {
+        } else {
             log.warn("{} was not an OchPort", ochPort);
             return Collections.emptySet();
         }
@@ -108,15 +102,9 @@
 
     private Set<TributarySlot> queryOtuTributarySlots(Port otuPort) {
         OtuSignalType signalType = null;
-        if (otuPort instanceof org.onosproject.net.OtuPort) {
-            // remove once deprecation of old OtuPort model is done
-            signalType = ((org.onosproject.net.OtuPort) otuPort).signalType();
-        }
         if (otuPort instanceof OtuPort) {
             signalType = ((OtuPort) otuPort).signalType();
-        }
-
-        if (signalType == null) {
+        } else {
             log.warn("{} was not an OtuPort", otuPort);
             return Collections.emptySet();
         }
diff --git a/providers/pcep/BUCK b/providers/pcep/BUCK
index ce77c96..3d57719 100644
--- a/providers/pcep/BUCK
+++ b/providers/pcep/BUCK
@@ -14,6 +14,6 @@
     url = 'http://onosproject.org',
     included_bundles = BUNDLES,
     description = 'PCEP protocol providers root.',
-    required_apps = [ 'org.onosproject.pcep-api' ],
+    required_apps = [ 'org.onosproject.pcep-api', 'org.onosproject.optical-model' ],
 )
 
diff --git a/providers/pcep/topology/BUCK b/providers/pcep/topology/BUCK
index 5b5078d..6d4b0bd 100644
--- a/providers/pcep/topology/BUCK
+++ b/providers/pcep/topology/BUCK
@@ -7,6 +7,7 @@
     '//protocols/pcep/api:onos-protocols-pcep-api',
     '//protocols/pcep/pcepio:onos-protocols-pcep-pcepio',
     '//core/api:onos-api-tests',
+    '//apps/optical-model:onos-apps-optical-model',
 ]
 
 osgi_jar_with_tests (
diff --git a/providers/pcep/topology/pom.xml b/providers/pcep/topology/pom.xml
index cb108f2..0e3f12b 100644
--- a/providers/pcep/topology/pom.xml
+++ b/providers/pcep/topology/pom.xml
@@ -38,5 +38,10 @@
              <classifier>tests</classifier>
              <scope>test</scope>
         </dependency>
-    </dependencies>
+         <dependency>
+             <groupId>org.onosproject</groupId>
+             <artifactId>onos-optical-model</artifactId>
+             <version>${project.version}</version>
+         </dependency>
+     </dependencies>
 </project>
diff --git a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
index 9a445fb..6c305ca 100644
--- a/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
+++ b/providers/pcep/topology/src/main/java/org/onosproject/provider/pcep/topology/impl/PcepTopologyProvider.java
@@ -26,14 +26,12 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.Link.Type;
+import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.config.ConfigFactory;
 import org.onosproject.net.config.NetworkConfigRegistry;
 import org.onosproject.net.config.NetworkConfigService;
 import org.onosproject.net.config.basics.SubjectFactories;
 import org.onosproject.net.MastershipRole;
-import org.onosproject.net.OchPort;
-import org.onosproject.net.OduCltPort;
-import org.onosproject.net.OmsPort;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.device.DefaultDeviceDescription;
@@ -43,9 +41,6 @@
 import org.onosproject.net.device.DeviceProviderRegistry;
 import org.onosproject.net.device.DeviceProviderService;
 import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.device.OchPortDescription;
-import org.onosproject.net.device.OduCltPortDescription;
-import org.onosproject.net.device.OmsPortDescription;
 import org.onosproject.net.device.PortDescription;
 import org.onosproject.net.link.DefaultLinkDescription;
 import org.onosproject.net.link.LinkDescription;
@@ -58,7 +53,6 @@
 import org.onosproject.pcep.api.PcepController;
 import org.onosproject.pcep.api.PcepDpid;
 import org.onosproject.pcep.api.PcepLink;
-import org.onosproject.pcep.api.PcepLink.PortType;
 import org.onosproject.pcep.api.PcepLinkListener;
 import org.onosproject.pcep.api.PcepOperator.OperationType;
 import org.onosproject.pcep.api.PcepSwitch;
@@ -157,8 +151,7 @@
     }
 
     private List<PortDescription> buildPortDescriptions(PcepDpid dpid,
-                                                        Port port,
-                                                        PortType portType) {
+                                                        Port port) {
 
         List<PortDescription> portList;
 
@@ -167,41 +160,18 @@
         } else {
             portList = new ArrayList<>();
         }
-        if (port != null && portType != null) {
-            portList.add(buildPortDescription(port, portType));
+        if (port != null) {
+            SparseAnnotations annotations = DefaultAnnotations.builder()
+                    .putAll(port.annotations()).build();
+            portList.add(new DefaultPortDescription(port.number(), port.isEnabled(),
+                                                    port.type(), port.portSpeed(),
+                                                    annotations));
         }
 
         portMap.put(dpid.value(), portList);
         return portList;
     }
 
-    private PortDescription buildPortDescription(Port port, PortType portType) {
-        PortDescription portDescription;
-
-        switch (portType) {
-            case OCH_PORT:
-                OchPort ochp = (OchPort) port;
-                portDescription = new OchPortDescription(ochp.number(), ochp.isEnabled(),
-                        ochp.signalType(), ochp.isTunable(),
-                        ochp.lambda());
-                break;
-            case ODU_PORT:
-                OduCltPort odup = (OduCltPort) port;
-                portDescription = new OduCltPortDescription(odup.number(), odup.isEnabled(),
-                        odup.signalType());
-                break;
-            case OMS_PORT:
-                OmsPort op = (OmsPort) port;
-                portDescription = new OmsPortDescription(op.number(), op.isEnabled(), op.minFrequency(),
-                        op.maxFrequency(), op.grid());
-                break;
-            default:
-                portDescription = new DefaultPortDescription(port.number(), port.isEnabled());
-                break;
-        }
-        return portDescription;
-    }
-
     /**
      * Build a link description from a pcep link.
      *
@@ -217,12 +187,12 @@
         deviceProviderService
                 .updatePorts(srcDeviceID,
                         buildPortDescriptions(pceLink.linkSrcDeviceID(),
-                                pceLink.linkSrcPort(), pceLink.portType()));
+                                pceLink.linkSrcPort()));
 
         deviceProviderService
                 .updatePorts(dstDeviceID,
                         buildPortDescriptions(pceLink.linkDstDeviceId(),
-                                pceLink.linkDstPort(), pceLink.portType()));
+                                pceLink.linkDstPort()));
 
         ConnectPoint src = new ConnectPoint(srcDeviceID, pceLink.linkSrcPort().number());
 
