diff --git a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
index ecb07f1..fa4a903 100644
--- a/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
+++ b/apps/odtn/api/src/main/java/org/onosproject/odtn/utils/tapi/TapiInstanceBuilder.java
@@ -29,7 +29,9 @@
 
     public static final String ONOS_CP = "onos-cp";
 
-    public static final String DEVICE_ID = "device_id";
+    public static final String DEVICE_ID = "device-id";
+
+    public static final String ODTN_PORT_TYPE = "odtn-port-type";
 
     /**
      * Generate DCS modelObjectData.
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java
new file mode 100644
index 0000000..347a0c8
--- /dev/null
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscovery.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.drivers.odtn;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.CharSource;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port.Type;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DefaultPortDescription;
+import org.onosproject.net.device.DefaultPortDescription.Builder;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfDevice;
+import org.onosproject.netconf.NetconfSession;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+import org.slf4j.Logger;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * OpenConfig based device and port discovery.
+ */
+public class InfineraOpenConfigDeviceDiscovery
+        extends AbstractHandlerBehaviour
+        implements OdtnDeviceDescriptionDiscovery, DeviceDescriptionDiscovery {
+
+    private static final Logger log = getLogger(InfineraOpenConfigDeviceDiscovery.class);
+
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        // TODO Auto-generated method stub
+        // Not really used right now
+        return null;
+    }
+
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        try {
+            return discoverPorts();
+        } catch (Exception e) {
+            log.error("Error discovering port details on {}", data().deviceId(), e);
+            return ImmutableList.of();
+        }
+    }
+
+    private List<PortDescription> discoverPorts() throws ConfigurationException, IOException {
+        DeviceId did = data().deviceId();
+        NetconfSession ns = Optional.ofNullable(handler().get(NetconfController.class))
+                .map(c -> c.getNetconfDevice(did))
+                .map(NetconfDevice::getSession)
+                .orElseThrow(() -> new IllegalStateException("No NetconfSession found for " + did));
+
+        // TODO convert this method into non-blocking form?
+
+        String reply = ns.asyncGet()
+                .join().toString();
+
+        // workaround until asyncGet().join() start failing exceptionally
+        String data = null;
+        if (reply.startsWith("<data")) {
+            data = reply;
+        }
+
+        if (data == null) {
+            log.error("No valid response found from {}:\n{}", did, reply);
+            return ImmutableList.of();
+        }
+
+        XMLConfiguration cfg = new XMLConfiguration();
+        cfg.load(CharSource.wrap(data).openStream());
+
+        return discoverPorts(cfg);
+    }
+
+    /**
+     * Parses port information from OpenConfig XML configuration.
+     *
+     * @param cfg tree where the root node is {@literal <data>}
+     * @return List of ports
+     */
+    @VisibleForTesting
+    protected List<PortDescription> discoverPorts(XMLConfiguration cfg) {
+        // If we want to use XPath
+        cfg.setExpressionEngine(new XPathExpressionEngine());
+
+        // converting components into PortDescription.
+        List<HierarchicalConfiguration> components = cfg.configurationsAt("interfaces/interface");
+        return components.stream()
+                .map(this::toPortDescription)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    // wrapper to make parsing exception safe
+    private PortDescription toPortDescription(HierarchicalConfiguration component) {
+        try {
+            return toPortDescriptionInternal(component);
+        } catch (Exception e) {
+            log.error("Unexpected exception parsing component {} on {}",
+                    component.getString("name"),
+                    data().deviceId(), e);
+            return null;
+        }
+    }
+
+    /**
+     * Converts Component subtree to PortDescription.
+     *
+     * @param component subtree to parse
+     * @return PortDescription or null if component is not an ONOS Port
+     */
+    private PortDescription toPortDescriptionInternal(HierarchicalConfiguration component) {
+
+        // to access other part of <data> tree:
+        //log.warn("parent data Node: {}",
+        //       ((SubnodeConfiguration) component).getParent().getRootNode().getName());
+
+
+        String name = component.getString("name");
+        checkNotNull(name);
+        if (!name.contains("GIGECLIENTCTP")) {
+            return null;
+        }
+
+
+        Builder builder = DefaultPortDescription.builder();
+
+        Map<String, String> props = new HashMap<>();
+        props.put(OdtnDeviceDescriptionDiscovery.OC_NAME, name);
+        props.put(OdtnDeviceDescriptionDiscovery.OC_TYPE, name);
+
+        Pattern clientPattern = Pattern.compile("GIGECLIENTCTP.1-A-2-T(\\d+)");
+        Pattern linePattern = Pattern.compile("GIGECLIENTCTP.1-L(\\d+)-1-1");
+        Matcher clientMatch = clientPattern.matcher(name);
+        Matcher lineMatch = linePattern.matcher(name);
+
+        if (clientMatch.find()) {
+            props.putIfAbsent(PORT_TYPE, OdtnPortType.CLIENT.value());
+            builder.withPortNumber(PortNumber.portNumber(Long.parseLong(clientMatch.group(1)), name));
+            builder.type(Type.PACKET);
+        } else if (lineMatch.find()) {
+            props.putIfAbsent(PORT_TYPE, OdtnPortType.LINE.value());
+            builder.withPortNumber(PortNumber.portNumber(100 + Long.parseLong(lineMatch.group(1)), name));
+            builder.type(Type.OCH);
+        } else {
+            return null;
+        }
+
+        builder.annotations(DefaultAnnotations.builder().putAll(props).build());
+        return builder.build();
+
+    }
+
+}
diff --git a/drivers/odtn-driver/src/main/resources/odtn-drivers.xml b/drivers/odtn-driver/src/main/resources/odtn-drivers.xml
index fd4aab1..8d85e3a 100644
--- a/drivers/odtn-driver/src/main/resources/odtn-drivers.xml
+++ b/drivers/odtn-driver/src/main/resources/odtn-drivers.xml
@@ -23,5 +23,13 @@
         <behaviour api="org.onosproject.odtn.behaviour.ConfigurableTransceiver"
                   impl="org.onosproject.odtn.behaviour.PlainTransceiver"/>
     </driver>
+    <driver name="infinera-xt3300" manufacturer="infinera" hwVersion="xt3300" swVersion="18.0">
+        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.odtn.InfineraOpenConfigDeviceDiscovery"/>
+        <behaviour api="org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.odtn.InfineraOpenConfigDeviceDiscovery"/>
+        <behaviour api="org.onosproject.odtn.behaviour.ConfigurableTransceiver"
+                   impl="org.onosproject.odtn.behaviour.PlainTransceiver"/>
+    </driver>
 </drivers>
 
diff --git a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java
new file mode 100644
index 0000000..f86945c
--- /dev/null
+++ b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/InfineraOpenConfigDeviceDiscoveryTest.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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.drivers.odtn;
+
+import com.google.common.io.CharSource;
+import java.io.IOException;
+import java.util.List;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.XMLConfiguration;
+import org.junit.Test;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_NAME;
+import static org.onosproject.odtn.behaviour.OdtnDeviceDescriptionDiscovery.OC_TYPE;
+import static org.onosproject.odtn.utils.tapi.TapiInstanceBuilder.ODTN_PORT_TYPE;
+
+public class InfineraOpenConfigDeviceDiscoveryTest {
+
+    @Test
+    public void testToPortDescription() throws ConfigurationException, IOException {
+        // CHECKSTYLE:OFF
+        String input =
+          "<data>\n" +
+          "  <interfaces xmlns=\"http://openconfig.net/yang/interfaces\">\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-2</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-2</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-3</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-3</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-4</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-4</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-5</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-5</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>CARRIERCTP.1-L1-6</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>CARRIERCTP.1-L1-6</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>GIGECLIENTCTP.1-A-2-T1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>GIGECLIENTCTP.1-A-2-T1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>GIGECLIENTCTP.1-A-2-T2</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>GIGECLIENTCTP.1-A-2-T2</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>GIGECLIENTCTP.1-L1-1-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>GIGECLIENTCTP.1-L1-1-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>GIGECLIENTCTP.1-L2-1-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>GIGECLIENTCTP.1-L2-1-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>NCTGIGE.1-NCT-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n" +
+          "        <name>NCTGIGE.1-NCT-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>NCTGIGE.1-NCT-2</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:ethernetCsmacd</type>\n" +
+          "        <name>NCTGIGE.1-NCT-2</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>OCHCTP.1-L1-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>OCHCTP.1-L1-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>SCHCTP.1-L1-1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>SCHCTP.1-L1-1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>TRIBPTP.1-A-2-T1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>TRIBPTP.1-A-2-T1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>TRIBPTP.1-A-2-T2</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>TRIBPTP.1-A-2-T2</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "    <interface>\n" +
+          "      <name>XTSCGPTP.1-L1</name>\n" +
+          "      <config>\n" +
+          "        <type xmlns:ianaift=\"urn:ietf:params:xml:ns:yang:iana-if-type\">ianaift:opticalTransport</type>\n" +
+          "        <name>XTSCGPTP.1-L1</name>\n" +
+          "        <description/>\n" +
+          "        <enabled>true</enabled>\n" +
+          "      </config>\n" +
+          "    </interface>\n" +
+          "  </interfaces>\n" +
+          "</data>\n";
+        // CHECKSTYLE:ON
+
+        InfineraOpenConfigDeviceDiscovery sut = new InfineraOpenConfigDeviceDiscovery();
+
+        XMLConfiguration cfg = new XMLConfiguration();
+        cfg.load(CharSource.wrap(input).openStream());
+
+        List<PortDescription> ports = sut.discoverPorts(cfg);
+
+        assertThat(ports, hasSize(4));
+
+        PortDescription portDescription;
+        portDescription = ports.get(0);
+        assertThat(portDescription.portNumber().toLong(), is(1L));
+        assertThat(portDescription.portNumber().name(), is("GIGECLIENTCTP.1-A-2-T1"));
+        assertThat(portDescription.annotations().value(OC_NAME), is("GIGECLIENTCTP.1-A-2-T1"));
+        assertThat(portDescription.annotations().value(OC_TYPE), is("GIGECLIENTCTP.1-A-2-T1"));
+        assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
+                is(OdtnDeviceDescriptionDiscovery.OdtnPortType.CLIENT.value()));
+
+        portDescription = ports.get(3);
+        assertThat(portDescription.portNumber().toLong(), is(102L));
+        assertThat(portDescription.portNumber().name(), is("GIGECLIENTCTP.1-L2-1-1"));
+        assertThat(portDescription.annotations().value(OC_NAME), is("GIGECLIENTCTP.1-L2-1-1"));
+        assertThat(portDescription.annotations().value(OC_TYPE), is("GIGECLIENTCTP.1-L2-1-1"));
+        assertThat(portDescription.annotations().value(ODTN_PORT_TYPE),
+                is(OdtnDeviceDescriptionDiscovery.OdtnPortType.LINE.value()));
+    }
+}
