Adding OpenConfig YANG models.

Change-Id: I0a2fdd5826e80933cf4b9ae939ff3051acec02aa
diff --git a/models/openconfig/BUCK b/models/openconfig/BUCK
new file mode 100644
index 0000000..d724f04
--- /dev/null
+++ b/models/openconfig/BUCK
@@ -0,0 +1,5 @@
+
+yang_model(
+  app_name = 'org.onosproject.models.openconfig',
+  title = 'OpenConfig YANG Models',
+)
\ No newline at end of file
diff --git a/models/openconfig/pom.xml b/models/openconfig/pom.xml
new file mode 100644
index 0000000..2e768d9
--- /dev/null
+++ b/models/openconfig/pom.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2017-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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-models</artifactId>
+        <version>1.12.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-models-openconfig</artifactId>
+    <packaging>bundle</packaging>
+    <description>OpenConfig YANG models</description>
+
+    <properties>
+        <onos.app.name>org.onosproject.models.openconfig</onos.app.name>
+    </properties>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-yang-model</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-apps-yang</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions combine.children="append">
+                        <Include-Resource>yang/resources/YangMetaData.ser=target/classes/yang/resources/YangMetaData.ser</Include-Resource>
+                    </instructions>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-yang-compiler-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>3.0.0</version>
+                <executions>
+                  <execution>
+                    <id>add-source</id>
+                    <phase>generate-sources</phase>
+                    <goals>
+                      <goal>add-source</goal>
+                    </goals>
+                    <configuration>
+                      <sources>
+                        <source>${project.build.directory}/generated-sources</source>
+                      </sources>
+                    </configuration>
+                  </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-clean-plugin</artifactId>
+                <version>3.0.0</version>
+                <executions>
+                    <execution>
+                        <id>onos-yang-plugin-workaround</id>
+                        <!-- yang plugin cannot handle non-clean compilation -->
+                        <phase>initialize</phase>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                        <configuration>
+                            <excludeDefaultDirectories>true</excludeDefaultDirectories>
+                            <filesets>
+                                <fileset>
+                                    <directory>target/generated-sources</directory>
+                                </fileset>
+                            </filesets>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
+
+        </plugins>
+
+        <pluginManagement>
+            <plugins>
+                <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+                <plugin>
+                    <groupId>org.eclipse.m2e</groupId>
+                    <artifactId>lifecycle-mapping</artifactId>
+                    <version>1.0.0</version>
+                    <configuration>
+                        <lifecycleMappingMetadata>
+                            <pluginExecutions>
+                                <pluginExecution>
+                                    <pluginExecutionFilter>
+                                        <groupId>
+                                            org.apache.maven.plugins
+                                        </groupId>
+                                        <artifactId>
+                                            maven-clean-plugin
+                                        </artifactId>
+                                        <versionRange>
+                                            [3.0.0,)
+                                        </versionRange>
+                                        <goals>
+                                            <goal>clean</goal>
+                                        </goals>
+                                    </pluginExecutionFilter>
+                                    <action>
+                                        <ignore></ignore>
+                                    </action>
+                                </pluginExecution>
+                            </pluginExecutions>
+                        </lifecycleMappingMetadata>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/models/openconfig/src/main/yang/acl/openconfig-acl.yang b/models/openconfig/src/main/yang/acl/openconfig-acl.yang
new file mode 100644
index 0000000..aee9e80
--- /dev/null
+++ b/models/openconfig/src/main/yang/acl/openconfig-acl.yang
@@ -0,0 +1,830 @@
+module openconfig-acl {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/acl";
+
+  prefix "oc-acl";
+
+  import openconfig-packet-match { prefix oc-match; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state
+    data for network access control lists (i.e., filters, rules,
+    etc.).  ACLs are organized into ACL sets, with each set
+    containing one or more ACL entries.  ACL sets are identified
+    by a unique name, while each entry within a set is assigned
+    a sequence-id that determines the order in which the ACL
+    rules are applied to a packet.
+
+    Individual ACL rules specify match criteria based on fields in
+    the packet, along with an action that defines how matching
+    packets should be handled. Entries have a type that indicates
+    the type of match criteria, e.g., MAC layer, IPv4, IPv6, etc.";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2017-05-26" {
+    description
+      "Separated ACL entries by type";
+    reference "1.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-01-22" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+
+  identity ACL_TYPE {
+    description
+      "Base identity for types of ACL sets";
+  }
+
+  identity ACL_IPV4 {
+    base ACL_TYPE;
+    description
+      "IP-layer ACLs with IPv4 addresses";
+  }
+
+  identity ACL_IPV6 {
+    base ACL_TYPE;
+    description
+      "IP-layer ACLs with IPv6 addresses";
+  }
+
+  identity ACL_L2 {
+    base ACL_TYPE;
+    description
+      "MAC-layer ACLs";
+  }
+
+  identity ACL_MIXED {
+    base ACL_TYPE;
+    description
+      "Mixed-mode ACL that specifies L2 and L3 protocol
+      fields.  This ACL type is not implemented by many
+      routing/switching devices.";
+  }
+
+  // ACL action type
+
+  identity FORWARDING_ACTION {
+    description
+      "Base identity for actions in the forwarding category";
+  }
+
+  identity ACCEPT {
+    base FORWARDING_ACTION;
+    description
+      "Accept the packet";
+  }
+
+  identity DROP {
+    base FORWARDING_ACTION;
+    description
+      "Drop packet without sending any ICMP error message";
+  }
+
+  identity REJECT {
+    base FORWARDING_ACTION;
+    description
+      "Drop the packet and send an ICMP error message to the source";
+  }
+
+  identity LOG_ACTION {
+    description
+      "Base identity for defining the destination for logging
+      actions";
+  }
+
+  identity LOG_SYSLOG {
+    base LOG_ACTION;
+    description
+      "Log the packet in Syslog";
+  }
+
+  identity LOG_NONE {
+    base LOG_ACTION;
+    description
+      "No logging";
+  }
+
+  identity ACL_COUNTER_CAPABILITY {
+    description
+      "Base identity for system to indicate how it is able to report
+      counters";
+  }
+
+  identity INTERFACE_ONLY {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are available and reported only per interface";
+  }
+
+  identity AGGREGATE_ONLY {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are aggregated over all interfaces, and reported
+      only per ACL entry";
+  }
+
+  identity INTERFACE_AGGREGATE {
+    base ACL_COUNTER_CAPABILITY;
+    description
+      "ACL counters are reported per interface, and also aggregated
+      and reported per ACL entry.";
+  }
+
+  // grouping statements
+
+  // input interface
+  grouping input-interface-config {
+    description
+      "Config of interface";
+
+  }
+
+  grouping input-interface-state {
+    description
+      "State information of interface";
+  }
+
+  grouping input-interface-top {
+    description
+      "Input interface top level container";
+
+    container input-interface {
+      description
+        "Input interface container";
+
+      container config {
+        description
+          "Config data";
+        uses input-interface-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information";
+        uses input-interface-config;
+        uses input-interface-state;
+      }
+
+      uses oc-if:interface-ref;
+
+    }
+  }
+
+  // Action Type
+  grouping action-config {
+    description
+      "Config of action type";
+
+
+    leaf forwarding-action {
+      type identityref {
+        base FORWARDING_ACTION;
+      }
+      mandatory true;
+      description
+        "Specifies the forwarding action.  One forwarding action
+        must be specified for each ACL entry";
+    }
+
+    leaf log-action {
+      type identityref {
+        base LOG_ACTION;
+      }
+      default LOG_NONE;
+      description
+        "Specifies the log action and destination for
+        matched packets.  The default is not to log the
+        packet.";
+    }
+
+
+  }
+
+  grouping action-state {
+    description
+      "State information of action type";
+
+  }
+
+  grouping action-top {
+    description
+      "ACL action type top level container";
+
+    container actions {
+      description
+        "Enclosing container for list of ACL actions associated
+        with an entry";
+
+      container config {
+        description
+          "Config data for ACL actions";
+        uses action-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information for ACL actions";
+        uses action-config;
+        uses action-state;
+      }
+    }
+  }
+
+  grouping acl-counters-state {
+    description
+      "Common grouping for ACL counters";
+
+    leaf matched-packets {
+      type oc-yang:counter64;
+      description
+        "Count of the number of packets matching the current ACL
+        entry.
+
+        An implementation should provide this counter on a
+        per-interface per-ACL-entry if possible.
+
+        If an implementation only supports ACL counters per entry
+        (i.e., not broken out per interface), then the value
+        should be equal to the aggregate count across all interfaces.
+
+        An implementation that provides counters per entry per
+        interface is not required to also provide an aggregate count,
+        e.g., per entry -- the user is expected to be able implement
+        the required aggregation if such a count is needed.";
+    }
+
+    leaf matched-octets {
+      type oc-yang:counter64;
+      description
+        "Count of the number of octets (bytes) matching the current
+        ACL entry.
+
+        An implementation should provide this counter on a
+        per-interface per-ACL-entry if possible.
+
+        If an implementation only supports ACL counters per entry
+        (i.e., not broken out per interface), then the value
+        should be equal to the aggregate count across all interfaces.
+
+        An implementation that provides counters per entry per
+        interface is not required to also provide an aggregate count,
+        e.g., per entry -- the user is expected to be able implement
+        the required aggregation if such a count is needed.";
+    }
+
+  }
+
+  // Access List Entries
+  grouping access-list-entries-config {
+    description
+      "Access List Entries (ACE) config.";
+
+    leaf sequence-id {
+      type uint32;
+      description
+        "The sequence id determines the order in which ACL entries
+        are applied.  The sequence id must be unique for each entry
+        in an ACL set.  Target devices should apply the ACL entry
+        rules in the order determined by sequence id, rather than
+        the relying only on order in the list.";
+    }
+
+    leaf description {
+      type string;
+      description
+        "A user-defined description, or comment, for this Access List
+        Entry.";
+    }
+
+  }
+
+  grouping access-list-entries-state {
+    description
+      "Access List Entries state.";
+
+    uses acl-counters-state;
+
+  }
+
+  grouping access-list-entries-top {
+    description
+      "Access list entries to level container";
+
+    container acl-entries {
+      description
+        "Access list entries container";
+
+      list acl-entry {
+        key "sequence-id";
+        description
+          "List of ACL entries comprising an ACL set";
+
+        leaf sequence-id {
+          type leafref {
+            path "../config/sequence-id";
+          }
+          description
+            "references the list key";
+        }
+
+        container config {
+          description
+            "Access list entries config";
+          uses access-list-entries-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State information for ACL entries";
+          uses access-list-entries-config;
+          uses access-list-entries-state;
+        }
+
+        uses oc-match:ethernet-header-top {
+          when "../../config/type='ACL_L2'" {
+            description
+              "MAC-layer fields are valid when the ACL type is L2";
+          }
+        }
+        uses oc-match:ipv4-protocol-fields-top {
+          when "../../config/type='ACL_IPV4'" {
+            description
+              "IPv4-layer fields are valid when the ACL type is
+              IPv4";
+          }
+        }
+        uses oc-match:ipv6-protocol-fields-top {
+          when "../../config/type='ACL_IPV6'" {
+            description
+              "IPv6-layer fields are valid when the ACL type is
+              IPv6";
+          }
+        }
+        uses oc-match:transport-fields-top {
+          when "../../config/type='ACL_IPV6' or " +
+            "../../config/type='ACL_IPV4'" {
+            description
+              "Transport-layer fields are valid when specifying
+              L3 ACL types";
+          }
+        }
+        uses input-interface-top;
+
+        uses action-top;
+      }
+    }
+  }
+
+  grouping acl-set-config {
+    description
+      "Access Control List config";
+
+    leaf name {
+      type string;
+      description
+        "The name of the access-list set";
+    }
+
+    leaf type {
+      type identityref {
+        base ACL_TYPE;
+      }
+      description
+        "The type determines the fields allowed in the ACL entries
+        belonging to the ACL set (e.g., IPv4, IPv6, etc.)";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Description, or comment, for the ACL set";
+    }
+
+  }
+
+  grouping acl-set-state {
+    description
+      "Access Control List state";
+  }
+
+  grouping acl-set-top {
+    description
+      "Access list entries variables top level container";
+
+    container acl-sets {
+      description
+        "Access list entries variables enclosing container";
+
+      list acl-set {
+        key "name type";
+        description
+          "List of ACL sets, each comprising of a list of ACL
+          entries";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to the type list key";
+        }
+
+        container config {
+          description
+            "Access list config";
+          uses acl-set-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Access list state information";
+          uses acl-set-config;
+          uses acl-set-state;
+        }
+        uses access-list-entries-top;
+      }
+    }
+  }
+
+  grouping interface-acl-entries-config {
+    description
+      "Configuration data for per-interface ACLs";
+
+  }
+
+  grouping interface-acl-entries-state {
+    description
+      "Operational state data for per-interface ACL entries";
+
+    leaf sequence-id {
+      type leafref {
+        path "/acl/acl-sets/" +
+          "acl-set[name=current()/../../../../set-name]" +
+          "[type=current()/../../../../type]/" +
+          "acl-entries/acl-entry/sequence-id";
+      }
+      description
+        "Reference to an entry in the ACL set applied to an
+        interface";
+    }
+
+    uses acl-counters-state;
+
+  }
+
+  grouping interface-acl-entries-top {
+    description
+      "Top-level grouping for per-interface ACL entries";
+
+    container acl-entries {
+      config false;
+      description
+        "Enclosing container for list of references to ACLs";
+
+      list acl-entry {
+        key "sequence-id";
+        description
+          "List of ACL entries assigned to an interface";
+
+        leaf sequence-id {
+          type leafref {
+            path "../state/sequence-id";
+          }
+          description
+            "Reference to per-interface acl entry key";
+        }
+
+        // no config container since the enclosing container is
+        // read-only
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for per-interface ACL entries";
+
+          uses interface-acl-entries-config;
+          uses interface-acl-entries-state;
+        }
+      }
+    }
+  }
+
+  grouping interface-ingress-acl-config {
+    description
+      "Configuration data for per-interface ingress ACLs";
+
+    leaf set-name {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set/config/name";
+      }
+      description
+        "Reference to the ACL set name applied on ingress";
+    }
+
+    leaf type {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+          "/config/type";
+      }
+      description
+        "Reference to the ACL set type applied on ingress";
+    }
+  }
+
+  grouping interface-ingress-acl-state {
+    description
+      "Operational state data for the per-interface ingress ACL";
+  }
+
+  grouping interface-ingress-acl-top {
+    description
+      "Top-level grouping for per-interface ingress ACL data";
+
+    container ingress-acl-sets {
+      description
+        "Enclosing container the list of ingress ACLs on the
+        interface";
+
+      list ingress-acl-set {
+        key "set-name type";
+        description
+          "List of ingress ACLs on the interface";
+
+        leaf set-name {
+          type leafref {
+            path "../config/set-name";
+          }
+          description
+            "Reference to set name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to type list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses interface-ingress-acl-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for interface ingress ACLs";
+
+          uses interface-ingress-acl-config;
+          uses interface-ingress-acl-state;
+        }
+
+        uses interface-acl-entries-top;
+      }
+    }
+  }
+
+  grouping interface-egress-acl-config {
+    description
+      "Configuration data for per-interface egress ACLs";
+
+    leaf set-name {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set/config/name";
+      }
+      description
+        "Reference to the ACL set name applied on egress";
+    }
+
+    leaf type {
+      type leafref {
+        path "../../../../../../acl-sets/acl-set[name=current()/../set-name]" +
+          "/config/type";
+      }
+      description
+        "Reference to the ACL set type applied on egress.";
+    }
+  }
+
+  grouping interface-egress-acl-state {
+    description
+      "Operational state data for the per-interface egress ACL";
+  }
+
+  grouping interface-egress-acl-top {
+    description
+      "Top-level grouping for per-interface egress ACL data";
+
+    container egress-acl-sets {
+      description
+        "Enclosing container the list of egress ACLs on the
+        interface";
+
+      list egress-acl-set {
+        key "set-name type";
+        description
+          "List of egress ACLs on the interface";
+
+        leaf set-name {
+          type leafref {
+            path "../config/set-name";
+          }
+          description
+            "Reference to set name list key";
+        }
+
+        leaf type {
+          type leafref {
+            path "../config/type";
+          }
+          description
+            "Reference to type list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses interface-egress-acl-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for interface egress ACLs";
+
+          uses interface-egress-acl-config;
+          uses interface-egress-acl-state;
+        }
+
+        uses interface-acl-entries-top;
+      }
+    }
+  }
+
+  grouping acl-interfaces-config {
+    description
+      "Configuration data for interface references";
+
+    leaf id {
+      type oc-if:interface-id;
+      description
+        "User-defined identifier for the interface -- a common
+        convention could be '<if name>.<subif index>'";
+    }
+  }
+
+  grouping acl-interfaces-state {
+    description
+      "Operational state data for interface references";
+  }
+
+  grouping acl-interfaces-top {
+    description
+      "Top-level grouping for interface-specific ACL data";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interfaces on which
+        ACLs are set";
+
+      list interface {
+        key "id";
+        description
+          "List of interfaces on which ACLs are set";
+
+        leaf id {
+          type leafref {
+            path "../config/id";
+          }
+          description
+            "Reference to the interface id list key";
+        }
+
+        container config {
+          description
+            "Configuration for ACL per-interface data";
+
+          uses acl-interfaces-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state for ACL per-interface data";
+
+          uses acl-interfaces-config;
+          uses acl-interfaces-state;
+        }
+
+        uses oc-if:interface-ref;
+        uses interface-ingress-acl-top;
+        uses interface-egress-acl-top;
+      }
+    }
+  }
+
+  grouping acl-config {
+    description
+      "Global configuration data for ACLs";
+  }
+
+  grouping acl-state {
+    description
+      "Global operational state data for ACLs";
+
+    leaf counter-capability {
+      type identityref {
+        base ACL_COUNTER_CAPABILITY;
+      }
+      description
+        "System reported indication of how ACL counters are reported
+        by the target";
+    }
+  }
+  grouping acl-top {
+    description
+      "Top level grouping for ACL data and structure";
+
+    container acl {
+      description
+        "Top level enclosing container for ACL model config
+        and operational state data";
+
+      container config {
+        description
+          "Global config data for ACLs";
+
+        uses acl-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Global operational state data for ACLs";
+
+        uses acl-config;
+        uses acl-state;
+      }
+
+      uses acl-set-top;
+      uses acl-interfaces-top;
+    }
+  }
+
+  // data definition statements
+  uses acl-top;
+
+  // augment statements
+
+
+}
diff --git a/models/openconfig/src/main/yang/acl/openconfig-packet-match-types.yang b/models/openconfig/src/main/yang/acl/openconfig-packet-match-types.yang
new file mode 100644
index 0000000..7c99b80
--- /dev/null
+++ b/models/openconfig/src/main/yang/acl/openconfig-packet-match-types.yang
@@ -0,0 +1,293 @@
+module openconfig-packet-match-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/packet-match-types";
+
+  prefix "oc-pkt-match-types";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines common types for use in models requiring
+    data definitions related to packet matches.";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2017-05-26" {
+    description
+        "Separated IP matches into AFs";
+    reference "1.0.0";
+  }
+
+    revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-04-27" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+
+  //TODO: should replace this with an official IEEE module
+  // when available.  Only a select number of types are
+  // defined in this identity.
+  identity ETHERTYPE {
+    description
+      "Base identity for commonly used Ethertype values used
+      in packet header matches on Ethernet frames.  The Ethertype
+      indicates which protocol is encapsulated in the Ethernet
+      payload.";
+    reference
+      "IEEE 802.3";
+  }
+
+  identity ETHERTYPE_IPV4 {
+    base ETHERTYPE;
+    description
+      "IPv4 protocol (0x0800)";
+  }
+
+  identity ETHERTYPE_ARP {
+    base ETHERTYPE;
+    description
+      "Address resolution protocol (0x0806)";
+  }
+
+  identity ETHERTYPE_VLAN {
+    base ETHERTYPE;
+    description
+      "VLAN-tagged frame (as defined by IEEE 802.1q) (0x8100). Note
+      that this value is also used to represent Shortest Path
+      Bridging (IEEE 801.1aq) frames.";
+  }
+
+  identity ETHERTYPE_IPV6 {
+    base ETHERTYPE;
+    description
+      "IPv6 protocol (0x86DD)";
+  }
+
+  identity ETHERTYPE_MPLS {
+    base ETHERTYPE;
+    description
+      "MPLS unicast (0x8847)";
+  }
+
+  identity ETHERTYPE_LLDP {
+    base ETHERTYPE;
+    description
+      "Link Layer Discovery Protocol (0x88CC)";
+  }
+
+  identity ETHERTYPE_ROCE {
+    base ETHERTYPE;
+    description
+      "RDMA over Converged Ethernet (0x8915)";
+  }
+
+
+  //TODO: should replace this with an official IANA module when
+  //available.  Only a select set of protocols are defined with
+  //this identity.
+  identity IP_PROTOCOL {
+    description
+      "Base identity for commonly used IP protocols used in
+      packet header matches";
+    reference
+      "IANA Assigned Internet Protocol Numbers";
+  }
+
+  identity IP_TCP {
+    base IP_PROTOCOL;
+    description
+      "Transmission Control Protocol (6)";
+  }
+
+  identity IP_UDP  {
+    base IP_PROTOCOL;
+    description
+      "User Datagram Protocol (17)";
+  }
+
+  identity IP_ICMP {
+    base IP_PROTOCOL;
+    description
+      "Internet Control Message Protocol (1)";
+  }
+
+  identity IP_IGMP {
+    base IP_PROTOCOL;
+    description
+      "Internet Group Membership Protocol (2)";
+  }
+
+  identity IP_PIM {
+    base IP_PROTOCOL;
+    description
+      "Protocol Independent Multicast (103)";
+  }
+
+  identity IP_RSVP {
+    base IP_PROTOCOL;
+    description
+      "Resource Reservation Protocol (46)";
+  }
+
+  identity IP_GRE {
+    base IP_PROTOCOL;
+    description
+      "Generic Routing Encapsulation (47)";
+  }
+
+  identity IP_AUTH {
+    base IP_PROTOCOL;
+    description
+      "Authentication header, e.g., for IPSEC (51)";
+  }
+
+  identity IP_L2TP {
+    base IP_PROTOCOL;
+    description
+      "Layer Two Tunneling Protocol v.3 (115)";
+  }
+
+
+
+  identity TCP_FLAGS {
+    description
+      "Common TCP flags used in packet header matches";
+    reference
+      "IETF RFC 793 - Transmission Control Protocol
+      IETF RFC 3168 - The Addition of Explicit Congestion
+      Notification (ECN) to IP";
+  }
+
+  identity TCP_SYN {
+    base TCP_FLAGS;
+    description
+      "TCP SYN flag";
+  }
+
+  identity TCP_FIN {
+    base TCP_FLAGS;
+    description
+      "TCP FIN flag";
+  }
+
+  identity TCP_RST {
+    base TCP_FLAGS;
+    description
+      "TCP RST flag";
+  }
+
+  identity TCP_PSH {
+    base TCP_FLAGS;
+    description
+      "TCP push flag";
+  }
+
+  identity TCP_ACK {
+    base TCP_FLAGS;
+    description
+      "TCP ACK flag";
+  }
+
+  identity TCP_URG {
+    base TCP_FLAGS;
+    description
+      "TCP urgent flag";
+  }
+
+  identity TCP_ECE {
+    base TCP_FLAGS;
+    description
+      "TCP ECN-Echo flag.  If the SYN flag is set, indicates that
+      the TCP peer is ECN-capable, otherwise indicates that a
+      packet with Congestion Experienced flag in the IP header
+      is set";
+  }
+
+  identity TCP_CWR {
+    base TCP_FLAGS;
+    description
+      "TCP Congestion Window Reduced flag";
+  }
+
+  // typedef statements
+
+  typedef port-num-range {
+    type union {
+      type string {
+        pattern '^(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?[0-9]?' +
+          '[0-9]?)\.\.(6[0-5][0-5][0-3][0-5]|[0-5]?[0-9]?[0-9]?' +
+          '[0-9]?[0-9]?)$';
+      }
+      type oc-inet:port-number;
+      type enumeration {
+        enum ANY {
+          description
+            "Indicates any valid port number (e.g., wildcard)";
+        }
+      }
+    }
+    description
+      "Port numbers may be represented as a single value,
+      an inclusive range as <lower>..<higher>, or as ANY to
+      indicate a wildcard.";
+  }
+
+  typedef ip-protocol-type {
+    type union {
+      type uint8 {
+        range 0..254;
+      }
+      type identityref {
+        base IP_PROTOCOL;
+      }
+    }
+    description
+      "The IP protocol number may be expressed as a valid protocol
+      number (integer) or using a protocol type defined by the
+      IP_PROTOCOL identity";
+  }
+
+  typedef ethertype-type {
+    type union {
+      type uint16 {
+        //Note range can only be expressed in decimal
+        //but value is expected in hex notation.
+        range 1..65535;
+      }
+      type identityref {
+        base ETHERTYPE;
+      }
+    }
+    description
+      "The Ethertype value may be expressed as a 16-bit number in
+      hexadecimal notation, or using a type defined by the
+      ETHERTYPE identity";
+  }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/acl/openconfig-packet-match.yang b/models/openconfig/src/main/yang/acl/openconfig-packet-match.yang
new file mode 100644
index 0000000..446df36
--- /dev/null
+++ b/models/openconfig/src/main/yang/acl/openconfig-packet-match.yang
@@ -0,0 +1,314 @@
+module openconfig-packet-match {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/header-fields";
+
+  prefix "oc-pkt-match";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-packet-match-types { prefix oc-pkt-match-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data related to packet header fields
+    used in matching operations, for example in ACLs.  When a
+    field is omitted from a match expression, the effect is a
+    wildcard ('any') for that field.";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2017-05-26" {
+    description
+      "Separated IP matches into AFs";
+    reference "1.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-04-27" {
+    description
+      "Initial revision";
+    reference "TBD";
+  }
+
+
+  // Physical Layer fields
+  // ethernet-header
+  grouping ethernet-header-config {
+    description
+      "Configuration data of fields in Ethernet header.";
+
+    leaf source-mac {
+      type oc-yang:mac-address;
+      description
+        "Source IEEE 802 MAC address.";
+    }
+
+    leaf source-mac-mask {
+      type oc-yang:mac-address;
+      description
+        "Source IEEE 802 MAC address mask.";
+    }
+
+    leaf destination-mac {
+      type oc-yang:mac-address;
+      description
+        "Destination IEEE 802 MAC address.";
+    }
+
+    leaf destination-mac-mask {
+      type oc-yang:mac-address;
+      description
+        "Destination IEEE 802 MAC address mask.";
+    }
+
+    leaf ethertype {
+      type oc-pkt-match-types:ethertype-type;
+      description
+        "Ethertype field to match in Ethernet packets";
+    }
+  }
+
+  grouping ethernet-header-state {
+    description
+      "State information of fields in Ethernet header.";
+  }
+
+  grouping ethernet-header-top {
+    description
+      "Top level container for fields in Ethernet header.";
+
+    container l2 {
+      description
+        "Ethernet header fields";
+
+      container config {
+        description
+          "Configuration data";
+        uses ethernet-header-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State Information.";
+        uses ethernet-header-config;
+        uses ethernet-header-state;
+      }
+    }
+  }
+
+  grouping ip-protocol-fields-common-config {
+    description
+      "IP protocol fields common to IPv4 and IPv6";
+
+    leaf dscp {
+      type oc-inet:dscp;
+      description
+        "Value of diffserv codepoint.";
+    }
+
+    leaf protocol {
+      type oc-pkt-match-types:ip-protocol-type;
+      description
+        "The protocol carried in the IP packet, expressed either
+        as its IP protocol number, or by a defined identity.";
+    }
+
+    leaf hop-limit {
+      type uint8 {
+        range 0..255;
+      }
+      description
+        "The IP packet's hop limit -- known as TTL (in hops) in
+        IPv4 packets, and hop limit in IPv6";
+    }
+  }
+
+  // IP Layer
+  // ip-protocol-fields
+  grouping ipv4-protocol-fields-config {
+    description
+      "Configuration data of IP protocol fields
+      for IPv4";
+
+    leaf source-address {
+      type oc-inet:ipv4-prefix;
+      description
+        "Source IPv4 address prefix.";
+    }
+
+    leaf destination-address {
+      type oc-inet:ipv4-prefix;
+      description
+        "Destination IPv4 address prefix.";
+    }
+
+    uses ip-protocol-fields-common-config;
+
+  }
+
+  grouping ipv4-protocol-fields-state {
+    description
+      "State information of IP header fields for IPv4";
+  }
+
+  grouping ipv4-protocol-fields-top {
+    description
+      "IP header fields for IPv4";
+
+    container ipv4 {
+      description
+        "Top level container for IPv4 match field data";
+
+      container config {
+        description
+          "Configuration data for IPv4 match fields";
+        uses ipv4-protocol-fields-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information for IPv4 match fields";
+        uses ipv4-protocol-fields-config;
+        uses ipv4-protocol-fields-state;
+      }
+    }
+  }
+
+  grouping ipv6-protocol-fields-config {
+    description
+      "Configuration data for IPv6 match fields";
+
+    leaf source-address {
+      type oc-inet:ipv6-prefix;
+      description
+        "Source IPv6 address prefix.";
+    }
+
+    leaf source-flow-label {
+      type oc-inet:ipv6-flow-label;
+      description
+        "Source IPv6 Flow label.";
+    }
+
+    leaf destination-address {
+      type oc-inet:ipv6-prefix;
+      description
+        "Destination IPv6 address prefix.";
+    }
+
+    leaf destination-flow-label {
+      type oc-inet:ipv6-flow-label;
+      description
+        "Destination IPv6 Flow label.";
+    }
+
+    uses ip-protocol-fields-common-config;
+  }
+
+  grouping ipv6-protocol-fields-state {
+    description
+      "Operational state data for IPv6 match fields";
+  }
+
+  grouping ipv6-protocol-fields-top {
+    description
+      "Top-level grouping for IPv6 match fields";
+
+    container ipv6 {
+      description
+        "Top-level container for IPv6 match field data";
+
+      container config {
+        description
+          "Configuration data for IPv6 match fields";
+
+        uses ipv6-protocol-fields-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for IPv6 match fields";
+
+        uses ipv6-protocol-fields-config;
+        uses ipv6-protocol-fields-state;
+      }
+    }
+  }
+
+  // Transport fields
+  grouping transport-fields-config {
+    description
+      "Configuration data of transport-layer packet fields";
+
+    leaf source-port {
+      type oc-pkt-match-types:port-num-range;
+      description
+        "Source port or range";
+    }
+
+    leaf destination-port {
+      type oc-pkt-match-types:port-num-range;
+      description
+        "Destination port or range";
+    }
+
+    leaf-list tcp-flags {
+      type identityref {
+        base oc-pkt-match-types:TCP_FLAGS;
+      }
+      description
+        "List of TCP flags to match";
+    }
+  }
+
+  grouping transport-fields-state {
+    description
+      "State data of transport-fields";
+  }
+
+  grouping transport-fields-top {
+    description
+      "Destination transport-fields top level grouping";
+
+    container transport {
+      description
+        "Transport fields container";
+
+      container config {
+        description
+          "Configuration data";
+        uses transport-fields-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State data";
+        uses transport-fields-config;
+        uses transport-fields-state;
+      }
+    }
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-common.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-common.yang
new file mode 100644
index 0000000..b740369
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-common.yang
@@ -0,0 +1,222 @@
+submodule openconfig-aft-common {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-interfaces { prefix "oc-if"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-yang-types { prefix "oc-yang"; }
+  import openconfig-inet-types { prefix "oc-inet"; }
+  import openconfig-mpls-types { prefix "oc-mplst"; }
+  import openconfig-policy-types { prefix "oc-pol-types"; }
+  import openconfig-aft-types { prefix "oc-aftt"; }
+
+  oc-ext:openconfig-version "0.3.0";
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings that are re-used
+    across multiple contexts within the AFT model.";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-common-nhop-structural {
+    description
+      "Structural grouping describing a next-hop entry.";
+
+    container next-hops {
+      description
+        "The list of next-hops that are to be used for entry within
+        the AFT table. The structure of each next-hop is address
+        family independent, such that it is possible to resolve fully
+        how the next-hop is treated. For example:
+
+        - Where ingress IPv4 unicast packets are to be forwarded via
+          an MPLS LSP, the next-hop list should indicate the MPLS
+          label stack that is used to the next-hop.
+        - Where ingress MPLS labelled packets are to be forwarded to
+          an IPv6 nexthop (for example, a CE within a VPN, then the
+          popped label stack, and IPv6 next-hop address should be
+          indicated).";
+
+      list next-hop {
+        key "index";
+
+        description
+          "A next-hop associated with the forwarding instance. The
+          entries within the next-hop list should only reflect
+          next-hops that are actively used by the local system.
+          That is to say inactive, backup or FRR next-hops should
+          not be included within this list.";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "A unique index identifying the next-hop entry for the
+            AFT entry";
+
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the AFT next-hop
+            entry";
+
+          uses aft-common-entry-nexthop-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the AFT
+            next-hop entry";
+
+          uses aft-common-entry-nexthop-config;
+          uses aft-common-entry-nexthop-state;
+        }
+
+        uses oc-if:interface-ref;
+      }
+    }
+  }
+
+  grouping aft-common-entry-state {
+    description
+      "Operational state parameters relating to a forwarding entry";
+
+    leaf packets-forwarded {
+      type oc-yang:counter64;
+      description
+        "The number of packets which have matched, and been forwarded,
+         based on the AFT entry.";
+    }
+
+    leaf octets-forwarded {
+      type oc-yang:counter64;
+      description
+        "The number of octets which have matched, and been forwarded,
+         based on the AFT entry";
+    }
+  }
+
+  grouping aft-common-entry-nexthop-config {
+    description
+      "Configuration parameters relating to a next-hop entry for a AFT
+      entry";
+
+    leaf index {
+      type uint64;
+      description
+        "A unique entry for the next-hop.";
+    }
+  }
+
+  grouping aft-common-entry-nexthop-state {
+    description
+      "Parameters relating to a next-hop within the AFT entry";
+
+    leaf weight {
+      type uint32;
+      description
+        "The weight of the next-hop. Traffic is balanced according to
+        the ratio described by the relative weights of the next hops
+        that exist for the AFT entry. Note that all next-hops that are
+        specified are assumed to be active next-hops and therefore
+        eligible (and selected) to be installed in the FIB, and hence
+        used for packet forwarding.";
+    }
+
+    leaf ip-address {
+      type oc-inet:ip-address;
+      description
+        "The IP address of the next-hop system.";
+    }
+
+    leaf mac-address {
+      type oc-yang:mac-address;
+      description
+        "The MAC address of the next-hop if resolved by the local
+        network instance.";
+    }
+
+    leaf-list popped-mpls-label-stack {
+      type oc-mplst:mpls-label;
+      description
+        "The MPLS label stack to be popped from the packet when
+        switched by the system. The stack is encoded as a leaf-list
+        such that the first entry is the label that is outer-most (i.e.,
+        furthest from the bottom of the stack) label
+        stack to be popped.
+
+        If the local system pops the outer-most label 400, then the
+        value of this list is [400,]. If the local system removes two
+        labels, the outer-most being 500, and the second of which is
+        400, then the value of the list is [500, 400].
+
+        A swap operation is reflected by entries in the
+        popped-mpls-label-stack and pushed-mpls-label-stack nodes.";
+    }
+
+    leaf-list pushed-mpls-label-stack {
+      type oc-mplst:mpls-label;
+      ordered-by user;
+      description
+        "The MPLS label stack imposed when forwarding packets to the
+        next-hop
+        - the stack is encoded as a leaf list whereby the order of the
+          entries is such that the first entry in the list is the
+          label at the bottom of the stack to be pushed.
+
+        To this end, a packet which is to forwarded to a device using
+        a service label of 42, and a transport label of 8072 will be
+        represented with a label stack list of [42, 8072].
+
+        The MPLS label stack list is ordered by the user, such that no
+        system re-ordering of leaves is permitted by the system.
+
+        A swap operation is reflected by entries in the
+        popped-mpls-label-stack and pushed-mpls-label-stack nodes.";
+
+    }
+
+    leaf decapsulate-header {
+      type oc-aftt:encapsulation-header-type;
+      description
+        "When forwarding a packet to the specified next-hop, the local
+        system performs a decapsulation of the packet - removing the
+        specified header type. In the case that no next-hop is
+        specified, the packet header is removed, and a subsequent
+        forwarding lookup is performed on the packet encapsulated
+        within the header, matched within the relevant AFT within the
+        specified network-instance.";
+    }
+
+    leaf encapsulate-header {
+      type oc-aftt:encapsulation-header-type;
+      description
+        "When forwarding a packet to the specified next-hop the local
+        system performs an encapsulation of the packet - adding the
+        specified header type.";
+    }
+
+    leaf origin-protocol {
+      type identityref {
+        base "oc-pol-types:INSTALL_PROTOCOL_TYPE";
+      }
+      description
+        "The protocol from which the AFT entry was learned.";
+    }
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-ethernet.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-ethernet.yang
new file mode 100644
index 0000000..cf933db
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-ethernet.yang
@@ -0,0 +1,89 @@
+submodule openconfig-aft-ethernet {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-yang-types { prefix "oc-yang"; }
+
+  // Include common cross-AFT groupings from the common submodule.
+  include openconfig-aft-common;
+
+  oc-ext:openconfig-version "0.3.0";
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings for the abstract
+    forwarding tables for Ethernet.";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-ethernet-structural {
+    description
+      "Structural grouping defining the schema for the Ethernet
+      abstract forwarding table.";
+
+    list mac-entry {
+      key "mac-address";
+
+      description
+        "List of the Ethernet entries within the abstract
+        forwarding table. This list is keyed by the outer MAC address
+        of the Ethernet frame.";
+
+      leaf mac-address {
+        type leafref {
+          path "../config/mac-address";
+        }
+        description
+          "Reference to the outer MAC address matched by the
+          entry.";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the Ethernet AFT entry.";
+        uses aft-ethernet-entry-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for the Ethernet AFT
+          entry.";
+        uses aft-ethernet-entry-config;
+        uses aft-ethernet-entry-state;
+      }
+
+      uses aft-common-nhop-structural;
+    }
+  }
+
+  grouping aft-ethernet-entry-config {
+    description
+      "Configuration parameters for the Ethernet AFT entry.";
+
+    leaf mac-address {
+        type oc-yang:mac-address;
+        description
+          "The outer MAC address of the Ethernet frame that must
+          be matched for the AFT entry to be utilised.";
+    }
+  }
+
+  grouping aft-ethernet-entry-state {
+    description
+      "Operational state parameters for the Ethernet AFT entry.";
+    uses aft-common-entry-state;    
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-ipv4.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-ipv4.yang
new file mode 100644
index 0000000..7f9a316
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-ipv4.yang
@@ -0,0 +1,89 @@
+submodule openconfig-aft-ipv4 {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-inet-types { prefix "oc-inet"; }
+
+  // Include common cross-AFT groupings from the common submodule.
+  include openconfig-aft-common;
+
+  oc-ext:openconfig-version "0.3.0";
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings for the abstract
+    forwarding tables for IPv4.";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-ipv4-unicast-structural {
+    description
+      "Structural grouping defining the schema for the IPv4 unicast
+      abstract forwarding table.";
+
+    list ipv4-entry {
+      key "prefix";
+
+      description
+        "List of the IPv4 unicast entries within the abstract
+        forwarding table. This list is keyed by the destination IPv4
+        prefix.";
+
+      leaf prefix {
+        type leafref {
+          path "../config/prefix";
+        }
+        description
+          "Reference to the IPv4 unicast destination prefix which
+          must be matched to utilise the AFT entry.";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the IPv4 unicast AFT entry.";
+        uses aft-ipv4-unicast-entry-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for the IPv4 unicast AFT
+          entry.";
+        uses aft-ipv4-unicast-entry-config;
+        uses aft-ipv4-unicast-entry-state;
+      }
+
+      uses aft-common-nhop-structural;
+    }
+  }
+
+  grouping aft-ipv4-unicast-entry-config {
+    description
+      "Configuration parameters for the IPv4 unicast entry.";
+
+    leaf prefix {
+        type oc-inet:ipv4-prefix;
+        description
+          "The IPv4 destination prefix that should be matched to
+          utilise the AFT entry.";
+    }
+  }
+
+  grouping aft-ipv4-unicast-entry-state {
+    description
+      "Operational state parameters for the IPv4 unicast entry."; 
+    uses aft-common-entry-state;   
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-ipv6.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-ipv6.yang
new file mode 100644
index 0000000..9cca582
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-ipv6.yang
@@ -0,0 +1,89 @@
+submodule openconfig-aft-ipv6 {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-inet-types { prefix "oc-inet"; }
+
+  // Include common cross-AFT groupings from the common submodule.
+  include openconfig-aft-common;
+
+  oc-ext:openconfig-version "0.3.0";
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings for the abstract
+    forwarding tables for IPv6.";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-ipv6-unicast-structural {
+    description
+      "Structural grouping defining the schema for the IPv6 unicast
+      abstract forwarding table.";
+
+    list ipv6-entry {
+      key "prefix";
+
+      description
+        "List of the IPv6 unicast entries within the abstract
+        forwarding table. This list is keyed by the destination IPv6
+        prefix.";
+
+      leaf prefix {
+        type leafref {
+          path "../config/prefix";
+        }
+        description
+          "Reference to the IPv6 unicast destination prefix which
+          must be matched to utilise the AFT entry.";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the IPv6 unicast AFT entry.";
+        uses aft-ipv6-unicast-entry-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for the IPv6 unicast AFT
+          entry.";
+        uses aft-ipv6-unicast-entry-config;
+        uses aft-ipv6-unicast-entry-state;
+      }
+
+      uses aft-common-nhop-structural;
+    }
+  }
+
+  grouping aft-ipv6-unicast-entry-config {
+    description
+      "Configuration parameters for the IPv6 unicast entry.";
+
+    leaf prefix {
+        type oc-inet:ipv6-prefix;
+        description
+          "The IPv6 destination prefix that should be matched to
+          utilise the AFT entry.";
+    }
+  }
+
+  grouping aft-ipv6-unicast-entry-state {
+    description
+      "Operational state parameters for the IPv6 unicast entry.";
+    uses aft-common-entry-state;    
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-mpls.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-mpls.yang
new file mode 100644
index 0000000..38e5cc0
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-mpls.yang
@@ -0,0 +1,89 @@
+submodule openconfig-aft-mpls {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-mpls-types { prefix "oc-mpls-types"; }
+
+  // Include common cross-AFT groupings from the common submodule.
+  include openconfig-aft-common;
+
+  oc-ext:openconfig-version "0.3.0";
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings for the abstract
+    forwarding table for MPLS label forwarding.";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-mpls-structural {
+    description
+      "Structural grouping defining the schema for the MPLS
+      abstract forwarding table.";
+
+    list label-entry {
+      key "label";
+
+      description
+        "List of the MPLS entries within the abstract
+        forwarding table. This list is keyed by the top-most MPLS
+        label.";
+
+      leaf label {
+        type leafref {
+          path "../config/label";
+        }
+        description
+          "Reference to the top-most MPLS label matched by the
+          entry.";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the MPLS AFT entry.";
+        uses aft-mpls-entry-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for the MPLS AFT
+          entry.";
+        uses aft-mpls-entry-config;
+        uses aft-mpls-entry-state;
+      }
+
+      uses aft-common-nhop-structural;
+    }
+  }
+
+  grouping aft-mpls-entry-config {
+    description
+      "Configuration parameters for the MPLS entry.";
+
+    leaf label {
+        type oc-mpls-types:mpls-label;
+        description
+          "The top-most MPLS label that should be matched to
+          utilise the AFT entry.";
+    }
+  }
+
+  grouping aft-mpls-entry-state {
+    description
+      "Operational state parameters for the MPLS entry.";
+    uses aft-common-entry-state;    
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-network-instance.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-network-instance.yang
new file mode 100644
index 0000000..b42c8ed
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-network-instance.yang
@@ -0,0 +1,115 @@
+module openconfig-aft-network-instance {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/aft/ni";
+  prefix "oc-aftni";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-network-instance { prefix "oc-ni"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+     www.openconfig.net";
+
+  description
+    "This module provides augmentations that are utilized
+     when building the OpenConfig network instance model to
+     add per-NI AFTs.";
+
+  oc-ext:openconfig-version "0.2.1";
+
+  revision 2017-01-13 {
+    description
+      "Updated revision for external review";
+    reference "0.2.1";
+  }
+
+
+  typedef network-instance-ref {
+    type leafref {
+      path "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:config/oc-ni:name";
+    }
+    description
+      "A re-usable type that can be referenced within other
+       modules that references a network instance.";
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+          "oc-ni:afts/oc-ni:ipv4-unicast/oc-ni:ipv4-entry/" +
+          "oc-ni:next-hops/oc-ni:next-hop/oc-ni:state" {
+
+    description
+      "Add leaves that require referencing of a network instance to the
+      operational state parameters of a next-hop within the AFT for IPv4
+      unicast.";
+
+    uses aft-nexthop-ni-state;
+  }
+
+ augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+          "oc-ni:afts/oc-ni:ipv6-unicast/oc-ni:ipv6-entry/" +
+          "oc-ni:next-hops/oc-ni:next-hop/oc-ni:state" {
+
+    description
+      "Add leaves that require referencing of a network instance to the
+      operational state parameters of a next-hop within the AFT for IPv6
+      unicast.";
+
+    uses aft-nexthop-ni-state;
+  }
+
+  grouping aft-nexthop-ni-state {
+    description
+      "Operational state parameters relating to a next-hop which reference a
+      network instance.";
+
+    leaf network-instance {
+      type network-instance-ref;
+      description
+        "The network-instance within which the next-hop should be resolved.
+         When this leaf is unspecified, the next-hop is resolved within 
+         the local instance.";
+    }
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+          "oc-ni:afts/oc-ni:ipv4-unicast/oc-ni:ipv4-entry/oc-ni:state" {
+    description
+      "Add leaves that require referencing of a network instance to the
+      operational state parameters of an entry within the IPv4 unicast AFT.";
+
+    uses aft-entry-ni-state;
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+          "oc-ni:afts/oc-ni:ipv6-unicast/oc-ni:ipv6-entry/oc-ni:state" {
+    description
+      "Add leaves that require referencing of a network instance to the
+      operational state parameters of an entry within the IPv6 unicast AFT.";
+
+    uses aft-entry-ni-state;
+  }
+
+  grouping aft-entry-ni-state {
+    description
+      "Operational state parameters relating to an AFT entry which reference
+      a network instance.";
+
+    leaf origin-network-instance {
+      type network-instance-ref;
+      description
+        "If the AFT entry was imported from another network instance (e.g., it
+        corresponds to a L3 forwarding entry which was learned within another
+        network-instance), the value of this leaf reflects the network-instance
+        from which it was learned.
+
+        For example, if the local network-instance corresponds to a L3VRF, and
+        routes are imported from the VPNv4 address-family of the BGP instance
+        in the DEFAULT_INSTANCE, then this value would reflect the
+        DEFAULT_INSTANCE as the origin-network-instance.";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-pf.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-pf.yang
new file mode 100644
index 0000000..707bb8b
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-pf.yang
@@ -0,0 +1,168 @@
+submodule openconfig-aft-pf {
+  belongs-to "openconfig-aft" {
+    prefix "oc-aft";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-inet-types { prefix "oc-inet"; }
+  import openconfig-yang-types { prefix "oc-yang"; }
+  import openconfig-mpls-types { prefix "oc-mplst"; }
+  import openconfig-packet-match-types {
+    prefix "oc-pkt-match-types";
+  }
+
+  // Include common cross-AFT groupings from the common submodule.
+  include openconfig-aft-common;
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Submodule containing definitions of groupings for the abstract
+    forwarding table(s) for policy forwarding entries. These are
+    defined to be forwarding tables that allow matches on
+    fields other than the destination address that is used in
+    other forwarding tables.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  grouping aft-pf-structural {
+    description
+      "Structural grouping defining the schema for the policy
+      forwarding abstract forwarding table.";
+
+    list policy-forwarding-entry {
+      key "index";
+
+      description
+        "List of the policy forwarding entries within the abstract
+        forwarding table. Each entry is uniquely identified by an
+        index on the system, due to the arbitrary match conditions
+        that may be implemented within the policy forwarding AFT.
+        The index may change upon changes of the entry if, and only
+        if, the device exporting the AFT replaces the entire entry
+        by removing the previous entry and replacing it with a
+        subsequent updated version.";
+
+      leaf index {
+        type leafref {
+          path "../config/index";
+        }
+        description
+          "Reference to the arbitary index for the policy forwarding
+          AFT entry.";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the Policy forwarding
+          AFT entry.";
+        uses aft-pf-entry-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for the Policy Forwarding
+          AFT entry.";
+        uses aft-pf-entry-config;
+        uses aft-pf-entry-state;
+      }
+
+      uses aft-common-nhop-structural;
+    }
+  }
+
+  grouping aft-pf-entry-config {
+    description
+      "Configuration parameters for the Policy Forwarding
+      AFT entry.";
+
+    leaf index {
+      type uint64;
+      description
+        "An arbitrary 64-bit index identifying the policy forwarding
+        AFT entry.";
+    }
+
+    leaf ip-prefix {
+      type oc-inet:ip-prefix;
+      description
+        "The IP prefix that the forwarding entry matches.";
+    }
+
+    leaf mac-address {
+      type oc-yang:mac-address;
+      description
+         "The MAC address that the forwarding entry matches. Used for
+         Layer 2 forwarding entries, e.g., within a VSI instance.";
+    }
+
+    leaf mpls-label {
+      type oc-mplst:mpls-label;
+      description
+        "The MPLS label that the forwarding entry matches. Used for
+        MPLS forwarding entries, whereby the local device acts as an
+        LSR.";
+    }
+
+    leaf mpls-tc {
+      type oc-mplst:mpls-tc;
+      description
+        "The value of the MPLS Traffic Class bits (formerly known as
+        the MPLS experimental bits) that are to be matched by the AFT
+        entry.";
+      reference
+        "RFC5462: Multiprotocol Label Switching (MPLS) Label Stack
+        Entry: 'EXP' Field Renamed to 'Traffic Class' Field"; }
+
+    leaf ip-dscp {
+      type oc-inet:dscp;
+      description
+        "The value of the differentiated services code point (DSCP) to
+        be matched for the forwarding entry. The value is specified in
+        cases where specific class-based forwarding based on IP is
+        implemented by the device.";
+    }
+
+    leaf ip-protocol {
+      type oc-pkt-match-types:ip-protocol-type;
+      description
+        "The value of the IP protocol field of an IPv4 packet, or the
+        next-header field of an IPv6 packet which is to be matched by
+        the AFT entry. This field is utilised where forwarding is
+        performed based on L4 information.";
+    }
+
+    leaf l4-src-port {
+      type oc-inet:port-number;
+      description
+        "The value of the source port field of the transport header
+        that is to be matched by the AFT entry.";
+    }
+
+    leaf l4-dst-port {
+      type oc-inet:port-number;
+      description
+        "The value of the destination port field of the transport
+        header that is to be matched by the AFT entry.";
+    }
+  }
+
+  grouping aft-pf-entry-state {
+    description
+      "Operational state parameters for the Policy Forwarding
+      AFT entry.";
+    uses aft-common-entry-state;    
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft-types.yang b/models/openconfig/src/main/yang/aft/openconfig-aft-types.yang
new file mode 100644
index 0000000..1476ea0
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft-types.yang
@@ -0,0 +1,52 @@
+module openconfig-aft-types {
+
+  namespace "http://openconfig.net/yang/fib-types";
+  prefix "oc-aftt";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig Working Group";
+
+  contact
+    "OpenConfig Working Group
+    www.openconfig.net";
+
+  description
+    "Types related to the OpenConfig Abstract Forwarding
+    Table (AFT) model";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  typedef encapsulation-header-type {
+    type enumeration {
+      enum GRE {
+        description
+          "The encapsulation header is a Generic Routing Encapsulation
+          header.";
+      }
+      enum IPV4 {
+        description
+          "The encapsulation header is an IPv4 packet header";
+      }
+      enum IPV6 {
+        description
+          "The encapsulation header is an IPv6 packet header";
+      }
+      enum MPLS {
+        description
+          "The encapsulation header is one or more MPLS labels indicated
+          by the pushed and popped label stack lists.";
+      }
+    }
+    description
+      "Types of tunnel encapsulation that are supported by systems as either
+      head- or tail-end.";
+  }
+}
diff --git a/models/openconfig/src/main/yang/aft/openconfig-aft.yang b/models/openconfig/src/main/yang/aft/openconfig-aft.yang
new file mode 100644
index 0000000..98b9362
--- /dev/null
+++ b/models/openconfig/src/main/yang/aft/openconfig-aft.yang
@@ -0,0 +1,136 @@
+module openconfig-aft {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/aft";
+
+  prefix "oc-aft";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // Include IPv4 AFT submodule.
+  include openconfig-aft-ipv4;
+  // Include IPv6 AFT submodule.
+  include openconfig-aft-ipv6;
+  // Include MPLS AFT submodule.
+  include openconfig-aft-mpls;
+  // Include policy forwarding AFT submodule.
+  include openconfig-aft-pf;
+  // Include the ethernet AFT submodule.
+  include openconfig-aft-ethernet;
+  // Include the common cross-AFT entities.
+  include openconfig-aft-common;
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "A model describing the forwarding entries installed on a network
+    element. It should be noted that this model is not expected to
+    align 1:1 with the underlying structure used directly by a
+    forwarding element (e.g., linecard), but rather provide an
+    abstraction that can be consumed by an NMS to observe, and in some
+    cases manipulate, the internal forwarding database in a simplified
+    manner. Since the underlying model of the forwarding table is not
+    expected to align with this model, the structure described herein
+    is referred to as an Abstract Forwarding Table (AFT), rather than
+    the FIB.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision 2017-05-10 {
+    description
+      "Refactor to provide concretised per-AF schemas per AFT.";
+    reference "0.3.0";
+  }
+
+  // config + state groupings
+
+  // structural groupings
+
+  grouping aft-top {
+    description
+      "Top-level grouping allowing per-protocol instantiation of the
+      AFT.";
+
+    container afts {
+      description
+        "The abstract forwarding tables (AFTs) that are associated
+        with the network instance. An AFT is instantiated per-protocol
+        running within the network-instance - such that one exists for
+        IPv4 Unicast, IPv6 Unicast, MPLS, L2 forwarding entries, etc.
+        A forwarding entry within the FIB has a set of next-hops,
+        which may be a reference to an entry within another table -
+        e.g., where a Layer 3 next-hop has an associated Layer 2
+        forwarding entry.";
+
+      container ipv4-unicast {
+        description
+
+          "The abstract forwarding table for IPv4 unicast. Entries
+          within this table are uniquely keyed on the IPv4 unicast
+          destination prefix which is matched by ingress packets.
+
+          The data set represented by the IPv4 Unicast AFT is the set
+          of entries from the IPv4 unicast RIB that have been selected
+          for installation into the FIB of the device exporting the
+          data structure.";
+
+        uses aft-ipv4-unicast-structural;
+      }
+
+      container ipv6-unicast {
+        description
+          "The abstract forwarding table for IPv6 unicast. Entries
+          within this table are uniquely keyed on the IPv6 unicast
+          destination prefix which is matched by ingress packets.
+
+          The data set represented by the IPv6 Unicast AFTis the set
+          of entries within the IPv6 RIB that ";
+
+        uses aft-ipv6-unicast-structural;
+
+      }
+
+      container policy-forwarding {
+        description
+          "The abstract forwarding table for policy-based forwarding
+          entries. Since multiple match criteria can be utilised
+          within a policy-based forwarding rule, this AFT provides a
+          flexible match criteria, and is indexed based on an
+          arbitrary 64-bit index. Entries within the AFT may match on
+          multiple field types (e.g., L4 header fields, as well as L2
+          fields).
+
+          Examples of entries within this table are:
+            - IPv4 policy-based routing based on DSCP.
+            - MPLS policy-based forwarding entries.";
+
+        uses aft-pf-structural;
+      }
+
+      container mpls {
+        description
+          "The abstract forwarding table for MPLS label based
+          forwarding entries. Entries within the table are keyed based
+          on the top-most MPLS label in the stack on the ingress
+          packet.";
+
+        uses aft-mpls-structural;
+      }
+
+      container ethernet {
+        description
+          "The abstract forwarding table for Ethernet based forwarding
+          entries. Entries within the table are keyed based on the 
+          destination MAC address on the ingress packet.";
+
+        uses aft-ethernet-structural;
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-multiprotocol.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-multiprotocol.yang
new file mode 100644
index 0000000..46c61e8
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-multiprotocol.yang
@@ -0,0 +1,458 @@
+submodule openconfig-bgp-common-multiprotocol {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-bgp-types { prefix oc-bgp-types; }
+  import openconfig-routing-policy { prefix oc-rpol; }
+  import openconfig-types { prefix oc-types; }
+
+  include openconfig-bgp-common;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains groupings that are related to support
+    for multiple protocols in BGP. The groupings are common across
+    multiple contexts.";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-common-mp-afi-safi-graceful-restart-config {
+    description
+      "BGP graceful restart parameters that apply on a per-AFI-SAFI
+      basis";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "This leaf indicates whether graceful-restart is enabled for
+        this AFI-SAFI";
+    }
+  }
+
+  grouping bgp-common-mp-afi-safi-config {
+    description
+      "Configuration parameters used for all BGP AFI-SAFIs";
+
+    leaf afi-safi-name {
+      type identityref {
+        base oc-bgp-types:AFI_SAFI_TYPE;
+      }
+      description "AFI,SAFI";
+    }
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "This leaf indicates whether the IPv4 Unicast AFI,SAFI is
+        enabled for the neighbour or group";
+    }
+  }
+
+  grouping bgp-common-mp-all-afi-safi-list-contents {
+    description
+      "A common grouping used for contents of the list that is used
+      for AFI-SAFI entries";
+
+    // import and export policy included for the afi/safi
+    uses oc-rpol:apply-policy-group;
+
+    uses bgp-common-mp-ipv4-unicast-group;
+    uses bgp-common-mp-ipv6-unicast-group;
+    uses bgp-common-mp-ipv4-labeled-unicast-group;
+    uses bgp-common-mp-ipv6-labeled-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv4-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv6-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv4-multicast-group;
+    uses bgp-common-mp-l3vpn-ipv6-multicast-group;
+    uses bgp-common-mp-l2vpn-vpls-group;
+    uses bgp-common-mp-l2vpn-evpn-group;
+  }
+
+  // Groupings relating to each address family
+  grouping bgp-common-mp-ipv4-unicast-group {
+    description
+      "Group for IPv4 Unicast configuration options";
+
+    container ipv4-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:IPV4_UNICAST'" {
+        description
+          "Include this container for IPv4 Unicast specific
+          configuration";
+      }
+
+      description "IPv4 unicast configuration options";
+
+      // include common IPv[46] unicast options
+      uses bgp-common-mp-ipv4-ipv6-unicast-common;
+
+      // placeholder for IPv4 unicast  specific configuration
+    }
+  }
+
+  grouping bgp-common-mp-ipv6-unicast-group {
+    description
+      "Group for IPv6 Unicast configuration options";
+
+    container ipv6-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:IPV6_UNICAST'" {
+        description
+          "Include this container for IPv6 Unicast specific
+          configuration";
+      }
+
+      description "IPv6 unicast configuration options";
+
+      // include common IPv[46] unicast options
+      uses bgp-common-mp-ipv4-ipv6-unicast-common;
+
+      // placeholder for IPv6 unicast specific configuration
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-ipv4-labeled-unicast-group {
+    description
+      "Group for IPv4 Labeled Unicast configuration options";
+
+    container ipv4-labeled-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:IPV4_LABELED_UNICAST'" {
+        description
+          "Include this container for IPv4 Labeled Unicast specific
+          configuration";
+      }
+
+      description "IPv4 Labeled Unicast configuration options";
+
+      uses bgp-common-mp-all-afi-safi-common;
+
+      // placeholder for IPv4 Labeled Unicast specific config
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-ipv6-labeled-unicast-group {
+    description
+      "Group for IPv6 Labeled Unicast configuration options";
+
+    container ipv6-labeled-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:IPV6_LABELED_UNICAST'" {
+        description
+          "Include this container for IPv6 Labeled Unicast specific
+          configuration";
+      }
+
+      description "IPv6 Labeled Unicast configuration options";
+
+      uses bgp-common-mp-all-afi-safi-common;
+
+      // placeholder for IPv6 Labeled Unicast specific config
+      // options.
+    }
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv4-unicast-group {
+    description
+      "Group for IPv4 Unicast L3VPN configuration options";
+
+    container l3vpn-ipv4-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV4_UNICAST'" {
+        description
+          "Include this container for IPv4 Unicast L3VPN specific
+          configuration";
+      }
+
+      description "Unicast IPv4 L3VPN configuration options";
+
+      // include common L3VPN configuration options
+      uses bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common;
+
+      // placeholder for IPv4 Unicast L3VPN specific config options.
+    }
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv6-unicast-group {
+    description
+      "Group for IPv6 Unicast L3VPN configuration options";
+
+    container l3vpn-ipv6-unicast {
+      when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV6_UNICAST'" {
+        description
+          "Include this container for unicast IPv6 L3VPN specific
+          configuration";
+      }
+
+      description "Unicast IPv6 L3VPN configuration options";
+
+      // include common L3VPN configuration options
+      uses bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common;
+
+      // placeholder for IPv6 Unicast L3VPN specific configuration
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv4-multicast-group {
+    description
+      "Group for IPv4 L3VPN multicast configuration options";
+
+    container l3vpn-ipv4-multicast {
+      when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV4_MULTICAST'" {
+        description
+          "Include this container for multicast IPv6 L3VPN specific
+          configuration";
+      }
+
+      description "Multicast IPv4 L3VPN configuration options";
+
+      // include common L3VPN multicast options
+      uses bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common;
+
+      // placeholder for IPv4 Multicast L3VPN specific configuration
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv6-multicast-group {
+    description
+      "Group for IPv6 L3VPN multicast configuration options";
+
+    container l3vpn-ipv6-multicast {
+      when "../afi-safi-name = 'oc-bgp-types:L3VPN_IPV6_MULTICAST'" {
+        description
+          "Include this container for multicast IPv6 L3VPN specific
+          configuration";
+      }
+
+      description "Multicast IPv6 L3VPN configuration options";
+
+      // include common L3VPN multicast options
+      uses bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common;
+
+      // placeholder for IPv6 Multicast L3VPN specific configuration
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-l2vpn-vpls-group {
+    description
+      "Group for BGP-signalled VPLS configuration options";
+
+    container l2vpn-vpls {
+      when "../afi-safi-name = 'oc-bgp-types:L2VPN_VPLS'" {
+        description
+          "Include this container for BGP-signalled VPLS specific
+          configuration";
+      }
+
+      description "BGP-signalled VPLS configuration options";
+
+      // include common L2VPN options
+      uses bgp-common-mp-l2vpn-common;
+
+      // placeholder for BGP-signalled VPLS specific configuration
+      // options
+    }
+  }
+
+  grouping bgp-common-mp-l2vpn-evpn-group {
+    description
+      "Group for BGP EVPN configuration options";
+
+    container l2vpn-evpn {
+      when "../afi-safi-name = 'oc-bgp-types:L2VPN_EVPN'" {
+        description
+          "Include this container for BGP EVPN specific
+          configuration";
+      }
+
+      description "BGP EVPN configuration options";
+
+      // include common L2VPN options
+      uses bgp-common-mp-l2vpn-common;
+
+      // placeholder for BGP EVPN specific configuration options
+    }
+  }
+
+  // Common groupings across multiple AFI,SAFIs
+  grouping bgp-common-mp-all-afi-safi-common {
+    description
+      "Grouping for configuration common to all AFI,SAFI";
+
+    container prefix-limit {
+      description
+        "Configure the maximum number of prefixes that will be
+        accepted from a peer";
+
+      container config {
+        description
+          "Configuration parameters relating to the prefix
+          limit for the AFI-SAFI";
+        uses bgp-common-mp-all-afi-safi-common-prefix-limit-config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information relating to the prefix-limit for the
+          AFI-SAFI";
+        uses bgp-common-mp-all-afi-safi-common-prefix-limit-config;
+      }
+    }
+  }
+
+  grouping bgp-common-mp-ipv4-ipv6-unicast-common {
+    description
+      "Common configuration that is applicable for IPv4 and IPv6
+      unicast";
+
+    // include common afi-safi options.
+    uses bgp-common-mp-all-afi-safi-common;
+
+    // configuration options that are specific to IPv[46] unicast
+    container config {
+      description
+        "Configuration parameters for common IPv4 and IPv6 unicast
+        AFI-SAFI options";
+      uses bgp-common-mp-ipv4-ipv6-unicast-common-config;
+    }
+    container state {
+      config false;
+      description
+        "State information for common IPv4 and IPv6 unicast
+        parameters";
+      uses bgp-common-mp-ipv4-ipv6-unicast-common-config;
+    }
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv4-ipv6-unicast-common {
+    description
+      "Common configuration applied across L3VPN for IPv4
+       and IPv6";
+
+    // placeholder -- specific configuration options that are generic
+    // across IPv[46] unicast address families.
+    uses bgp-common-mp-all-afi-safi-common;
+  }
+
+  grouping bgp-common-mp-l3vpn-ipv4-ipv6-multicast-common {
+    description
+      "Common configuration applied across L3VPN for IPv4
+      and IPv6";
+
+    // placeholder -- specific configuration options that are
+    // generic across IPv[46] multicast address families.
+    uses bgp-common-mp-all-afi-safi-common;
+  }
+
+  grouping bgp-common-mp-l2vpn-common {
+    description
+      "Common configuration applied across L2VPN address
+      families";
+
+    // placeholder -- specific configuration options that are
+    // generic across L2VPN address families
+    uses bgp-common-mp-all-afi-safi-common;
+  }
+
+  // Config groupings for common groups
+  grouping bgp-common-mp-all-afi-safi-common-prefix-limit-config {
+    description
+      "Configuration parameters relating to prefix-limits for an
+      AFI-SAFI";
+
+    leaf max-prefixes {
+      type uint32;
+      description
+        "Maximum number of prefixes that will be accepted
+        from the neighbour";
+    }
+
+    leaf prevent-teardown {
+      type boolean;
+      default false;
+      description
+        "Do not tear down the BGP session when the maximum
+        prefix limit is exceeded, but rather only log a
+        warning. The default of this leaf is false, such
+        that when it is not specified, the session is torn
+        down.";
+    }
+
+    leaf shutdown-threshold-pct {
+      type oc-types:percentage;
+      description
+        "Threshold on number of prefixes that can be received
+        from a neighbour before generation of warning messages
+        or log entries. Expressed as a percentage of
+        max-prefixes";
+    }
+
+    leaf restart-timer {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units "seconds";
+      description
+        "Time interval in seconds after which the BGP session
+        is re-established after being torn down due to exceeding
+        the max-prefix limit.";
+    }
+  }
+
+  grouping bgp-common-mp-ipv4-ipv6-unicast-common-config {
+    description
+      "Common configuration parameters for IPv4 and IPv6 Unicast
+      address families";
+
+    leaf send-default-route {
+      type boolean;
+      default "false";
+      description
+        "If set to true, send the default-route to the neighbour(s)";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-structure.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-structure.yang
new file mode 100644
index 0000000..30a5ad2
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common-structure.yang
@@ -0,0 +1,179 @@
+submodule openconfig-bgp-common-structure {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  include openconfig-bgp-common-multiprotocol;
+  include openconfig-bgp-common;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains groupings that are common across multiple BGP
+    contexts and provide structure around other primitive groupings.";
+
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-common-structure-neighbor-group-logging-options {
+    description
+      "Structural grouping used to include error handling configuration and
+      state for both BGP neighbors and groups";
+
+    container logging-options {
+      description
+        "Logging options for events related to the BGP neighbor or
+        group";
+      container config {
+        description
+          "Configuration parameters enabling or modifying logging
+          for events relating to the BGPgroup";
+        uses bgp-common-neighbor-group-logging-options-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to logging for the BGP neighbor
+          or group";
+        uses bgp-common-neighbor-group-logging-options-config;
+      }
+    }
+  }
+
+  grouping bgp-common-structure-neighbor-group-ebgp-multihop {
+    description
+      "Structural grouping used to include eBGP multihop configuration and
+      state for both BGP neighbors and peer groups";
+
+    container ebgp-multihop {
+      description
+        "eBGP multi-hop parameters for the BGPgroup";
+      container config {
+        description
+          "Configuration parameters relating to eBGP multihop for the
+          BGP group";
+        uses bgp-common-neighbor-group-multihop-config;
+      }
+      container state {
+        config false;
+        description
+          "State information for eBGP multihop, for the BGP neighbor
+          or group";
+        uses bgp-common-neighbor-group-multihop-config;
+      }
+    }
+  }
+
+  grouping bgp-common-structure-neighbor-group-route-reflector {
+    description
+      "Structural grouping used to include route reflector configuration and
+      state for both BGP neighbors and peer groups";
+
+    container route-reflector {
+      description
+        "Route reflector parameters for the BGPgroup";
+      container config {
+        description
+          "Configuraton parameters relating to route reflection
+          for the BGPgroup";
+        uses bgp-common-neighbor-group-route-reflector-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to route reflection for the
+          BGPgroup";
+        uses bgp-common-neighbor-group-route-reflector-config;
+      }
+    }
+  }
+
+  grouping bgp-common-structure-neighbor-group-as-path-options {
+    description
+      "Structural grouping used to include AS_PATH manipulation configuration
+      and state for both BGP neighbors and peer groups";
+
+    container as-path-options {
+      description
+        "AS_PATH manipulation parameters for the BGP neighbor or
+        group";
+      container config {
+        description
+          "Configuration parameters relating to AS_PATH manipulation
+          for the BGP peer or group";
+        uses bgp-common-neighbor-group-as-path-options-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the AS_PATH manipulation
+          mechanisms for the BGP peer or group";
+        uses bgp-common-neighbor-group-as-path-options-config;
+      }
+    }
+  }
+
+  grouping bgp-common-structure-neighbor-group-add-paths {
+    description
+      "Structural grouping used to include ADD-PATHs configuration and state
+      for both BGP neighbors and peer groups";
+
+    container add-paths {
+      description
+        "Parameters relating to the advertisement and receipt of
+        multiple paths for a single NLRI (add-paths)";
+      container config {
+        description
+          "Configuration parameters relating to ADD_PATHS";
+        uses bgp-common-neighbor-group-add-paths-config;
+      }
+      container state {
+        config false;
+        description
+          "State information associated with ADD_PATHS";
+        uses bgp-common-neighbor-group-add-paths-config;
+      }
+    }
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-common.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common.yang
new file mode 100644
index 0000000..5ebc98b
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-common.yang
@@ -0,0 +1,648 @@
+submodule openconfig-bgp-common {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-bgp-types { prefix oc-bgp-types; }
+  import openconfig-routing-policy { prefix oc-rpol; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-inet-types { prefix oc-inet; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains common groupings that are common across
+    multiple contexts within the BGP module. That is to say that they
+    may be application to a subset of global, peer-group or neighbor
+    contexts.";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-common-neighbor-group-timers-config {
+    description
+      "Config parameters related to timers associated with the BGP
+      peer";
+
+    leaf connect-retry {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      default 30;
+      description
+        "Time interval in seconds between attempts to establish a
+        session with the peer.";
+    }
+
+    leaf hold-time {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      default 90;
+      description
+        "Time interval in seconds that a BGP session will be
+        considered active in the absence of keepalive or other
+        messages from the peer.  The hold-time is typically
+        set to 3x the keepalive-interval.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4, Sec. 10";
+    }
+
+    leaf keepalive-interval {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      default 30;
+      description
+        "Time interval in seconds between transmission of keepalive
+        messages to the neighbor.  Typically set to 1/3 the
+        hold-time.";
+    }
+
+    leaf minimum-advertisement-interval {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      default 30;
+      description
+        "Minimum time which must elapse between subsequent UPDATE
+        messages relating to a common set of NLRI being transmitted
+        to a peer. This timer is referred to as
+        MinRouteAdvertisementIntervalTimer by RFC 4721 and serves to
+        reduce the number of UPDATE messages transmitted when a
+        particular set of NLRI exhibit instability.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4, Sec 9.2.1.1";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-config {
+    description
+      "Neighbor level configuration items.";
+
+    leaf peer-as {
+      type oc-inet:as-number;
+      description
+        "AS number of the peer.";
+    }
+
+    leaf local-as {
+      type oc-inet:as-number;
+      description
+        "The local autonomous system number that is to be used
+        when establishing sessions with the remote peer or peer
+        group, if this differs from the global BGP router
+        autonomous system number.";
+    }
+
+    leaf peer-type {
+        type oc-bgp-types:peer-type;
+        description
+          "Explicitly designate the peer or peer group as internal
+          (iBGP) or external (eBGP).";
+    }
+
+    leaf auth-password {
+      type oc-types:routing-password;
+      description
+        "Configures an MD5 authentication password for use with
+        neighboring devices.";
+    }
+
+    leaf remove-private-as {
+      // could also make this a container with a flag to enable
+      // remove-private and separate option.  here, option implies
+      // remove-private is enabled.
+      type oc-bgp-types:remove-private-as-option;
+      description
+        "Remove private AS numbers from updates sent to peers - when
+        this leaf is not specified, the AS_PATH attribute should be
+        sent to the peer unchanged";
+    }
+
+    leaf route-flap-damping {
+      type boolean;
+      default false;
+      description
+        "Enable route flap damping.";
+    }
+
+    leaf send-community {
+      type oc-bgp-types:community-type;
+      default "NONE";
+      description
+        "Specify which types of community should be sent to the
+        neighbor or group. The default is to not send the
+        community attribute";
+    }
+
+    leaf description {
+      type string;
+      description
+        "An optional textual description (intended primarily for use
+        with a peer or group";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-transport-config {
+    description
+      "Configuration parameters relating to the transport protocol
+      used by the BGP session to the peer";
+
+    leaf tcp-mss {
+      type uint16;
+      description
+        "Sets the max segment size for BGP TCP sessions.";
+    }
+
+    leaf mtu-discovery {
+      type boolean;
+      default false;
+      description
+        "Turns path mtu discovery for BGP TCP sessions on (true)
+        or off (false)";
+    }
+
+    leaf passive-mode {
+      type boolean;
+      default false;
+      description
+        "Wait for peers to issue requests to open a BGP session,
+        rather than initiating sessions from the local router.";
+    }
+
+    leaf local-address {
+      type union {
+        type oc-inet:ip-address;
+        type string;
+      }
+      //TODO:  the string should be converted to a leafref type
+      //to point to an interface when YANG 1.1 is available with
+      //leafrefs in union types.
+      description
+        "Set the local IP (either IPv4 or IPv6) address to use
+        for the session when sending BGP update messages.  This
+        may be expressed as either an IP address or reference
+        to the name of an interface.";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-error-handling-config {
+    description
+      "Configuration parameters relating to enhanced error handling
+      behaviours for BGP";
+
+    leaf treat-as-withdraw {
+      type boolean;
+      default "false";
+      description
+        "Specify whether erroneous UPDATE messages for which the
+        NLRI can be extracted are reated as though the NLRI is
+        withdrawn - avoiding session reset";
+      reference "draft-ietf-idr-error-handling-16";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-logging-options-config {
+    description
+      "Configuration parameters specifying the logging behaviour for
+      BGP sessions to the peer";
+
+    leaf log-neighbor-state-changes {
+      type boolean;
+      default "true";
+      description
+        "Configure logging of peer state changes.  Default is
+        to enable logging of peer state changes.";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-multihop-config {
+    description
+      "Configuration parameters specifying the multihop behaviour for
+      BGP sessions to the peer";
+
+    leaf enabled {
+      type boolean;
+      default "false";
+      description
+        "When enabled the referenced group or neighbors are permitted
+        to be indirectly connected - including cases where the TTL
+        can be decremented between the BGP peers";
+    }
+
+    leaf multihop-ttl {
+      type uint8;
+      description
+        "Time-to-live value to use when packets are sent to the
+        referenced group or neighbors and ebgp-multihop is enabled";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-route-reflector-config {
+    description
+      "Configuration parameters determining whether the behaviour of
+      the local system when acting as a route-reflector";
+
+    leaf route-reflector-cluster-id {
+      type oc-bgp-types:rr-cluster-id-type;
+      description
+        "route-reflector cluster id to use when local router is
+        configured as a route reflector.  Commonly set at the group
+        level, but allows a different cluster
+        id to be set for each neighbor.";
+    }
+
+    leaf route-reflector-client {
+      type boolean;
+      default "false";
+      description
+        "Configure the neighbor as a route reflector client.";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-as-path-options-config {
+    description
+      "Configuration parameters allowing manipulation of the AS_PATH
+      attribute";
+
+    leaf allow-own-as {
+      type uint8;
+      default 0;
+      description
+        "Specify the number of occurrences of the local BGP speaker's
+        AS that can occur within the AS_PATH before it is rejected.";
+    }
+
+    leaf replace-peer-as {
+      type boolean;
+      default "false";
+      description
+        "Replace occurrences of the peer's AS in the AS_PATH
+        with the local autonomous system number";
+    }
+
+    leaf disable-peer-as-filter {
+      type boolean;
+      default "false";
+      description
+        "When set to true, the system advertises routes to a peer
+        even if the peer's AS was in the AS path.  The default
+        behavior (false) suppresses advertisements to peers if
+        their AS number is in the AS path of the route.";
+    }
+  }
+
+  grouping bgp-common-neighbor-group-add-paths-config {
+    description
+      "Configuration parameters specfying whether the local system
+      will send or receive multiple paths using ADD_PATHS";
+
+    leaf receive {
+      type boolean;
+      default false;
+      description
+        "Enable capability negotiation to receive multiple path
+        advertisements for an NLRI from the neighbor or group";
+      reference
+        "RFC 7911 - Advertisement of Multiple Paths in BGP";
+    }
+
+    leaf send {
+      type boolean;
+      default false;
+      description
+        "Enable capability negotiation to send multiple path
+        advertisements for an NLRI from the neighbor or group";
+      reference
+        "RFC 7911 - Advertisement of Multiple Paths in BGP";
+    }
+
+    leaf send-max {
+      type uint8;
+      description
+        "The maximum total number of paths to advertise to neighbors
+        for a single NLRI.  This includes the single best path as
+        well as additional paths advertised when add-paths is
+        enabled.";
+    }
+
+    leaf eligible-prefix-policy {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+          "oc-rpol:policy-definition/oc-rpol:name";
+      }
+      description
+        "A reference to a routing policy which can be used to
+        restrict the prefixes for which add-paths is enabled";
+    }
+  }
+
+  grouping bgp-common-graceful-restart-config {
+    description
+      "Configuration parameters relating to BGP graceful restart.";
+
+    leaf enabled {
+      type boolean;
+      description
+        "Enable or disable the graceful-restart capability.";
+    }
+
+    leaf restart-time {
+      type uint16 {
+        range 0..4096;
+      }
+      description
+        "Estimated time (in seconds) for the local BGP speaker to
+        restart a session. This value is advertise in the graceful
+        restart BGP capability.  This is a 12-bit value, referred to
+        as Restart Time in RFC4724.  Per RFC4724, the suggested
+        default value is <= the hold-time value.";
+    }
+
+    leaf stale-routes-time {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      description
+        "An upper-bound on the time thate stale routes will be
+        retained by a router after a session is restarted. If an
+        End-of-RIB (EOR) marker is received prior to this timer
+        expiring stale-routes will be flushed upon its receipt - if
+        no EOR is received, then when this timer expires stale paths
+        will be purged. This timer is referred to as the
+        Selection_Deferral_Timer in RFC4724";
+    }
+
+    leaf helper-only {
+      type boolean;
+      description
+        "Enable graceful-restart in helper mode only. When this
+        leaf is set, the local system does not retain forwarding
+        its own state during a restart, but supports procedures
+        for the receiving speaker, as defined in RFC4724.";
+    }
+  }
+
+  grouping bgp-common-use-multiple-paths-config {
+    description
+      "Generic configuration options relating to use of multiple
+      paths for a referenced AFI-SAFI, group or neighbor";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "Whether the use of multiple paths for the same NLRI is
+        enabled for the neighbor. This value is overridden by
+        any more specific configuration value.";
+    }
+  }
+
+  grouping bgp-common-use-multiple-paths-ebgp-as-options-config {
+    description
+      "Configuration parameters specific to eBGP multipath applicable
+      to all contexts";
+
+    leaf allow-multiple-as {
+     type boolean;
+     default "false";
+     description
+      "Allow multipath to use paths from different neighbouring
+      ASes.  The default is to only consider multiple paths from
+      the same neighbouring AS.";
+    }
+  }
+
+  grouping bgp-common-global-group-use-multiple-paths {
+    description
+      "Common grouping used for both global and groups which provides
+      configuration and state parameters relating to use of multiple
+      paths";
+
+    container use-multiple-paths {
+      description
+        "Parameters related to the use of multiple paths for the
+        same NLRI";
+
+      container config {
+        description
+          "Configuration parameters relating to multipath";
+        uses bgp-common-use-multiple-paths-config;
+      }
+      container state {
+        config false;
+        description
+          "State parameters relating to multipath";
+        uses bgp-common-use-multiple-paths-config;
+      }
+
+      container ebgp {
+        description
+          "Multipath parameters for eBGP";
+        container config {
+          description
+            "Configuration parameters relating to eBGP multipath";
+          uses bgp-common-use-multiple-paths-ebgp-config;
+        }
+        container state {
+          config false;
+          description
+            "State information relating to eBGP multipath";
+          uses bgp-common-use-multiple-paths-ebgp-config;
+        }
+      }
+
+      container ibgp {
+        description
+          "Multipath parameters for iBGP";
+        container config {
+          description
+            "Configuration parameters relating to iBGP multipath";
+          uses bgp-common-use-multiple-paths-ibgp-config;
+        }
+        container state {
+          config false;
+          description
+            "State information relating to iBGP multipath";
+          uses bgp-common-use-multiple-paths-ibgp-config;
+        }
+      }
+    }
+  }
+
+  grouping bgp-common-use-multiple-paths-ebgp-config {
+    description
+      "Configuration parameters relating to multipath for eBGP";
+
+    leaf allow-multiple-as {
+     type boolean;
+     default "false";
+     description
+      "Allow multipath to use paths from different neighbouring
+      ASes.  The default is to only consider multiple paths from
+      the same neighbouring AS.";
+    }
+
+    leaf maximum-paths {
+     type uint32;
+     default 1;
+     description
+      "Maximum number of parallel paths to consider when using
+      BGP multipath. The default is use a single path.";
+    }
+  }
+
+  grouping bgp-common-use-multiple-paths-ibgp-config {
+    description
+      "Configuration parmaeters relating to multipath for iBGP";
+
+    leaf maximum-paths {
+      type uint32;
+      default 1;
+      description
+        "Maximum number of parallel paths to consider when using
+        iBGP multipath. The default is to use a single path";
+    }
+  }
+
+  grouping bgp-common-route-selection-options-config {
+    description
+      "Set of configuration options that govern best
+       path selection.";
+
+    leaf always-compare-med {
+      type boolean;
+      default "false";
+      description
+        "Compare multi-exit discriminator (MED) value from
+        different ASes when selecting the best route.  The
+        default behavior is to only compare MEDs for paths
+        received from the same AS.";
+    }
+
+    leaf ignore-as-path-length {
+      type boolean;
+      default "false";
+      description
+        "Ignore the AS path length when selecting the best path.
+        The default is to use the AS path length and prefer paths
+        with shorter length.";
+    }
+
+    leaf external-compare-router-id {
+      type boolean;
+      default "true";
+      description
+        "When comparing similar routes received from external
+        BGP peers, use the router-id as a criterion to select
+        the active path.";
+    }
+
+    leaf advertise-inactive-routes {
+      type boolean;
+      default "false";
+      description
+        "Advertise inactive routes to external peers.  The
+        default is to only advertise active routes.";
+    }
+
+    leaf enable-aigp {
+      type boolean;
+      default false;
+      description
+        "Flag to enable sending / receiving accumulated IGP
+        attribute in routing updates";
+    }
+
+    leaf ignore-next-hop-igp-metric {
+      type boolean;
+      default "false";
+      description
+        "Ignore the IGP metric to the next-hop when calculating
+        BGP best-path. The default is to select the route for
+        which the metric to the next-hop is lowest";
+    }
+  }
+
+  grouping bgp-common-route-selection-options {
+    description
+      "Configuration and state relating to route selection options";
+
+    container route-selection-options {
+      description
+        "Parameters relating to options for route selection";
+      container config {
+        description
+          "Configuration parameters relating to route selection
+          options";
+        uses bgp-common-route-selection-options-config;
+      }
+      container state {
+        config false;
+        description
+          "State information for the route selection options";
+        uses bgp-common-route-selection-options-config;
+      }
+    }
+  }
+
+  grouping bgp-common-state {
+    description
+      "Grouping containing common counters relating to prefixes and
+      paths";
+
+    leaf total-paths {
+      type uint32;
+      description
+        "Total number of BGP paths within the context";
+    }
+
+    leaf total-prefixes {
+      type uint32;
+      description
+        "Total number of BGP prefixes received within the context";
+    }
+  }
+
+
+}
+
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-errors.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-errors.yang
new file mode 100644
index 0000000..07a464d
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-errors.yang
@@ -0,0 +1,405 @@
+submodule openconfig-bgp-errors {
+
+  belongs-to openconfig-bgp-types {
+    prefix "oc-bgp-types";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module defines BGP NOTIFICATION message error codes
+    and subcodes";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+
+
+  identity BGP_ERROR_CODE {
+    description
+      "Indicates the error type in a BGP NOTIFICATION message";
+    reference
+      "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+  }
+
+  identity BGP_ERROR_SUBCODE {
+    description
+      "Provides more specific information about the nature of the
+      error reported in a NOTIFICATION message. Each Error
+      Code may have one or more Error Subcodes associated with it.";
+    reference
+      "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+  }
+
+
+  identity UNSPECIFIC {
+    base  BGP_ERROR_SUBCODE;
+    description
+      "The error subcode field is unspecific when the NOTIFICATION
+      message does not include any specific error subcode (i.e..,
+      value 0).";
+  }
+
+  identity MESSAGE_HEADER_ERROR {
+    base BGP_ERROR_CODE;
+    description
+      "Errors detected while processing the Message Header";
+  }
+
+  identity OPEN_MESSAGE_ERROR {
+    base BGP_ERROR_CODE;
+    description
+      "Errors detected while processing the OPEN message";
+  }
+
+  identity UPDATE_MESSAGE_ERROR {
+    base BGP_ERROR_CODE;
+    description
+      "Errors detected while processing the UPDATE message";
+  }
+
+  identity HOLD_TIMER_EXPIRED {
+    base BGP_ERROR_CODE;
+    description
+      "Indicates that the system did not receive successive
+      KEEPALIVE, UPDATE, and/or NOTIFICATION messages within the
+      period specified in the Hold Time field of the OPEN message";
+  }
+
+  identity FINITE_STATE_MACHINE_ERROR {
+    base BGP_ERROR_CODE;
+    description
+      "Error detected by the BGP Finite State Machine
+      (e.g., receipt of an unexpected event)";
+  }
+
+  identity CEASE {
+    base BGP_ERROR_CODE;
+    description
+      "Sent by a BGP peer to close its BGP connection in absence of
+      any fatal errors.  If the BGP speaker terminates its
+      connection with a neihbor because the number of prefixes
+      received exceeds the configured upper bound, the speaker must
+      send the neighbor a NOTIFICATION message with the Cease
+      error code.";
+  }
+
+  identity ROUTE_REFRESH_MESSAGE_ERROR {
+    base BGP_ERROR_CODE;
+    description
+      "The length, excluding the fixed-size message header, of the
+      received ROUTE-REFRESH message with Message Subtype 1 and 2 is
+      not 4.  Applicable only when a BGP speaker has received the
+      'Enhanced Route Refresh Capability' from a peer";
+    reference
+      "RFC 7313 - Enhanced Route Refresh Capability for BGP-4";
+  }
+
+  identity MESSAGE_HEADER_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for Message Header error
+      notifications";
+  }
+
+  identity CONNECTION_NOT_SYNCHRONIZED {
+    base MESSAGE_HEADER_SUBCODE;
+    description
+      "Marker field of the message header is not all ones as
+      expected";
+  }
+
+  identity BAD_MESSAGE_LENGTH {
+    base MESSAGE_HEADER_SUBCODE;
+    description
+      "Indicates the message has an erroneous length with one
+      or more of the following:
+
+      - the Length field of the message header is less than 19 or
+        greater than 4096
+
+      - the Length field of an OPEN message is less than the minimum
+        length of the OPEN message
+
+      - the Length field of an UPDATE message is less than the
+        minimum length of the UPDATE message
+
+      - the Length field of a KEEPALIVE message is not equal to 19
+
+      - the Length field of a NOTIFICATION message is less than the
+        minimum length of the NOTIFICATION message
+
+      The erroneous Length field must be reported in the
+      NOTIFICATION data.";
+  }
+
+  identity BAD_MESSAGE_TYPE {
+    base MESSAGE_HEADER_SUBCODE;
+    description
+      "Type field of the message header is not recognized.  The
+      erroneous type field must be reported in the NOTIFICATION
+      data";
+  }
+
+  identity OPEN_MESSAGE_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for OPEN message error
+      notifications";
+  }
+
+  identity UNSUPPORTED_VERSION_NUMBER {
+    base OPEN_MESSAGE_SUBCODE;
+    description
+      "Version number in the Version field of the received OPEN
+      message is not supported";
+  }
+
+  identity BAD_PEER_AS {
+    base  OPEN_MESSAGE_SUBCODE;
+    description
+      "Autonomous System field of the OPEN message is unacceptable";
+  }
+
+  identity BAD_BGP_IDENTIFIER {
+    base OPEN_MESSAGE_SUBCODE;
+    description
+      "BGP Identifier field of the OPEN message is syntactically
+      incorrect";
+  }
+
+  identity UNSUPPORTED_OPTIONAL_PARAMETER {
+    base OPEN_MESSAGE_SUBCODE;
+    description
+      "One of the Optional Parameters in the OPEN message is not
+      recognized";
+  }
+
+  identity UNACCEPTABLE_HOLD_TIME {
+    base OPEN_MESSAGE_SUBCODE;
+    description
+      "Hold Time field of the OPEN message is unacceptable";
+  }
+
+  identity UNSUPPORTED_CAPABILITY {
+    base OPEN_MESSAGE_SUBCODE;
+    description
+      "Inidicates that the peer does not support capabilities
+      advertisement -- the peer may send this subcode in response to
+      an OPEN message that carries the Capabilities Optional
+      Parameter";
+    reference
+      "RFC 5492 - Capabilities Advertisement with BGP-4";
+  }
+
+  identity UPDATE_MESSAGE_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for UPDATE message error
+      notifications";
+  }
+
+  identity MALFORMED_ATTRIBUTE_LIST {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "Inidicates Withdrawn Routes Length or Total Attribute Length
+      is too large, or
+
+      An attribute appears more than once in the UPDATE message";
+  }
+
+  identity UNRECOGNIZED_WELL_KNOWN_ATTRIBUTE {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "One or more of the well-known mandatory attributes are not
+      recognized";
+  }
+
+  identity MISSING_WELL_KNOWN_ATTRIBUTE {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "One or more of the well-known mandatory attributes are not
+      present";
+  }
+
+  identity ATTRIBUTE_FLAGS_ERROR {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "Attribute has Attribute Flags that conflict with the
+      Attribute Type Code";
+  }
+
+  identity ATTRIBUTE_LENGTH_ERROR {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "Attribute has an Attribute Length that conflicts with the
+      expected length (based on the attribute type code)";
+  }
+
+  identity INVALID_ORIGIN_ATTRIBUTE {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "ORIGIN attribute has an undefined value";
+  }
+
+  identity INVALID_NEXT_HOP_ATTRIBUTE {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "The NEXT_HOP attribute field is syntactically incorrect";
+  }
+
+  identity OPTIONAL_ATTRIBUTE_ERROR {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "An error is detected in the value of a recognized optional
+      attribute (such an attribute must be discarded)";
+  }
+
+  identity INVALID_NETWORK_FIELD {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "The NLRI field in the UPDATE message is syntactically
+      incorrect";
+  }
+
+  identity MALFORMED_AS_PATH {
+    base UPDATE_MESSAGE_SUBCODE;
+    description
+      "The AS_PATH attribute is syntactically incorrect";
+  }
+
+  identity FINITE_STATE_MACHINE_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for BGP finite state machine
+      errors.";
+    reference
+      "RFC 6608 - Subcodes for BGP Finite State Machine Error";
+  }
+
+  identity RECEIVE_UNEXPECTED_MESSAGE_OPENSENT {
+    base FINITE_STATE_MACHINE_SUBCODE;
+    description
+      "The peer BGP speaker received an unexpected message from
+      the local system while the peer speaker session was in the
+      OpenSent state";
+  }
+
+  identity RECEIVE_UNEXPECTED_MESSAGE_OPENCONFIRM {
+    base FINITE_STATE_MACHINE_SUBCODE;
+    description
+      "The peer BGP speaker received an unexpected message from
+      the local system while the peer speaker session was in the
+      OpenConfirm state";
+  }
+
+  identity RECEIVE_UNEXPECTED_MESSAGE_ESTABLISHED {
+    base FINITE_STATE_MACHINE_SUBCODE;
+    description
+      "The peer BGP speaker received an unexpected message from
+      the local system while the peer speaker session was in the
+      Established state";
+  }
+
+  identity CEASE_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for Cease notification messages";
+    reference
+      "RFC 4486 - Subcodes for BGP Cease Notification Message";
+  }
+
+  identity MAX_NUM_PREFIXES_REACHED {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker terminated its peering with the local
+      system because the number of address prefixes received
+      exceeds a locally configured upper bound";
+  }
+
+  identity ADMINISTRATIVE_SHUTDOWN {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker administratively shut down its peering
+      with the local system";
+  }
+
+  identity PEER_DE_CONFIGURED {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker de-configure the peering with the local
+      system";
+  }
+
+  identity ADMINISTRATIVE_RESET {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker administratively reset the peering with
+      the local system";
+  }
+
+  identity CONNECTION_REJECTED {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker disallowed the BGP connection to the
+      local system after the peer speaker accepted a transport
+      protocol connection";
+  }
+
+  identity OTHER_CONFIG_CHANGE {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker administratively reset the peering with
+      the local sytem due to a configuration change that is not
+      covered by another subcode.";
+  }
+
+  identity CONN_COLLISION_RESOLUTION {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker sent a CEASE NOTIFICATION as a result of
+      the collision resolution procedure described in RFC 4271";
+  }
+
+  identity OUT_OF_RESOURCES {
+    base CEASE_SUBCODE;
+    description
+      "The peer BGP speaker ran out of resources (e.g., memory) and
+      reset the session with the local system";
+  }
+
+  identity ROUTE_REFRESH_SUBCODE {
+    base BGP_ERROR_SUBCODE;
+    description
+      "Error subcode definitions for the ROUTE-REFRESH message
+      error";
+  }
+
+  identity INVALID_MESSAGE_LENGTH {
+    base ROUTE_REFRESH_SUBCODE;
+    description
+      "The length, excluding the fixed-size message header, of the
+      received ROUTE-REFRESH message with Message Subtype 1 and 2
+      is not 4";
+  }
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-global.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-global.yang
new file mode 100644
index 0000000..a6fa8cd
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-global.yang
@@ -0,0 +1,375 @@
+submodule openconfig-bgp-global {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-inet-types { prefix oc-inet; }
+
+  // Include common submodules
+  include openconfig-bgp-common;
+  include openconfig-bgp-common-multiprotocol;
+  include openconfig-bgp-peer-group;
+  include openconfig-bgp-common-structure;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains groupings that are specific to the
+    global context of the OpenConfig BGP module";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-global-config {
+    description
+      "Global configuration options for the BGP router.";
+
+    leaf as {
+      type oc-inet:as-number;
+      mandatory true;
+      description
+        "Local autonomous system number of the router.  Uses
+        the 32-bit as-number type from the model in RFC 6991.";
+    }
+
+    leaf router-id {
+      type oc-yang:dotted-quad;
+      description
+        "Router id of the router - an unsigned 32-bit integer
+        expressed in dotted quad notation.";
+      reference
+        "RFC4271 - A Border Gateway Protocol 4 (BGP-4),
+        Section 4.2";
+    }
+  }
+
+  grouping bgp-global-state {
+    description
+      "Operational state parameters for the BGP neighbor";
+
+    uses bgp-common-state;
+  }
+
+  grouping bgp-global-default-route-distance-config {
+    description
+      "Configuration options relating to the administrative distance
+      (or preference) assigned to routes received from different
+      sources (external, internal, and local).";
+
+    leaf external-route-distance {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Administrative distance for routes learned from external
+        BGP (eBGP).";
+    }
+    leaf internal-route-distance {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Administrative distance for routes learned from internal
+        BGP (iBGP).";
+    }
+  }
+
+  grouping bgp-global-confederation-config {
+    description
+      "Configuration options specifying parameters when the local
+      router is within an autonomous system which is part of a BGP
+      confederation.";
+
+    leaf identifier {
+      type oc-inet:as-number;
+      description
+        "Confederation identifier for the autonomous system.
+        Setting the identifier indicates that the local-AS is part
+        of a BGP confederation.";
+    }
+
+    leaf-list member-as {
+      type oc-inet:as-number;
+      description
+        "Remote autonomous systems that are to be treated
+        as part of the local confederation.";
+    }
+  }
+
+  grouping bgp-global-dynamic-neighbors {
+    description
+      "Grouping containing configuration relating to dynamic peers.";
+
+    container dynamic-neighbor-prefixes {
+      description
+        "A list of IP prefixes from which the system should:
+          - Accept connections to the BGP daemon
+          - Dynamically configure a BGP neighbor corresponding to the
+            source address of the remote system, using the parameters
+            of the specified peer-group.
+         For such neighbors, an entry within the neighbor list should
+         be created, indicating that the peer was dynamically
+         configured, and referencing the peer-group from which the
+         configuration was derived.";
+
+      list dynamic-neighbor-prefix {
+        key "prefix";
+        description
+          "An individual prefix from which dynamic neighbor
+          connections are allowed.";
+
+        leaf prefix {
+          type leafref {
+            path "../config/prefix";
+          }
+          description
+            "Reference to the IP prefix from which source connections
+            are allowed for the dynamic neighbor group.";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the source prefix
+            for the dynamic BGP neighbor connections.";
+
+          uses bgp-global-dynamic-neighbor-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the source
+            prefix for the dynamic BGP neighbor connections.";
+
+          uses bgp-global-dynamic-neighbor-config;
+        }
+      }
+    }
+  }
+
+  grouping bgp-global-dynamic-neighbor-config {
+    description
+      "Configuration parameters relating to an individual prefix from
+      which dynamic neighbors are accepted.";
+
+    leaf prefix {
+      type oc-inet:ip-prefix;
+      description
+        "The IP prefix within which the source address of the remote
+        BGP speaker must fall to be considered eligible to the
+        dynamically configured."; }
+
+    leaf peer-group {
+      type leafref {
+        // At bgp/global/dynamic-neighbor-prefixes/dynamic-neighbor
+        // prefix/config/peer-group
+        path "../../../../../peer-groups/peer-group/config/" +
+             "peer-group-name";
+      }
+      description
+        "The peer-group within which the dynamic neighbor will be
+        configured.  The configuration parameters used for the dynamic
+        neighbor are those specified within the referenced peer
+        group.";
+    }
+  }
+
+  grouping bgp-global-mp-all-afi-safi-list-contents {
+    description
+      "A grouping used for contents of the list of AFI-SAFI
+      entries at the global BGP level.";
+
+    // import and export policy included for the afi/safi
+
+    uses bgp-common-mp-ipv4-unicast-group;
+    uses bgp-common-mp-ipv6-unicast-group;
+    uses bgp-common-mp-ipv4-labeled-unicast-group;
+    uses bgp-common-mp-ipv6-labeled-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv4-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv6-unicast-group;
+    uses bgp-common-mp-l3vpn-ipv4-multicast-group;
+    uses bgp-common-mp-l3vpn-ipv6-multicast-group;
+    uses bgp-common-mp-l2vpn-vpls-group;
+    uses bgp-common-mp-l2vpn-evpn-group;
+  }
+
+  grouping bgp-global-afi-safi-list {
+    description
+      "List of address-families associated with the BGP instance";
+
+    list afi-safi {
+      key "afi-safi-name";
+
+      description
+        "AFI,SAFI configuration available for the
+        neighbour or group";
+
+      leaf afi-safi-name {
+        type leafref {
+          path "../config/afi-safi-name";
+        }
+        description
+          "Reference to the AFI-SAFI name used as a key
+          for the AFI-SAFI list";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+        uses bgp-common-state;
+      }
+
+      container graceful-restart {
+        description
+          "Parameters relating to BGP graceful-restart";
+        container config {
+          description
+            "Configuration options for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+        }
+        container state {
+          config false;
+          description
+            "State information for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+        }
+      }
+
+      uses bgp-common-route-selection-options;
+      uses bgp-common-global-group-use-multiple-paths;
+      uses bgp-common-structure-neighbor-group-add-paths;
+      uses bgp-global-mp-all-afi-safi-list-contents;
+    }
+  }
+
+  // Structural groupings
+  grouping bgp-global-base {
+    description
+      "Global configuration parameters for the BGP router";
+
+    container config {
+      description
+        "Configuration parameters relating to the global BGP router";
+      uses bgp-global-config;
+    }
+    container state {
+      config false;
+      description
+        "State information relating to the global BGP router";
+      uses bgp-global-config;
+      uses bgp-global-state;
+    }
+
+    container default-route-distance {
+      description
+        "Administrative distance (or preference) assigned to
+        routes received from different sources
+        (external, internal, and local).";
+
+      container config {
+        description
+          "Configuration parameters relating to the default route
+          distance";
+        uses bgp-global-default-route-distance-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the default route distance";
+        uses bgp-global-default-route-distance-config;
+      }
+    }
+
+    container confederation {
+      description
+        "Parameters indicating whether the local system acts as part
+        of a BGP confederation";
+
+      container config {
+        description
+          "Configuration parameters relating to BGP confederations";
+        uses bgp-global-confederation-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the BGP confederations";
+        uses bgp-global-confederation-config;
+      }
+    }
+
+    container graceful-restart {
+      description
+        "Parameters relating the graceful restart mechanism for BGP";
+      container config {
+        description
+          "Configuration parameters relating to graceful-restart";
+        uses bgp-common-graceful-restart-config;
+      }
+      container state {
+        config false;
+        description
+          "State information associated with graceful-restart";
+        uses bgp-common-graceful-restart-config;
+      }
+    }
+
+    uses bgp-common-global-group-use-multiple-paths;
+    uses bgp-common-route-selection-options;
+
+    container afi-safis {
+      description
+        "Address family specific configuration";
+      uses bgp-global-afi-safi-list;
+    }
+
+    uses bgp-global-dynamic-neighbors;
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-neighbor.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-neighbor.yang
new file mode 100644
index 0000000..f88dc4e
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-neighbor.yang
@@ -0,0 +1,686 @@
+submodule openconfig-bgp-neighbor {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-routing-policy { prefix oc-rpol; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-bgp-types { prefix oc-bgp-types; }
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-yang-types { prefix oc-yang; }
+
+  // Include the common submodule
+  include openconfig-bgp-common;
+  include openconfig-bgp-common-multiprotocol;
+  include openconfig-bgp-peer-group;
+  include openconfig-bgp-common-structure;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains groupings that are specific to the
+    neighbor context of the OpenConfig BGP module.";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-neighbor-config {
+    description
+      "Configuration parameters relating to a base BGP neighbor that
+      are not also applicable to any other context
+      (e.g., peer group)";
+
+    leaf peer-group {
+      type leafref {
+        path "../../../../peer-groups/peer-group/peer-group-name";
+      }
+      description
+        "The peer-group with which this neighbor is associated";
+    }
+
+    leaf neighbor-address {
+        type oc-inet:ip-address;
+        description
+          "Address of the BGP peer, either in IPv4 or IPv6";
+    }
+
+    leaf enabled {
+        type boolean;
+        default true;
+        description
+          "Whether the BGP peer is enabled. In cases where the
+          enabled leaf is set to false, the local system should not
+          initiate connections to the neighbor, and should not
+          respond to TCP connections attempts from the neighbor. If
+          the state of the BGP session is ESTABLISHED at the time
+          that this leaf is set to false, the BGP session should be
+          ceased.";
+    }
+  }
+
+  grouping bgp-neighbor-use-multiple-paths {
+    description
+      "Multipath configuration and state applicable to a BGP
+      neighbor";
+
+    container use-multiple-paths {
+      description
+        "Parameters related to the use of multiple-paths for the same
+        NLRI when they are received only from this neighbor";
+
+      container config {
+        description
+          "Configuration parameters relating to multipath";
+        uses bgp-common-use-multiple-paths-config;
+      }
+      container state {
+        config false;
+        description
+          "State parameters relating to multipath";
+        uses bgp-common-use-multiple-paths-config;
+      }
+
+      container ebgp {
+        description
+          "Multipath configuration for eBGP";
+        container config {
+          description
+            "Configuration parameters relating to eBGP multipath";
+          uses bgp-common-use-multiple-paths-ebgp-as-options-config;
+        }
+        container state {
+          config false;
+          description
+            "State information relating to eBGP multipath";
+          uses bgp-common-use-multiple-paths-ebgp-as-options-config;
+        }
+      }
+    }
+  }
+
+  grouping bgp-neighbor-state {
+    description
+      "Operational state parameters relating only to a BGP neighbor";
+
+    leaf session-state {
+      type enumeration {
+          enum IDLE {
+            description
+              "neighbor is down, and in the Idle state of the
+              FSM";
+          }
+          enum CONNECT {
+            description
+              "neighbor is down, and the session is waiting for
+              the underlying transport session to be established";
+          }
+          enum ACTIVE {
+            description
+              "neighbor is down, and the local system is awaiting
+              a conncetion from the remote peer";
+          }
+          enum OPENSENT {
+            description
+              "neighbor is in the process of being established.
+              The local system has sent an OPEN message";
+          }
+          enum OPENCONFIRM {
+            description
+              "neighbor is in the process of being established.
+              The local system is awaiting a NOTIFICATION or
+              KEEPALIVE message";
+          }
+          enum ESTABLISHED {
+            description
+              "neighbor is up - the BGP session with the peer is
+              established";
+          }
+        }
+      description
+        "Operational state of the BGP peer";
+    }
+
+    leaf last-established {
+      type oc-types:timeticks64;
+      description
+        "This timestamp indicates the time that the
+        BGP session last transitioned in or out of the Established
+        state.  The value is the timestamp in seconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).
+
+        The BGP session uptime can be computed by clients as the
+        difference between this value and the current time in UTC
+        (assuming the session is in the ESTABLISHED state, per the
+        session-state leaf).";
+    }
+
+    leaf established-transitions {
+      type oc-yang:counter64;
+      description
+        "Number of transitions to the Established state for
+        the neighbor session.  This value is analogous to the
+        bgpPeerFsmEstablishedTransitions object from the standard
+        BGP-4 MIB";
+      reference
+        "RFC 4273 - Definitions of Managed Objects for BGP-4";
+    }
+
+    leaf-list supported-capabilities {
+      type identityref {
+        base oc-bgp-types:BGP_CAPABILITY;
+      }
+      description
+        "BGP capabilities negotiated as supported with the peer";
+    }
+
+    container messages {
+      description
+        "Counters for BGP messages sent and received from the
+        neighbor";
+      container sent {
+        description
+          "Counters relating to BGP messages sent to the neighbor";
+        uses bgp-neighbor-counters-message-types-state;
+        }
+
+      container received {
+        description
+          "Counters for BGP messages received from the neighbor";
+        uses bgp-neighbor-counters-message-types-state;
+      }
+    }
+
+    container queues {
+      description
+        "Counters related to queued messages associated with the
+        BGP neighbor";
+      uses bgp-neighbor-queue-counters-state;
+    }
+
+    leaf dynamically-configured {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the peer was configured dynamically
+        due to an inbound connection request from a specified source prefix
+        within a dynamic-neighbor-prefix.";
+    }
+  }
+
+  grouping bgp-neighbor-counters-message-types-state {
+    description
+      "Grouping of BGP message types, included for re-use
+      across counters";
+
+    leaf UPDATE {
+      type uint64;
+      description
+        "Number of BGP UPDATE messages announcing, withdrawing
+        or modifying paths exchanged.";
+    }
+
+    leaf NOTIFICATION {
+      type uint64;
+      description
+        "Number of BGP NOTIFICATION messages indicating an
+        error condition has occurred exchanged.";
+    }
+
+    leaf last-notification-time {
+      type oc-types:timeticks64;
+      description
+        "This timestamp indicates the time that a NOTIFICATION
+        message was sent or received on the peering session
+        (based on whether this leaf is associated with
+        sent or received messages).
+
+        The value is the timestamp in seconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf last-notification-error-code {
+      type identityref {
+        base oc-bgp-types:BGP_ERROR_CODE;
+      }
+      description
+        "Indicates the last BGP error sent or received on the peering
+        session (based on whether this leaf is associated with
+        sent or received messages).";
+    }
+
+    leaf last-notification-error-subcode {
+      type identityref {
+        base oc-bgp-types:BGP_ERROR_SUBCODE;
+      }
+      description
+        "Indicates the last BGP error subcode sent or received on
+        the peering session (based on whether this leaf is associated
+        with sent or received messages)";
+    }
+  }
+
+  grouping bgp-neighbor-queue-counters-state {
+    description
+      "Counters relating to the message queues associated with the
+      BGP peer";
+
+    leaf input {
+      type uint32;
+      description
+        "The number of messages received from the peer currently
+        queued";
+    }
+
+    leaf output {
+      type uint32;
+      description
+        "The number of messages queued to be sent to the peer";
+    }
+  }
+
+  grouping bgp-neighbor-transport-state {
+    description
+      "Operational state parameters relating to the transport session
+      used for the BGP session";
+
+    leaf local-port {
+      type oc-inet:port-number;
+      description
+        "Local TCP port being used for the TCP session supporting
+        the BGP session";
+    }
+
+    leaf remote-address {
+      type oc-inet:ip-address;
+      description
+        "Remote address to which the BGP session has been
+        established";
+    }
+
+    leaf remote-port {
+      type oc-inet:port-number;
+      description
+        "Remote port being used by the peer for the TCP session
+        supporting the BGP session";
+    }
+  }
+
+  grouping bgp-neighbor-error-handling-state {
+    description
+      "Operational state parameters relating to enhanced error
+      error handling for BGP";
+
+    leaf erroneous-update-messages {
+      type uint32;
+      description
+        "The number of BGP UPDATE messages for which the
+        treat-as-withdraw mechanism has been applied based
+        on erroneous message contents";
+    }
+  }
+
+  grouping bgp-neighbor-timers-state {
+    description
+      "Operational state parameters relating to BGP timers associated
+      with the BGP session";
+
+    leaf negotiated-hold-time {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      description
+        "The negotiated hold-time for the BGP session";
+    }
+  }
+
+  grouping bgp-neighbor-afi-safi-graceful-restart-state {
+    description
+      "Operational state variables relating to the graceful-restart
+      mechanism on a per-AFI-SAFI basis";
+
+    leaf received {
+      type boolean;
+      description
+        "This leaf indicates whether the neighbor advertised the
+        ability to support graceful-restart for this AFI-SAFI";
+    }
+
+    leaf advertised {
+      type boolean;
+      description
+        "This leaf indicates whether the ability to support
+        graceful-restart has been advertised to the peer";
+    }
+  }
+
+  grouping bgp-neighbor-graceful-restart-state {
+    description
+      "Operational state information relevant to graceful restart
+      for BGP";
+
+    leaf peer-restart-time {
+      type uint16 {
+        range 0..4096;
+      }
+      description
+        "The period of time (advertised by the peer) that
+        the peer expects a restart of a BGP session to
+        take";
+    }
+
+    leaf peer-restarting {
+      type boolean;
+      description
+        "This flag indicates whether the remote neighbor is currently
+        in the process of restarting, and hence received routes are
+        currently stale";
+    }
+
+    leaf local-restarting {
+      type boolean;
+      description
+        "This flag indicates whether the local neighbor is currently
+        restarting. The flag is unset after all NLRI have been
+        advertised to the peer, and the End-of-RIB (EOR) marker has
+        been unset";
+    }
+
+    leaf mode {
+      type enumeration {
+        enum HELPER_ONLY {
+          description
+            "The local router is operating in helper-only mode, and
+            hence will not retain forwarding state during a local
+            session restart, but will do so during a restart of the
+            remote peer";
+        }
+        enum BILATERAL {
+          description
+            "The local router is operating in both helper mode, and
+            hence retains forwarding state during a remote restart,
+            and also maintains forwarding state during local session
+            restart";
+        }
+        enum REMOTE_HELPER {
+          description
+            "The local system is able to retain routes during restart
+            but the remote system is only able to act as a helper";
+        }
+      }
+      description
+        "Ths leaf indicates the mode of operation of BGP graceful
+        restart with the peer";
+    }
+  }
+
+  grouping bgp-neighbor-afi-safi-state {
+    description
+      "Operational state parameters relating to an individual AFI,
+      SAFI for a neighbor";
+
+    leaf active {
+      type boolean;
+      description
+        "This value indicates whether a particular AFI-SAFI has
+        been succesfully negotiated with the peer. An AFI-SAFI
+        may be enabled in the current running configuration, but a
+        session restart may be required in order to negotiate the new
+        capability.";
+    }
+
+    container prefixes {
+      description "Prefix counters for the BGP session";
+      leaf received {
+        type uint32;
+        description
+          "The number of prefixes received from the neighbor";
+      }
+
+      leaf sent {
+        type uint32;
+        description
+          "The number of prefixes advertised to the neighbor";
+      }
+
+      leaf installed {
+        type uint32;
+        description
+          "The number of advertised prefixes installed in the
+          Loc-RIB";
+      }
+    }
+  }
+
+  grouping bgp-neighbor-afi-safi-list {
+    description
+      "List of address-families associated with the BGP neighbor";
+
+    list afi-safi {
+      key "afi-safi-name";
+
+      description
+        "AFI,SAFI configuration available for the
+        neighbour or group";
+
+
+      leaf afi-safi-name {
+        type leafref {
+          path "../config/afi-safi-name";
+        }
+        description
+          "Reference to the AFI-SAFI name used as a key
+          for the AFI-SAFI list";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+        uses bgp-neighbor-afi-safi-state;
+      }
+
+
+      container graceful-restart {
+        description
+          "Parameters relating to BGP graceful-restart";
+        container config {
+          description
+            "Configuration options for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+        }
+        container state {
+          config false;
+          description
+            "State information for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+          uses bgp-neighbor-afi-safi-graceful-restart-state;
+        }
+      }
+
+      uses bgp-common-structure-neighbor-group-add-paths;
+      uses bgp-common-mp-all-afi-safi-list-contents;
+      uses bgp-neighbor-use-multiple-paths;
+    }
+  }
+
+  grouping bgp-neighbor-base {
+    description
+      "Parameters related to a BGP neighbor";
+
+    container config {
+      description
+        "Configuration parameters relating to the BGP neighbor or
+        group";
+      uses bgp-neighbor-config;
+      uses bgp-common-neighbor-group-config;
+    }
+    container state {
+      config false;
+      description
+        "State information relating to the BGP neighbor";
+      uses bgp-neighbor-config;
+      uses bgp-common-neighbor-group-config;
+      uses bgp-neighbor-state;
+    }
+
+    container timers {
+      description
+        "Timers related to a BGP neighbor";
+      container config {
+        description
+          "Configuration parameters relating to timers used for the
+          BGP neighbor";
+        uses bgp-common-neighbor-group-timers-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the timers used for the BGP
+          neighbor";
+        uses bgp-common-neighbor-group-timers-config;
+        uses bgp-neighbor-timers-state;
+      }
+    }
+
+    container transport {
+      description
+        "Transport session parameters for the BGP neighbor";
+      container config {
+        description
+          "Configuration parameters relating to the transport
+          session(s) used for the BGP neighbor";
+        uses bgp-common-neighbor-group-transport-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the transport session(s)
+          used for the BGP neighbor";
+        uses bgp-common-neighbor-group-transport-config;
+        uses bgp-neighbor-transport-state;
+      }
+    }
+
+    container error-handling {
+      description
+        "Error handling parameters used for the BGP neighbor or
+        group";
+      container config {
+        description
+          "Configuration parameters enabling or modifying the
+          behavior or enhanced error handling mechanisms for the BGP
+          neighbor";
+        uses bgp-common-neighbor-group-error-handling-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to enhanced error handling
+          mechanisms for the BGP neighbor";
+        uses bgp-common-neighbor-group-error-handling-config;
+        uses bgp-neighbor-error-handling-state;
+      }
+    }
+
+    container graceful-restart {
+      description
+        "Parameters relating the graceful restart mechanism for BGP";
+      container config {
+        description
+          "Configuration parameters relating to graceful-restart";
+        uses bgp-common-graceful-restart-config;
+      }
+      container state {
+        config false;
+        description
+          "State information associated with graceful-restart";
+        uses bgp-common-graceful-restart-config;
+        uses bgp-neighbor-graceful-restart-state;
+      }
+    }
+
+    uses bgp-common-structure-neighbor-group-logging-options;
+    uses bgp-common-structure-neighbor-group-ebgp-multihop;
+    uses bgp-common-structure-neighbor-group-route-reflector;
+    uses bgp-common-structure-neighbor-group-as-path-options;
+    uses bgp-neighbor-use-multiple-paths;
+    uses oc-rpol:apply-policy-group;
+
+    container afi-safis {
+      description
+        "Per-address-family configuration parameters associated with
+        the neighbor";
+      uses bgp-neighbor-afi-safi-list;
+    }
+  }
+
+  grouping bgp-neighbor-list {
+    description
+      "The list of BGP neighbors";
+
+    list neighbor {
+      key "neighbor-address";
+      description
+        "List of BGP neighbors configured on the local system,
+        uniquely identified by peer IPv[46] address";
+
+      leaf neighbor-address {
+        type leafref {
+          path "../config/neighbor-address";
+        }
+        description
+          "Reference to the address of the BGP neighbor used as
+          a key in the neighbor list";
+      }
+
+      uses bgp-neighbor-base;
+    }
+
+  }
+
+
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-peer-group.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-peer-group.yang
new file mode 100644
index 0000000..a579b85
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-peer-group.yang
@@ -0,0 +1,259 @@
+submodule openconfig-bgp-peer-group {
+
+  belongs-to openconfig-bgp {
+    prefix "oc-bgp";
+  }
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-routing-policy { prefix oc-rpol; }
+
+  // Include the common submodule
+  include openconfig-bgp-common;
+  include openconfig-bgp-common-multiprotocol;
+  include openconfig-bgp-common-structure;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This sub-module contains groupings that are specific to the
+    peer-group context of the OpenConfig BGP module.";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  grouping bgp-peer-group-config {
+    description
+      "Configuration parameters relating to a base BGP peer group that
+      are not also applicable to any other context (e.g., neighbor)";
+
+    leaf peer-group-name {
+      type string;
+      description
+        "Name of the BGP peer-group";
+    }
+
+  }
+
+  grouping bgp-peer-group-afi-safi-list {
+    description
+      "List of address-families associated with the BGP peer-group";
+
+    list afi-safi {
+      key "afi-safi-name";
+
+      description
+        "AFI,SAFI configuration available for the
+        neighbour or group";
+
+      leaf afi-safi-name {
+        type leafref {
+          path "../config/afi-safi-name";
+        }
+        description
+          "Reference to the AFI-SAFI name used as a key
+          for the AFI-SAFI list";
+      }
+
+      container config {
+        description
+          "Configuration parameters for the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the AFI-SAFI";
+        uses bgp-common-mp-afi-safi-config;
+      }
+
+      container graceful-restart {
+        description
+          "Parameters relating to BGP graceful-restart";
+        container config {
+          description
+            "Configuration options for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+        }
+        container state {
+          config false;
+          description
+            "State information for BGP graceful-restart";
+          uses bgp-common-mp-afi-safi-graceful-restart-config;
+        }
+      }
+
+      uses bgp-common-structure-neighbor-group-add-paths;
+      uses bgp-common-global-group-use-multiple-paths;
+      uses bgp-common-mp-all-afi-safi-list-contents;
+    }
+  }
+
+  grouping bgp-peer-group-base {
+    description
+      "Parameters related to a BGP group";
+
+    container config {
+      description
+        "Configuration parameters relating to the BGP neighbor or
+        group";
+      uses bgp-peer-group-config;
+      uses bgp-common-neighbor-group-config;
+    }
+    container state {
+      config false;
+      description
+        "State information relating to the BGP peer-group";
+      uses bgp-peer-group-config;
+      uses bgp-common-neighbor-group-config;
+      uses bgp-common-state;
+    }
+
+    container timers {
+      description
+        "Timers related to a BGP peer-group";
+
+      container config {
+        description
+          "Configuration parameters relating to timers used for the
+          BGP neighbor or peer group";
+        uses bgp-common-neighbor-group-timers-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the timers used for the BGP
+         group";
+        uses bgp-common-neighbor-group-timers-config;
+      }
+    }
+
+    container transport {
+      description
+        "Transport session parameters for the BGP peer-group";
+
+      container config {
+        description
+          "Configuration parameters relating to the transport
+          session(s) used for the BGP neighbor or group";
+        uses bgp-common-neighbor-group-transport-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to the transport session(s)
+          used for the BGP neighbor or group";
+        uses bgp-common-neighbor-group-transport-config;
+      }
+    }
+
+    container error-handling {
+      description
+        "Error handling parameters used for the BGP peer-group";
+
+      container config {
+        description
+          "Configuration parameters enabling or modifying the
+          behavior or enhanced error handling mechanisms for the BGP
+          group";
+        uses bgp-common-neighbor-group-error-handling-config;
+      }
+      container state {
+        config false;
+        description
+          "State information relating to enhanced error handling
+          mechanisms for the BGP group";
+        uses bgp-common-neighbor-group-error-handling-config;
+      }
+    }
+
+    container graceful-restart {
+      description
+        "Parameters relating the graceful restart mechanism for BGP";
+      container config {
+        description
+          "Configuration parameters relating to graceful-restart";
+        uses bgp-common-graceful-restart-config;
+      }
+      container state {
+        config false;
+        description
+          "State information associated with graceful-restart";
+        uses bgp-common-graceful-restart-config;
+      }
+    }
+
+    uses bgp-common-structure-neighbor-group-logging-options;
+    uses bgp-common-structure-neighbor-group-ebgp-multihop;
+    uses bgp-common-structure-neighbor-group-route-reflector;
+    uses bgp-common-structure-neighbor-group-as-path-options;
+    uses bgp-common-global-group-use-multiple-paths;
+    uses oc-rpol:apply-policy-group;
+
+    container afi-safis {
+      description
+        "Per-address-family configuration parameters associated with
+        thegroup";
+      uses bgp-peer-group-afi-safi-list;
+    }
+  }
+
+  grouping bgp-peer-group-list {
+    description
+      "The list of BGP peer groups";
+
+    list peer-group {
+      key "peer-group-name";
+      description
+        "List of BGP peer-groups configured on the local system -
+        uniquely identified by peer-group name";
+
+    leaf peer-group-name {
+      type leafref {
+        path "../config/peer-group-name";
+      }
+      description
+        "Reference to the name of the BGP peer-group used as a
+        key in the peer-group list";
+      }
+
+      uses bgp-peer-group-base;
+    }
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-policy.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-policy.yang
new file mode 100644
index 0000000..4903de8
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-policy.yang
@@ -0,0 +1,1198 @@
+module openconfig-bgp-policy {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/bgp-policy";
+
+  prefix "oc-bgp-pol";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-routing-policy {prefix oc-rpol; }
+  import openconfig-policy-types { prefix oc-pol-types; }
+  import openconfig-bgp-types { prefix oc-bgp-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains data definitions for BGP routing policy.
+    It augments the base routing-policy module with BGP-specific
+    options for conditions and actions.";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+
+  // typedef statements
+
+  typedef bgp-set-community-option-type {
+    type enumeration {
+      enum ADD {
+        description
+          "add the specified communities to the existing
+          community attribute";
+      }
+      enum REMOVE {
+        description
+          "remove the specified communities from the
+          existing community attribute";
+      }
+      enum REPLACE {
+        description
+          "replace the existing community attribute with
+          the specified communities. If an empty set is
+          specified, this removes the community attribute
+          from the route.";
+      }
+    }
+    description
+      "Type definition for options when setting the community
+      attribute in a policy action";
+  }
+
+  typedef bgp-next-hop-type {
+    type union {
+      type oc-inet:ip-address;
+      type enumeration {
+        enum SELF {
+          description "special designation for local router's own
+          address, i.e., next-hop-self";
+        }
+      }
+    }
+    description
+      "type definition for specifying next-hop in policy actions";
+  }
+
+  typedef bgp-set-med-type {
+    type union {
+      type uint32;
+      type string {
+        pattern '^[+-][0-9]+$';
+      }
+      type enumeration {
+        enum IGP {
+          description "set the MED value to the IGP cost toward the
+          next hop for the route";
+        }
+      }
+    }
+    description
+      "Type definition for specifying how the BGP MED can
+      be set in BGP policy actions. The three choices are to set
+      the MED directly, increment/decrement using +/- notation,
+      and setting it to the IGP cost (predefined value).";
+  }
+
+  // grouping statements
+
+  grouping match-community-config {
+    description
+      "Configuration data for match conditions on communities";
+
+    leaf community-set {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+          "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:community-sets/" +
+          "oc-bgp-pol:community-set/oc-bgp-pol:community-set-name";
+      }
+      description
+        "References a defined community set";
+    }
+
+    uses oc-rpol:match-set-options-group;
+  }
+
+  grouping match-community-state {
+    description
+      "Operational state data for match conditions on communities";
+  }
+
+  grouping match-community-top {
+    description
+      "Top-level grouping for match conditions on communities";
+
+    container match-community-set {
+      description
+        "Top-level container for match conditions on communities.
+        Match a referenced community-set according to the logic
+        defined in the match-set-options leaf";
+
+      container config {
+        description
+          "Configuration data for match conditions on communities";
+
+        uses match-community-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses match-community-config;
+        uses match-community-state;
+      }
+    }
+  }
+
+  grouping match-ext-community-config {
+    description
+      "Configuration data for match conditions on extended
+      communities";
+
+      leaf ext-community-set {
+        type leafref {
+          path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+            "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:ext-community-sets/" +
+            "oc-bgp-pol:ext-community-set/" +
+            "oc-bgp-pol:ext-community-set-name";
+        }
+        description "References a defined extended community set";
+      }
+
+      uses oc-rpol:match-set-options-group;
+  }
+
+  grouping match-ext-community-state {
+    description
+      "Operational state data for match conditions on extended
+      communities";
+  }
+
+  grouping match-ext-community-top {
+    description
+      "Top-level grouping for match conditions on extended
+      communities";
+
+    container match-ext-community-set {
+      description
+        "Match a referenced extended community-set according to the
+        logic defined in the match-set-options leaf";
+
+      container config {
+        description
+          "Configuration data for match conditions on extended
+          communities";
+
+        uses match-ext-community-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for match conditions on extended
+          communities";
+
+        uses match-ext-community-config;
+        uses match-ext-community-state;
+      }
+    }
+  }
+
+  grouping match-as-path-config {
+    description
+      "Configuration data for match conditions on AS path set";
+
+    leaf as-path-set {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+          "oc-bgp-pol:bgp-defined-sets/oc-bgp-pol:as-path-sets/" +
+          "oc-bgp-pol:as-path-set/oc-bgp-pol:as-path-set-name";
+      }
+      description "References a defined AS path set";
+    }
+    uses oc-rpol:match-set-options-group;
+  }
+
+  grouping match-as-path-state {
+    description
+      "Operational state data for match conditions on AS path set";
+  }
+
+  grouping match-as-path-top {
+    description
+      "Top-level grouping for match conditions on AS path set";
+
+    container match-as-path-set {
+      description
+        "Match a referenced as-path set according to the logic
+        defined in the match-set-options leaf";
+
+      container config {
+        description
+          "Configuration data for match conditions on AS path set";
+
+        uses match-as-path-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for match conditions on AS
+          path set";
+
+        uses match-as-path-config;
+        uses match-as-path-state;
+      }
+    }
+  }
+
+  grouping bgp-match-set-conditions {
+    description
+      "Condition statement definitions for checking membership in a
+      defined set";
+
+    uses match-community-top;
+    uses match-ext-community-top;
+    uses match-as-path-top;
+  }
+
+  grouping community-count-config {
+    description
+      "Configuration data for community count condition";
+
+    uses oc-pol-types:attribute-compare-operators;
+  }
+
+  grouping community-count-state {
+    description
+      "Operational state data for community count condition";
+  }
+
+  grouping community-count-top {
+    description
+      "Top-level grouping for community count condition";
+
+    container community-count {
+      description
+        "Value and comparison operations for conditions based on the
+        number of communities in the route update";
+
+      container config {
+        description
+          "Configuration data for community count condition";
+
+        uses community-count-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for community count condition";
+
+        uses community-count-config;
+        uses community-count-state;
+      }
+    }
+  }
+
+  grouping as-path-length-config {
+    description
+      "Configuration data for AS path length condition";
+
+    uses oc-pol-types:attribute-compare-operators;
+  }
+
+  grouping as-path-length-state {
+    description
+      "Operational state data for AS path length condition";
+  }
+
+  grouping as-path-length-top {
+    description
+      "Top-level grouping for AS path length condition";
+
+    container as-path-length {
+      description
+        "Value and comparison operations for conditions based on the
+        length of the AS path in the route update";
+
+      container config {
+        description
+          "Configuration data for AS path length condition";
+
+        uses as-path-length-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for AS path length condition";
+
+        uses as-path-length-config;
+        uses as-path-length-state;
+      }
+    }
+  }
+
+  grouping bgp-conditions-config {
+    description
+      "Configuration data for BGP-specific policy conditions";
+
+    leaf med-eq {
+      type uint32;
+      description
+        "Condition to check if the received MED value is equal to
+        the specified value";
+    }
+
+    leaf origin-eq {
+      type oc-bgp-types:bgp-origin-attr-type;
+      description
+        "Condition to check if the route origin is equal to the
+        specified value";
+    }
+
+    leaf-list next-hop-in {
+      type oc-inet:ip-address;
+      description
+        "List of next hop addresses to check for in the route
+        update";
+    }
+
+    leaf-list afi-safi-in {
+      type identityref {
+        base oc-bgp-types:AFI_SAFI_TYPE;
+      }
+      description
+        "List of address families which the NLRI may be
+        within";
+    }
+
+    leaf local-pref-eq {
+      type uint32;
+      // TODO: add support for other comparisons if needed
+      description
+        "Condition to check if the local pref attribute is equal to
+        the specified value";
+    }
+
+    leaf route-type {
+      // TODO: verify extent of vendor support for this comparison
+      type enumeration {
+        enum INTERNAL {
+          description "route type is internal";
+        }
+        enum EXTERNAL {
+          description "route type is external";
+        }
+      }
+      description
+        "Condition to check the route type in the route update";
+    }
+  }
+
+  grouping bgp-conditions-state {
+    description
+      "Operational state data for BGP-specific policy conditions";
+  }
+
+  grouping bgp-conditions-top {
+    description
+      "Top-level grouping for BGP-specific policy conditions";
+
+    container bgp-conditions {
+      description
+        "Top-level container ";
+
+      container config {
+        description
+          "Configuration data for BGP-specific policy conditions";
+
+        uses bgp-conditions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for BGP-specific policy
+          conditions";
+
+        uses bgp-conditions-config;
+        uses bgp-conditions-state;
+      }
+
+      uses community-count-top;
+      uses as-path-length-top;
+      uses bgp-match-set-conditions;
+    }
+  }
+
+  grouping community-set-config {
+    description
+      "Configuration data for BGP community sets";
+
+    leaf community-set-name {
+      type string;
+      mandatory true;
+      description
+        "name / label of the community set -- this is used to
+        reference the set in match conditions";
+    }
+
+    leaf-list community-member {
+      type union {
+        type oc-bgp-types:bgp-std-community-type;
+        type oc-bgp-types:bgp-community-regexp-type;
+        type oc-bgp-types:bgp-well-known-community-type;
+      }
+      description
+        "members of the community set";
+    }
+  }
+
+  grouping community-set-state {
+    description
+      "Operational state data for BGP community sets";
+  }
+
+  grouping community-set-top {
+    description
+      "Top-level grouping for BGP community sets";
+
+    container community-sets {
+      description
+        "Enclosing container for list of defined BGP community sets";
+
+      list community-set {
+        key "community-set-name";
+        description
+          "List of defined BGP community sets";
+
+        leaf community-set-name {
+          type leafref {
+            path "../config/community-set-name";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container config {
+          description
+            "Configuration data for BGP community sets";
+
+          uses community-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for BGP community sets";
+
+          uses community-set-config;
+          uses community-set-state;
+        }
+      }
+    }
+  }
+
+  grouping ext-community-set-config {
+    description
+      "Configuration data for extended BGP community sets";
+
+    leaf ext-community-set-name {
+      type string;
+      description
+        "name / label of the extended community set -- this is
+        used to reference the set in match conditions";
+    }
+
+    leaf-list ext-community-member {
+      type union {
+        type oc-bgp-types:bgp-ext-community-type;
+        type oc-bgp-types:bgp-community-regexp-type;
+      }
+      description
+          "members of the extended community set";
+    }
+  }
+
+  grouping ext-community-set-state {
+    description
+      "Operational state data for extended BGP community sets";
+  }
+
+  grouping ext-community-set-top {
+    description
+      "Top-level grouping for extended BGP community sets";
+
+    container ext-community-sets {
+      description
+        "Enclosing container for list of extended BGP community
+        sets";
+
+      list ext-community-set {
+        key "ext-community-set-name";
+        description
+          "List of defined extended BGP community sets";
+
+        leaf ext-community-set-name {
+          type leafref {
+            path "../config/ext-community-set-name";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container config {
+          description
+            "Configuration data for extended BGP community sets";
+
+          uses ext-community-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for extended BGP community sets";
+
+          uses ext-community-set-config;
+          uses ext-community-set-state;
+        }
+      }
+    }
+  }
+
+  grouping as-path-set-config {
+    description
+      "Configuration data for AS path sets";
+
+    leaf as-path-set-name {
+      type string;
+      description
+        "name of the AS path set -- this is used to reference
+        the set in match conditions";
+    }
+
+    leaf-list as-path-set-member {
+      // TODO: need to refine typedef for AS path expressions
+      type string;
+      description
+          "AS path expression -- list of ASes in the set";
+    }
+  }
+
+  grouping as-path-set-state {
+    description
+      "Operational state data for AS path sets";
+  }
+
+  grouping as-path-set-top {
+    description
+      "Top-level grouping for AS path sets";
+
+    container as-path-sets {
+      description
+        "Enclosing container for list of define AS path sets";
+
+      list as-path-set {
+        key "as-path-set-name";
+        description
+          "List of defined AS path sets";
+
+        leaf as-path-set-name {
+          type leafref {
+            path "../config/as-path-set-name";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container config {
+          description
+            "Configuration data for AS path sets";
+
+          uses as-path-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for AS path sets";
+
+          uses as-path-set-config;
+          uses as-path-set-state;
+        }
+      }
+    }
+  }
+
+  // augment statements
+
+  augment "/oc-rpol:routing-policy/oc-rpol:defined-sets" {
+    description "adds BGP defined sets container to routing policy
+    model";
+
+    container bgp-defined-sets {
+      description
+        "BGP-related set definitions for policy match conditions";
+
+      uses community-set-top;
+      uses ext-community-set-top;
+      uses as-path-set-top;
+    }
+  }
+
+  grouping as-path-prepend-config {
+    description
+      "Configuration data for the AS path prepend action";
+
+    leaf repeat-n {
+      type uint8 {
+        range 1..max;
+      }
+      description
+        "Number of times to prepend the value specified in the asn
+        leaf to the AS path. If no value is specified by the asn
+        leaf, the local AS number of the system is used. The value
+        should be between 1 and the maximum supported by the
+        implementation.";
+    }
+
+    leaf asn {
+      type oc-inet:as-number;
+      description
+        "The AS number to prepend to the AS path. If this leaf is
+        not specified and repeat-n is set, then the local AS
+        number will be used for prepending.";
+    }
+  }
+
+  grouping as-path-prepend-state {
+    description
+      "Operational state data for the AS path prepend action";
+  }
+
+  grouping as-path-prepend-top {
+    description
+      "Top-level grouping for the AS path prepend action";
+
+    container set-as-path-prepend {
+      description
+        "Action to prepend the specified AS number to the AS-path a
+        specified number of times";
+
+      container config {
+        description
+          "Configuration data for the AS path prepend action";
+
+        uses as-path-prepend-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the AS path prepend action";
+
+        uses as-path-prepend-config;
+        uses as-path-prepend-state;
+      }
+    }
+  }
+
+  grouping set-community-action-common {
+    description
+      "Common leaves for set-community and set-ext-community
+      actions";
+
+    leaf method {
+      type enumeration {
+        enum INLINE {
+          description
+            "The extended communities are specified inline as a
+            list";
+        }
+        enum REFERENCE {
+          description
+            "The extended communities are specified by referencing a
+            defined ext-community set";
+        }
+      }
+      description
+        "Indicates the method used to specify the extended
+        communities for the set-ext-community action";
+    }
+
+    leaf options {
+      type bgp-set-community-option-type;
+      description
+        "Options for modifying the community attribute with
+        the specified values.  These options apply to both
+        methods of setting the community attribute.";
+    }
+  }
+
+  grouping set-community-inline-config {
+    description
+      "Configuration data for inline specification of set-community
+      action";
+
+    leaf-list communities {
+      type union {
+        type oc-bgp-types:bgp-std-community-type;
+        type oc-bgp-types:bgp-well-known-community-type;
+      }
+      description
+        "Set the community values for the update inline with
+        a list.";
+    }
+  }
+
+  grouping set-community-inline-state {
+    description
+      "Operational state data or inline specification of
+      set-community action";
+  }
+
+  grouping set-community-inline-top {
+    description
+      "Top-level grouping or inline specification of set-community
+      action";
+
+    container inline {
+      when "../config/method=INLINE" {
+        description
+          "Active only when the set-community method is INLINE";
+      }
+      description
+        "Set the community values for the action inline with
+        a list.";
+
+      container config {
+        description
+          "Configuration data or inline specification of set-community
+      action";
+
+        uses set-community-inline-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data or inline specification of
+          set-community action";
+
+        uses set-community-inline-config;
+        uses set-community-inline-state;
+      }
+    }
+  }
+
+  grouping set-community-reference-config {
+    description
+      "Configuration data for referening a community-set in the
+      set-community action";
+
+    leaf community-set-ref {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+          "oc-bgp-pol:bgp-defined-sets/" +
+          "oc-bgp-pol:community-sets/oc-bgp-pol:community-set/" +
+          "oc-bgp-pol:community-set-name";
+      }
+      description
+        "References a defined community set by name";
+    }
+  }
+
+  grouping set-community-reference-state {
+    description
+      "Operational state data for referening a community-set in the
+      set-community action";
+  }
+
+  grouping set-community-reference-top {
+    description
+      "Top-level grouping for referening a community-set in the
+      set-community action";
+
+    container reference {
+      when "../config/method=REFERENCE" {
+        description
+          "Active only when the set-community method is REFERENCE";
+      }
+      description
+        "Provide a reference to a defined community set for the
+        set-community action";
+
+      container config {
+        description
+          "Configuration data for referening a community-set in the
+      set-community action";
+
+        uses set-community-reference-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for referening a community-set
+          in the set-community action";
+
+        uses set-community-reference-config;
+        uses set-community-reference-state;
+      }
+    }
+  }
+
+  grouping set-community-action-config {
+    description
+      "Configuration data for the set-community action";
+
+    uses set-community-action-common;
+  }
+
+  grouping set-community-action-state {
+    description
+      "Operational state data for the set-community action";
+  }
+
+  grouping set-community-action-top {
+    description
+      "Top-level grouping for the set-community action";
+
+    container set-community {
+      description
+        "Action to set the community attributes of the route, along
+        with options to modify how the community is modified.
+        Communities may be set using an inline list OR
+        reference to an existing defined set (not both).";
+
+      container config {
+        description
+          "Configuration data for the set-community action";
+
+        uses set-community-action-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the set-community action";
+
+        uses set-community-action-config;
+        uses set-community-action-state;
+      }
+
+      uses set-community-inline-top;
+      uses set-community-reference-top;
+    }
+  }
+
+  grouping set-ext-community-inline-config {
+    description
+      "Configuration data for inline specification of
+      set-ext-community action";
+
+    leaf-list communities {
+      type union {
+        type oc-bgp-types:bgp-ext-community-type;
+        type oc-bgp-types:bgp-well-known-community-type;
+      }
+      description
+        "Set the extended community values for the update inline
+        with a list.";
+    }
+  }
+
+  grouping set-ext-community-inline-state {
+    description
+      "Operational state data or inline specification of
+      set-ext-community action";
+  }
+
+  grouping set-ext-community-inline-top {
+    description
+      "Top-level grouping or inline specification of set-ext-community
+      action";
+
+    container inline {
+      when "../config/method=INLINE" {
+        description
+          "Active only when the set-community method is INLINE";
+      }
+      description
+        "Set the extended community values for the action inline with
+        a list.";
+
+      container config {
+        description
+          "Configuration data or inline specification of
+          set-ext-community action";
+
+        uses set-ext-community-inline-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data or inline specification of
+          set-ext-community action";
+
+        uses set-ext-community-inline-config;
+        uses set-ext-community-inline-state;
+      }
+    }
+  }
+
+  grouping set-ext-community-reference-config {
+    description
+      "Configuration data for referening a extended community-set
+      in the set-ext-community action";
+
+    leaf ext-community-set-ref {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:defined-sets/" +
+          "oc-bgp-pol:bgp-defined-sets/" +
+          "oc-bgp-pol:ext-community-sets/" +
+          "oc-bgp-pol:ext-community-set/" +
+          "oc-bgp-pol:ext-community-set-name";
+      }
+      description
+        "References a defined extended community set by
+        name";
+    }
+  }
+
+  grouping set-ext-community-reference-state {
+    description
+      "Operational state data for referening an extended
+      community-set in the set-ext-community action";
+  }
+
+  grouping set-ext-community-reference-top {
+    description
+      "Top-level grouping for referening an extended community-set
+      in the set-community action";
+
+    container reference {
+      when "../config/method=REFERENCE" {
+        description
+          "Active only when the set-community method is REFERENCE";
+      }
+      description
+        "Provide a reference to an extended community set for the
+        set-ext-community action";
+
+      container config {
+        description
+          "Configuration data for referening an extended
+          community-set in the set-ext-community action";
+
+        uses set-ext-community-reference-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for referening an extended
+          community-set in the set-ext-community action";
+
+        uses set-ext-community-reference-config;
+        uses set-ext-community-reference-state;
+      }
+    }
+  }
+
+  grouping set-ext-community-action-config {
+    description
+      "Configuration data for the set-ext-community action";
+
+    uses set-community-action-common;
+  }
+
+  grouping set-ext-community-action-state {
+    description
+      "Operational state data for the set-ext-community action";
+  }
+
+  grouping set-ext-community-action-top {
+    description
+      "Top-level grouping for the set-ext-community action";
+
+    container set-ext-community {
+      description
+        "Action to set the extended community attributes of the
+        route, along with options to modify how the community is
+        modified. Extended communities may be set using an inline
+        list OR a reference to an existing defined set (but not
+        both).";
+
+      container config {
+        description
+          "Configuration data for the set-ext-community action";
+
+        uses set-ext-community-action-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the set-ext-community action";
+
+        uses set-ext-community-action-config;
+        uses set-ext-community-action-state;
+      }
+      uses set-ext-community-inline-top;
+      uses set-ext-community-reference-top;
+    }
+  }
+
+  grouping bgp-actions-config {
+    description
+      "Configuration data for BGP-specific actions";
+
+    leaf set-route-origin {
+      type oc-bgp-types:bgp-origin-attr-type;
+      description "set the origin attribute to the specified
+      value";
+    }
+
+    leaf set-local-pref {
+      type uint32;
+      description "set the local pref attribute on the route
+      update";
+    }
+
+    leaf set-next-hop {
+      type bgp-next-hop-type;
+      description "set the next-hop attribute in the route update";
+    }
+
+    leaf set-med {
+      type bgp-set-med-type;
+      description "set the med metric attribute in the route
+      update";
+    }
+  }
+
+  grouping bgp-actions-state {
+    description
+      "Operational state data for BGP-specific actions";
+  }
+
+  grouping bgp-actions-top {
+    description
+      "Top-level grouping for BGP-specific actions";
+
+    container bgp-actions {
+      description
+        "Top-level container for BGP-specific actions";
+
+      container config {
+        description
+          "Configuration data for BGP-specific actions";
+
+        uses bgp-actions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for BGP-specific actions";
+
+        uses bgp-actions-config;
+        uses bgp-actions-state;
+      }
+      uses as-path-prepend-top;
+      uses set-community-action-top;
+      uses set-ext-community-action-top;
+    }
+  }
+
+  augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+    "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+    "oc-rpol:conditions" {
+    description
+      "BGP policy conditions added to routing policy module";
+
+    uses bgp-conditions-top;
+  }
+
+  augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+    "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+    "oc-rpol:actions" {
+    description "BGP policy actions added to routing policy
+    module";
+
+    uses bgp-actions-top;
+  }
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp-types.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp-types.yang
new file mode 100644
index 0000000..1e58de2
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp-types.yang
@@ -0,0 +1,554 @@
+module openconfig-bgp-types {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/bgp-types";
+
+  prefix "oc-bgp-types";
+
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-inet-types { prefix "oc-inet"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // Include definitions of BGP error notifications
+  include openconfig-bgp-errors;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains general data definitions for use in BGP
+    policy. It can be imported by modules that make use of BGP
+    attributes";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+
+  identity BGP_CAPABILITY {
+    description "Base identity for a BGP capability";
+  }
+
+  identity MPBGP {
+    base BGP_CAPABILITY;
+    description
+      "Multi-protocol extensions to BGP";
+    reference "RFC2858";
+  }
+
+  identity ROUTE_REFRESH {
+    base BGP_CAPABILITY;
+    description
+      "The BGP route-refresh functionality";
+    reference "RFC2918";
+  }
+
+  identity ASN32 {
+    base BGP_CAPABILITY;
+    description
+      "4-byte (32-bit) AS number functionality";
+    reference "RFC6793";
+  }
+
+  identity GRACEFUL_RESTART {
+    base BGP_CAPABILITY;
+    description
+      "Graceful restart functionality";
+    reference "RFC4724";
+  }
+
+  identity ADD_PATHS {
+    base BGP_CAPABILITY;
+    description
+      "BGP add-paths";
+    reference "draft-ietf-idr-add-paths";
+  }
+
+  identity AFI_SAFI_TYPE {
+    description
+      "Base identity type for AFI,SAFI tuples for BGP-4";
+    reference "RFC4760 - multiprotocol extensions for BGP-4";
+  }
+
+  identity IPV4_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "IPv4 unicast (AFI,SAFI = 1,1)";
+    reference "RFC4760";
+  }
+
+  identity IPV6_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "IPv6 unicast (AFI,SAFI = 2,1)";
+    reference "RFC4760";
+  }
+
+  identity IPV4_LABELED_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Labeled IPv4 unicast (AFI,SAFI = 1,4)";
+    reference "RFC3107";
+  }
+
+  identity IPV6_LABELED_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Labeled IPv6 unicast (AFI,SAFI = 2,4)";
+    reference "RFC3107";
+  }
+
+  identity L3VPN_IPV4_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Unicast IPv4 MPLS L3VPN (AFI,SAFI = 1,128)";
+    reference "RFC4364";
+  }
+
+  identity L3VPN_IPV6_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Unicast IPv6 MPLS L3VPN (AFI,SAFI = 2,128)";
+    reference "RFC4659";
+  }
+
+  identity L3VPN_IPV4_MULTICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Multicast IPv4 MPLS L3VPN (AFI,SAFI = 1,129)";
+    reference "RFC6514";
+  }
+
+  identity L3VPN_IPV6_MULTICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Multicast IPv6 MPLS L3VPN (AFI,SAFI = 2,129)";
+    reference "RFC6514";
+  }
+
+  identity L2VPN_VPLS {
+    base AFI_SAFI_TYPE;
+    description
+      "BGP-signalled VPLS (AFI,SAFI = 25,65)";
+    reference "RFC4761";
+  }
+
+  identity L2VPN_EVPN {
+    base AFI_SAFI_TYPE;
+    description
+      "BGP MPLS Based Ethernet VPN (AFI,SAFI = 25,70)";
+  }
+
+  identity BGP_WELL_KNOWN_STD_COMMUNITY {
+    description
+      "Reserved communities within the standard community space
+      defined by RFC1997. These communities must fall within the
+      range 0x00000000 to 0xFFFFFFFF";
+    reference "RFC1997";
+  }
+
+  identity NO_EXPORT {
+    base BGP_WELL_KNOWN_STD_COMMUNITY;
+    description
+      "Do not export NLRI received carrying this community outside
+      the bounds of this autonomous system, or this confederation if
+      the local autonomous system is a confederation member AS. This
+      community has a value of 0xFFFFFF01.";
+    reference "RFC1997";
+  }
+
+  identity NO_ADVERTISE {
+    base BGP_WELL_KNOWN_STD_COMMUNITY;
+    description
+      "All NLRI received carrying this community must not be
+      advertised to other BGP peers. This community has a value of
+      0xFFFFFF02.";
+    reference "RFC1997";
+  }
+
+  identity NO_EXPORT_SUBCONFED {
+    base BGP_WELL_KNOWN_STD_COMMUNITY;
+    description
+      "All NLRI received carrying this community must not be
+      advertised to external BGP peers - including over confederation
+      sub-AS boundaries. This community has a value of 0xFFFFFF03.";
+    reference "RFC1997";
+  }
+
+  identity NOPEER {
+    base BGP_WELL_KNOWN_STD_COMMUNITY;
+    description
+      "An autonomous system receiving NLRI tagged with this community
+      is advised not to readvertise the NLRI to external bi-lateral
+      peer autonomous systems. An AS may also filter received NLRI
+      from bilateral peer sessions when they are tagged with this
+      community value";
+    reference "RFC3765";
+  }
+
+  typedef bgp-session-direction {
+    type enumeration {
+      enum INBOUND {
+        description
+          "Refers to all NLRI received from the BGP peer";
+      }
+      enum OUTBOUND {
+        description
+          "Refers to all NLRI advertised to the BGP peer";
+      }
+    }
+    description
+      "Type to describe the direction of NLRI transmission";
+  }
+
+  typedef bgp-well-known-community-type {
+    type identityref {
+      base BGP_WELL_KNOWN_STD_COMMUNITY;
+    }
+    description
+      "Type definition for well-known IETF community attribute
+      values";
+    reference
+      "IANA Border Gateway Protocol (BGP) Well Known Communities";
+  }
+
+
+  typedef bgp-std-community-type {
+    // TODO: further refine restrictions and allowed patterns
+    // 4-octet value:
+    //  <as number> 2 octets
+    //  <community value> 2 octets
+    type union {
+      type uint32 {
+      // per RFC 1997, 0x00000000 - 0x0000FFFF and 0xFFFF0000 -
+      // 0xFFFFFFFF are reserved
+      }
+      type string {
+        pattern '^(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'      +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):'      +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+    }
+    description
+      "Type definition for standard commmunity attributes represented as
+      a integer value, or a string of the form N:M where N and M are
+      integers between 0 and 65535.";
+    reference "RFC 1997 - BGP Communities Attribute";
+  }
+
+  typedef bgp-ext-community-type {
+    type union {
+      type string {
+        // Type 1: 2-octet global and 4-octet local
+        //         (AS number)        (Integer)
+        pattern '^(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'      +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):'      +
+                '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'    +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9])$';
+      }
+      type string {
+        // Type 2: 4-octet global and 2-octet local
+        //         (ipv4-address)     (integer)
+        pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'         +
+                '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|'         +
+                '2[0-4][0-9]|25[0-5]):'                                +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+      type string {
+        // RFC5668: 4-octet global and 2-octet local
+        //            (AS number)        (integer)
+        pattern '^(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'   +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9]):'                                    +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+      type string {
+        // route-target with Type 1
+        // route-target:(ASN):(local-part)
+        pattern '^route\-target:'                                             +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):'      +
+                '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'    +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9])$';
+      }
+      type string {
+        // route-target with Type 2
+        // route-target:(IPv4):(local-part)
+        pattern '^route\-target:'                                      +
+                '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'          +
+                '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|'         +
+                '2[0-4][0-9]|25[0-5]):'                                +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+      type string {
+        // 4-byte AS Type 1 route-target
+        pattern '^route\-target:'                                            +
+                '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'    +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9]):'                                    +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+      type string {
+        // route-origin with Type 1
+        pattern '^route\-origin:'                                            +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9]):'      +
+                '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'    +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9])$';
+      }
+      type string {
+        // route-origin with Type 2
+        pattern '^route\-origin:'                                      +
+                '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'          +
+                '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|'         +
+                '2[0-4][0-9]|25[0-5]):'                                +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}' +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+      type string {
+        // 4-byte AS Type 1 route-origin
+        pattern '^route\-origin:'                                            +
+                '(429496729[0-5]|42949672[0-8][0-9]|4294967[0-1][0-9]{2}'    +
+                '|429496[0-6][0-9]{3}|42949[0-5][0-9]{4}|4294[0-8][0-9]{5}|' +
+                '429[0-3][0-9]{6}|4[0-1][0-9]{7}|[1-3][0-9]{9}|'             +
+                '[1-9][0-9]{1,8}|[0-9]):'                                    +
+                '(6553[0-5]|655[0-2][0-9]|654[0-9]{2}|65[0-4][0-9]{2}'       +
+                '|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{1,3}|[0-9])$';
+      }
+    }
+    description
+      "Type definition for extended community attributes. In the case that
+      common communities are utilised, they are represented as a string
+      of the form:
+        - <2b AS>:<4b value> per RFC4360 section 3.1
+        - <4b IPv4>:<2b value> per RFC4360 section 3.2
+        - <4b AS>:<2b value> per RFC5668 section 2.
+        - route-target:<2b AS>:<4b value> per RFC4360 section 4
+        - route-target:<4b IPv4>:<2b value> per RFC4360 section 4
+        - route-origin:<2b ASN>:<4b value> per RFC4360 section 5
+        - route-origin:<4b IPv4>:<2b value> per RFC4360 section 5";
+    reference
+      "RFC 4360 - BGP Extended Communities Attribute
+       RFC 5668 - 4-Octet AS Specific BGP Extended Community";
+  }
+
+  typedef bgp-ext-community-recv-type {
+    type union {
+      type bgp-ext-community-type;
+      type binary {
+        length 8;
+      }
+    }
+    description
+      "A type definition utilised to define the extended community
+      in a context where the system is receiving the extended
+      community from an external source, such that the value may be
+      unknown. In the case that the received extended community is
+      unknown it is defined to be a 8-octet quantity formatted
+      according to RFC4360:
+
+      Type Field: 1 or 2 octets.
+      Value Field: Remaining octets.
+
+      The high-order octet of the type field is encoded such that
+      bit 0 indicates whether the extended community type is IANA
+      assigned; and bit 1 indicates whether the extended community
+      is transitive.  The remaining bits of the high-order type
+      field must be interpreted to determine whether the low-order
+      type field should be parsed, or whether the entire remainder
+      of the extended community is a value.";
+    reference
+      "RFC 4360 - BGP Extended Communities Attribute
+       RFC 5668 - 4-Octet AS Specific BGP Extended Community";
+  }
+
+  typedef bgp-community-regexp-type {
+    // TODO: needs more work to decide what format these regexps can
+    // take.
+    type oc-types:std-regexp;
+    description
+      "Type definition for communities specified as regular
+      expression patterns";
+  }
+
+  typedef bgp-origin-attr-type {
+    type enumeration {
+      enum IGP {
+        description
+          "Origin of the NLRI is internal";
+      }
+      enum EGP {
+        description
+          "Origin of the NLRI is EGP";
+      }
+      enum INCOMPLETE {
+        description
+          "Origin of the NLRI is neither IGP or EGP";
+      }
+    }
+    description
+      "Type definition for standard BGP origin attribute";
+    reference "RFC 4271 - A Border Gateway Protocol 4 (BGP-4),
+      Sec 4.3";
+  }
+
+  typedef peer-type {
+    type enumeration {
+      enum INTERNAL {
+        description
+          "Internal (iBGP) peer";
+      }
+      enum EXTERNAL {
+        description
+          "External (eBGP) peer";
+      }
+    }
+    description
+      "Labels a peer or peer group as explicitly internal or
+      external";
+  }
+
+  identity REMOVE_PRIVATE_AS_OPTION {
+    description
+      "Base identity for options for removing private autonomous
+      system numbers from the AS_PATH attribute";
+  }
+
+  identity PRIVATE_AS_REMOVE_ALL {
+    base REMOVE_PRIVATE_AS_OPTION;
+    description
+      "Strip all private autonmous system numbers from the AS_PATH.
+      This action is performed regardless of the other content of the
+      AS_PATH attribute, and for all instances of private AS numbers
+      within that attribute.";
+  }
+
+  identity PRIVATE_AS_REPLACE_ALL {
+    base REMOVE_PRIVATE_AS_OPTION;
+    description
+      "Replace all instances of private autonomous system numbers in
+      the AS_PATH with the local BGP speaker's autonomous system
+      number. This action is performed regardless of the other
+      content of the AS_PATH attribute, and for all instances of
+      private AS number within that attribute.";
+  }
+
+  typedef remove-private-as-option {
+    type identityref {
+      base REMOVE_PRIVATE_AS_OPTION;
+    }
+    description
+      "Set of options for configuring how private AS path numbers
+      are removed from advertisements";
+  }
+
+  typedef rr-cluster-id-type {
+    type union {
+      type uint32;
+      type oc-inet:ipv4-address;
+    }
+    description
+      "Union type for route reflector cluster ids:
+      option 1: 4-byte number
+      option 2: IP address";
+  }
+
+  typedef community-type {
+    type enumeration {
+      enum STANDARD {
+        description "Send only standard communities";
+      }
+      enum EXTENDED {
+        description "Send only extended communities";
+      }
+      enum BOTH {
+        description "Send both standard and extended communities";
+      }
+      enum NONE {
+        description "Do not send any community attribute";
+      }
+    }
+    description
+      "type describing variations of community attributes:
+      STANDARD: standard BGP community [rfc1997]
+      EXTENDED: extended BGP community [rfc4360]
+      BOTH: both standard and extended community";
+  }
+
+
+  typedef as-path-segment-type {
+    type enumeration {
+      enum AS_SEQ {
+        description
+          "Ordered set of autonomous systems that a route in
+          the UPDATE message has traversed";
+      }
+      enum AS_SET {
+        description
+          "Unordered set of autonomous systems that a route in
+          the UPDATE message has traversed";
+      }
+      enum AS_CONFED_SEQUENCE {
+        description
+          "Ordered set of Member Autonomous
+          Systems in the local confederation that the UPDATE message
+          has traversed";
+      }
+      enum AS_CONFED_SET {
+        description
+          "Unordered set of Member Autonomous Systems
+          in the local confederation that the UPDATE message has
+          traversed";
+      }
+    }
+    description
+      "Defines the types of BGP AS path segments.";
+  }
+}
diff --git a/models/openconfig/src/main/yang/bgp/openconfig-bgp.yang b/models/openconfig/src/main/yang/bgp/openconfig-bgp.yang
new file mode 100644
index 0000000..f3ea180
--- /dev/null
+++ b/models/openconfig/src/main/yang/bgp/openconfig-bgp.yang
@@ -0,0 +1,137 @@
+module openconfig-bgp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/bgp";
+
+  prefix "oc-bgp";
+
+  // import some basic inet types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // Include the OpenConfig BGP submodules
+  // Common: defines the groupings that are common across more than
+  //         one context (where contexts are neighbor, group, global)
+  include openconfig-bgp-common;
+  // Multiprotocol: defines the groupings that are common across more
+  //                than one context, and relate to Multiprotocol
+  include openconfig-bgp-common-multiprotocol;
+  // Structure: defines groupings that are shared but are solely used for
+  //            structural reasons.
+  include openconfig-bgp-common-structure;
+  // Include peer-group/neighbor/global - these define the groupings
+  // that are specific to one context
+  include openconfig-bgp-peer-group;
+  include openconfig-bgp-neighbor;
+  include openconfig-bgp-global;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module describes a YANG model for BGP protocol
+    configuration.It is a limited subset of all of the configuration
+    parameters available in the variety of vendor implementations,
+    hence it is expected that it would be augmented with vendor-
+    specific configuration data as needed. Additional modules or
+    submodules to handle other aspects of BGP configuration,
+    including policy, VRFs, VPNs, and additional address families
+    are also expected.
+
+    This model supports the following BGP configuration level
+    hierarchy:
+
+      BGP
+        |
+        +-> [ global BGP configuration ]
+          +-> AFI / SAFI global
+        +-> peer group
+          +-> [ peer group config ]
+          +-> AFI / SAFI [ per-AFI overrides ]
+        +-> neighbor
+          +-> [ neighbor config ]
+          +-> [ optional pointer to peer-group ]
+          +-> AFI / SAFI [ per-AFI overrides ]";
+
+  oc-ext:openconfig-version "4.0.1";
+
+  revision "2017-07-30" {
+    description
+      "Clarification of add-paths send-max leaf";
+    reference "4.0.1";
+  }
+
+  revision "2017-07-10" {
+    description
+      "Add error notifications; moved add-paths config; add AS
+      prepend policy features; removed unneeded config leaves";
+    reference "4.0.0";
+  }
+
+  revision "2017-02-02" {
+    description
+      "Bugfix to remove remaining global-level policy data";
+    reference "3.0.1";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add dynamic neighbor support, migrate to OpenConfig types";
+    reference "3.0.0";
+  }
+
+  revision "2016-06-21" {
+    description
+      "OpenConfig BGP refactor";
+    reference "2.1.1";
+  }
+
+  revision "2016-06-06" {
+    description
+      "OpenConfig public release";
+    reference "2.1.0";
+  }
+
+  revision "2016-03-31" {
+    description
+      "OpenConfig public release";
+    reference "2.0.1";
+  }
+
+  grouping bgp-top {
+    description
+      "Top-level grouping for the BGP model data";
+
+    container bgp {
+      description
+        "Top-level configuration and state for the BGP router";
+
+      container global {
+        description
+          "Global configuration for the BGP router";
+          uses bgp-global-base;
+      }
+
+      container neighbors {
+        description
+          "Configuration for BGP neighbors";
+        uses bgp-neighbor-list;
+      }
+
+      container peer-groups {
+        description
+          "Configuration for BGP peer-groups";
+        uses bgp-peer-group-list;
+      }
+    }
+  }
+
+  uses bgp-top;
+
+}
diff --git a/models/openconfig/src/main/yang/catalog/openconfig-catalog-types.yang b/models/openconfig/src/main/yang/catalog/openconfig-catalog-types.yang
new file mode 100644
index 0000000..bdec31e
--- /dev/null
+++ b/models/openconfig/src/main/yang/catalog/openconfig-catalog-types.yang
@@ -0,0 +1,242 @@
+module openconfig-catalog-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/catalog-types";
+
+  prefix "oc-cat-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines types and identities used by the OpenConfig
+    YANG module catalog model.";
+
+  oc-ext:openconfig-version "0.2.1";
+
+  revision "2017-05-01" {
+    description
+      "Fix to module dependency list";
+    reference "0.2.1";
+  }
+
+  revision "2017-03-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-02-15" {
+    description
+      "Initial OpenConfig public release";
+    reference "0.1.0";
+  }
+
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity CATALOG_MEMBER_TYPE {
+    description
+      "Base identity for elements in the catalog";
+  }
+
+  identity MODULE {
+    base CATALOG_MEMBER_TYPE;
+    description
+      "Module elements in the catalog";
+  }
+
+  identity RELEASE_BUNDLE {
+    base CATALOG_MEMBER_TYPE;
+    description
+      "Release bundle elements in the catalog";
+  }
+
+  identity FEATURE_BUNDLE {
+    base CATALOG_MEMBER_TYPE;
+    description
+      "Feature bundle elements in the catalog";
+  }
+
+
+  identity IMPLEMENTATION_STATUS_TYPE {
+    description
+      "Indications of the status of a module's implementation on a
+      device or server";
+  }
+
+  identity IN_PROGRESS {
+    base IMPLEMENTATION_STATUS_TYPE;
+    description
+      "Implementation is in progress";
+  }
+
+  identity PLANNED {
+    base IMPLEMENTATION_STATUS_TYPE;
+    description
+      "Implementation is planned";
+  }
+
+  identity COMPLETE {
+    base IMPLEMENTATION_STATUS_TYPE;
+    description
+      "Implementation is complete and fully supports the model";
+  }
+
+  identity PARTIAL {
+    base IMPLEMENTATION_STATUS_TYPE;
+    description
+      "Implementation is complete, but only supports the model
+      partially";
+  }
+
+  identity MODULE_STATUS_TYPE {
+    description
+      "Indicates the deployment status of the module";
+  }
+
+  identity EXPERIMENTAL {
+    base MODULE_STATUS_TYPE;
+    description
+      "Module should be considered experimental, not deployed in
+      production settings";
+  }
+
+  identity PRODUCTION {
+    base MODULE_STATUS_TYPE;
+    description
+      "Module is suitable for use in production, or has been
+      deployed in production";
+  }
+
+  identity MODULE_CATEGORY_BASE {
+    description
+      "Base identity for the module category.  It is expected that
+      publishing organizations will define additional derived
+      identities to describe their categorization scheme.";
+  }
+
+  identity MODULE_SUBCATEGORY_BASE {
+    description
+      "Base identity for the module subcategory.  It is expected that
+      publishing organizations will define additional derived
+      identities to describe their categorization scheme.";
+  }
+
+  identity ORGANIZATION_TYPE {
+    description
+      "Publishing organization type for the set of modules";
+  }
+
+  identity STANDARDS {
+    base ORGANIZATION_TYPE;
+    description
+      "Standards development organization (SDO) publisher type";
+  }
+
+  identity INDUSTRY {
+    base ORGANIZATION_TYPE;
+    description
+      "Industry forum or other industry group";
+  }
+
+  identity COMMERCIAL {
+    base ORGANIZATION_TYPE;
+    description
+      "Commercial entity, company, etc.";
+  }
+
+  identity INDIVIDUAL {
+    base ORGANIZATION_TYPE;
+    description
+      "For modules published by an individual";
+  }
+
+  identity IETF_MODEL_LAYER {
+    base MODULE_CATEGORY_BASE;
+    description
+      "Describes layering of models based on their abstraction
+      level as defined by IETF model classification proposals";
+    reference
+      "IETF draft-ietf-netmod-yang-model-classification";
+  }
+
+  identity IETF_MODEL_TYPE {
+    base MODULE_SUBCATEGORY_BASE;
+    description
+      "IETF proposed classification dimension of YANG model types as
+     standard YANG models, vendor-specific, or user-specific YANG
+     models and extensions";
+    reference
+      "IETF draft-ietf-netmod-yang-model-classification";
+  }
+
+  identity IETF_NETWORK_SERVICE {
+    base IETF_MODEL_LAYER;
+    description
+      "Service-layer model as defined by IETF classification
+      proposal";
+  }
+
+  identity IETF_NETWORK_ELEMENT {
+    base IETF_MODEL_LAYER;
+    description
+      "Network element-layer model as defined by IETF classification
+      proposal";
+  }
+
+  identity IETF_TYPE_STANDARD {
+    base IETF_MODEL_TYPE;
+    description
+      "Models published by standards-defining organizations (SDOs)";
+  }
+
+  identity IETF_TYPE_VENDOR {
+    base IETF_MODEL_TYPE;
+    description
+      "Developed by organizations (e.g., vendors) with the intent
+      to support a specific set of implementations under control of
+      that organization";
+  }
+
+  identity IETF_TYPE_USER {
+    base IETF_MODEL_TYPE;
+    description
+      "Developed by organizations that operate YANG-based
+      infrastructure including devices and orchestrators.
+      The intent of these models is to express the specific needs
+      for a certain implementation, above and beyond what is provided
+      by vendors";
+  }
+
+  typedef module-version-type {
+    type string;
+    description
+      "This type defines acceptable formats for the version of a
+      module.  The version may be a semantic version, or a YANG
+      revision statement date, and may include wildcards when
+      included in a bundle compatibility list, e.g.:
+
+      semver format: <major>.<minor>.<patch>
+      examples: 0.1.0, 2.1.0, 1.1.*, 2.*.*
+
+      revision format:  YYYY-MM-DD
+      example:  2016-11-31";
+  }
+
+
+
+}
diff --git a/models/openconfig/src/main/yang/catalog/openconfig-module-catalog.yang b/models/openconfig/src/main/yang/catalog/openconfig-module-catalog.yang
new file mode 100644
index 0000000..673fe95
--- /dev/null
+++ b/models/openconfig/src/main/yang/catalog/openconfig-module-catalog.yang
@@ -0,0 +1,786 @@
+module openconfig-module-catalog {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/module-catalog";
+
+  prefix "oc-cat";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-catalog-types { prefix oc-cat-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module provides a schema for cataloging and descrbing
+    YANG models published across various organizations.  The catalog
+    contains several categories of data:
+
+    * organizations -- entities that publish and/or maintain
+      individual YANG modules or groups of modules
+
+    * modules -- information regarding individual YANG modules,
+      including their versions, dependencies, submodules, and how
+      to access them
+
+    * release bundles -- groups of modules that are compatible and
+      consistent with each other (as determined by the publisher of
+      of the bundle).  The release bundle does not necessarily
+      correspond to a functional area, e.g., it could the entire
+      set of modules published by an organization
+
+    * feature bundles -- sets of schema paths across a
+      release bundle that provide a specific set of functionality
+
+    * implementations -- information about available module and/or
+      bundle implementations and their status";
+
+  oc-ext:openconfig-version "0.2.1";
+
+  revision "2017-05-01" {
+    description
+      "Fix to module dependency list";
+    reference "0.2.1";
+  }
+
+  revision "2017-03-08" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  revision "2016-02-15" {
+    description
+      "Initial OpenConfig public release";
+    reference "0.1.0";
+  }
+
+
+
+  // grouping statements
+
+  grouping catalog-module-common-config {
+    description
+      "Data definitions common for both bundles and standalone
+      modules";
+
+    leaf name {
+      type string;
+      description
+        "The name of the module or bundle.  For modules, this
+        should reflect the 'module' or 'submodule'
+        statement in the YANG module file.
+
+        For bundles, this is the canonical name for the overall
+        bundle of modules which is to be released together.
+        This name should be consistent over multiple
+        releases";
+    }
+
+    leaf version {
+      type oc-cat-types:module-version-type;
+      description
+        "For individual modules, this is the version number, e.g.,
+        a semantic version.  The version may be the same as the date
+        indicated in the module revision statement.
+
+        For bundles, this is a semantic version number for the
+        overall bundle. This version is to be defined as per the
+        approach specified in the OpenConfig semantic version
+        guidance - and is of the form x.y.z, where x is the major
+        version, y is the minor version, and z is the patch level";
+      reference
+        "Semantic versioning for OpenConfig models";
+    }
+  }
+
+  grouping feature-bundle-included-reference {
+    description
+      "References to the included feature bundles";
+
+    leaf name {
+      type leafref {
+        path "../../../../../../../organizations/" +
+          "organization[name=current()/../publisher]/" +
+            "feature-bundles/feature-bundle/name";
+      }
+      description
+        "Name of the referenced feature bundle";
+    }
+
+    leaf publisher {
+      type leafref {
+        path "../../../../../../../organizations/organization/" +
+          "name";
+      }
+      description
+        "Publisher of the referenced feature bundle";
+    }
+
+    leaf version {
+      type oc-cat-types:module-version-type;
+      description
+        "Version of the referenced feature bundle";
+    }
+  }
+
+  grouping catalog-implementation-bundle-config {
+    description
+      "References to the feature bundles supported by an
+      implementation";
+
+    uses feature-bundle-included-reference;
+  }
+
+  grouping catalog-implementation-bundle-top {
+    description
+      "Top-level grouping for the list of feature bundles
+      supported by an implementation";
+
+    container feature-bundles {
+      description
+        "Enclosing container for the list of feature bundles";
+
+      list feature-bundle {
+        key "name version";
+        description
+          "List of feature bundles supported by the implementation";
+
+        uses catalog-implementation-bundle-config;
+      }
+    }
+  }
+
+  grouping catalog-implementation-config {
+    description
+      "Data describing any available implementations";
+
+    leaf id {
+      type string;
+      description
+        "An identifier for the implementation, provided by the
+        implementor.  This id should uniquely identify a specific
+        implementation of the module, e.g., based on the vendor,
+        platform, and platform version.";
+    }
+
+    leaf description {
+      type string;
+      description
+        "A text summary of important information about the
+        implementation";
+    }
+
+    leaf reference {
+      type union {
+        type oc-inet:uri;
+        type string;
+      }
+      description
+        "A URI (preferred) or text reference to more detailed
+        information about the implementation.";
+    }
+
+
+    leaf platform {
+      type string;
+      description
+        "Name of the platform on which the implementation
+        is available -- this could be the model name of a network
+        device, a server OS, etc.";
+    }
+
+    leaf platform-version {
+      type string;
+      description
+        "Implementor-defined version name or number of the
+        module implementation, corresponding to the platform.
+        This could be the firmware version of a network device
+        such as a router, OS version, or other server platform
+        version.";
+    }
+
+    leaf status {
+      type identityref {
+        base oc-cat-types:IMPLEMENTATION_STATUS_TYPE;
+      }
+      description
+        "Indicates the status of the implementation, e.g.,
+        complete, partial, in-progress, etc.  Implementors
+        may define additional values for the base identity";
+    }
+  }
+
+  grouping catalog-implementation-top {
+    description
+      "Top level grouping for information on model implementations";
+
+    container implementations {
+      description
+        "Container for module implementation information";
+
+      list implementation {
+        key "id";
+        description
+          "List of available implementations, keyed by an identifier
+          provided by either the implementor or the module
+          maintainer.  Such a key avoids needing a complex composite
+          key to uniquely identify an implementation.";
+
+        uses catalog-implementation-config;
+        uses catalog-implementation-bundle-top;
+      }
+    }
+  }
+
+  grouping catalog-module-dependency-config {
+    description
+      "Information about module dependencies";
+
+
+    leaf-list required-module {
+      type string;
+      description
+        "List of names of modules that are imported by the
+        current module.  This list should reflect all of the 'import'
+        statements in the module.  Release bundles should be used to
+        indicate which versions of the imported module are used
+        (or are compatible) with the current module";
+    }
+  }
+
+  grouping catalog-module-dependency-top {
+    description
+      "Top-level grouping for module dependency data";
+
+    container dependencies {
+      description
+        "Data about dependencies of the module";
+
+      uses catalog-module-dependency-config;
+    }
+
+  }
+
+  grouping catalog-module-classification-config {
+    description
+      "Data describing the module's classification(s)";
+
+    leaf category {
+      type identityref {
+        base oc-cat-types:MODULE_CATEGORY_BASE;
+      }
+      description
+         "Categorization of the module based on identities defined
+         or used by the publishing organizations.";
+    }
+
+    leaf subcategory {
+      type identityref {
+        base oc-cat-types:MODULE_SUBCATEGORY_BASE;
+      }
+      description
+         "Sub-categorization of the module based on identities
+          defined or used by the publishing organizations.";
+    }
+
+    leaf deployment-status {
+      type identityref {
+        base oc-cat-types:MODULE_STATUS_TYPE;
+      }
+      description
+        "Deployment status of the module -- experimental,
+        standards-track, production, etc.";
+    }
+  }
+
+  grouping catalog-module-classification-top {
+    description
+      "Data definitions related to module classfications";
+
+    container classification {
+      description
+        "Container for data describing the module's classification";
+
+      uses catalog-module-classification-config;
+    }
+  }
+
+  grouping catalog-module-access-config {
+    description
+      "Data pertaining to retrieval and usage of the module";
+
+    leaf uri {
+      type oc-inet:uri;
+      description
+        "URI where module can be downloaded.  Modules may be
+        made available from the catalog maintainer, or directly
+        from the publisher";
+    }
+
+    leaf md5-hash {
+      type string;
+      description
+        "Optional MD5 hash of the module file.  If specified, the
+        hash may be used by users to validate data integrity";
+    }
+  }
+
+  grouping catalog-module-access-top {
+    description
+      "Top level groupig for data related to accessing a module
+      or submodule";
+
+    container access {
+      description
+        "Container for data pertaining to retrieval and usage of the
+        module";
+
+      uses catalog-module-access-config;
+    }
+  }
+
+  grouping catalog-module-submodule-config {
+    description
+      "Data definitions for submodules belonging to a
+      module";
+
+    leaf name {
+      type string;
+      description
+        "Name of the submodule as indicated by its top-level
+        'submodule' statement";
+    }
+
+  }
+
+  grouping catalog-module-submodule-top {
+    description
+      "Top-level grouping for submodule information";
+
+    container submodules {
+      description
+        "Data for the submodules belonging to a submodule. If the
+        module does not have any submodules, this container
+        should be empty.";
+
+      list submodule {
+        key "name";
+        description
+          "List of submodules included by a module.  All submodules
+          specified by 'include' statements in the module should be
+          included in this list.";
+
+        uses catalog-module-submodule-config;
+        uses catalog-module-access-top;
+      }
+    }
+  }
+
+  grouping catalog-module-base-config {
+    description
+      "Basic information describing the module, e.g., the
+      YANG metadata in the module preface.";
+
+
+    leaf namespace {
+      type string;
+      description
+        "Published namespace of module, i.e., defined by the
+        'namespace' ";
+    }
+
+    leaf prefix {
+      type string;
+      description
+        "Published prefix of the module";
+    }
+
+    leaf revision {
+      type string;
+      description
+        "Date in the revision statement of the module";
+    }
+
+    leaf summary {
+      type string;
+      description
+        "Summary description of the module";
+    }
+  }
+
+  grouping release-bundle-member-config {
+    description
+      "Data for each member of a bundle";
+
+    leaf id {
+      type string;
+      description
+        "Identifier for the bundle member";
+    }
+
+    leaf type {
+      type identityref {
+        base oc-cat-types:CATALOG_MEMBER_TYPE;
+      }
+      description
+        "The type of member that is to be included within the
+        release bundle. Release bundles may include modules and
+        other release bundles.  Both member modules and member
+        bundles should specify the list of compatible versions.";
+    }
+
+    leaf module {
+      when "../type = 'oc-cat-types:MODULE'" {
+        description
+          "The module name is specified for bundle membrs that are
+          modules";
+      }
+      type leafref {
+        path "../../../../../../../organizations/" +
+          "organization[name=current()/../publisher]/modules/" +
+          "module/name";
+      }
+      description
+        "Name of the module set which is included in this bundle -
+        for example, 'openconfig-bgp'";
+    }
+
+    leaf release-bundle {
+      when "../type = 'oc-cat-types:RELEASE_BUNDLE'" {
+        description
+          "The release bundle is specified for bundle members that
+          are release bundles";
+      }
+      type leafref {
+        path "../../../../../../../organizations/" +
+          "organization[name=current()/../publisher]/" +
+            "release-bundles/release-bundle/name";
+      }
+      description
+        "Name of the module set which is included in this bundle -
+        for example, 'openconfig-bgp'";
+    }
+
+    leaf publisher {
+      type leafref {
+        path "../../../../../../../organizations/organization/" +
+          "name";
+      }
+      description
+        "Reference to the name of the publishing organization";
+    }
+
+    leaf-list compatible-versions {
+      type oc-cat-types:module-version-type;
+      description
+        "A list of semantic version specification of the versions
+        of the specified module or release bundle which are
+        compatible when building this version of the bundle.
+
+        Version specifications may be added when changes are made
+        to a module within a bundle, and this does not affect the
+        interaction between it and other modules. It is expected
+        that backwards compatible changes to an individual module or
+        member bundle do not affect the compatibility of that
+        with other members, and hence wildcard matches are allowed
+        within this list.";
+    }
+  }
+
+  grouping release-bundle-member-top {
+
+    description
+      "Parameters relating to models within release bundles";
+
+    container members {
+      description
+        "List of bundle members which make up this release bundle. A
+        member is defined as an individual YANG module specified
+        in the YANG catalogue, or another release
+        bundle which can be used to group multiple YANG
+        models together.";
+
+      list member {
+        key "id";
+        description
+          "A set of modules or bundles which are part of the bundle
+          of models. For example, if 'ietf-yang-types' were to be
+          specified within the bundle, then this would refer to the
+          individual entry within the module catalogue. If the type
+          of the entry is set to bundle, then for example,
+          openconfig-bgp could be referenced - which itself consists
+          of separate modules.";
+
+        uses release-bundle-member-config;
+
+      }
+    }
+  }
+
+  grouping release-bundle-top {
+    description
+      "Top-level container for a release bundle";
+
+    container release-bundles {
+      description
+        "List of release bundles";
+
+      list release-bundle {
+        key "name version";
+
+        description
+          "List of release bundles - sets of modules and/or
+          bundles which are interoperable";
+
+        uses catalog-module-common-config;
+        uses release-bundle-member-top;
+      }
+    }
+  }
+
+  grouping feature-bundle-release-config {
+    description
+      "Data definitions to identify the release bundle that the
+      feature bundle is based on.";
+
+    leaf name {
+      type leafref {
+        path "../../../../release-bundles/release-bundle/name";
+      }
+      description
+        "Reference to the name of the release bundle used for the
+        feature paths.";
+    }
+
+    leaf version {
+      type leafref {
+        path "../../../../release-bundles/" +
+          "release-bundle[name=current()/../name]/version";
+      }
+      description
+        "Reference to the release bundle version used for the
+        feature paths";
+    }
+
+    leaf publisher {
+      type leafref {
+        path "../../../../release-bundles/" +
+          "release-bundle[name=current()/../name]/publisher";
+      }
+      description
+        "Reference to the publisher of the release bundle used for
+        the feature paths";
+    }
+  }
+
+  grouping feature-bundle-release-top {
+    description
+      "Top-level grouping for data about the release bundle used
+      to specify the feature bundle";
+
+    container release-bundle {
+      description
+        "Data to identify the release bundle from which the feature
+        paths should be specified.  If the feature crosses
+        release bundles, a new release bundle should be
+        created to support the feature bundle.";
+
+      leaf name {
+        type leafref {
+          path "../../../../../../organizations/" +
+            "organization[name=current()/../publisher]/" +
+              "release-bundles/release-bundle/name";
+        }
+        description
+          "Name of the module set which is included in this bundle -
+          for example, 'openconfig-bgp'";
+      }
+
+      leaf publisher {
+        type leafref {
+          path "../../../../../../organizations/organization/" +
+            "name";
+        }
+        description
+          "Reference to the name of the publishing organization";
+      }
+
+      leaf version {
+        type oc-cat-types:module-version-type;
+        description
+          "Version of the referenced release bundle";
+      }
+    }
+  }
+
+
+  grouping feature-bundle-config {
+    description
+      "Data definitions for the feature bundle";
+
+    uses catalog-module-common-config;
+
+    leaf-list path {
+      type string;
+      description
+        "The list of schema paths included in the feature.  The
+        paths specify subtrees, i.e., all data underneath the
+        specified path are included in the feature.";
+    }
+  }
+
+  grouping feature-bundle-feature-config {
+    description
+      "Data definitions for included feature bundles";
+
+    uses feature-bundle-included-reference;
+  }
+
+  grouping feature-bundle-feature-top {
+    description
+      "Top level grouping for the list of included feature
+      bundles";
+
+    container feature-bundles {
+      description
+        "Enclosing container for the list of included feature
+        bundles.  Feature bundles may be composed from other
+        smaller feature units";
+
+      list feature-bundle {
+        key "name";
+        description
+          "The list of feature bundles included in the current
+          feature bundle.";
+
+        uses feature-bundle-feature-config;
+      }
+    }
+
+  }
+
+
+  grouping feature-bundle-top {
+    description
+      "Top-level grouping for OpenConfig feature bundles";
+
+    container feature-bundles {
+      description
+        "Enclosing container for the list of feature bundles";
+
+      list feature-bundle {
+        key "name version";
+        description
+          "List of feature bundles";
+
+        uses feature-bundle-config;
+        uses feature-bundle-release-top;
+        uses feature-bundle-feature-top;
+      }
+    }
+  }
+
+  grouping catalog-module-top {
+    description
+      "Top level structure of the module catalog";
+
+    container modules {
+      description
+        "Modules published by this organization";
+
+      list module {
+        key "name version";
+        description
+          "List of published modules from the organization";
+
+        uses catalog-module-common-config;
+        uses catalog-module-base-config;
+        uses catalog-module-classification-top;
+        uses catalog-module-dependency-top;
+        uses catalog-module-access-top;
+        uses catalog-module-submodule-top;
+      }
+    }
+  }
+
+  grouping catalog-organization-config {
+    description
+      "Top level grouping for data related to an organization that
+      publishes module, bundles, etc.";
+
+    leaf name {
+      type string;
+      description
+        "Name of the maintaining organization -- the name should be
+        supplied in the official format used by the organization.
+        Standards Body examples:
+          IETF, IEEE, MEF, ONF, etc.
+        Commercial entity examples:
+          AT&T, Facebook, <Vendor>
+        Name of industry forum examples:
+          OpenConfig, OpenDaylight, ON.Lab";
+    }
+
+    leaf type {
+      type identityref {
+        base oc-cat-types:ORGANIZATION_TYPE;
+      }
+      description
+        "Type of the publishing organization";
+    }
+
+    leaf contact {
+      type string;
+      description
+        "Contact information for the publishing organization (web
+        site, email address, etc.)";
+    }
+  }
+
+  grouping catalog-organization-top {
+    description
+      "Top level grouping for list of maintaining organizations";
+
+    container organizations {
+      description
+        "List of organizations owning modules";
+
+      list organization {
+        key "name";
+
+        description
+          "List of organizations publishing YANG modules or
+          module bundles";
+
+        uses catalog-organization-config;
+        uses catalog-module-top;
+        uses release-bundle-top;
+        uses feature-bundle-top;
+        uses catalog-implementation-top;
+      }
+    }
+  }
+
+
+  grouping catalog-top {
+    description
+      "Top-level grouping for the YANG model catalog";
+
+    uses catalog-organization-top;
+  }
+
+  // data definition statements
+
+  uses catalog-top;
+
+}
diff --git a/models/openconfig/src/main/yang/comm/iana-if-type.yang b/models/openconfig/src/main/yang/comm/iana-if-type.yang
new file mode 100644
index 0000000..931f8b6
--- /dev/null
+++ b/models/openconfig/src/main/yang/comm/iana-if-type.yang
@@ -0,0 +1,1629 @@
+module iana-if-type {
+  namespace "urn:ietf:params:xml:ns:yang:iana-if-type";
+  prefix ianaift;
+
+  import ietf-interfaces {
+    prefix if;
+  }
+
+  organization "IANA";
+  contact
+    "        Internet Assigned Numbers Authority
+
+     Postal: ICANN
+             12025 Waterfront Drive, Suite 300
+             Los Angeles, CA 90094-2536
+             United States
+
+     Tel:    +1 310 301 5800
+     <mailto:iana&iana.org>";
+  description
+    "This YANG module defines YANG identities for IANA-registered
+     interface types.
+
+     This YANG module is maintained by IANA and reflects the
+     'ifType definitions' registry.
+
+     The latest revision of this YANG module can be obtained from
+     the IANA web site.
+
+     Requests for new values should be made to IANA via
+     email (iana&iana.org).
+
+     Copyright (c) 2014 IETF Trust and the persons identified as
+     authors of the code.  All rights reserved.
+
+     Redistribution and use in source and binary forms, with or
+     without modification, is permitted pursuant to, and subject
+     to the license terms contained in, the Simplified BSD License
+     set forth in Section 4.c of the IETF Trust's Legal Provisions
+     Relating to IETF Documents
+     (http://trustee.ietf.org/license-info).
+
+     The initial version of this YANG module is part of RFC 7224;
+     see the RFC itself for full legal notices.";
+  reference
+    "IANA 'ifType definitions' registry.
+     <http://www.iana.org/assignments/smi-numbers>";
+
+  revision 2017-03-30 {
+    description
+      "Registered ifType 290.";
+  }
+
+  revision 2017-01-19 {
+    description
+      "Registered ifType 289.";
+  }
+
+  revision 2016-11-23 {
+    description
+      "Registered ifTypes 283-288.";
+  }
+
+  revision 2016-06-09 {
+    description
+      "Registered ifType 282.";
+  }
+  revision 2016-05-03 {
+    description
+      "Registered ifType 281.";
+  }
+  revision 2015-06-12 {
+    description
+      "Corrected formatting issue.";
+  }  
+  revision 2014-09-24 {
+    description
+      "Registered ifType 280.";
+  }
+  revision 2014-09-19 {
+    description
+      "Registered ifType 279.";
+  }
+  revision 2014-07-03 {
+    description
+      "Registered ifTypes 277-278.";
+  }
+  revision 2014-05-19 {
+    description
+      "Updated the contact address.";
+  }
+  revision 2014-05-08 {
+    description
+      "Initial revision.";
+    reference
+      "RFC 7224: IANA Interface Type YANG Module";
+  }
+
+  identity iana-interface-type {
+    base if:interface-type;
+    description
+      "This identity is used as a base for all interface types
+       defined in the 'ifType definitions' registry.";
+  }
+
+  identity other {
+    base iana-interface-type;
+  }
+  identity regular1822 {
+    base iana-interface-type;
+  }
+  identity hdh1822 {
+    base iana-interface-type;
+  }
+  identity ddnX25 {
+    base iana-interface-type;
+  }
+  identity rfc877x25 {
+    base iana-interface-type;
+    reference
+      "RFC 1382 - SNMP MIB Extension for the X.25 Packet Layer";
+  }
+  identity ethernetCsmacd {
+    base iana-interface-type;
+    description
+      "For all Ethernet-like interfaces, regardless of speed,
+       as per RFC 3635.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88023Csmacd {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity iso88024TokenBus {
+    base iana-interface-type;
+  }
+  identity iso88025TokenRing {
+    base iana-interface-type;
+  }
+  identity iso88026Man {
+    base iana-interface-type;
+  }
+  identity starLan {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Deprecated via RFC 3635.
+       Use ethernetCsmacd(6) instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity proteon10Mbit {
+    base iana-interface-type;
+  }
+  identity proteon80Mbit {
+    base iana-interface-type;
+  }
+  identity hyperchannel {
+    base iana-interface-type;
+  }
+  identity fddi {
+    base iana-interface-type;
+    reference
+      "RFC 1512 - FDDI Management Information Base";
+  }
+  identity lapb {
+    base iana-interface-type;
+    reference
+      "RFC 1381 - SNMP MIB Extension for X.25 LAPB";
+  }
+  identity sdlc {
+    base iana-interface-type;
+  }
+  identity ds1 {
+    base iana-interface-type;
+    description
+      "DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity e1 {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+    reference
+      "RFC 4805 - Definitions of Managed Objects for the
+                  DS1, J1, E1, DS2, and E2 Interface Types";
+  }
+  identity basicISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity primaryISDN {
+    base iana-interface-type;
+    description
+      "No longer used.  See also RFC 2127.";
+  }
+  identity propPointToPointSerial {
+    base iana-interface-type;
+    description
+      "Proprietary serial.";
+  }
+  identity ppp {
+    base iana-interface-type;
+  }
+  identity softwareLoopback {
+    base iana-interface-type;
+  }
+  identity eon {
+    base iana-interface-type;
+    description
+      "CLNP over IP.";
+  }
+  identity ethernet3Mbit {
+    base iana-interface-type;
+  }
+  identity nsip {
+    base iana-interface-type;
+    description
+      "XNS over IP.";
+  }
+  identity slip {
+    base iana-interface-type;
+    description
+      "Generic SLIP.";
+  }
+  identity ultra {
+    base iana-interface-type;
+    description
+      "Ultra Technologies.";
+  }
+  identity ds3 {
+    base iana-interface-type;
+    description
+      "DS3-MIB.";
+    reference
+      "RFC 3896 - Definitions of Managed Objects for the
+                  DS3/E3 Interface Type";
+  }
+  identity sip {
+    base iana-interface-type;
+    description
+      "SMDS, coffee.";
+    reference
+      "RFC 1694 - Definitions of Managed Objects for SMDS
+                  Interfaces using SMIv2";
+  }
+  identity frameRelay {
+    base iana-interface-type;
+    description
+      "DTE only.";
+    reference
+      "RFC 2115 - Management Information Base for Frame Relay
+                  DTEs Using SMIv2";
+  }
+  identity rs232 {
+    base iana-interface-type;
+    reference
+      "RFC 1659 - Definitions of Managed Objects for RS-232-like
+                  Hardware Devices using SMIv2";
+  }
+  identity para {
+    base iana-interface-type;
+    description
+      "Parallel-port.";
+    reference
+      "RFC 1660 - Definitions of Managed Objects for
+                  Parallel-printer-like Hardware Devices using
+                  SMIv2";
+  }
+  identity arcnet {
+    base iana-interface-type;
+    description
+      "ARCnet.";
+  }
+  identity arcnetPlus {
+    base iana-interface-type;
+    description
+      "ARCnet Plus.";
+  }
+  identity atm {
+    base iana-interface-type;
+    description
+      "ATM cells.";
+  }
+  identity miox25 {
+    base iana-interface-type;
+    reference
+      "RFC 1461 - SNMP MIB extension for Multiprotocol
+                  Interconnect over X.25";
+  }
+  identity sonet {
+    base iana-interface-type;
+    description
+      "SONET or SDH.";
+  }
+  identity x25ple {
+    base iana-interface-type;
+    reference
+      "RFC 2127 - ISDN Management Information Base using SMIv2";
+  }
+  identity iso88022llc {
+    base iana-interface-type;
+  }
+  identity localTalk {
+    base iana-interface-type;
+  }
+  identity smdsDxi {
+    base iana-interface-type;
+  }
+  identity frameRelayService {
+    base iana-interface-type;
+    description
+      "FRNETSERV-MIB.";
+    reference
+      "RFC 2954 - Definitions of Managed Objects for Frame
+                  Relay Service";
+  }
+  identity v35 {
+    base iana-interface-type;
+  }
+  identity hssi {
+    base iana-interface-type;
+  }
+  identity hippi {
+    base iana-interface-type;
+  }
+  identity modem {
+    base iana-interface-type;
+    description
+      "Generic modem.";
+  }
+  identity aal5 {
+    base iana-interface-type;
+    description
+      "AAL5 over ATM.";
+  }
+  identity sonetPath {
+    base iana-interface-type;
+  }
+  identity sonetVT {
+    base iana-interface-type;
+  }
+  identity smdsIcip {
+    base iana-interface-type;
+    description
+      "SMDS InterCarrier Interface.";
+  }
+  identity propVirtual {
+    base iana-interface-type;
+    description
+      "Proprietary virtual/internal.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity propMultiplexor {
+    base iana-interface-type;
+    description
+      "Proprietary multiplexing.";
+    reference
+      "RFC 2863 - The Interfaces Group MIB";
+  }
+  identity ieee80212 {
+    base iana-interface-type;
+    description
+      "100BaseVG.";
+  }
+  identity fibreChannel {
+    base iana-interface-type;
+    description
+      "Fibre Channel.";
+  }
+  identity hippiInterface {
+    base iana-interface-type;
+    description
+      "HIPPI interfaces.";
+  }
+  identity frameRelayInterconnect {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; use either
+       frameRelay(32) or frameRelayService(44).";
+  }
+  identity aflane8023 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.3.";
+  }
+  identity aflane8025 {
+    base iana-interface-type;
+    description
+      "ATM Emulated LAN for 802.5.";
+  }
+  identity cctEmul {
+    base iana-interface-type;
+    description
+      "ATM Emulated circuit.";
+  }
+  identity fastEther {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity isdn {
+    base iana-interface-type;
+    description
+      "ISDN and X.25.";
+    reference
+      "RFC 1356 - Multiprotocol Interconnect on X.25 and ISDN
+                  in the Packet Mode";
+  }
+  identity v11 {
+    base iana-interface-type;
+    description
+      "CCITT V.11/X.21.";
+  }
+  identity v36 {
+    base iana-interface-type;
+    description
+      "CCITT V.36.";
+  }
+  identity g703at64k {
+    base iana-interface-type;
+    description
+      "CCITT G703 at 64Kbps.";
+  }
+  identity g703at2mb {
+    base iana-interface-type;
+    status obsolete;
+    description
+      "Obsolete; see DS1-MIB.";
+  }
+  identity qllc {
+    base iana-interface-type;
+    description
+      "SNA QLLC.";
+  }
+  identity fastEtherFX {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity channel {
+    base iana-interface-type;
+    description
+      "Channel.";
+  }
+  identity ieee80211 {
+    base iana-interface-type;
+    description
+      "Radio spread spectrum.";
+  }
+  identity ibm370parChan {
+    base iana-interface-type;
+    description
+      "IBM System 360/370 OEMI Channel.";
+  }
+  identity escon {
+    base iana-interface-type;
+    description
+      "IBM Enterprise Systems Connection.";
+  }
+  identity dlsw {
+    base iana-interface-type;
+    description
+      "Data Link Switching.";
+  }
+  identity isdns {
+    base iana-interface-type;
+    description
+      "ISDN S/T interface.";
+  }
+  identity isdnu {
+    base iana-interface-type;
+    description
+      "ISDN U interface.";
+  }
+  identity lapd {
+    base iana-interface-type;
+    description
+      "Link Access Protocol D.";
+  }
+  identity ipSwitch {
+    base iana-interface-type;
+    description
+      "IP Switching Objects.";
+  }
+  identity rsrb {
+    base iana-interface-type;
+    description
+      "Remote Source Route Bridging.";
+  }
+  identity atmLogical {
+    base iana-interface-type;
+    description
+      "ATM Logical Port.";
+    reference
+      "RFC 3606 - Definitions of Supplemental Managed Objects
+                  for ATM Interface";
+  }
+  identity ds0 {
+    base iana-interface-type;
+    description
+      "Digital Signal Level 0.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity ds0Bundle {
+    base iana-interface-type;
+    description
+      "Group of ds0s on the same ds1.";
+    reference
+      "RFC 2494 - Definitions of Managed Objects for the DS0
+                  and DS0 Bundle Interface Type";
+  }
+  identity bsc {
+    base iana-interface-type;
+    description
+      "Bisynchronous Protocol.";
+  }
+  identity async {
+    base iana-interface-type;
+    description
+      "Asynchronous Protocol.";
+  }
+  identity cnr {
+    base iana-interface-type;
+    description
+      "Combat Net Radio.";
+  }
+  identity iso88025Dtr {
+    base iana-interface-type;
+    description
+      "ISO 802.5r DTR.";
+  }
+  identity eplrs {
+    base iana-interface-type;
+    description
+      "Ext Pos Loc Report Sys.";
+  }
+  identity arap {
+    base iana-interface-type;
+    description
+      "Appletalk Remote Access Protocol.";
+  }
+  identity propCnls {
+    base iana-interface-type;
+    description
+      "Proprietary Connectionless Protocol.";
+  }
+  identity hostPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.29 PAD Protocol.";
+  }
+  identity termPad {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X.3 PAD Facility.";
+  }
+  identity frameRelayMPI {
+    base iana-interface-type;
+    description
+      "Multiproto Interconnect over FR.";
+  }
+  identity x213 {
+    base iana-interface-type;
+    description
+      "CCITT-ITU X213.";
+  }
+  identity adsl {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop.";
+  }
+  identity radsl {
+    base iana-interface-type;
+    description
+      "Rate-Adapt. Digital Subscriber Loop.";
+  }
+  identity sdsl {
+    base iana-interface-type;
+    description
+      "Symmetric Digital Subscriber Loop.";
+  }
+  identity vdsl {
+    base iana-interface-type;
+    description
+      "Very H-Speed Digital Subscrib. Loop.";
+  }
+  identity iso88025CRFPInt {
+    base iana-interface-type;
+    description
+      "ISO 802.5 CRFP.";
+  }
+  identity myrinet {
+    base iana-interface-type;
+    description
+      "Myricom Myrinet.";
+  }
+  identity voiceEM {
+    base iana-interface-type;
+    description
+      "Voice recEive and transMit.";
+  }
+  identity voiceFXO {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Office.";
+  }
+  identity voiceFXS {
+    base iana-interface-type;
+    description
+      "Voice Foreign Exchange Station.";
+  }
+  identity voiceEncap {
+    base iana-interface-type;
+    description
+      "Voice encapsulation.";
+  }
+  identity voiceOverIp {
+    base iana-interface-type;
+    description
+      "Voice over IP encapsulation.";
+  }
+  identity atmDxi {
+    base iana-interface-type;
+    description
+      "ATM DXI.";
+  }
+  identity atmFuni {
+    base iana-interface-type;
+    description
+      "ATM FUNI.";
+  }
+  identity atmIma {
+    base iana-interface-type;
+    description
+      "ATM IMA.";
+  }
+  identity pppMultilinkBundle {
+    base iana-interface-type;
+    description
+      "PPP Multilink Bundle.";
+  }
+  identity ipOverCdlc {
+    base iana-interface-type;
+    description
+      "IBM ipOverCdlc.";
+  }
+  identity ipOverClaw {
+    base iana-interface-type;
+    description
+      "IBM Common Link Access to Workstn.";
+  }
+  identity stackToStack {
+    base iana-interface-type;
+    description
+      "IBM stackToStack.";
+  }
+  identity virtualIpAddress {
+    base iana-interface-type;
+    description
+      "IBM VIPA.";
+  }
+  identity mpc {
+    base iana-interface-type;
+    description
+      "IBM multi-protocol channel support.";
+  }
+  identity ipOverAtm {
+    base iana-interface-type;
+    description
+      "IBM ipOverAtm.";
+    reference
+      "RFC 2320 - Definitions of Managed Objects for Classical IP
+                  and ARP Over ATM Using SMIv2 (IPOA-MIB)";
+  }
+  identity iso88025Fiber {
+    base iana-interface-type;
+    description
+      "ISO 802.5j Fiber Token Ring.";
+  }
+  identity tdlc {
+    base iana-interface-type;
+    description
+      "IBM twinaxial data link control.";
+  }
+  identity gigabitEthernet {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Obsoleted via RFC 3635.
+       ethernetCsmacd(6) should be used instead.";
+    reference
+      "RFC 3635 - Definitions of Managed Objects for the
+                  Ethernet-like Interface Types";
+  }
+  identity hdlc {
+    base iana-interface-type;
+    description
+      "HDLC.";
+  }
+  identity lapf {
+    base iana-interface-type;
+    description
+      "LAP F.";
+  }
+  identity v37 {
+    base iana-interface-type;
+    description
+      "V.37.";
+  }
+  identity x25mlp {
+    base iana-interface-type;
+    description
+      "Multi-Link Protocol.";
+  }
+  identity x25huntGroup {
+    base iana-interface-type;
+    description
+      "X25 Hunt Group.";
+  }
+  identity transpHdlc {
+    base iana-interface-type;
+    description
+      "Transp HDLC.";
+  }
+  identity interleave {
+    base iana-interface-type;
+    description
+      "Interleave channel.";
+  }
+  identity fast {
+    base iana-interface-type;
+    description
+      "Fast channel.";
+  }
+  identity ip {
+    base iana-interface-type;
+    description
+      "IP (for APPN HPR in IP networks).";
+  }
+  identity docsCableMaclayer {
+    base iana-interface-type;
+    description
+      "CATV Mac Layer.";
+  }
+  identity docsCableDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream interface.";
+  }
+  identity docsCableUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream interface.";
+  }
+  identity a12MppSwitch {
+    base iana-interface-type;
+    description
+      "Avalon Parallel Processor.";
+  }
+  identity tunnel {
+    base iana-interface-type;
+    description
+      "Encapsulation interface.";
+  }
+  identity coffee {
+    base iana-interface-type;
+    description
+      "Coffee pot.";
+    reference
+      "RFC 2325 - Coffee MIB";
+  }
+  identity ces {
+    base iana-interface-type;
+    description
+      "Circuit Emulation Service.";
+  }
+  identity atmSubInterface {
+    base iana-interface-type;
+    description
+      "ATM Sub Interface.";
+  }
+  identity l2vlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using 802.1Q.";
+  }
+  identity l3ipvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IP.";
+  }
+  identity l3ipxvlan {
+    base iana-interface-type;
+    description
+      "Layer 3 Virtual LAN using IPX.";
+  }
+  identity digitalPowerline {
+    base iana-interface-type;
+    description
+      "IP over Power Lines.";
+  }
+  identity mediaMailOverIp {
+    base iana-interface-type;
+    description
+      "Multimedia Mail over IP.";
+  }
+  identity dtm {
+    base iana-interface-type;
+    description
+      "Dynamic synchronous Transfer Mode.";
+  }
+  identity dcn {
+    base iana-interface-type;
+    description
+      "Data Communications Network.";
+  }
+  identity ipForward {
+    base iana-interface-type;
+    description
+      "IP Forwarding Interface.";
+  }
+  identity msdsl {
+    base iana-interface-type;
+    description
+      "Multi-rate Symmetric DSL.";
+  }
+  identity ieee1394 {
+    base iana-interface-type;
+
+    description
+      "IEEE1394 High Performance Serial Bus.";
+  }
+  identity if-gsn {
+    base iana-interface-type;
+    description
+      "HIPPI-6400.";
+  }
+  identity dvbRccMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCC MAC Layer.";
+  }
+  identity dvbRccDownstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Downstream Channel.";
+  }
+  identity dvbRccUpstream {
+    base iana-interface-type;
+    description
+      "DVB-RCC Upstream Channel.";
+  }
+  identity atmVirtual {
+    base iana-interface-type;
+    description
+      "ATM Virtual Interface.";
+  }
+  identity mplsTunnel {
+    base iana-interface-type;
+    description
+      "MPLS Tunnel Virtual Interface.";
+  }
+  identity srp {
+    base iana-interface-type;
+    description
+      "Spatial Reuse Protocol.";
+  }
+  identity voiceOverAtm {
+    base iana-interface-type;
+    description
+      "Voice over ATM.";
+  }
+  identity voiceOverFrameRelay {
+    base iana-interface-type;
+    description
+      "Voice Over Frame Relay.";
+  }
+  identity idsl {
+    base iana-interface-type;
+    description
+      "Digital Subscriber Loop over ISDN.";
+  }
+  identity compositeLink {
+    base iana-interface-type;
+    description
+      "Avici Composite Link Interface.";
+  }
+  identity ss7SigLink {
+    base iana-interface-type;
+    description
+      "SS7 Signaling Link.";
+  }
+  identity propWirelessP2P {
+    base iana-interface-type;
+    description
+      "Prop. P2P wireless interface.";
+  }
+  identity frForward {
+    base iana-interface-type;
+    description
+      "Frame Forward Interface.";
+  }
+  identity rfc1483 {
+    base iana-interface-type;
+    description
+      "Multiprotocol over ATM AAL5.";
+    reference
+      "RFC 1483 - Multiprotocol Encapsulation over ATM
+                  Adaptation Layer 5";
+  }
+  identity usb {
+    base iana-interface-type;
+    description
+      "USB Interface.";
+  }
+  identity ieee8023adLag {
+    base iana-interface-type;
+    description
+      "IEEE 802.3ad Link Aggregate.";
+  }
+  identity bgppolicyaccounting {
+    base iana-interface-type;
+    description
+      "BGP Policy Accounting.";
+  }
+  identity frf16MfrBundle {
+    base iana-interface-type;
+    description
+      "FRF.16 Multilink Frame Relay.";
+  }
+  identity h323Gatekeeper {
+    base iana-interface-type;
+    description
+      "H323 Gatekeeper.";
+  }
+  identity h323Proxy {
+    base iana-interface-type;
+    description
+      "H323 Voice and Video Proxy.";
+  }
+  identity mpls {
+    base iana-interface-type;
+    description
+      "MPLS.";
+  }
+  identity mfSigLink {
+    base iana-interface-type;
+    description
+      "Multi-frequency signaling link.";
+  }
+  identity hdsl2 {
+    base iana-interface-type;
+    description
+      "High Bit-Rate DSL - 2nd generation.";
+  }
+  identity shdsl {
+    base iana-interface-type;
+    description
+      "Multirate HDSL2.";
+  }
+  identity ds1FDL {
+    base iana-interface-type;
+    description
+      "Facility Data Link (4Kbps) on a DS1.";
+  }
+  identity pos {
+    base iana-interface-type;
+    description
+      "Packet over SONET/SDH Interface.";
+  }
+  identity dvbAsiIn {
+    base iana-interface-type;
+    description
+      "DVB-ASI Input.";
+  }
+  identity dvbAsiOut {
+    base iana-interface-type;
+    description
+      "DVB-ASI Output.";
+  }
+  identity plc {
+    base iana-interface-type;
+    description
+      "Power Line Communications.";
+  }
+  identity nfas {
+    base iana-interface-type;
+    description
+      "Non-Facility Associated Signaling.";
+  }
+  identity tr008 {
+    base iana-interface-type;
+    description
+      "TR008.";
+  }
+  identity gr303RDT {
+    base iana-interface-type;
+    description
+      "Remote Digital Terminal.";
+  }
+  identity gr303IDT {
+    base iana-interface-type;
+    description
+      "Integrated Digital Terminal.";
+  }
+  identity isup {
+    base iana-interface-type;
+    description
+      "ISUP.";
+  }
+  identity propDocsWirelessMaclayer {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Maclayer.";
+  }
+  identity propDocsWirelessDownstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Downstream.";
+  }
+  identity propDocsWirelessUpstream {
+    base iana-interface-type;
+    description
+      "Cisco proprietary Upstream.";
+  }
+  identity hiperlan2 {
+    base iana-interface-type;
+    description
+      "HIPERLAN Type 2 Radio Interface.";
+  }
+  identity propBWAp2Mp {
+    base iana-interface-type;
+    description
+      "PropBroadbandWirelessAccesspt2Multipt (use of this value
+       for IEEE 802.16 WMAN interfaces as per IEEE Std 802.16f
+       is deprecated, and ieee80216WMAN(237) should be used
+       instead).";
+  }
+  identity sonetOverheadChannel {
+    base iana-interface-type;
+    description
+      "SONET Overhead Channel.";
+  }
+  identity digitalWrapperOverheadChannel {
+    base iana-interface-type;
+    description
+      "Digital Wrapper.";
+  }
+  identity aal2 {
+    base iana-interface-type;
+    description
+      "ATM adaptation layer 2.";
+  }
+  identity radioMAC {
+    base iana-interface-type;
+    description
+      "MAC layer over radio links.";
+  }
+  identity atmRadio {
+    base iana-interface-type;
+    description
+      "ATM over radio links.";
+  }
+  identity imt {
+    base iana-interface-type;
+    description
+      "Inter-Machine Trunks.";
+  }
+  identity mvl {
+    base iana-interface-type;
+    description
+      "Multiple Virtual Lines DSL.";
+  }
+  identity reachDSL {
+    base iana-interface-type;
+    description
+      "Long Reach DSL.";
+  }
+  identity frDlciEndPt {
+    base iana-interface-type;
+    description
+      "Frame Relay DLCI End Point.";
+  }
+  identity atmVciEndPt {
+    base iana-interface-type;
+    description
+      "ATM VCI End Point.";
+  }
+  identity opticalChannel {
+    base iana-interface-type;
+    description
+      "Optical Channel.";
+  }
+  identity opticalTransport {
+    base iana-interface-type;
+    description
+      "Optical Transport.";
+  }
+  identity propAtm {
+    base iana-interface-type;
+    description
+      "Proprietary ATM.";
+  }
+  identity voiceOverCable {
+    base iana-interface-type;
+    description
+      "Voice Over Cable Interface.";
+  }
+  identity infiniband {
+    base iana-interface-type;
+    description
+      "Infiniband.";
+  }
+  identity teLink {
+    base iana-interface-type;
+    description
+      "TE Link.";
+  }
+  identity q2931 {
+    base iana-interface-type;
+    description
+      "Q.2931.";
+  }
+  identity virtualTg {
+    base iana-interface-type;
+    description
+      "Virtual Trunk Group.";
+  }
+  identity sipTg {
+    base iana-interface-type;
+    description
+      "SIP Trunk Group.";
+  }
+  identity sipSig {
+    base iana-interface-type;
+    description
+      "SIP Signaling.";
+  }
+  identity docsCableUpstreamChannel {
+    base iana-interface-type;
+    description
+      "CATV Upstream Channel.";
+  }
+  identity econet {
+    base iana-interface-type;
+    description
+      "Acorn Econet.";
+  }
+  identity pon155 {
+    base iana-interface-type;
+    description
+      "FSAN 155Mb Symetrical PON interface.";
+  }
+  identity pon622 {
+    base iana-interface-type;
+    description
+      "FSAN 622Mb Symetrical PON interface.";
+  }
+  identity bridge {
+    base iana-interface-type;
+    description
+      "Transparent bridge interface.";
+  }
+  identity linegroup {
+    base iana-interface-type;
+    description
+      "Interface common to multiple lines.";
+  }
+  identity voiceEMFGD {
+    base iana-interface-type;
+    description
+      "Voice E&M Feature Group D.";
+  }
+  identity voiceFGDEANA {
+    base iana-interface-type;
+    description
+      "Voice FGD Exchange Access North American.";
+  }
+  identity voiceDID {
+    base iana-interface-type;
+    description
+      "Voice Direct Inward Dialing.";
+  }
+  identity mpegTransport {
+    base iana-interface-type;
+    description
+      "MPEG transport interface.";
+  }
+  identity sixToFour {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "6to4 interface (DEPRECATED).";
+    reference
+      "RFC 4087 - IP Tunnel MIB";
+  }
+  identity gtp {
+    base iana-interface-type;
+    description
+      "GTP (GPRS Tunneling Protocol).";
+  }
+  identity pdnEtherLoop1 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 1.";
+  }
+  identity pdnEtherLoop2 {
+    base iana-interface-type;
+    description
+      "Paradyne EtherLoop 2.";
+  }
+  identity opticalChannelGroup {
+    base iana-interface-type;
+    description
+      "Optical Channel Group.";
+  }
+  identity homepna {
+    base iana-interface-type;
+    description
+      "HomePNA ITU-T G.989.";
+  }
+  identity gfp {
+    base iana-interface-type;
+    description
+      "Generic Framing Procedure (GFP).";
+  }
+  identity ciscoISLvlan {
+    base iana-interface-type;
+    description
+      "Layer 2 Virtual LAN using Cisco ISL.";
+  }
+  identity actelisMetaLOOP {
+    base iana-interface-type;
+    description
+      "Acteleis proprietary MetaLOOP High Speed Link.";
+  }
+  identity fcipLink {
+    base iana-interface-type;
+    description
+      "FCIP Link.";
+  }
+  identity rpr {
+    base iana-interface-type;
+    description
+      "Resilient Packet Ring Interface Type.";
+  }
+  identity qam {
+    base iana-interface-type;
+    description
+      "RF Qam Interface.";
+  }
+  identity lmp {
+    base iana-interface-type;
+    description
+      "Link Management Protocol.";
+    reference
+      "RFC 4327 - Link Management Protocol (LMP) Management
+                  Information Base (MIB)";
+  }
+  identity cblVectaStar {
+    base iana-interface-type;
+    description
+      "Cambridge Broadband Networks Limited VectaStar.";
+  }
+  identity docsCableMCmtsDownstream {
+    base iana-interface-type;
+    description
+      "CATV Modular CMTS Downstream Interface.";
+  }
+  identity adsl2 {
+    base iana-interface-type;
+    status deprecated;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2
+       (DEPRECATED/OBSOLETED - please use adsl2plus(238)
+       instead).";
+    reference
+      "RFC 4706 - Definitions of Managed Objects for Asymmetric
+                  Digital Subscriber Line 2 (ADSL2)";
+  }
+  identity macSecControlledIF {
+    base iana-interface-type;
+    description
+      "MACSecControlled.";
+  }
+  identity macSecUncontrolledIF {
+    base iana-interface-type;
+    description
+      "MACSecUncontrolled.";
+  }
+  identity aviciOpticalEther {
+    base iana-interface-type;
+    description
+      "Avici Optical Ethernet Aggregate.";
+  }
+  identity atmbond {
+    base iana-interface-type;
+    description
+      "atmbond.";
+  }
+  identity voiceFGDOS {
+    base iana-interface-type;
+    description
+      "Voice FGD Operator Services.";
+  }
+  identity mocaVersion1 {
+    base iana-interface-type;
+    description
+      "MultiMedia over Coax Alliance (MoCA) Interface
+       as documented in information provided privately to IANA.";
+  }
+  identity ieee80216WMAN {
+    base iana-interface-type;
+    description
+      "IEEE 802.16 WMAN interface.";
+  }
+  identity adsl2plus {
+    base iana-interface-type;
+    description
+      "Asymmetric Digital Subscriber Loop Version 2 -
+       Version 2 Plus and all variants.";
+  }
+  identity dvbRcsMacLayer {
+    base iana-interface-type;
+    description
+      "DVB-RCS MAC Layer.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbTdm {
+    base iana-interface-type;
+    description
+      "DVB Satellite TDM.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity dvbRcsTdma {
+    base iana-interface-type;
+    description
+      "DVB-RCS TDMA.";
+    reference
+      "RFC 5728 - The SatLabs Group DVB-RCS MIB";
+  }
+  identity x86Laps {
+    base iana-interface-type;
+    description
+      "LAPS based on ITU-T X.86/Y.1323.";
+  }
+  identity wwanPP {
+    base iana-interface-type;
+    description
+      "3GPP WWAN.";
+  }
+  identity wwanPP2 {
+    base iana-interface-type;
+    description
+      "3GPP2 WWAN.";
+  }
+  identity voiceEBS {
+    base iana-interface-type;
+    description
+      "Voice P-phone EBS physical interface.";
+  }
+  identity ifPwType {
+    base iana-interface-type;
+    description
+      "Pseudowire interface type.";
+    reference
+      "RFC 5601 - Pseudowire (PW) Management Information Base (MIB)";
+  }
+  identity ilan {
+    base iana-interface-type;
+    description
+      "Internal LAN on a bridge per IEEE 802.1ap.";
+  }
+  identity pip {
+    base iana-interface-type;
+    description
+      "Provider Instance Port on a bridge per IEEE 802.1ah PBB.";
+  }
+  identity aluELP {
+    base iana-interface-type;
+    description
+      "Alcatel-Lucent Ethernet Link Protection.";
+  }
+  identity gpon {
+    base iana-interface-type;
+    description
+      "Gigabit-capable passive optical networks (G-PON) as per
+       ITU-T G.948.";
+  }
+  identity vdsl2 {
+    base iana-interface-type;
+    description
+      "Very high speed digital subscriber line Version 2
+       (as per ITU-T Recommendation G.993.2).";
+    reference
+      "RFC 5650 - Definitions of Managed Objects for Very High
+                  Speed Digital Subscriber Line 2 (VDSL2)";
+  }
+  identity capwapDot11Profile {
+    base iana-interface-type;
+    description
+      "WLAN Profile Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapDot11Bss {
+    base iana-interface-type;
+    description
+      "WLAN BSS Interface.";
+    reference
+      "RFC 5834 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Binding MIB for
+                  IEEE 802.11";
+  }
+  identity capwapWtpVirtualRadio {
+    base iana-interface-type;
+    description
+      "WTP Virtual Radio Interface.";
+    reference
+      "RFC 5833 - Control and Provisioning of Wireless Access
+                  Points (CAPWAP) Protocol Base MIB";
+  }
+  identity bits {
+    base iana-interface-type;
+    description
+      "bitsport.";
+  }
+  identity docsCableUpstreamRfPort {
+    base iana-interface-type;
+    description
+      "DOCSIS CATV Upstream RF Port.";
+  }
+  identity cableDownstreamRfPort {
+    base iana-interface-type;
+    description
+      "CATV downstream RF Port.";
+  }
+  identity vmwareVirtualNic {
+    base iana-interface-type;
+    description
+      "VMware Virtual Network Interface.";
+  }
+  identity ieee802154 {
+    base iana-interface-type;
+    description
+      "IEEE 802.15.4 WPAN interface.";
+    reference
+      "IEEE 802.15.4-2006";
+  }
+  identity otnOdu {
+    base iana-interface-type;
+    description
+      "OTN Optical Data Unit.";
+  }
+  identity otnOtu {
+    base iana-interface-type;
+    description
+      "OTN Optical channel Transport Unit.";
+  }
+  identity ifVfiType {
+    base iana-interface-type;
+    description
+      "VPLS Forwarding Instance Interface Type.";
+  }
+  identity g9981 {
+    base iana-interface-type;
+    description
+      "G.998.1 bonded interface.";
+  }
+  identity g9982 {
+    base iana-interface-type;
+    description
+      "G.998.2 bonded interface.";
+  }
+  identity g9983 {
+    base iana-interface-type;
+    description
+      "G.998.3 bonded interface.";
+  }
+
+  identity aluEpon {
+    base iana-interface-type;
+    description
+      "Ethernet Passive Optical Networks (E-PON).";
+  }
+  identity aluEponOnu {
+    base iana-interface-type;
+    description
+      "EPON Optical Network Unit.";
+  }
+  identity aluEponPhysicalUni {
+    base iana-interface-type;
+    description
+      "EPON physical User to Network interface.";
+  }
+  identity aluEponLogicalLink {
+    base iana-interface-type;
+    description
+      "The emulation of a point-to-point link over the EPON
+       layer.";
+  }
+  identity aluGponOnu {
+    base iana-interface-type;
+    description
+      "GPON Optical Network Unit.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity aluGponPhysicalUni {
+    base iana-interface-type;
+    description
+      "GPON physical User to Network interface.";
+    reference
+      "ITU-T G.984.2";
+  }
+  identity vmwareNicTeam {
+    base iana-interface-type;
+    description
+      "VMware NIC Team.";
+  }
+  identity docsOfdmDownstream {
+    base iana-interface-type;
+    description
+      "CATV Downstream OFDM interface.";
+  }
+  identity docsOfdmaUpstream {
+    base iana-interface-type;
+    description
+      "CATV Upstream OFDMA interface.";
+  }
+  identity gfast {
+    base iana-interface-type;
+    description
+      "G.fast port.";
+    reference
+      "ITU-T G.9701";
+  }
+  identity sdci {
+    base iana-interface-type;
+    description
+      "SDCI (IO-Link).";
+    reference
+      "IEC 61131-9 Edition 1.0 2013-09";
+  }
+  identity xboxWireless {
+    base iana-interface-type;
+    description
+      "Xbox wireless.";
+  }
+  identity fastdsl {
+    base iana-interface-type;
+    description
+      "FastDSL.";
+    reference
+      "BBF TR-355";
+  }
+  identity docsCableScte55d1FwdOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Forward Channel.";
+  }
+  identity docsCableScte55d1RetOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-1 OOB Return Channel.";
+  }
+  identity docsCableScte55d2DsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Downstream Channel.";
+  }
+  identity docsCableScte55d2UsOob {
+    base iana-interface-type;
+    description
+      "Cable SCTE 55-2 OOB Upstream Channel.";
+  }
+  identity docsCableNdf {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Forward.";
+  }
+  identity docsCableNdr {
+    base iana-interface-type;
+    description
+      "Cable Narrowband Digital Return.";
+  }
+  identity ptm {
+    base iana-interface-type;
+    description
+      "Packet Transfer Mode.";
+  }
+  identity ghn {
+    base iana-interface-type;
+    description
+      "G.hn port.";
+  }
+}
diff --git a/models/openconfig/src/main/yang/comm/ietf-inet-types.yang b/models/openconfig/src/main/yang/comm/ietf-inet-types.yang
new file mode 100644
index 0000000..2b7ed38
--- /dev/null
+++ b/models/openconfig/src/main/yang/comm/ietf-inet-types.yang
@@ -0,0 +1,454 @@
+  module ietf-inet-types {
+
+    yang-version 1;
+
+    namespace
+      "urn:ietf:params:xml:ns:yang:ietf-inet-types";
+
+    prefix inet;
+
+    organization
+      "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+    contact
+      "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+    description
+      "This module contains a collection of generally useful derived
+    YANG data types for Internet addresses and related things.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+    revision "2013-07-15" {
+      description
+        "This revision adds the following new data types:
+      - ip-address-no-zone
+      - ipv4-address-no-zone
+      - ipv6-address-no-zone";
+      reference
+        "RFC 6991: Common YANG Data Types";
+
+    }
+
+    revision "2010-09-24" {
+      description "Initial revision.";
+      reference
+        "RFC 6021: Common YANG Data Types";
+
+    }
+
+
+    typedef ip-version {
+      type enumeration {
+        enum "unknown" {
+          value 0;
+          description
+            "An unknown or unspecified version of the Internet
+          protocol.";
+        }
+        enum "ipv4" {
+          value 1;
+          description
+            "The IPv4 protocol as defined in RFC 791.";
+        }
+        enum "ipv6" {
+          value 2;
+          description
+            "The IPv6 protocol as defined in RFC 2460.";
+        }
+      }
+      description
+        "This value represents the version of the IP protocol.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetVersion textual convention of the SMIv2.";
+      reference
+        "RFC  791: Internet Protocol
+         RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+         RFC 4001: Textual Conventions for Internet Network Addresses";
+
+    }
+
+    typedef dscp {
+      type uint8 {
+        range "0..63";
+      }
+      description
+        "The dscp type represents a Differentiated Services Code Point
+      that may be used for marking packets in a traffic stream.
+      In the value set and its semantics, this type is equivalent
+      to the Dscp textual convention of the SMIv2.";
+      reference
+        "RFC 3289: Management Information Base for the Differentiated
+        	  Services Architecture
+         RFC 2474: Definition of the Differentiated Services Field
+        	  (DS Field) in the IPv4 and IPv6 Headers
+         RFC 2780: IANA Allocation Guidelines For Values In
+        	  the Internet Protocol and Related Headers";
+
+    }
+
+    typedef ipv6-flow-label {
+      type uint32 {
+        range "0..1048575";
+      }
+      description
+        "The ipv6-flow-label type represents the flow identifier or Flow
+      Label in an IPv6 packet header that may be used to
+      discriminate traffic flows.
+
+      In the value set and its semantics, this type is equivalent
+      to the IPv6FlowLabel textual convention of the SMIv2.";
+      reference
+        "RFC 3595: Textual Conventions for IPv6 Flow Label
+         RFC 2460: Internet Protocol, Version 6 (IPv6) Specification";
+
+    }
+
+    typedef port-number {
+      type uint16 {
+        range "0..65535";
+      }
+      description
+        "The port-number type represents a 16-bit port number of an
+      Internet transport-layer protocol such as UDP, TCP, DCCP, or
+      SCTP.  Port numbers are assigned by IANA.  A current list of
+      all assignments is available from <http://www.iana.org/>.
+
+      Note that the port number value zero is reserved by IANA.  In
+      situations where the value zero does not make sense, it can
+      be excluded by subtyping the port-number type.
+      In the value set and its semantics, this type is equivalent
+      to the InetPortNumber textual convention of the SMIv2.";
+      reference
+        "RFC  768: User Datagram Protocol
+         RFC  793: Transmission Control Protocol
+         RFC 4960: Stream Control Transmission Protocol
+         RFC 4340: Datagram Congestion Control Protocol (DCCP)
+         RFC 4001: Textual Conventions for Internet Network Addresses";
+
+    }
+
+    typedef as-number {
+      type uint32;
+      description
+        "The as-number type represents autonomous system numbers
+      which identify an Autonomous System (AS).  An AS is a set
+      of routers under a single technical administration, using
+      an interior gateway protocol and common metrics to route
+      packets within the AS, and using an exterior gateway
+      protocol to route packets to other ASes.  IANA maintains
+      the AS number space and has delegated large parts to the
+      regional registries.
+
+      Autonomous system numbers were originally limited to 16
+      bits.  BGP extensions have enlarged the autonomous system
+      number space to 32 bits.  This type therefore uses an uint32
+      base type without a range restriction in order to support
+      a larger autonomous system number space.
+
+      In the value set and its semantics, this type is equivalent
+      to the InetAutonomousSystemNumber textual convention of
+      the SMIv2.";
+      reference
+        "RFC 1930: Guidelines for creation, selection, and registration
+        	  of an Autonomous System (AS)
+         RFC 4271: A Border Gateway Protocol 4 (BGP-4)
+         RFC 4001: Textual Conventions for Internet Network Addresses
+         RFC 6793: BGP Support for Four-Octet Autonomous System (AS)
+        	  Number Space";
+
+    }
+
+    typedef ip-address {
+      type union {
+        type ipv4-address;
+        type ipv6-address;
+      }
+      description
+        "The ip-address type represents an IP address and is IP
+      version neutral.  The format of the textual representation
+      implies the IP version.  This type supports scoped addresses
+      by allowing zone identifiers in the address format.";
+      reference
+        "RFC 4007: IPv6 Scoped Address Architecture";
+
+    }
+
+    typedef ipv4-address {
+      type string {
+        pattern
+          '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?';
+      }
+      description
+        "The ipv4-address type represents an IPv4 address in
+       dotted-quad notation.  The IPv4 address may include a zone
+       index, separated by a % sign.
+
+       The zone index is used to disambiguate identical address
+       values.  For link-local addresses, the zone index will
+       typically be the interface index number or the name of an
+       interface.  If the zone index is not present, the default
+       zone of the device will be used.
+
+       The canonical format for the zone index is the numerical
+       format";
+    }
+
+    typedef ipv6-address {
+      type string {
+        pattern
+          '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\p{N}\p{L}]+)?';
+        pattern
+          '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?';
+      }
+      description
+        "The ipv6-address type represents an IPv6 address in full,
+      mixed, shortened, and shortened-mixed notation.  The IPv6
+      address may include a zone index, separated by a % sign.
+
+      The zone index is used to disambiguate identical address
+      values.  For link-local addresses, the zone index will
+      typically be the interface index number or the name of an
+      interface.  If the zone index is not present, the default
+      zone of the device will be used.
+
+
+
+      The canonical format of IPv6 addresses uses the textual
+      representation defined in Section 4 of RFC 5952.  The
+      canonical format for the zone index is the numerical
+      format as described in Section 11.2 of RFC 4007.";
+      reference
+        "RFC 4291: IP Version 6 Addressing Architecture
+         RFC 4007: IPv6 Scoped Address Architecture
+         RFC 5952: A Recommendation for IPv6 Address Text
+        	  Representation";
+
+    }
+
+    typedef ip-address-no-zone {
+      type union {
+        type ipv4-address-no-zone;
+        type ipv6-address-no-zone;
+      }
+      description
+        "The ip-address-no-zone type represents an IP address and is
+      IP version neutral.  The format of the textual representation
+      implies the IP version.  This type does not support scoped
+      addresses since it does not allow zone identifiers in the
+      address format.";
+      reference
+        "RFC 4007: IPv6 Scoped Address Architecture";
+
+    }
+
+    typedef ipv4-address-no-zone {
+      type ipv4-address {
+        pattern '[0-9\.]*';
+      }
+      description
+        "An IPv4 address without a zone index.  This type, derived from
+       ipv4-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+    }
+
+    typedef ipv6-address-no-zone {
+      type ipv6-address {
+        pattern '[0-9a-fA-F:\.]*';
+      }
+      description
+        "An IPv6 address without a zone index.  This type, derived from
+       ipv6-address, may be used in situations where the zone is
+       known from the context and hence no zone index is needed.";
+      reference
+        "RFC 4291: IP Version 6 Addressing Architecture
+         RFC 4007: IPv6 Scoped Address Architecture
+         RFC 5952: A Recommendation for IPv6 Address Text
+        	  Representation";
+
+    }
+
+    typedef ip-prefix {
+      type union {
+        type ipv4-prefix;
+        type ipv6-prefix;
+      }
+      description
+        "The ip-prefix type represents an IP prefix and is IP
+      version neutral.  The format of the textual representations
+      implies the IP version.";
+    }
+
+    typedef ipv4-prefix {
+      type string {
+        pattern
+          '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))';
+      }
+      description
+        "The ipv4-prefix type represents an IPv4 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 32.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The canonical format of an IPv4 prefix has all bits of
+      the IPv4 address set to zero that are not part of the
+      IPv4 prefix.";
+    }
+
+    typedef ipv6-prefix {
+      type string {
+        pattern
+          '((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))';
+        pattern
+          '(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(/.+)';
+      }
+      description
+        "The ipv6-prefix type represents an IPv6 address prefix.
+      The prefix length is given by the number following the
+      slash character and must be less than or equal to 128.
+
+      A prefix length value of n corresponds to an IP address
+      mask that has n contiguous 1-bits from the most
+      significant bit (MSB) and all other bits set to 0.
+
+      The IPv6 address should have all bits that do not belong
+      to the prefix set to zero.
+
+      The canonical format of an IPv6 prefix has all bits of
+      the IPv6 address set to zero that are not part of the
+      IPv6 prefix.  Furthermore, the IPv6 address is represented
+      as defined in Section 4 of RFC 5952.";
+      reference
+        "RFC 5952: A Recommendation for IPv6 Address Text
+        	  Representation";
+
+    }
+
+    typedef domain-name {
+      type string {
+        length "1..253";
+        pattern
+          '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)|\.';
+      }
+      description
+        "The domain-name type represents a DNS domain name.  The
+      name SHOULD be fully qualified whenever possible.
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  It is designed to hold various types of
+      domain names, including names used for A or AAAA records
+      (host names) and other records, such as SRV records.  Note
+      that Internet host names have a stricter syntax (described
+      in RFC 952) than the DNS recommendations in RFCs 1034 and
+      1123, and that systems that want to store host names in
+      schema nodes using the domain-name type are recommended to
+      adhere to this stricter standard to ensure interoperability.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      The description clause of schema nodes using the domain-name
+      type MUST describe when and how these names are resolved to
+      IP addresses.  Note that the resolution of a domain-name value
+      may require to query multiple DNS records (e.g., A for IPv4
+      and AAAA for IPv6).  The order of the resolution process and
+      which DNS record takes precedence can either be defined
+      explicitly or may depend on the configuration of the
+      resolver.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be A-labels as per RFC 5890.";
+      reference
+        "RFC  952: DoD Internet Host Table Specification
+         RFC 1034: Domain Names - Concepts and Facilities
+         RFC 1123: Requirements for Internet Hosts -- Application
+        	  and Support
+         RFC 2782: A DNS RR for specifying the location of services
+        	  (DNS SRV)
+         RFC 5890: Internationalized Domain Names in Applications
+        	  (IDNA): Definitions and Document Framework";
+
+    }
+
+    typedef host {
+      type union {
+        type ip-address;
+        type domain-name;
+      }
+      description
+        "The host type represents either an IP address or a DNS
+      domain name.";
+    }
+
+    typedef uri {
+      type string;
+      description
+        "The uri type represents a Uniform Resource Identifier
+      (URI) as defined by STD 66.
+
+      Objects using the uri type MUST be in US-ASCII encoding,
+      and MUST be normalized as described by RFC 3986 Sections
+      6.2.1, 6.2.2.1, and 6.2.2.2.  All unnecessary
+      percent-encoding is removed, and all case-insensitive
+      characters are set to lowercase except for hexadecimal
+      digits, which are normalized to uppercase as described in
+      Section 6.2.2.1.
+
+      The purpose of this normalization is to help provide
+      unique URIs.  Note that this normalization is not
+      sufficient to provide uniqueness.  Two URIs that are
+      textually distinct after this normalization may still be
+      equivalent.
+
+      Objects using the uri type may restrict the schemes that
+      they permit.  For example, 'data:' and 'urn:' schemes
+      might not be appropriate.
+
+      A zero-length URI is not a valid URI.  This can be used to
+      express 'URI absent' where required.
+
+      In the value set and its semantics, this type is equivalent
+      to the Uri SMIv2 textual convention defined in RFC 5017.";
+      reference
+        "RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
+         RFC 3305: Report from the Joint W3C/IETF URI Planning Interest
+        	  Group: Uniform Resource Identifiers (URIs), URLs,
+        	  and Uniform Resource Names (URNs): Clarifications
+        	  and Recommendations
+         RFC 5017: MIB Textual Conventions for Uniform Resource
+        	  Identifiers (URIs)";
+
+    }
+  }  // module ietf-inet-types
diff --git a/models/openconfig/src/main/yang/comm/ietf-interfaces.yang b/models/openconfig/src/main/yang/comm/ietf-interfaces.yang
new file mode 100644
index 0000000..d02aca2
--- /dev/null
+++ b/models/openconfig/src/main/yang/comm/ietf-interfaces.yang
@@ -0,0 +1,703 @@
+module ietf-interfaces {
+
+     namespace "urn:ietf:params:xml:ns:yang:ietf-interfaces";
+     prefix if;
+
+     import ietf-yang-types {
+       prefix yang;
+     }
+
+     organization
+       "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+     contact
+       "WG Web:   <http://tools.ietf.org/wg/netmod/>
+        WG List:  <mailto:netmod@ietf.org>
+
+        WG Chair: Thomas Nadeau
+                  <mailto:tnadeau@lucidvision.com>
+
+        WG Chair: Juergen Schoenwaelder
+                  <mailto:j.schoenwaelder@jacobs-university.de>
+
+        Editor:   Martin Bjorklund
+                  <mailto:mbj@tail-f.com>";
+
+     description
+       "This module contains a collection of YANG definitions for
+        managing network interfaces.
+
+        Copyright (c) 2014 IETF Trust and the persons identified as
+        authors of the code.  All rights reserved.
+
+        Redistribution and use in source and binary forms, with or
+        without modification, is permitted pursuant to, and subject
+        to the license terms contained in, the Simplified BSD License
+        set forth in Section 4.c of the IETF Trust's Legal Provisions
+        Relating to IETF Documents
+        (http://trustee.ietf.org/license-info).
+
+        This version of this YANG module is part of RFC 7223; see
+        the RFC itself for full legal notices.";
+
+     revision 2014-05-08 {
+       description
+         "Initial revision.";
+       reference
+         "RFC 7223: A YANG Data Model for Interface Management";
+     }
+
+     /*
+      * Typedefs
+      */
+
+     typedef interface-ref {
+       type leafref {
+         path "/if:interfaces/if:interface/if:name";
+       }
+       description
+         "This type is used by data models that need to reference
+          configured interfaces.";
+     }
+
+     typedef interface-state-ref {
+       type leafref {
+         path "/if:interfaces-state/if:interface/if:name";
+       }
+       description
+         "This type is used by data models that need to reference
+          the operationally present interfaces.";
+     }
+
+     /*
+      * Identities
+      */
+
+     identity interface-type {
+       description
+         "Base identity from which specific interface types are
+          derived.";
+     }
+
+     /*
+      * Features
+      */
+
+     feature arbitrary-names {
+       description
+         "This feature indicates that the device allows user-controlled
+          interfaces to be named arbitrarily.";
+     }
+
+
+     feature pre-provisioning {
+       description
+         "This feature indicates that the device supports
+          pre-provisioning of interface configuration, i.e., it is
+          possible to configure an interface whose physical interface
+          hardware is not present on the device.";
+     }
+
+     feature if-mib {
+       description
+         "This feature indicates that the device implements
+          the IF-MIB.";
+       reference
+         "RFC 2863: The Interfaces Group MIB";
+     }
+
+     /*
+      * Configuration data nodes
+      */
+
+     container interfaces {
+       description
+         "Interface configuration parameters.";
+
+       list interface {
+         key "name";
+
+         description
+           "The list of configured interfaces on the device.
+
+            The operational state of an interface is available in the
+            /interfaces-state/interface list.  If the configuration of a
+            system-controlled interface cannot be used by the system
+            (e.g., the interface hardware present does not match the
+            interface type), then the configuration is not applied to
+            the system-controlled interface shown in the
+            /interfaces-state/interface list.  If the configuration
+            of a user-controlled interface cannot be used by the system,
+            the configured interface is not instantiated in the
+            /interfaces-state/interface list.";
+
+        leaf name {
+           type string;
+           description
+             "The name of the interface.
+
+              A device MAY restrict the allowed values for this leaf,
+              possibly depending on the type of the interface.
+
+
+              For system-controlled interfaces, this leaf is the
+              device-specific name of the interface.  The 'config false'
+              list /interfaces-state/interface contains the currently
+              existing interfaces on the device.
+
+              If a client tries to create configuration for a
+              system-controlled interface that is not present in the
+              /interfaces-state/interface list, the server MAY reject
+              the request if the implementation does not support
+              pre-provisioning of interfaces or if the name refers to
+              an interface that can never exist in the system.  A
+              NETCONF server MUST reply with an rpc-error with the
+              error-tag 'invalid-value' in this case.
+
+              If the device supports pre-provisioning of interface
+              configuration, the 'pre-provisioning' feature is
+              advertised.
+
+              If the device allows arbitrarily named user-controlled
+              interfaces, the 'arbitrary-names' feature is advertised.
+
+              When a configured user-controlled interface is created by
+              the system, it is instantiated with the same name in the
+              /interface-state/interface list.";
+         }
+
+         leaf description {
+           type string;
+           description
+             "A textual description of the interface.
+
+              A server implementation MAY map this leaf to the ifAlias
+              MIB object.  Such an implementation needs to use some
+              mechanism to handle the differences in size and characters
+              allowed between this leaf and ifAlias.  The definition of
+              such a mechanism is outside the scope of this document.
+
+              Since ifAlias is defined to be stored in non-volatile
+              storage, the MIB implementation MUST map ifAlias to the
+              value of 'description' in the persistently stored
+              datastore.
+
+              Specifically, if the device supports ':startup', when
+              ifAlias is read the device MUST return the value of
+              'description' in the 'startup' datastore, and when it is
+              written, it MUST be written to the 'running' and 'startup'
+              datastores.  Note that it is up to the implementation to
+
+              decide whether to modify this single leaf in 'startup' or
+              perform an implicit copy-config from 'running' to
+              'startup'.
+
+              If the device does not support ':startup', ifAlias MUST
+              be mapped to the 'description' leaf in the 'running'
+              datastore.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifAlias";
+         }
+
+         leaf type {
+           type identityref {
+             base interface-type;
+           }
+           mandatory true;
+           description
+             "The type of the interface.
+
+              When an interface entry is created, a server MAY
+              initialize the type leaf with a valid value, e.g., if it
+              is possible to derive the type from the name of the
+              interface.
+
+              If a client tries to set the type of an interface to a
+              value that can never be used by the system, e.g., if the
+              type is not supported or if the type does not match the
+              name of the interface, the server MUST reject the request.
+              A NETCONF server MUST reply with an rpc-error with the
+              error-tag 'invalid-value' in this case.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifType";
+         }
+
+         leaf enabled {
+           type boolean;
+           default "true";
+           description
+             "This leaf contains the configured, desired state of the
+              interface.
+
+              Systems that implement the IF-MIB use the value of this
+              leaf in the 'running' datastore to set
+              IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+              has been initialized, as described in RFC 2863.
+
+              Changes in this leaf in the 'running' datastore are
+              reflected in ifAdminStatus, but if ifAdminStatus is
+              changed over SNMP, this leaf is not affected.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+         }
+
+         leaf link-up-down-trap-enable {
+           if-feature if-mib;
+           type enumeration {
+             enum enabled {
+               value 1;
+             }
+             enum disabled {
+               value 2;
+             }
+           }
+           description
+             "Controls whether linkUp/linkDown SNMP notifications
+              should be generated for this interface.
+
+              If this node is not configured, the value 'enabled' is
+              operationally used by the server for interfaces that do
+              not operate on top of any other interface (i.e., there are
+              no 'lower-layer-if' entries), and 'disabled' otherwise.";
+           reference
+             "RFC 2863: The Interfaces Group MIB -
+                        ifLinkUpDownTrapEnable";
+         }
+       }
+     }
+
+     /*
+      * Operational state data nodes
+      */
+
+     container interfaces-state {
+       config false;
+       description
+         "Data nodes for the operational state of interfaces.";
+
+       list interface {
+         key "name";
+
+         description
+           "The list of interfaces on the device.
+
+            System-controlled interfaces created by the system are
+            always present in this list, whether they are configured or
+            not.";
+
+         leaf name {
+           type string;
+           description
+             "The name of the interface.
+
+              A server implementation MAY map this leaf to the ifName
+              MIB object.  Such an implementation needs to use some
+              mechanism to handle the differences in size and characters
+              allowed between this leaf and ifName.  The definition of
+              such a mechanism is outside the scope of this document.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifName";
+         }
+
+         leaf type {
+           type identityref {
+             base interface-type;
+           }
+           mandatory true;
+           description
+             "The type of the interface.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifType";
+         }
+
+         leaf admin-status {
+           if-feature if-mib;
+           type enumeration {
+             enum up {
+               value 1;
+               description
+                 "Ready to pass packets.";
+             }
+             enum down {
+               value 2;
+               description
+                 "Not ready to pass packets and not in some test mode.";
+             }
+
+             enum testing {
+               value 3;
+               description
+                 "In some test mode.";
+             }
+           }
+           mandatory true;
+           description
+             "The desired state of the interface.
+
+              This leaf has the same read semantics as ifAdminStatus.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+         }
+
+         leaf oper-status {
+           type enumeration {
+             enum up {
+               value 1;
+               description
+                 "Ready to pass packets.";
+             }
+             enum down {
+               value 2;
+               description
+                 "The interface does not pass any packets.";
+             }
+             enum testing {
+               value 3;
+               description
+                 "In some test mode.  No operational packets can
+                  be passed.";
+             }
+             enum unknown {
+               value 4;
+               description
+                 "Status cannot be determined for some reason.";
+             }
+             enum dormant {
+               value 5;
+               description
+                 "Waiting for some external event.";
+             }
+             enum not-present {
+               value 6;
+               description
+                 "Some component (typically hardware) is missing.";
+             }
+
+             enum lower-layer-down {
+               value 7;
+               description
+                 "Down due to state of lower-layer interface(s).";
+             }
+           }
+           mandatory true;
+           description
+             "The current operational state of the interface.
+
+              This leaf has the same semantics as ifOperStatus.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+         }
+
+         leaf last-change {
+           type yang:date-and-time;
+           description
+             "The time the interface entered its current operational
+              state.  If the current state was entered prior to the
+              last re-initialization of the local network management
+              subsystem, then this node is not present.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifLastChange";
+         }
+
+         leaf if-index {
+           if-feature if-mib;
+           type int32 {
+             range "1..2147483647";
+           }
+           mandatory true;
+           description
+             "The ifIndex value for the ifEntry represented by this
+              interface.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifIndex";
+         }
+
+         leaf phys-address {
+           type yang:phys-address;
+           description
+             "The interface's address at its protocol sub-layer.  For
+              example, for an 802.x interface, this object normally
+              contains a Media Access Control (MAC) address.  The
+              interface's media-specific modules must define the bit
+
+
+              and byte ordering and the format of the value of this
+              object.  For interfaces that do not have such an address
+              (e.g., a serial line), this node is not present.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifPhysAddress";
+         }
+
+         leaf-list higher-layer-if {
+           type interface-state-ref;
+           description
+             "A list of references to interfaces layered on top of this
+              interface.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifStackTable";
+         }
+
+         leaf-list lower-layer-if {
+           type interface-state-ref;
+           description
+             "A list of references to interfaces layered underneath this
+              interface.";
+           reference
+             "RFC 2863: The Interfaces Group MIB - ifStackTable";
+         }
+
+         leaf speed {
+           type yang:gauge64;
+           units "bits/second";
+           description
+               "An estimate of the interface's current bandwidth in bits
+                per second.  For interfaces that do not vary in
+                bandwidth or for those where no accurate estimation can
+                be made, this node should contain the nominal bandwidth.
+                For interfaces that have no concept of bandwidth, this
+                node is not present.";
+           reference
+             "RFC 2863: The Interfaces Group MIB -
+                        ifSpeed, ifHighSpeed";
+         }
+
+
+         container statistics {
+           description
+             "A collection of interface-related statistics objects.";
+
+           leaf discontinuity-time {
+             type yang:date-and-time;
+             mandatory true;
+             description
+               "The time on the most recent occasion at which any one or
+                more of this interface's counters suffered a
+                discontinuity.  If no such discontinuities have occurred
+                since the last re-initialization of the local management
+                subsystem, then this node contains the time the local
+                management subsystem re-initialized itself.";
+           }
+
+           leaf in-octets {
+             type yang:counter64;
+             description
+               "The total number of octets received on the interface,
+                including framing characters.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+           }
+
+           leaf in-unicast-pkts {
+             type yang:counter64;
+             description
+               "The number of packets, delivered by this sub-layer to a
+                higher (sub-)layer, that were not addressed to a
+                multicast or broadcast address at this sub-layer.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+           }
+
+           leaf in-broadcast-pkts {
+             type yang:counter64;
+             description
+               "The number of packets, delivered by this sub-layer to a
+                higher (sub-)layer, that were addressed to a broadcast
+                address at this sub-layer.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB -
+                          ifHCInBroadcastPkts";
+           }
+
+           leaf in-multicast-pkts {
+             type yang:counter64;
+             description
+               "The number of packets, delivered by this sub-layer to a
+                higher (sub-)layer, that were addressed to a multicast
+                address at this sub-layer.  For a MAC-layer protocol,
+                this includes both Group and Functional addresses.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB -
+                          ifHCInMulticastPkts";
+           }
+
+           leaf in-discards {
+             type yang:counter32;
+             description
+               "The number of inbound packets that were chosen to be
+                discarded even though no errors had been detected to
+                prevent their being deliverable to a higher-layer
+                protocol.  One possible reason for discarding such a
+                packet could be to free up buffer space.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+           }
+
+           leaf in-errors {
+             type yang:counter32;
+             description
+               "For packet-oriented interfaces, the number of inbound
+                packets that contained errors preventing them from being
+                deliverable to a higher-layer protocol.  For character-
+                oriented or fixed-length interfaces, the number of
+                inbound transmission units that contained errors
+                preventing them from being deliverable to a higher-layer
+                protocol.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifInErrors";
+           }
+
+           leaf in-unknown-protos {
+             type yang:counter32;
+             description
+               "For packet-oriented interfaces, the number of packets
+                received via the interface that were discarded because
+                of an unknown or unsupported protocol.  For
+                character-oriented or fixed-length interfaces that
+                support protocol multiplexing, the number of
+                transmission units received via the interface that were
+                discarded because of an unknown or unsupported protocol.
+                For any interface that does not support protocol
+                multiplexing, this counter is not present.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+           }
+
+           leaf out-octets {
+             type yang:counter64;
+             description
+               "The total number of octets transmitted out of the
+                interface, including framing characters.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+           }
+
+           leaf out-unicast-pkts {
+             type yang:counter64;
+             description
+               "The total number of packets that higher-level protocols
+                requested be transmitted, and that were not addressed
+                to a multicast or broadcast address at this sub-layer,
+                including those that were discarded or not sent.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+           }
+
+           leaf out-broadcast-pkts {
+             type yang:counter64;
+             description
+               "The total number of packets that higher-level protocols
+                requested be transmitted, and that were addressed to a
+                broadcast address at this sub-layer, including those
+                that were discarded or not sent.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB -
+                          ifHCOutBroadcastPkts";
+           }
+
+           leaf out-multicast-pkts {
+             type yang:counter64;
+             description
+               "The total number of packets that higher-level protocols
+                requested be transmitted, and that were addressed to a
+                multicast address at this sub-layer, including those
+                that were discarded or not sent.  For a MAC-layer
+                protocol, this includes both Group and Functional
+                addresses.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB -
+                          ifHCOutMulticastPkts";
+           }
+
+           leaf out-discards {
+             type yang:counter32;
+             description
+               "The number of outbound packets that were chosen to be
+                discarded even though no errors had been detected to
+                prevent their being transmitted.  One possible reason
+                for discarding such a packet could be to free up buffer
+                space.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+           }
+
+           leaf out-errors {
+             type yang:counter32;
+             description
+               "For packet-oriented interfaces, the number of outbound
+                packets that could not be transmitted because of errors.
+                For character-oriented or fixed-length interfaces, the
+                number of outbound transmission units that could not be
+                transmitted because of errors.
+
+                Discontinuities in the value of this counter can occur
+                at re-initialization of the management system, and at
+                other times as indicated by the value of
+                'discontinuity-time'.";
+             reference
+               "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+           }
+         }
+       }
+     }
+   }
diff --git a/models/openconfig/src/main/yang/comm/ietf-yang-types.yang b/models/openconfig/src/main/yang/comm/ietf-yang-types.yang
new file mode 100644
index 0000000..9a543fa
--- /dev/null
+++ b/models/openconfig/src/main/yang/comm/ietf-yang-types.yang
@@ -0,0 +1,490 @@
+  module ietf-yang-types {
+
+    yang-version 1;
+
+    namespace
+      "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+
+    prefix yang;
+
+    organization
+      "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+    contact
+      "WG Web:   <http://tools.ietf.org/wg/netmod/>
+    WG List:  <mailto:netmod@ietf.org>
+
+    WG Chair: David Kessens
+              <mailto:david.kessens@nsn.com>
+
+    WG Chair: Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>
+
+    Editor:   Juergen Schoenwaelder
+              <mailto:j.schoenwaelder@jacobs-university.de>";
+
+    description
+      "This module contains a collection of generally useful derived
+    YANG data types.
+
+    Copyright (c) 2013 IETF Trust and the persons identified as
+    authors of the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or
+    without modification, is permitted pursuant to, and subject
+    to the license terms contained in, the Simplified BSD License
+    set forth in Section 4.c of the IETF Trust's Legal Provisions
+    Relating to IETF Documents
+    (http://trustee.ietf.org/license-info).
+
+    This version of this YANG module is part of RFC 6991; see
+    the RFC itself for full legal notices.";
+
+    revision "2013-07-15" {
+      description
+        "This revision adds the following new data types:
+      - yang-identifier
+      - hex-string
+      - uuid
+      - dotted-quad";
+      reference
+        "RFC 6991: Common YANG Data Types";
+
+    }
+
+    revision "2010-09-24" {
+      description "Initial revision.";
+      reference
+        "RFC 6021: Common YANG Data Types";
+
+    }
+
+
+    typedef counter32 {
+      type uint32;
+      description
+        "The counter32 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter32 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter32 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter32.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter32 type of the SMIv2.";
+      reference
+        "RFC 2578: Structure of Management Information Version 2
+        	  (SMIv2)";
+
+    }
+
+    typedef zero-based-counter32 {
+      type counter32;
+      default "0";
+      description
+        "The zero-based-counter32 type represents a counter32
+      that has the defined 'initial' value zero.
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^32-1 (4294967295 decimal), when it
+      wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter32 textual convention of the SMIv2.";
+      reference
+        "RFC 4502: Remote Network Monitoring Management Information
+        	  Base Version 2";
+
+    }
+
+    typedef counter64 {
+      type uint64;
+      description
+        "The counter64 type represents a non-negative integer
+      that monotonically increases until it reaches a
+      maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Counters have no defined 'initial' value, and thus, a
+      single value of a counter has (in general) no information
+      content.  Discontinuities in the monotonically increasing
+      value normally occur at re-initialization of the
+      management system, and at other times as specified in the
+      description of a schema node using this type.  If such
+      other times can occur, for example, the creation of
+      a schema node of type counter64 at times other than
+      re-initialization, then a corresponding schema node
+      should be defined, with an appropriate type, to indicate
+      the last discontinuity.
+
+      The counter64 type should not be used for configuration
+      schema nodes.  A default statement SHOULD NOT be used in
+      combination with the type counter64.
+
+      In the value set and its semantics, this type is equivalent
+      to the Counter64 type of the SMIv2.";
+      reference
+        "RFC 2578: Structure of Management Information Version 2
+        	  (SMIv2)";
+
+    }
+
+    typedef zero-based-counter64 {
+      type counter64;
+      default "0";
+      description
+        "The zero-based-counter64 type represents a counter64 that
+      has the defined 'initial' value zero.
+
+
+
+
+      A schema node of this type will be set to zero (0) on creation
+      and will thereafter increase monotonically until it reaches
+      a maximum value of 2^64-1 (18446744073709551615 decimal),
+      when it wraps around and starts increasing again from zero.
+
+      Provided that an application discovers a new schema node
+      of this type within the minimum time to wrap, it can use the
+      'initial' value as a delta.  It is important for a management
+      station to be aware of this minimum time and the actual time
+      between polls, and to discard data if the actual time is too
+      long or there is no defined minimum time.
+
+      In the value set and its semantics, this type is equivalent
+      to the ZeroBasedCounter64 textual convention of the SMIv2.";
+      reference
+        "RFC 2856: Textual Conventions for Additional High Capacity
+        	  Data Types";
+
+    }
+
+    typedef gauge32 {
+      type uint32;
+      description
+        "The gauge32 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^32-1 (4294967295 decimal), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge32 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge32 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the Gauge32 type of the SMIv2.";
+      reference
+        "RFC 2578: Structure of Management Information Version 2
+        	  (SMIv2)";
+
+    }
+
+    typedef gauge64 {
+      type uint64;
+      description
+        "The gauge64 type represents a non-negative integer, which
+      may increase or decrease, but shall never exceed a maximum
+      value, nor fall below a minimum value.  The maximum value
+      cannot be greater than 2^64-1 (18446744073709551615), and
+      the minimum value cannot be smaller than 0.  The value of
+      a gauge64 has its maximum value whenever the information
+      being modeled is greater than or equal to its maximum
+      value, and has its minimum value whenever the information
+      being modeled is smaller than or equal to its minimum value.
+      If the information being modeled subsequently decreases
+      below (increases above) the maximum (minimum) value, the
+      gauge64 also decreases (increases).
+
+      In the value set and its semantics, this type is equivalent
+      to the CounterBasedGauge64 SMIv2 textual convention defined
+      in RFC 2856";
+      reference
+        "RFC 2856: Textual Conventions for Additional High Capacity
+        	  Data Types";
+
+    }
+
+    typedef object-identifier {
+      type string {
+        pattern
+          '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))(\.(0|([1-9]\d*)))*';
+      }
+      description
+        "The object-identifier type represents administratively
+      assigned names in a registration-hierarchical-name tree.
+
+      Values of this type are denoted as a sequence of numerical
+      non-negative sub-identifier values.  Each sub-identifier
+      value MUST NOT exceed 2^32-1 (4294967295).  Sub-identifiers
+      are separated by single dots and without any intermediate
+      whitespace.
+
+      The ASN.1 standard restricts the value space of the first
+      sub-identifier to 0, 1, or 2.  Furthermore, the value space
+      of the second sub-identifier is restricted to the range
+      0 to 39 if the first sub-identifier is 0 or 1.  Finally,
+      the ASN.1 standard requires that an object identifier
+      has always at least two sub-identifiers.  The pattern
+      captures these restrictions.
+
+      Although the number of sub-identifiers is not limited,
+      module designers should realize that there may be
+      implementations that stick with the SMIv2 limit of 128
+      sub-identifiers.
+
+      This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+      since it is not restricted to 128 sub-identifiers.  Hence,
+      this type SHOULD NOT be used to represent the SMIv2 OBJECT
+      IDENTIFIER type; the object-identifier-128 type SHOULD be
+      used instead.";
+      reference
+        "ISO9834-1: Information technology -- Open Systems
+        Interconnection -- Procedures for the operation of OSI
+        Registration Authorities: General procedures and top
+        arcs of the ASN.1 Object Identifier tree";
+
+    }
+
+    typedef object-identifier-128 {
+      type object-identifier {
+        pattern '\d*(\.\d*){1,127}';
+      }
+      description
+        "This type represents object-identifiers restricted to 128
+      sub-identifiers.
+
+      In the value set and its semantics, this type is equivalent
+      to the OBJECT IDENTIFIER type of the SMIv2.";
+      reference
+        "RFC 2578: Structure of Management Information Version 2
+        	  (SMIv2)";
+
+    }
+
+    typedef yang-identifier {
+      type string {
+        length "1..max";
+        pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+        pattern
+          '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+      }
+      description
+        "A YANG identifier string as defined by the 'identifier'
+       rule in Section 12 of RFC 6020.  An identifier must
+       start with an alphabetic character or an underscore
+       followed by an arbitrary sequence of alphabetic or
+       numeric characters, underscores, hyphens, or dots.
+
+       A YANG identifier MUST NOT start with any possible
+       combination of the lowercase or uppercase character
+       sequence 'xml'.";
+      reference
+        "RFC 6020: YANG - A Data Modeling Language for the Network
+        	  Configuration Protocol (NETCONF)";
+
+    }
+
+    typedef date-and-time {
+      type string {
+        pattern
+          '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2})';
+      }
+      description
+        "The date-and-time type is a profile of the ISO 8601
+      standard for representation of dates and times using the
+      Gregorian calendar.  The profile is defined by the
+      date-time production in Section 5.6 of RFC 3339.
+
+      The date-and-time type is compatible with the dateTime XML
+      schema type with the following notable exceptions:
+
+      (a) The date-and-time type does not allow negative years.
+
+      (b) The date-and-time time-offset -00:00 indicates an unknown
+          time zone (see RFC 3339) while -00:00 and +00:00 and Z
+          all represent the same time zone in dateTime.
+
+      (c) The canonical format (see below) of data-and-time values
+          differs from the canonical format used by the dateTime XML
+          schema type, which requires all times to be in UTC using
+          the time-offset 'Z'.
+
+      This type is not equivalent to the DateAndTime textual
+      convention of the SMIv2 since RFC 3339 uses a different
+      separator between full-date and full-time and provides
+      higher resolution of time-secfrac.
+
+      The canonical format for date-and-time values with a known time
+      zone uses a numeric time zone offset that is calculated using
+      the device's configured known offset to UTC time.  A change of
+      the device's offset to UTC time will cause date-and-time values
+      to change accordingly.  Such changes might happen periodically
+      in case a server follows automatically daylight saving time
+      (DST) time zone offset changes.  The canonical format for
+      date-and-time values with an unknown time zone (usually
+      referring to the notion of local time) uses the time-offset
+      -00:00.";
+      reference
+        "RFC 3339: Date and Time on the Internet: Timestamps
+         RFC 2579: Textual Conventions for SMIv2
+        XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+
+    }
+
+    typedef timeticks {
+      type uint32;
+      description
+        "The timeticks type represents a non-negative integer that
+      represents the time, modulo 2^32 (4294967296 decimal), in
+      hundredths of a second between two epochs.  When a schema
+      node is defined that uses this type, the description of
+      the schema node identifies both of the reference epochs.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeTicks type of the SMIv2.";
+      reference
+        "RFC 2578: Structure of Management Information Version 2
+        	  (SMIv2)";
+
+    }
+
+    typedef timestamp {
+      type timeticks;
+      description
+        "The timestamp type represents the value of an associated
+      timeticks schema node at which a specific occurrence
+      happened.  The specific occurrence must be defined in the
+      description of any schema node defined using this type.  When
+      the specific occurrence occurred prior to the last time the
+      associated timeticks attribute was zero, then the timestamp
+      value is zero.  Note that this requires all timestamp values
+      to be reset to zero when the value of the associated timeticks
+      attribute reaches 497+ days and wraps around to zero.
+
+      The associated timeticks schema node must be specified
+      in the description of any schema node using this type.
+
+      In the value set and its semantics, this type is equivalent
+      to the TimeStamp textual convention of the SMIv2.";
+      reference
+        "RFC 2579: Textual Conventions for SMIv2";
+
+    }
+
+    typedef phys-address {
+      type string {
+        pattern
+          '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+      }
+      description
+        "Represents media- or physical-level addresses represented
+      as a sequence octets, each octet represented by two hexadecimal
+      numbers.  Octets are separated by colons.  The canonical
+      representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the PhysAddress textual convention of the SMIv2.";
+      reference
+        "RFC 2579: Textual Conventions for SMIv2";
+
+    }
+
+    typedef mac-address {
+      type string {
+        pattern
+          '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+      }
+      description
+        "The mac-address type represents an IEEE 802 MAC address.
+      The canonical representation uses lowercase characters.
+
+      In the value set and its semantics, this type is equivalent
+      to the MacAddress textual convention of the SMIv2.";
+      reference
+        "IEEE 802: IEEE Standard for Local and Metropolitan Area
+        	  Networks: Overview and Architecture
+         RFC 2579: Textual Conventions for SMIv2";
+
+    }
+
+    typedef xpath1.0 {
+      type string;
+      description
+        "This type represents an XPATH 1.0 expression.
+
+      When a schema node is defined that uses this type, the
+      description of the schema node MUST specify the XPath
+      context in which the XPath expression is evaluated.";
+      reference
+        "XPATH: XML Path Language (XPath) Version 1.0";
+
+    }
+
+    typedef hex-string {
+      type string {
+        pattern
+          '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+      }
+      description
+        "A hexadecimal string with octets represented as hex digits
+      separated by colons.  The canonical representation uses
+      lowercase characters.";
+    }
+
+    typedef uuid {
+      type string {
+        pattern
+          '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+      }
+      description
+        "A Universally Unique IDentifier in the string representation
+      defined in RFC 4122.  The canonical representation uses
+      lowercase characters.
+
+      The following is an example of a UUID in string representation:
+      f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+      ";
+      reference
+        "RFC 4122: A Universally Unique IDentifier (UUID) URN
+        	  Namespace";
+
+    }
+
+    typedef dotted-quad {
+      type string {
+        pattern
+          '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+      }
+      description
+        "An unsigned 32-bit number expressed in the dotted-quad
+       notation, i.e., four octets written as decimal numbers
+       and separated with the '.' (full stop) character.";
+    }
+  }  // module ietf-yang-types
+
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-if-aggregate.yang b/models/openconfig/src/main/yang/interfaces/openconfig-if-aggregate.yang
new file mode 100644
index 0000000..8115652
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-if-aggregate.yang
@@ -0,0 +1,200 @@
+module openconfig-if-aggregate {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/aggregate";
+
+  prefix "oc-lag";
+
+  // import some basic types
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import iana-if-type { prefix ift; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing aggregated (aka bundle, LAG) interfaces.";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+
+
+  typedef aggregation-type {
+    type enumeration {
+      enum LACP {
+        description "LAG managed by LACP";
+      }
+      enum STATIC {
+        description "Statically configured bundle / LAG";
+      }
+    }
+    description
+      "Type to define the lag-type, i.e., how the LAG is
+      defined and managed";
+  }
+
+  // grouping statements
+
+
+  grouping aggregation-logical-config {
+    description
+      "Configuration data for aggregate interfaces";
+
+
+    leaf lag-type {
+      type aggregation-type;
+      description
+        "Sets the type of LAG, i.e., how it is
+        configured / maintained";
+    }
+
+    leaf min-links {
+      type uint16;
+      description
+        "Specifies the mininum number of member
+        interfaces that must be active for the aggregate interface
+        to be available";
+    }
+  }
+
+  grouping aggregation-logical-state {
+    description
+      "Operational state data for aggregate interfaces";
+
+    leaf lag-speed {
+      type uint32;
+      units Mbps;
+      description
+        "Reports effective speed of the aggregate interface,
+        based on speed of active member interfaces";
+    }
+
+    leaf-list member {
+      when "oc-lag:lag-type = 'STATIC'" {
+        description
+          "The simple list of member interfaces is active
+          when the aggregate is statically configured";
+      }
+      type oc-if:base-interface-ref;
+      description
+        "List of current member interfaces for the aggregate,
+        expressed as references to existing interfaces";
+    }
+  }
+
+  grouping aggregation-logical-top {
+    description "Top-level data definitions for LAGs";
+
+    container aggregation {
+
+      description
+        "Options for logical interfaces representing
+        aggregates";
+
+      container config {
+        description
+          "Configuration variables for logical aggregate /
+          LAG interfaces";
+
+        uses aggregation-logical-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Operational state variables for logical
+          aggregate / LAG interfaces";
+
+        uses aggregation-logical-config;
+        uses aggregation-logical-state;
+
+      }
+    }
+  }
+
+  grouping ethernet-if-aggregation-config {
+    description
+      "Adds configuration items for Ethernet interfaces
+      belonging to a logical aggregate / LAG";
+
+    leaf aggregate-id {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      description
+        "Specify the logical aggregate interface to which
+        this interface belongs";
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface" {
+    when "oc-if:type = 'ift:ieee8023adLag'" {
+      description "active when the interface is set to type LAG";
+    }
+    description "Adds LAG configuration to the interface module";
+
+    uses aggregation-logical-top;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+    "oc-eth:config" {
+    when "oc-if:type = 'ift:ethernetCsmacd'" {
+      description "active when the interface is Ethernet";
+    }
+    description "Adds LAG settings to individual Ethernet
+    interfaces";
+
+    uses ethernet-if-aggregation-config;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet/" +
+    "oc-eth:state" {
+    when "oc-if:type = 'ift:ethernetCsmacd'" {
+      description "active when the interface is Ethernet";
+    }
+    description "Adds LAG settings to individual Ethernet
+    interfaces";
+
+    uses ethernet-if-aggregation-config;
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-if-ethernet.yang b/models/openconfig/src/main/yang/interfaces/openconfig-if-ethernet.yang
new file mode 100644
index 0000000..0a3c2e8
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-if-ethernet.yang
@@ -0,0 +1,345 @@
+module openconfig-if-ethernet {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/ethernet";
+
+  prefix "oc-eth";
+
+  // import some basic types
+  import openconfig-interfaces { prefix oc-if; }
+  import iana-if-type { prefix ift; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing Ethernet interfaces -- augments the IETF YANG
+    model for interfaces described by RFC 7223";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity ETHERNET_SPEED {
+    description "base type to specify available Ethernet link
+    speeds";
+  }
+
+  identity SPEED_10MB {
+    base ETHERNET_SPEED;
+    description "10 Mbps Ethernet";
+  }
+
+  identity SPEED_100MB {
+    base ETHERNET_SPEED;
+    description "100 Mbps Ethernet";
+  }
+
+  identity SPEED_1GB {
+    base ETHERNET_SPEED;
+    description "1 GBps Ethernet";
+  }
+
+  identity SPEED_10GB {
+    base ETHERNET_SPEED;
+    description "10 GBps Ethernet";
+  }
+
+  identity SPEED_25GB {
+    base ETHERNET_SPEED;
+    description "25 GBps Ethernet";
+  }
+
+  identity SPEED_40GB {
+    base ETHERNET_SPEED;
+    description "40 GBps Ethernet";
+  }
+
+  identity SPEED_50GB {
+    base ETHERNET_SPEED;
+    description "50 GBps Ethernet";
+  }
+
+  identity SPEED_100GB {
+    base ETHERNET_SPEED;
+    description "100 GBps Ethernet";
+  }
+
+  identity SPEED_UNKNOWN {
+    base ETHERNET_SPEED;
+    description
+      "Interface speed is unknown.  Systems may report
+      speed UNKNOWN when an interface is down or unpopuplated (e.g.,
+      pluggable not present).";
+  }
+
+  // typedef statements
+
+
+  // grouping statements
+
+  grouping ethernet-interface-config {
+    description "Configuration items for Ethernet interfaces";
+
+    leaf mac-address {
+      type oc-yang:mac-address;
+      description
+        "Assigns a MAC address to the Ethernet interface.  If not
+        specified, the corresponding operational state leaf is
+        expected to show the system-assigned MAC address.";
+    }
+
+    leaf auto-negotiate {
+      type boolean;
+      default true;
+      description
+        "Set to TRUE to request the interface to auto-negotiate
+        transmission parameters with its peer interface.  When
+        set to FALSE, the transmission parameters are specified
+        manually.";
+      reference
+        "IEEE 802.3-2012 auto-negotiation transmission parameters";
+    }
+
+    leaf duplex-mode {
+      type enumeration {
+        enum FULL {
+          description "Full duplex mode";
+        }
+        enum HALF {
+          description "Half duplex mode";
+        }
+      }
+      description
+        "When auto-negotiate is TRUE, this optionally sets the
+        duplex mode that will be advertised to the peer.  If
+        unspecified, the interface should negotiate the duplex mode
+        directly (typically full-duplex).  When auto-negotiate is
+        FALSE, this sets the duplex mode on the interface directly.";
+    }
+
+    leaf port-speed {
+      type identityref {
+        base ETHERNET_SPEED;
+      }
+      description
+        "When auto-negotiate is TRUE, this optionally sets the
+        port-speed mode that will be advertised to the peer for
+        negotiation.  If unspecified, it is expected that the
+        interface will select the highest speed available based on
+        negotiation.  When auto-negotiate is set to FALSE, sets the
+        link speed to a fixed value -- supported values are defined
+        by ETHERNET_SPEED identities";
+    }
+
+    leaf enable-flow-control {
+      type boolean;
+      default false;
+      description
+        "Enable or disable flow control for this interface.
+        Ethernet flow control is a mechanism by which a receiver
+        may send PAUSE frames to a sender to stop transmission for
+        a specified time.
+
+        This setting should override auto-negotiated flow control
+        settings.  If left unspecified, and auto-negotiate is TRUE,
+        flow control mode is negotiated with the peer interface.";
+      reference
+        "IEEE 802.3x";
+    }
+  }
+
+  grouping ethernet-interface-state-counters {
+    description
+      "Ethernet-specific counters and statistics";
+
+    // ingress counters
+
+    leaf in-mac-control-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer control frames received on the interface";
+    }
+
+    leaf in-mac-pause-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer PAUSE frames received on the interface";
+    }
+
+    leaf in-oversize-frames {
+      type oc-yang:counter64;
+      description
+        "Number of oversize frames received on the interface";
+    }
+
+    leaf in-jabber-frames {
+      type oc-yang:counter64;
+      description
+        "Number of jabber frames received on the
+        interface.  Jabber frames are typically defined as oversize
+        frames which also have a bad CRC.  Implementations may use
+        slightly different definitions of what constitutes a jabber
+        frame.  Often indicative of a NIC hardware problem.";
+    }
+
+    leaf in-fragment-frames {
+      type oc-yang:counter64;
+      description
+        "Number of fragment frames received on the interface.";
+    }
+
+    leaf in-8021q-frames {
+      type oc-yang:counter64;
+      description
+        "Number of 802.1q tagged frames received on the interface";
+    }
+
+    leaf in-crc-errors {
+      type oc-yang:counter64;
+      description
+        "Number of receive error events due to FCS/CRC check
+        failure";
+    }
+
+    // egress counters
+
+    leaf out-mac-control-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer control frames sent on the interface";
+    }
+
+    leaf out-mac-pause-frames {
+      type oc-yang:counter64;
+      description
+        "MAC layer PAUSE frames sent on the interface";
+    }
+
+    leaf out-8021q-frames {
+      type oc-yang:counter64;
+      description
+        "Number of 802.1q tagged frames sent on the interface";
+    }
+  }
+
+  grouping ethernet-interface-state {
+    description
+      "Grouping for defining Ethernet-specific operational state";
+
+    leaf hw-mac-address {
+      type oc-yang:mac-address;
+      description
+        "Represenets the 'burned-in',  or system-assigned, MAC
+        address for the Ethernet interface.";
+    }
+
+    leaf negotiated-duplex-mode {
+      type enumeration {
+        enum FULL {
+          description "Full duplex mode";
+        }
+        enum HALF {
+          description "Half duplex mode";
+        }
+      }
+      description
+        "When auto-negotiate is set to TRUE, and the interface has
+        completed auto-negotiation with the remote peer, this value
+        shows the duplex mode that has been negotiated.";
+    }
+
+    leaf negotiated-port-speed {
+      type identityref {
+        base ETHERNET_SPEED;
+      }
+      description
+        "When auto-negotiate is set to TRUE, and the interface has
+        completed auto-negotiation with the remote peer, this value
+        shows the interface speed that has been negotiated.";
+    }
+
+    container counters {
+      description "Ethernet interface counters";
+
+      uses ethernet-interface-state-counters;
+
+    }
+
+  }
+
+  // data definition statements
+
+  grouping ethernet-top {
+    description "top-level Ethernet config and state containers";
+
+    container ethernet {
+      description
+        "Top-level container for ethernet configuration
+        and state";
+
+      container config {
+        description "Configuration data for ethernet interfaces";
+
+        uses ethernet-interface-config;
+
+      }
+
+      container state {
+
+        config false;
+        description "State variables for Ethernet interfaces";
+
+        uses ethernet-interface-config;
+        uses ethernet-interface-state;
+
+      }
+
+    }
+  }
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface" {
+    description "Adds addtional Ethernet-specific configuration to
+    interfaces model";
+
+    uses ethernet-top {
+      when "oc-if:state/oc-if:type = 'ift:ethernetCsmacd'" {
+      description "Additional interface configuration parameters when
+      the interface type is Ethernet";
+      }
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-if-ip-ext.yang b/models/openconfig/src/main/yang/interfaces/openconfig-if-ip-ext.yang
new file mode 100644
index 0000000..558b0de
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-if-ip-ext.yang
@@ -0,0 +1,157 @@
+module openconfig-if-ip-ext {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/ip-ext";
+
+  prefix "oc-ip-ext";
+
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ip { prefix oc-ip; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module adds extensions to the base IP configuration and
+    operational state model to support additional use cases.";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+
+  // grouping statements
+
+  grouping ipv6-autoconf-config {
+    description
+      "Configuration data for IPv6 address autoconfiguration";
+
+    leaf create-global-addresses {
+      type boolean;
+      default true;
+      description
+        "[adapted from IETF IP model RFC 7277]
+
+        If enabled, the host creates global addresses as
+        described in RFC 4862.";
+      reference
+        "RFC 4862: IPv6 Stateless Address Autoconfiguration
+                  Section 5.5";
+    }
+    leaf create-temporary-addresses {
+      type boolean;
+      default false;
+      description
+      "[adapted from IETF IP model RFC 7277]
+
+      If enabled, the host creates temporary addresses as
+      described in RFC 4941.";
+      reference
+        "RFC 4941: Privacy Extensions for Stateless Address
+                  Autoconfiguration in IPv6";
+    }
+
+    leaf temporary-valid-lifetime {
+      type uint32;
+      units "seconds";
+      default 604800;
+      description
+        "[adapted from IETF IP model RFC 7277]
+
+        The time period during which the temporary address
+        is valid.";
+      reference
+        "RFC 4941: Privacy Extensions for Stateless Address
+                  Autoconfiguration in IPv6
+                  - TEMP_VALID_LIFETIME";
+    }
+
+    leaf temporary-preferred-lifetime {
+      type uint32;
+      units "seconds";
+      default 86400;
+      description
+        "[adapted from IETF IP model RFC 7277]
+
+        The time period during which the temporary address is
+        preferred.";
+      reference
+        "RFC 4941: Privacy Extensions for Stateless Address
+                  Autoconfiguration in IPv6
+                  - TEMP_PREFERRED_LIFETIME";
+    }
+  }
+
+  grouping ipv6-autoconf-state {
+    description
+      "Operational state data for IPv6 address autoconfiguration";
+
+    //TODO: placeholder for additional opstate for IPv6 autoconf
+  }
+
+  grouping ipv6-autoconf-top {
+    description
+      "Top-level grouping for IPv6 address autoconfiguration";
+
+    container autoconf {
+      description
+        "Top-level container for IPv6 autoconf";
+
+      container config {
+        description
+          "[adapted from IETF IP model RFC 7277]
+
+          Parameters to control the autoconfiguration of IPv6
+          addresses, as described in RFC 4862.";
+        reference
+          "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+
+        uses ipv6-autoconf-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses ipv6-autoconf-config;
+        uses ipv6-autoconf-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv6" {
+      description
+        "Adds address autoconfiguration to the base IP model";
+
+      uses ipv6-autoconf-top;
+    }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-if-ip.yang b/models/openconfig/src/main/yang/interfaces/openconfig-if-ip.yang
new file mode 100644
index 0000000..cc291de
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-if-ip.yang
@@ -0,0 +1,1191 @@
+module openconfig-if-ip {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces/ip";
+
+  prefix "oc-ip";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-vlan { prefix oc-vlan; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This model defines data for managing configuration and
+    operational state on IP (IPv4 and IPv6) interfaces.
+
+    This model reuses data items defined in the IETF YANG model for
+    interfaces described by RFC 7277 with an alternate structure
+    (particularly for operational state data) and with
+    additional configuration items.
+
+    Portions of this code were derived from IETF RFC 7277.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2017-04-03"{
+    description
+      "Update copyright notice.";
+    reference "1.1.1";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+
+  // typedef statements
+
+  typedef ip-address-origin {
+    type enumeration {
+      enum OTHER {
+        description
+          "None of the following.";
+        }
+      enum STATIC {
+        description
+          "Indicates that the address has been statically
+          configured - for example, using NETCONF or a Command Line
+          Interface.";
+      }
+      enum DHCP {
+        description
+          "Indicates an address that has been assigned to this
+          system by a DHCP server.";
+      }
+      enum LINK_LAYER {
+        description
+          "Indicates an address created by IPv6 stateless
+          autoconfiguration that embeds a link-layer address in its
+          interface identifier.";
+      }
+      enum RANDOM {
+        description
+          "Indicates an address chosen by the system at
+          random, e.g., an IPv4 address within 169.254/16, an
+          RFC 4941 temporary address, or an RFC 7217 semantically
+          opaque address.";
+        reference
+          "RFC 4941: Privacy Extensions for Stateless Address
+                    Autoconfiguration in IPv6
+          RFC 7217: A Method for Generating Semantically Opaque
+                    Interface Identifiers with IPv6 Stateless
+                    Address Autoconfiguration (SLAAC)";
+      }
+    }
+    description
+     "The origin of an address.";
+  }
+
+  typedef neighbor-origin {
+    type enumeration {
+      enum OTHER {
+       description
+         "None of the following.";
+      }
+      enum STATIC {
+       description
+         "Indicates that the mapping has been statically
+          configured - for example, using NETCONF or a Command Line
+          Interface.";
+      }
+      enum DYNAMIC {
+       description
+        "Indicates that the mapping has been dynamically resolved
+        using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
+        protocol.";
+      }
+    }
+    description
+      "The origin of a neighbor entry.";
+  }
+
+  // grouping statements
+
+  grouping ip-common-global-config {
+    description
+      "Shared configuration data for IPv4 or IPv6 assigned
+      globally on an interface.";
+
+    leaf dhcp-client {
+      type boolean;
+      default false;
+      description
+        "Enables a DHCP client on the interface in order to request
+        an address";
+    }
+  }
+
+  grouping ip-common-counters-state {
+    description
+      "Operational state for IP traffic statistics for IPv4 and
+      IPv6";
+
+    container counters {
+      description
+        "Packet and byte counters for IP transmission and
+        reception for the address family.";
+
+
+      leaf in-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of IP packets received for the specified
+          address family, including those received in error";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets received in input IP packets
+          for the specified address family, including those received
+          in error.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-error-pkts {
+        // TODO: this counter combines several error conditions --
+        // could consider breaking them out to separate leaf nodes
+        type oc-yang:counter64;
+        description
+          "Number of IP packets discarded due to errors for the
+          specified address family, including errors in the IP
+          header, no route found to the IP destination, invalid
+          address, unknown protocol, etc.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-forwarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of input packets for which the device was not
+          their final IP destination and for which the device
+          attempted to find a route to forward them to that final
+          destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-forwarded-octets {
+        type oc-yang:counter64;
+        description
+          "The number of octets received in input IP packets
+          for the specified address family for which the device was
+          not their final IP destination and for which the
+          device attempted to find a route to forward them to that
+          final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf in-discarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of input IP packets for the
+          specified address family, for which no problems were
+          encountered to prevent their continued processing, but
+          were discarded (e.g., for lack of buffer space).";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of IP packets for the
+          specified address family that the device supplied
+          to the lower layers for transmission.  This includes
+          packets generated locally and those forwarded by the
+          device.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets in IP packets for the
+          specified address family that the device
+          supplied to the lower layers for transmission.  This
+          includes packets generated locally and those forwarded by
+          the device.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-error-pkts {
+        // TODO: this counter combines several error conditions --
+        // could consider breaking them out to separate leaf nodes
+        type oc-yang:counter64;
+        description
+          "Number of IP packets for the specified address family
+          locally generated and discarded due to errors, including
+          no route found to the IP destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-forwarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of packets for which this entity was not their
+          final IP destination and for which it was successful in
+          finding a path to their final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-forwarded-octets {
+        type oc-yang:counter64;
+        description
+          "The number of octets in packets for which this entity was
+          not their final IP destination and for which it was
+          successful in finding a path to their final destination.";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+
+      leaf out-discarded-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of output IP packets for the
+          specified address family for which no problem was
+          encountered to prevent their transmission to their
+          destination, but were discarded (e.g., for lack of
+          buffer space).";
+        reference
+          "RFC 4293 - Management Information Base for the
+          Internet Protocol (IP)";
+      }
+    }
+
+  }
+
+
+
+  grouping ipv4-global-config {
+    description
+      "Configuration data for IPv4 interfaces across
+      all addresses assigned to the interface";
+
+    leaf enabled {
+     type boolean;
+     default true;
+     description
+       "Controls whether IPv4 is enabled or disabled on this
+        interface.  When IPv4 is enabled, this interface is
+        connected to an IPv4 stack, and the interface can send
+        and receive IPv4 packets.";
+    }
+
+    leaf mtu {
+     type uint16 {
+       range "68..max";
+     }
+     units octets;
+     description
+       "The size, in octets, of the largest IPv4 packet that the
+        interface will send and receive.
+
+        The server may restrict the allowed values for this leaf,
+        depending on the interface's type.
+
+        If this leaf is not configured, the operationally used MTU
+        depends on the interface's type.";
+     reference
+       "RFC 791: Internet Protocol";
+    }
+
+    uses ip-common-global-config;
+
+
+  }
+
+  grouping ipv4-address-config {
+
+    description
+      "Per IPv4 adresss configuration data for the
+      interface.";
+
+    leaf ip {
+       type oc-inet:ipv4-address;
+       description
+        "The IPv4 address on the interface.";
+    }
+
+    leaf prefix-length {
+      type uint8 {
+       range "0..32";
+      }
+      description
+       "The length of the subnet prefix.";
+    }
+  }
+
+  grouping ipv4-neighbor-config {
+    description
+      "Per IPv4 neighbor configuration data. Neighbor
+      entries are analagous to static ARP entries, i.e., they
+      create a correspondence between IP and link-layer addresses";
+
+    leaf ip {
+     type oc-inet:ipv4-address;
+     description
+       "The IPv4 address of the neighbor node.";
+    }
+    leaf link-layer-address {
+     type oc-yang:phys-address;
+     mandatory true;
+     description
+       "The link-layer address of the neighbor node.";
+    }
+  }
+
+  grouping ipv4-address-state {
+    description
+      "State variables for IPv4 addresses on the interface";
+
+    leaf origin {
+      type ip-address-origin;
+      description
+       "The origin of this address, e.g., statically configured,
+       assigned by DHCP, etc..";
+    }
+  }
+
+  grouping ipv4-neighbor-state {
+    description
+      "State variables for IPv4 neighbor entries on the interface.";
+
+    leaf origin {
+      type neighbor-origin;
+      description
+        "The origin of this neighbor entry, static or dynamic.";
+    }
+  }
+
+  grouping ipv6-global-config {
+    description
+      "Configuration data at the global level for each
+      IPv6 interface";
+
+    leaf enabled {
+      type boolean;
+      default true;
+      description
+        "Controls whether IPv6 is enabled or disabled on this
+        interface.  When IPv6 is enabled, this interface is
+        connected to an IPv6 stack, and the interface can send
+        and receive IPv6 packets.";
+    }
+
+    leaf mtu {
+      type uint32 {
+       range "1280..max";
+      }
+      units octets;
+      description
+        "The size, in octets, of the largest IPv6 packet that the
+        interface will send and receive.
+
+        The server may restrict the allowed values for this leaf,
+        depending on the interface's type.
+
+        If this leaf is not configured, the operationally used MTU
+        depends on the interface's type.";
+      reference
+        "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+                  Section 5";
+    }
+
+    leaf dup-addr-detect-transmits {
+      type uint32;
+      default 1;
+      description
+        "The number of consecutive Neighbor Solicitation messages
+        sent while performing Duplicate Address Detection on a
+        tentative address.  A value of zero indicates that
+        Duplicate Address Detection is not performed on
+        tentative addresses.  A value of one indicates a single
+        transmission with no follow-up retransmissions.";
+      reference
+        "RFC 4862: IPv6 Stateless Address Autoconfiguration";
+    }
+
+    uses ip-common-global-config;
+  }
+
+  grouping ipv6-address-config {
+    description "Per-address configuration data for IPv6 interfaces";
+
+    leaf ip {
+      type oc-inet:ipv6-address;
+      description
+        "The IPv6 address on the interface.";
+    }
+
+    leaf prefix-length {
+      type uint8 {
+        range "0..128";
+      }
+      mandatory true;
+      description
+        "The length of the subnet prefix.";
+    }
+  }
+
+  grouping ipv6-address-state {
+    description
+      "Per-address operational state data for IPv6 interfaces";
+
+    leaf origin {
+      type ip-address-origin;
+      description
+        "The origin of this address, e.g., static, dhcp, etc.";
+    }
+
+    leaf status {
+      type enumeration {
+        enum PREFERRED {
+          description
+            "This is a valid address that can appear as the
+            destination or source address of a packet.";
+        }
+        enum DEPRECATED {
+          description
+            "This is a valid but deprecated address that should
+            no longer be used as a source address in new
+            communications, but packets addressed to such an
+            address are processed as expected.";
+        }
+        enum INVALID {
+          description
+            "This isn't a valid address, and it shouldn't appear
+            as the destination or source address of a packet.";
+        }
+        enum INACCESSIBLE {
+          description
+            "The address is not accessible because the interface
+            to which this address is assigned is not
+            operational.";
+        }
+        enum UNKNOWN {
+          description
+            "The status cannot be determined for some reason.";
+        }
+        enum TENTATIVE {
+          description
+            "The uniqueness of the address on the link is being
+            verified.  Addresses in this state should not be
+            used for general communication and should only be
+            used to determine the uniqueness of the address.";
+        }
+        enum DUPLICATE {
+          description
+           "The address has been determined to be non-unique on
+            the link and so must not be used.";
+        }
+        enum OPTIMISTIC {
+          description
+            "The address is available for use, subject to
+            restrictions, while its uniqueness on a link is
+            being verified.";
+        }
+      }
+      description
+        "The status of an address.  Most of the states correspond
+        to states from the IPv6 Stateless Address
+        Autoconfiguration protocol.";
+      reference
+          "RFC 4293: Management Information Base for the
+                      Internet Protocol (IP)
+                      - IpAddressStatusTC
+            RFC 4862: IPv6 Stateless Address Autoconfiguration";
+    }
+  }
+
+  grouping ipv6-neighbor-config {
+    description
+      "Per-neighbor configuration data for IPv6 interfaces";
+
+    leaf ip {
+      type oc-inet:ipv6-address;
+      description
+        "The IPv6 address of the neighbor node.";
+    }
+
+    leaf link-layer-address {
+      type oc-yang:phys-address;
+      mandatory true;
+      description
+        "The link-layer address of the neighbor node.";
+    }
+  }
+
+  grouping ipv6-neighbor-state {
+    description "Per-neighbor state variables for IPv6 interfaces";
+
+    leaf origin {
+      type neighbor-origin;
+      description
+        "The origin of this neighbor entry.";
+    }
+    leaf is-router {
+      type empty;
+      description
+        "Indicates that the neighbor node acts as a router.";
+    }
+    leaf neighbor-state {
+      type enumeration {
+        enum INCOMPLETE {
+          description
+          "Address resolution is in progress, and the link-layer
+                address of the neighbor has not yet been
+                determined.";
+        }
+        enum REACHABLE {
+          description
+          "Roughly speaking, the neighbor is known to have been
+                reachable recently (within tens of seconds ago).";
+        }
+        enum STALE {
+          description
+          "The neighbor is no longer known to be reachable, but
+                until traffic is sent to the neighbor no attempt
+                should be made to verify its reachability.";
+        }
+        enum DELAY {
+          description
+          "The neighbor is no longer known to be reachable, and
+                traffic has recently been sent to the neighbor.
+                Rather than probe the neighbor immediately, however,
+                delay sending probes for a short while in order to
+                give upper-layer protocols a chance to provide
+                reachability confirmation.";
+        }
+        enum PROBE {
+          description
+          "The neighbor is no longer known to be reachable, and
+                unicast Neighbor Solicitation probes are being sent
+                to verify reachability.";
+        }
+      }
+      description
+        "The Neighbor Unreachability Detection state of this
+        entry.";
+      reference
+        "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
+             Section 7.3.2";
+    }
+  }
+
+  grouping ip-vrrp-ipv6-config {
+    description
+      "IPv6-specific configuration data for VRRP on IPv6
+      interfaces";
+
+      leaf virtual-link-local {
+        type oc-inet:ip-address;
+        description
+          "For VRRP on IPv6 interfaces, sets the virtual link local
+          address";
+      }
+  }
+
+  grouping ip-vrrp-ipv6-state {
+    description
+      "IPv6-specific operational state for VRRP on IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+  grouping ip-vrrp-tracking-config {
+    description
+      "Configuration data for tracking interfaces
+      in a VRRP group";
+
+    leaf-list track-interface {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      // TODO: we may need to add some restriction to ethernet
+      // or IP interfaces.
+      description
+        "Sets a list of one or more interfaces that should
+        be tracked for up/down events to dynamically change the
+        priority state of the VRRP group, and potentially
+        change the mastership if the tracked interface going
+        down lowers the priority sufficiently.  Any of the tracked
+        interfaces going down will cause the priority to be lowered.
+        Some implementations may only support a single
+        tracked interface.";
+    }
+
+    leaf priority-decrement {
+      type uint8 {
+        range 0..254;
+      }
+      default 0;
+      description "Set the value to subtract from priority when
+      the tracked interface goes down";
+    }
+  }
+
+  grouping ip-vrrp-tracking-state {
+    description
+      "Operational state data for tracking interfaces in a VRRP
+      group";
+  }
+
+  grouping ip-vrrp-tracking-top {
+    description
+      "Top-level grouping for VRRP interface tracking";
+
+    container interface-tracking {
+      description
+        "Top-level container for VRRP interface tracking";
+
+      container config {
+        description
+          "Configuration data for VRRP interface tracking";
+
+        uses ip-vrrp-tracking-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for VRRP interface tracking";
+
+        uses ip-vrrp-tracking-config;
+        uses ip-vrrp-tracking-state;
+      }
+    }
+  }
+
+  grouping ip-vrrp-config {
+    description
+      "Configuration data for VRRP on IP interfaces";
+
+    leaf virtual-router-id {
+      type uint8 {
+        range 1..255;
+      }
+      description
+        "Set the virtual router id for use by the VRRP group.  This
+        usually also determines the virtual MAC address that is
+        generated for the VRRP group";
+    }
+
+    leaf-list virtual-address {
+      type oc-inet:ip-address;
+      description
+        "Configure one or more virtual addresses for the
+        VRRP group";
+    }
+
+    leaf priority {
+      type uint8 {
+        range 1..254;
+      }
+      default 100;
+      description
+        "Specifies the sending VRRP interface's priority
+        for the virtual router.  Higher values equal higher
+        priority";
+    }
+
+    leaf preempt {
+      type boolean;
+      default true;
+      description
+        "When set to true, enables preemption by a higher
+        priority backup router of a lower priority master router";
+    }
+
+    leaf preempt-delay {
+      type uint16 {
+        range 0..3600;
+      }
+      default 0;
+      description
+        "Set the delay the higher priority router waits
+        before preempting";
+    }
+
+    leaf accept-mode {
+      type boolean;
+      // TODO: should we adopt the RFC default given the common
+      // operational practice of setting to true?
+      default false;
+      description
+        "Configure whether packets destined for
+        virtual addresses are accepted even when the virtual
+        address is not owned by the router interface";
+    }
+
+    leaf advertisement-interval {
+      type uint16 {
+        range 1..4095;
+      }
+      // TODO this range is theoretical -- needs to be validated
+      // against major implementations.
+      units "centiseconds";
+      default 100;
+      description
+        "Sets the interval between successive VRRP
+        advertisements -- RFC 5798 defines this as a 12-bit
+        value expressed as 0.1 seconds, with default 100, i.e.,
+        1 second.  Several implementation express this in units of
+        seconds";
+    }
+  }
+
+  grouping ip-vrrp-state {
+    description
+      "Operational state data for VRRP on IP interfaces";
+
+    leaf current-priority {
+      type uint8;
+      description "Operational value of the priority for the
+      interface in the VRRP group";
+    }
+  }
+
+  grouping ip-vrrp-top {
+    description
+      "Top-level grouping for Virtual Router Redundancy Protocol";
+
+    container vrrp {
+      description
+        "Enclosing container for VRRP groups handled by this
+        IP interface";
+
+      reference "RFC 5798 - Virtual Router Redundancy Protocol
+        (VRRP) Version 3 for IPv4 and IPv6";
+
+      list vrrp-group {
+        key "virtual-router-id";
+        description
+          "List of VRRP groups, keyed by virtual router id";
+
+        leaf virtual-router-id {
+          type leafref {
+            path "../config/virtual-router-id";
+          }
+          description
+            "References the configured virtual router id for this
+            VRRP group";
+        }
+
+        container config {
+          description
+            "Configuration data for the VRRP group";
+
+          uses ip-vrrp-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for the VRRP group";
+
+          uses ip-vrrp-config;
+          uses ip-vrrp-state;
+        }
+
+        uses ip-vrrp-tracking-top;
+      }
+    }
+  }
+
+  grouping ipv4-top {
+    description "Top-level configuration and state for IPv4
+    interfaces";
+
+    container ipv4 {
+      description
+        "Parameters for the IPv4 address family.";
+
+      container addresses {
+        description
+          "Enclosing container for address list";
+
+        list address {
+          key "ip";
+          description
+           "The list of configured IPv4 addresses on the interface.";
+
+          leaf ip {
+            type leafref {
+              path "../oc-ip:config/oc-ip:ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description "Configuration data for each configured IPv4
+            address on the interface";
+
+            uses ipv4-address-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "Operational state data for each IPv4 address
+            configured on the interface";
+
+            uses ipv4-address-config;
+            uses ipv4-address-state;
+          }
+
+        }
+      }
+
+      container neighbors {
+        description
+          "Enclosing container for neighbor list";
+
+        list neighbor {
+          key "ip";
+          description
+           "A list of mappings from IPv4 addresses to
+            link-layer addresses.
+
+            Entries in this list are used as static entries in the
+            ARP Cache.";
+          reference
+           "RFC 826: An Ethernet Address Resolution Protocol";
+
+          leaf ip {
+            type leafref  {
+              path "../oc-ip:config/oc-ip:ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description "Configuration data for each configured IPv4
+            address on the interface";
+
+            uses ipv4-neighbor-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "Operational state data for each IPv4 address
+            configured on the interface";
+
+            uses ipv4-neighbor-config;
+            uses ipv4-neighbor-state;
+          }
+        }
+      }
+
+      uses oc-if:sub-unnumbered-top;
+
+      container config {
+        description
+          "Top-level IPv4 configuration data for the interface";
+
+        uses ipv4-global-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Top level IPv4 operational state data";
+
+        uses ipv4-global-config;
+        uses ip-common-counters-state;
+      }
+    }
+  }
+
+  grouping ipv6-top {
+    description
+      "Top-level configuration and state for IPv6 interfaces";
+
+    container ipv6 {
+      description
+       "Parameters for the IPv6 address family.";
+
+      container addresses {
+        description
+          "Enclosing container for address list";
+
+        list address {
+          key "ip";
+          description
+           "The list of configured IPv6 addresses on the interface.";
+
+          leaf ip {
+            type leafref {
+              path "../oc-ip:config/oc-ip:ip";
+            }
+            description "References the configured IP address";
+          }
+
+          container config {
+            description
+              "Configuration data for each IPv6 address on
+              the interface";
+
+            uses ipv6-address-config;
+
+          }
+
+          container state {
+
+            config false;
+            description
+              "State data for each IPv6 address on the
+              interface";
+
+            uses ipv6-address-config;
+            uses ipv6-address-state;
+          }
+        }
+      }
+
+      container neighbors {
+        description
+          "Enclosing container for list of IPv6 neighbors";
+
+        list neighbor {
+          key "ip";
+          description
+            "List of IPv6 neighbors";
+
+          leaf ip {
+            type leafref {
+              path "../oc-ip:config/oc-ip:ip";
+            }
+            description
+              "References the configured IP neighbor address";
+          }
+
+          container config {
+            description "Configuration data for each IPv6 address on
+            the interface";
+
+            uses ipv6-neighbor-config;
+
+          }
+
+          container state {
+
+            config false;
+            description "State data for each IPv6 address on the
+            interface";
+
+            uses ipv6-neighbor-config;
+            uses ipv6-neighbor-state;
+          }
+        }
+      }
+      uses oc-if:sub-unnumbered-top;
+
+      container config {
+        description "Top-level config data for the IPv6 interface";
+
+        uses ipv6-global-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Top-level operational state data for the IPv6 interface";
+
+        uses ipv6-global-config;
+        uses ip-common-counters-state;
+
+      }
+    }
+  }
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface" {
+    description
+      "IPv4 addr family configuration for
+      interfaces";
+
+    uses ipv4-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface" {
+    description
+      "IPv6 addr family configuration for
+      interfaces";
+
+    uses ipv6-top;
+
+  }
+
+  // VRRP for IPv4 interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  // VRRP for IPv6 interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/" +
+    "vrrp/vrrp-group/config" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+  "oc-if:subinterface/oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/" +
+    "vrrp-group/state" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-state;
+  }
+
+  // Augments for for routed VLANs
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+    description
+      "IPv4 addr family configuration for
+      interfaces";
+
+    uses ipv4-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan" {
+    description
+      "IPv6 addr family configuration for
+      interfaces";
+
+    uses ipv6-top;
+
+  }
+
+  // VRRP for routed VLAN interfaces
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv4/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address" {
+    description
+      "Additional IP addr family configuration for
+      interfaces";
+
+    uses ip-vrrp-top;
+
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/config" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-config;
+  }
+
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-vlan:routed-vlan/" +
+    "oc-ip:ipv6/oc-ip:addresses/oc-ip:address/vrrp/vrrp-group/state" {
+    description
+      "Additional VRRP data for IPv6 interfaces";
+
+    uses ip-vrrp-ipv6-state;
+  }
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-if-types.yang b/models/openconfig/src/main/yang/interfaces/openconfig-if-types.yang
new file mode 100644
index 0000000..dc447ef
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-if-types.yang
@@ -0,0 +1,80 @@
+module openconfig-if-types {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/openconfig-if-types";
+
+  prefix "oc-ift";
+
+  // import statements
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains a set of interface type definitions that
+    are used across OpenConfig models. These are generally physical
+    or logical interfaces, distinct from hardware ports (which are
+    described by the OpenConfig platform model).";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2016-11-14" {
+    description
+      "Initial version";
+    reference "0.1.0";
+  }
+
+
+  identity INTERFACE_TYPE {
+    description
+      "Base identity from which interface types are derived.";
+  }
+
+  identity IF_ETHERNET {
+    base INTERFACE_TYPE;
+    description
+      "Ethernet interfaces based on IEEE 802.3 standards, as well
+      as FlexEthernet";
+    reference
+      "IEEE 802.3-2015 - IEEE Standard for Ethernet
+      OIF Flex Ethernet Implementation Agreement 1.0";
+  }
+
+  identity IF_AGGREGATE {
+    base INTERFACE_TYPE;
+    description
+      "An aggregated, or bonded, interface forming a
+      Link Aggregation Group (LAG), or bundle, most often based on
+      the IEEE 802.1AX (or 802.3ad) standard.";
+    reference
+      "IEEE 802.1AX-2008";
+  }
+
+  identity IF_LOOPBACK {
+    base INTERFACE_TYPE;
+    description
+      "A virtual interface designated as a loopback used for
+      various management and operations tasks.";
+  }
+
+  identity IF_ROUTED_VLAN {
+    base INTERFACE_TYPE;
+    description
+      "A logical interface used for routing services on a VLAN.
+      Such interfaces are also known as switch virtual interfaces
+      (SVI) or integrated routing and bridging interfaces (IRBs).";
+  }
+
+  identity IF_SONET {
+    base INTERFACE_TYPE;
+    description
+      "SONET/SDH interface";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/interfaces/openconfig-interfaces.yang b/models/openconfig/src/main/yang/interfaces/openconfig-interfaces.yang
new file mode 100644
index 0000000..b5c928e
--- /dev/null
+++ b/models/openconfig/src/main/yang/interfaces/openconfig-interfaces.yang
@@ -0,0 +1,965 @@
+module openconfig-interfaces {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/interfaces";
+
+  prefix "oc-if";
+
+  // import some basic types
+  import ietf-interfaces { prefix ietf-if; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing network interfaces and subinterfaces.  This
+    module also defines convenience types / groupings for other
+    models to create references to interfaces:
+
+      base-interface-ref (type) -  reference to a base interface
+      interface-ref (grouping) -  container for reference to a
+        interface + subinterface
+      interface-ref-state (grouping) - container for read-only
+        (opstate) reference to interface + subinterface
+
+    This model reuses data items defined in the IETF YANG model for
+    interfaces described by RFC 7223 with an alternate structure
+    (particularly for operational state data) and with
+    additional configuration items.
+
+    Portions of this code were derived from IETF RFC 7223.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Added Ethernet/IP state data; Add dhcp-client;
+      migrate to OpenConfig types modules; Removed or
+      renamed opstate values";
+    reference "2.0.0";
+  }
+
+  revision "2017-04-03" {
+    description
+      "Update copyright notice.";
+    reference "1.1.1";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes to Ethernet interfaces model";
+    reference "1.1.0";
+  }
+
+
+  // typedef statements
+
+  typedef base-interface-ref {
+    type leafref {
+      path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+    }
+    description
+      "Reusable type for by-name reference to a base interface.
+      This type may be used in cases where ability to reference
+      a subinterface is not required.";
+  }
+
+  typedef interface-id {
+    type string;
+    description
+      "User-defined identifier for an interface, generally used to
+      name a interface reference.  The id can be arbitrary but a
+      useful convention is to use a combination of base interface
+      name and subinterface index.";
+  }
+
+  // grouping statements
+
+  grouping interface-ref-common {
+    description
+      "Reference leafrefs to interface / subinterface";
+
+    leaf interface {
+      type leafref {
+        path "/oc-if:interfaces/oc-if:interface/oc-if:name";
+      }
+      description
+        "Reference to a base interface.  If a reference to a
+        subinterface is required, this leaf must be specified
+        to indicate the base interface.";
+    }
+
+    leaf subinterface {
+      type leafref {
+        path "/oc-if:interfaces/" +
+          "oc-if:interface[oc-if:name=current()/../interface]/" +
+          "oc-if:subinterfaces/oc-if:subinterface/oc-if:index";
+      }
+      description
+        "Reference to a subinterface -- this requires the base
+        interface to be specified using the interface leaf in
+        this container.  If only a reference to a base interface
+        is requuired, this leaf should not be set.";
+    }
+  }
+
+  grouping interface-ref-state-container {
+    description
+      "Reusable opstate w/container for a reference to an
+      interface or subinterface";
+
+    container state {
+      config false;
+      description
+        "Operational state for interface-ref";
+
+      uses interface-ref-common;
+    }
+  }
+
+  grouping interface-ref {
+    description
+      "Reusable definition for a reference to an interface or
+      subinterface";
+
+    container interface-ref {
+      description
+        "Reference to an interface or subinterface";
+
+      container config {
+        description
+          "Configured reference to interface / subinterface";
+
+        uses interface-ref-common;
+      }
+
+      uses interface-ref-state-container;
+    }
+  }
+
+  grouping interface-ref-state {
+    description
+      "Reusable opstate w/container for a reference to an
+      interface or subinterface";
+
+    container interface-ref {
+      description
+        "Reference to an interface or subinterface";
+
+      uses interface-ref-state-container;
+    }
+  }
+
+  grouping base-interface-ref-state {
+    description
+      "Reusable opstate w/container for a reference to a
+      base interface (no subinterface).";
+
+      container state {
+        config false;
+        description
+          "Operational state for base interface reference";
+
+        leaf interface {
+          type base-interface-ref;
+          description
+            "Reference to a base interface.";
+        }
+      }
+  }
+
+
+  grouping interface-common-config {
+    description
+      "Configuration data data nodes common to physical interfaces
+      and subinterfaces";
+
+    leaf description {
+      type string;
+      description
+        "A textual description of the interface.
+
+        A server implementation MAY map this leaf to the ifAlias
+        MIB object.  Such an implementation needs to use some
+        mechanism to handle the differences in size and characters
+        allowed between this leaf and ifAlias.  The definition of
+        such a mechanism is outside the scope of this document.
+
+        Since ifAlias is defined to be stored in non-volatile
+        storage, the MIB implementation MUST map ifAlias to the
+        value of 'description' in the persistently stored
+        datastore.
+
+        Specifically, if the device supports ':startup', when
+        ifAlias is read the device MUST return the value of
+        'description' in the 'startup' datastore, and when it is
+        written, it MUST be written to the 'running' and 'startup'
+        datastores.  Note that it is up to the implementation to
+
+        decide whether to modify this single leaf in 'startup' or
+        perform an implicit copy-config from 'running' to
+        'startup'.
+
+        If the device does not support ':startup', ifAlias MUST
+        be mapped to the 'description' leaf in the 'running'
+        datastore.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAlias";
+    }
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "This leaf contains the configured, desired state of the
+        interface.
+
+        Systems that implement the IF-MIB use the value of this
+        leaf in the 'running' datastore to set
+        IF-MIB.ifAdminStatus to 'up' or 'down' after an ifEntry
+        has been initialized, as described in RFC 2863.
+
+        Changes in this leaf in the 'running' datastore are
+        reflected in ifAdminStatus, but if ifAdminStatus is
+        changed over SNMP, this leaf is not affected.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+    }
+
+  }
+
+  grouping interface-phys-config {
+    description
+      "Configuration data for physical interfaces";
+
+    leaf name {
+      type string;
+      description
+        "The name of the interface.
+
+        A device MAY restrict the allowed values for this leaf,
+        possibly depending on the type of the interface.
+        For system-controlled interfaces, this leaf is the
+        device-specific name of the interface.  The 'config false'
+        list interfaces/interface[name]/state contains the currently
+        existing interfaces on the device.
+
+        If a client tries to create configuration for a
+        system-controlled interface that is not present in the
+        corresponding state list, the server MAY reject
+        the request if the implementation does not support
+        pre-provisioning of interfaces or if the name refers to
+        an interface that can never exist in the system.  A
+        NETCONF server MUST reply with an rpc-error with the
+        error-tag 'invalid-value' in this case.
+
+        The IETF model in RFC 7223 provides YANG features for the
+        following (i.e., pre-provisioning and arbitrary-names),
+        however they are omitted here:
+
+          If the device supports pre-provisioning of interface
+          configuration, the 'pre-provisioning' feature is
+          advertised.
+
+          If the device allows arbitrarily named user-controlled
+          interfaces, the 'arbitrary-names' feature is advertised.
+
+        When a configured user-controlled interface is created by
+        the system, it is instantiated with the same name in the
+        /interfaces/interface[name]/state list.";
+    }
+
+    leaf type {
+      type identityref {
+        base ietf-if:interface-type;
+      }
+      mandatory true;
+      description
+        "The type of the interface.
+
+        When an interface entry is created, a server MAY
+        initialize the type leaf with a valid value, e.g., if it
+        is possible to derive the type from the name of the
+        interface.
+
+        If a client tries to set the type of an interface to a
+        value that can never be used by the system, e.g., if the
+        type is not supported or if the type does not match the
+        name of the interface, the server MUST reject the request.
+        A NETCONF server MUST reply with an rpc-error with the
+        error-tag 'invalid-value' in this case.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifType";
+    }
+
+    leaf mtu {
+      type uint16;
+      description
+        "Set the max transmission unit size in octets
+        for the physical interface.  If this is not set, the mtu is
+        set to the operational default -- e.g., 1514 bytes on an
+        Ethernet interface.";
+    }
+
+    uses interface-common-config;
+  }
+
+  grouping interface-phys-holdtime-config {
+    description
+      "Configuration data for interface hold-time settings --
+      applies to physical interfaces.";
+
+    leaf up {
+      type uint32;
+      units milliseconds;
+      default 0;
+      description
+        "Dampens advertisement when the interface
+        transitions from down to up.  A zero value means dampening
+        is turned off, i.e., immediate notification.";
+    }
+
+    leaf down {
+      type uint32;
+      units milliseconds;
+      default 0;
+      description
+        "Dampens advertisement when the interface transitions from
+        up to down.  A zero value means dampening is turned off,
+        i.e., immediate notification.";
+    }
+  }
+
+  grouping interface-phys-holdtime-state {
+    description
+      "Operational state data for interface hold-time.";
+  }
+
+  grouping interface-phys-holdtime-top {
+    description
+      "Top-level grouping for setting link transition
+      dampening on physical and other types of interfaces.";
+
+    container hold-time {
+      description
+        "Top-level container for hold-time settings to enable
+        dampening advertisements of interface transitions.";
+
+      container config {
+        description
+          "Configuration data for interface hold-time settings.";
+
+        uses interface-phys-holdtime-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for interface hold-time.";
+
+        uses interface-phys-holdtime-config;
+        uses interface-phys-holdtime-state;
+      }
+    }
+  }
+
+  grouping interface-common-state {
+    description
+      "Operational state data (in addition to intended configuration)
+      at the global level for this interface";
+
+    leaf ifindex {
+      type uint32;
+      description
+        "System assigned number for each interface.  Corresponds to
+        ifIndex object in SNMP Interface MIB";
+      reference
+        "RFC 2863 - The Interfaces Group MIB";
+    }
+
+    leaf admin-status {
+      type enumeration {
+        enum UP {
+          description
+            "Ready to pass packets.";
+        }
+        enum DOWN {
+          description
+            "Not ready to pass packets and not in some test mode.";
+        }
+        enum TESTING {
+          //TODO: This is generally not supported as a configured
+          //admin state, though it's in the standard interfaces MIB.
+          //Consider removing it.
+          description
+            "In some test mode.";
+        }
+      }
+      //TODO:consider converting to an identity to have the
+      //flexibility to remove some values defined by RFC 7223 that
+      //are not used or not implemented consistently.
+      mandatory true;
+      description
+        "The desired state of the interface.  In RFC 7223 this leaf
+        has the same read semantics as ifAdminStatus.  Here, it
+        reflects the administrative state as set by enabling or
+        disabling the interface.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifAdminStatus";
+    }
+
+    leaf oper-status {
+      type enumeration {
+        enum UP {
+          value 1;
+          description
+            "Ready to pass packets.";
+        }
+        enum DOWN {
+          value 2;
+          description
+            "The interface does not pass any packets.";
+        }
+        enum TESTING {
+          value 3;
+          description
+            "In some test mode.  No operational packets can
+             be passed.";
+        }
+        enum UNKNOWN {
+          value 4;
+          description
+            "Status cannot be determined for some reason.";
+        }
+        enum DORMANT {
+          value 5;
+          description
+            "Waiting for some external event.";
+        }
+        enum NOT_PRESENT {
+          value 6;
+          description
+            "Some component (typically hardware) is missing.";
+        }
+        enum LOWER_LAYER_DOWN {
+          value 7;
+          description
+            "Down due to state of lower-layer interface(s).";
+        }
+      }
+      //TODO:consider converting to an identity to have the
+      //flexibility to remove some values defined by RFC 7223 that
+      //are not used or not implemented consistently.
+      mandatory true;
+      description
+        "The current operational state of the interface.
+
+         This leaf has the same semantics as ifOperStatus.";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifOperStatus";
+    }
+
+    leaf last-change {
+      type oc-types:timeticks64;
+      units nanoseconds;
+      description
+        "This timestamp indicates the time of the last state change
+        of the interface (e.g., up-to-down transition). This
+        corresponds to the ifLastChange object in the standard
+        interface MIB.
+
+        The value is the timestamp in nanoseconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      reference
+        "RFC 2863: The Interfaces Group MIB - ifLastChange";
+    }
+
+  }
+
+
+  grouping interface-counters-state {
+    description
+      "Operational state representing interface counters
+      and statistics.";
+
+      //TODO: we may need to break this list of counters into those
+      //that would appear for physical vs. subinterface or logical
+      //interfaces.  For now, just replicating the full stats
+      //grouping to both interface and subinterface.
+
+    container counters {
+      description
+        "A collection of interface-related statistics objects.";
+
+      leaf in-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets received on the interface,
+          including framing characters.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifHCInOctets";
+      }
+
+      leaf in-unicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of packets, delivered by this sub-layer to a
+          higher (sub-)layer, that were not addressed to a
+          multicast or broadcast address at this sub-layer.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifHCInUcastPkts";
+      }
+
+      leaf in-broadcast-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of packets, delivered by this sub-layer to a
+          higher (sub-)layer, that were addressed to a broadcast
+          address at this sub-layer.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifHCInBroadcastPkts";
+      }
+
+      leaf in-multicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The number of packets, delivered by this sub-layer to a
+          higher (sub-)layer, that were addressed to a multicast
+          address at this sub-layer.  For a MAC-layer protocol,
+          this includes both Group and Functional addresses.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifHCInMulticastPkts";
+      }
+
+      leaf in-discards {
+        type oc-yang:counter64;
+        description
+          "The number of inbound packets that were chosen to be
+          discarded even though no errors had been detected to
+          prevent their being deliverable to a higher-layer
+          protocol.  One possible reason for discarding such a
+          packet could be to free up buffer space.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+
+
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifInDiscards";
+      }
+
+      leaf in-errors {
+        type oc-yang:counter64;
+        description
+          "For packet-oriented interfaces, the number of inbound
+          packets that contained errors preventing them from being
+          deliverable to a higher-layer protocol.  For character-
+          oriented or fixed-length interfaces, the number of
+          inbound transmission units that contained errors
+          preventing them from being deliverable to a higher-layer
+          protocol.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifInErrors";
+      }
+
+      leaf in-unknown-protos {
+        type oc-yang:counter64;
+        description
+          "For packet-oriented interfaces, the number of packets
+          received via the interface that were discarded because
+          of an unknown or unsupported protocol.  For
+          character-oriented or fixed-length interfaces that
+          support protocol multiplexing, the number of
+          transmission units received via the interface that were
+          discarded because of an unknown or unsupported protocol.
+          For any interface that does not support protocol
+          multiplexing, this counter is not present.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifInUnknownProtos";
+      }
+
+      leaf in-fcs-errors {
+        type oc-yang:counter64;
+        description
+          "Number of received packets which had errors in the
+          frame check sequence (FCS), i.e., framing errors.
+
+          Discontinuities in the value of this counter can occur
+          when the device is re-initialization as indicated by the
+          value of 'last-clear'.";
+      }
+
+      leaf out-octets {
+        type oc-yang:counter64;
+        description
+          "The total number of octets transmitted out of the
+          interface, including framing characters.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifHCOutOctets";
+      }
+
+      leaf out-unicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of packets that higher-level protocols
+          requested be transmitted, and that were not addressed
+          to a multicast or broadcast address at this sub-layer,
+          including those that were discarded or not sent.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifHCOutUcastPkts";
+      }
+
+      leaf out-broadcast-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of packets that higher-level protocols
+          requested be transmitted, and that were addressed to a
+          broadcast address at this sub-layer, including those
+          that were discarded or not sent.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifHCOutBroadcastPkts";
+      }
+
+
+      leaf out-multicast-pkts {
+        type oc-yang:counter64;
+        description
+          "The total number of packets that higher-level protocols
+          requested be transmitted, and that were addressed to a
+          multicast address at this sub-layer, including those
+          that were discarded or not sent.  For a MAC-layer
+          protocol, this includes both Group and Functional
+          addresses.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB -
+                     ifHCOutMulticastPkts";
+      }
+
+      leaf out-discards {
+        type oc-yang:counter64;
+        description
+          "The number of outbound packets that were chosen to be
+          discarded even though no errors had been detected to
+          prevent their being transmitted.  One possible reason
+          for discarding such a packet could be to free up buffer
+          space.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOutDiscards";
+      }
+
+      leaf out-errors {
+        type oc-yang:counter64;
+        description
+          "For packet-oriented interfaces, the number of outbound
+          packets that could not be transmitted because of errors.
+          For character-oriented or fixed-length interfaces, the
+          number of outbound transmission units that could not be
+          transmitted because of errors.
+
+          Discontinuities in the value of this counter can occur
+          at re-initialization of the management system, and at
+          other times as indicated by the value of
+          'last-clear'.";
+        reference
+          "RFC 2863: The Interfaces Group MIB - ifOutErrors";
+      }
+
+      leaf carrier-transitions {
+        type oc-yang:counter64;
+        description
+          "Number of times the interface state has transitioned
+          between up and down since the time the device restarted
+          or the last-clear time, whichever is most recent.";
+      }
+
+      leaf last-clear {
+        type oc-types:timeticks64;
+        units nanoseconds;
+        description
+          "Timestamp of the last time the interface counters were
+          cleared.
+
+          The value is the timestamp in nanoseconds relative to
+          the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      }
+    }
+  }
+
+  // data definition statements
+
+  grouping sub-unnumbered-config {
+    description
+      "Configuration data for unnumbered subinterfaces";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "Indicates that the subinterface is unnumbered.  By default
+        the subinterface is numbered, i.e., expected to have an
+        IP address configuration.";
+    }
+  }
+
+  grouping sub-unnumbered-state {
+    description
+      "Operational state data unnumbered subinterfaces";
+  }
+
+  grouping sub-unnumbered-top {
+    description
+      "Top-level grouping unnumbered subinterfaces";
+
+    container unnumbered {
+      description
+        "Top-level container for setting unnumbered interfaces.
+        Includes reference the interface that provides the
+        address information";
+
+      container config {
+        description
+          "Configuration data for unnumbered interface";
+
+        uses sub-unnumbered-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for unnumbered interfaces";
+
+        uses sub-unnumbered-config;
+        uses sub-unnumbered-state;
+      }
+
+      uses oc-if:interface-ref;
+    }
+  }
+
+  grouping subinterfaces-config {
+    description
+      "Configuration data for subinterfaces";
+
+    leaf index {
+      type uint32;
+      default 0;
+      description
+        "The index of the subinterface, or logical interface number.
+        On systems with no support for subinterfaces, or not using
+        subinterfaces, this value should default to 0, i.e., the
+        default subinterface.";
+    }
+
+    uses interface-common-config;
+
+  }
+
+  grouping subinterfaces-state {
+    description
+      "Operational state data for subinterfaces";
+
+    leaf name {
+      type string;
+      description
+        "The system-assigned name for the sub-interface.  This MAY
+        be a combination of the base interface name and the
+        subinterface index, or some other convention used by the
+        system.";
+    }
+
+    uses interface-common-state;
+    uses interface-counters-state;
+  }
+
+  grouping subinterfaces-top {
+    description
+      "Subinterface data for logical interfaces associated with a
+      given interface";
+
+    container subinterfaces {
+      description
+        "Enclosing container for the list of subinterfaces associated
+        with a physical interface";
+
+      list subinterface {
+        key "index";
+
+        description
+          "The list of subinterfaces (logical interfaces) associated
+          with a physical interface";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "The index number of the subinterface -- used to address
+            the logical interface";
+        }
+
+        container config {
+          description
+            "Configurable items at the subinterface level";
+
+          uses subinterfaces-config;
+        }
+
+        container state {
+
+          config false;
+          description
+            "Operational state data for logical interfaces";
+
+          uses subinterfaces-config;
+          uses subinterfaces-state;
+        }
+      }
+    }
+  }
+
+  grouping interfaces-top {
+    description
+      "Top-level grouping for interface configuration and
+      operational state data";
+
+    container interfaces {
+      description
+        "Top level container for interfaces, including configuration
+        and state data.";
+
+
+      list interface {
+        key "name";
+
+        description
+          "The list of named interfaces on the device.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "References the configured name of the interface";
+            //TODO: need to consider whether this should actually
+            //reference the name in the state subtree, which
+            //presumably would be the system-assigned name, or the
+            //configured name.  Points to the config/name now
+            //because of YANG 1.0 limitation that the list
+            //key must have the same "config" as the list, and
+            //also can't point to a non-config node.
+        }
+
+        container config {
+          description
+            "Configurable items at the global, physical interface
+            level";
+
+          uses interface-phys-config;
+        }
+
+        container state {
+
+          config false;
+          description
+            "Operational state data at the global interface level";
+
+          uses interface-phys-config;
+          uses interface-common-state;
+          uses interface-counters-state;
+        }
+
+        uses interface-phys-holdtime-top;
+        uses subinterfaces-top;
+      }
+    }
+  }
+
+  uses interfaces-top;
+
+
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis-lsdb-types.yang b/models/openconfig/src/main/yang/isis/openconfig-isis-lsdb-types.yang
new file mode 100644
index 0000000..b645e35
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis-lsdb-types.yang
@@ -0,0 +1,677 @@
+module openconfig-isis-lsdb-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/isis-lsdb-types";
+
+  prefix "oc-isis-lsdb-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains general LSDB type definitions for use in
+    ISIS YANG model. ";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  identity ISIS_TLV_TYPE {
+    description
+      "Base identity for an ISIS TLV type.";
+  }
+
+  identity ISIS_SUBTLV_TYPE {
+    description
+      "Base identity for an ISIS SUB-TLV type.";
+  }
+
+  identity IS_REACHABILITY_SUBTLVS_TYPE {
+    base "ISIS_SUBTLV_TYPE";
+    description
+      "Base identity for an ISIS TLV 22, 23, 222, 223, 141 SUB-TLV
+      type.";
+  }
+
+  identity IP_REACHABILITY_SUBTLVS_TYPE {
+    base "ISIS_SUBTLV_TYPE";
+    description
+      "Base identity for an ISIS TLV 135, 235, 236, 237 SUB-TLV
+      type.";
+  }
+
+  identity ROUTER_CAPABILITY_SUBTLVS_TYPE {
+    base "ISIS_SUBTLV_TYPE";
+    description
+      "Base identity for an ISIS TLV 242 SUB-TLV type.";
+  }
+
+  identity AREA_ADDRESSES {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 1. Intermediate System to Intermediate System Intra-
+      Domain Routeing Exchange Protocol for use in Conjunction with
+      the Protocol for Providing the Connectionless-mode Network
+      Service (ISO 8473), International Standard 10589: 2002, Second
+      Edition, 2002.";
+    reference
+      "ISO 10589";
+  }
+
+  identity IIS_NEIGHBORS {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 2. Intermediate System to Intermediate System Intra-
+      Domain Routeing Exchange Protocol for use in Conjunction with
+      the Protocol for Providing the Connectionless-mode Network
+      Service (ISO 8473), International Standard 10589: 2002, Second
+      Edition, 2002.";
+    reference
+      "ISO 10589";
+  }
+
+  identity INSTANCE_ID {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 7. An Instance Identifier (IID) to uniquely
+      identify an IS-IS instance. When the IID = 0, the list of
+      supported ITIDs MUST NOT be present. An IID-TLV with IID = 0
+      MUST NOT appear in an SNP or LSP. When the TLV appears (with a
+      non-zero IID) in an SNP or LSP, exactly one ITID. MUST be
+      present indicating the topology with which the PDU is
+      associated. If no ITIDs or multiple ITIDs are present or the
+      IID is zero, then the PDU MUST be ignored";
+    reference
+      "RFC6822: IS-IS Multi-Instance";
+  }
+
+  identity AUTHENTICATION {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 10.Intermediate System to Intermediate System Intra-
+      Domain Routeing Exchange Protocol for use in Conjunction with
+      the Protocol for Providing the Connectionless-mode Network
+      Service (ISO 8473) International Standard 10589: 2002, Second
+      Edition, 2002.";
+    reference
+      "ISO 10589";
+  }
+
+  identity PURGE_OI {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 13. If an IS generates a purge, it SHOULD include
+      this TLV in the purge with its own system ID.  If an IS
+      receives a purge that does not include this TLV, then it SHOULD
+      add this TLV with both its own system ID and the system ID of
+      the IS from which it received the purge.  This allows ISs
+      receiving purges to log the system ID of the originator, or the
+      upstream source of the purge.";
+    reference
+      "RFC6232: Purge Originator Identification TLV";
+  }
+
+  identity LSP_BUFFER_SIZE {
+   base "ISIS_TLV_TYPE";
+   description
+     "ISIS TLV 14. The maximum MTU that the advertising system can
+     receive, expressed in bytes.";
+   reference
+     "ISO 10589: LSP Buffer Size TLV";
+  }
+
+  identity EXTENDED_IS_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 22. An extended IS reachability TLV that has a
+      different data structure to TLV 2 that introduces the use of
+      sub-TLV object-group.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering";
+  }
+
+  identity IS_NEIGHBOR_ATTRIBUTE {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 23. Identical in format to TLV 22 and included in
+      Original LSPs or Extended LSPs. Regardless of the type of LSP
+      in which the TLVs appear, the information pertains to the
+      neighbor relationship between the Originating System and the IS
+      identified in the TLV";
+    reference
+      "RFC5311: Simplified Extension of Link State PDU (LSP) Space
+      for IS-IS";
+  }
+
+  identity ISIS_ALIAS_ID {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 24. IS-Alias TLV which extension-capable ISs to
+      recognize the Originating System of an Extended LSP set. It
+      identifies the Normal system-id of the Originating System";
+    reference
+      "RFC5311: Simplified Extension of Link State PDU (LSP) Space
+      for IS-IS";
+  }
+
+  identity IPV4_INTERNAL_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 128. TLV defines IP addresses within the routing
+      domain reachable directly via one or more interfaces on this
+      Intermediate system";
+    reference
+      "RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+      Domain-Wide Prefix Distribution with Two-Level IS-IS";
+  }
+
+  identity NLPID {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 129. TLV defines the set Network Layer Protocol
+      Identifiers for Network Layer protocols that this Intermediate
+      System is capable of relaying";
+    reference
+      "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+      Dual Environments";
+  }
+
+  identity IPV4_EXTERNAL_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 130. TLV defines IP addresses outside the routing
+      domain reachable via interfaces on this Intermediate system.
+      This is permitted to appear multiple times, and in an LSP with
+      any LSP number. However, this field must not appear in
+      pseudonode LSPs";
+    reference "
+      RFC1195: OSI ISIS for IP and Dual Environments.  RFC5302:
+      Domain-Wide Prefix Distribution with Two-Level IS-IS";
+  }
+
+  identity IPV4_INTERFACE_ADDRESSES {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 132. The IP address of one or more interfaces
+      corresponding to the SNPAs enabled on this Intermediate system
+      (i.e., one or more IP addresses of this router). This is
+      permitted to appear multiple times, and in an LSP with any LSP
+      number.";
+    reference
+      "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and Dual
+      Environments";
+  }
+
+  identity IPV4_TE_ROUTER_ID {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 134. Traffic Engineering router ID TLV that contains
+      the 4-octet router ID of the router originating the LSP";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering";
+  }
+
+  identity EXTENDED_IPV4_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 135. Extended IP reachability TLV that provides for a
+      32-bit metric and adds one bit to indicate that a prefix has
+      been redistributed _down_ in the hierarchy";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering";
+  }
+
+  identity DYNAMIC_NAME {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 137. The Dynamic hostname TLV is optional.  This TLV
+      may be present in any fragment of a non-pseudonode LSP.  The
+      value field identifies the symbolic name of the router
+      originating the LSP.  This symbolic name can be the FQDN for the
+      router, it can be a subset of the FQDN, or it can be any string
+      operators want to use for the router.";
+    reference
+      "RFC6233: IS-IS Registry Extension for Purges, RFC 5301: Dynamic
+      Hostname Exchange Mechanism for IS-IS.";
+  }
+
+  identity IPV4_SRLG {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 138. IPv4 Shared Risk Link Group TLV";
+    reference
+      "RFC5307: IS-IS Extensions in Support of Generalized
+      Multi-Protocol Label Switching (GMPLS)";
+  }
+
+  identity IPV6_SRLG {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 139. IPv6 Shared Risk Link Group";
+    reference
+      "RFC6119: IPv6 Traffic Engineering in IS-IS";
+  }
+
+  identity IPV6_TE_ROUTER_ID {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 140. The IPv6 TE Router ID TLV contains a 16-octet
+      IPv6 address. A stable global IPv6 address MUST be used, so that
+      the router ID provides a routable address, regardless of the
+      state of a node's interfaces. If a router does not implement
+      traffic engineering, it MAY include or omit the IPv6 TE Router
+      ID TLV.  If a router implements traffic engineering for IPv6, it
+      MUST include this TLV in its LSP.  This TLV MUST NOT be included
+      more than once in an LSP.";
+    reference
+      "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+  }
+
+  identity MT_ISN {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 222. TLV is aligned with extended IS reachability TLV
+      type 22 beside an additional two bytes in front at the beginning
+      of the TLV that. indicate MT membership.";
+    reference
+      "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+      System to Intermediate Systems (IS-ISs)";
+  }
+
+  identity MT_IS_NEIGHBOR_ATTRIBUTE {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 223. Is is identical in format to TLV 222. In the
+      event that there is a need to advertise in Extended LSPs such
+      information associated with neighbors of the Originating System,
+      it is necessary to define new TLVs to carry the sub-TLV
+      information.";
+    reference
+      "RFC5311: Simplified Extension of Link State PDU (LSP) Space for
+      IS-IS";
+  }
+
+  identity MULTI_TOPOLOGY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 229. This MT TLV can advertise up to 127 MTs.  It is
+      announced in IIHs and LSP fragment 0, and can occur multiple
+      times.  The resulting MT set SHOULD be the union of all the MT
+      TLV occurrences in the packet. Any other IS-IS PDU occurrence of
+      this TLV MUST be ignored.  Lack of MT TLV in hellos and fragment
+      zero LSPs MUST be interpreted as participation of the
+      advertising interface or router in MT ID #0 only.  If a router
+      advertises MT TLV, it has to advertise all the MTs it
+      participates in, specifically including topology ID #0 also.";
+    reference
+      "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+      System to Intermediate Systems (IS-ISs)";
+  }
+
+  identity IPV6_INTERFACE_ADDRESSES {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 232. IPv6 Interface Address TLV that maps directly to
+      the IP Interface Address TLV in [RFC1195]. We necessarily modify
+      the contents to be 0-15 16-octet IPv6 interface addresses
+      instead of 0-63 4-octet IPv4 interface addresses";
+    reference "RFC5308: Routing IPv6 with IS-IS.";
+  }
+
+  identity MT_IPV4_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 235. TLV is aligned with extended IP reachability TLV
+      type 135 beside an additional two bytes in front to indicate MT
+      membership";
+    reference
+      "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+      System to Intermediate Systems (IS-ISs)";
+  }
+
+  identity IPV6_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 236. The IPv6 Reachability TLV describes network
+      reachability through the specification of a routing prefix,
+      metric information, a bit to indicate if the prefix is being
+      advertised down from a higher level, a bit to indicate if the
+      prefix is being distributed from another routing protocol, and
+      OPTIONALLY the existence of Sub-TLVs to allow for later
+      extension.";
+    reference
+      "RFC5308: Routing IPv6 with IS-IS";
+  }
+
+  identity MT_IPV6_REACHABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 237. TLV is aligned with IPv6 Reachability TLV type
+      236 beside an additional two bytes in front to indicate MT
+      membership.";
+    reference
+      "RFC5120: M-ISIS: Multi Topology (MT) Routing in Intermediate
+      System to Intermediate Systems (IS-ISs).";
+  }
+
+  identity ROUTER_CAPABILITY {
+    base "ISIS_TLV_TYPE";
+    description
+      "ISIS TLV 242. IS-IS TLV named CAPABILITY, formed of multiple
+      sub-TLVs, which allows a router to announce its capabilities
+      within an IS-IS level or the entire routing domain.";
+    reference
+      "RFC4971: Intermediate System to Intermediate System (IS-IS)
+      Extensions for Advertising Router Information.";
+  }
+
+  //sub-TLVs for TLVs 22, 23, 141, 222, 223
+
+  identity IS_REACHABILITY_ADMIN_GROUP {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 3. Administrative group(color).";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering";
+  }
+
+  identity IS_REACHABILITY_LINK_ID {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 4. Link Local/Remote Identifiers.";
+    reference
+      "RFC5307: IS-IS Extensions in Support of Generalized
+      Multi-Protocol Label Switching (GMPLS)";
+  }
+
+  identity IS_REACHABILITY_IPV4_INTERFACE_ADDRESS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 6. IPv4 Interface Address.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_IPV4_NEIGHBOR_ADDRESS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 8. IPv4 Neighbor Address.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_MAX_LINK_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 9. Maximum Link Bandwidth.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_MAX_RESERVABLE_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 10. Maximum Reservable Bandwidth.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_UNRESERVED_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 11. Unreserved bandwidth.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_IPV6_INTERFACE_ADDRESS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 12. IPv6 Interface Address.";
+    reference
+      "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+  }
+
+  identity IS_REACHABILITY_IPV6_NEIGHBOR_ADDRESS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 13. IPv6 Neighbor Address.";
+    reference
+      "RFC6119: IPv6 Traffic Engineering in IS-IS.";
+  }
+
+  identity IS_REACHABILITY_EXTENDED_ADMIN_GROUP {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 14. Extended Administrative Group.";
+    reference
+      "RFC7308: Extended Administrative Groups in MPLS Traffic
+      Engineering (MPLS-TE).";
+  }
+
+  identity IS_REACHABILITY_TE_DEFAULT_METRIC {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 18. TE Default Metric.";
+    reference
+      "RFC5305: IS-IS Extensions for Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_LINK_ATTRIBUTES {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 19. Link Attributes.";
+    reference
+      "RFC5209: Definition of an IS-IS Link Attribute Sub-TLV.";
+  }
+
+  identity IS_REACHABILITY_LINK_PROTECTION_TYPE {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 20. Link Protection Type.";
+    reference
+      "RFC5307: IS-IS Extensions in Support of Generalized
+      Multi-Protocol  Label Switching (GMPLS)";
+  }
+
+  identity IS_REACHABILITY_BANDWIDTH_CONSTRAINTS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 22. Bandwidth Constraints.";
+    reference
+      "RFC4124: Protocol Extensions for Support of Diffserv-aware MPLS
+      Traffic Engineering.";
+  }
+
+  identity IS_REACHABILITY_UNCONSTRAINED_LSP {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 23. Unconstrained LSP.";
+    reference
+      "RFC5330: A Link-Type sub-TLV to Convey the Number of Traffic
+      Engineering Label Switched Paths Signalled with Zero
+      Reserved Bandwidth across a Link.";
+  }
+
+  identity IS_REACHABILITY_ADJ_SID {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 31. Adjacency Segment Identifier.";
+    reference
+      "draft-ietf-isis-segment-routing-extensions.";
+  }
+
+  identity IS_REACHABILITY_ADJ_LAN_SID {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 32. Adjacency LAN Segment Identifier.";
+    reference
+      "draft-ietf-isis-segment-routing-extensions.";
+  }
+
+  identity IS_REACHABILITY_LINK_DELAY {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 33. Unidirectional Link Delay.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_MIN_MAX_LINK_DELAY {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 34. Min/Max Unidirectional Link Delay.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_LINK_DELAY_VARIATION {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 35. Unidirectional Link Delay Variation.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_LINK_LOSS {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 36. Unidirectional Link Loss Delay.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_RESIDUAL_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 37. Unidirectional Residual Bandwidth.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_AVAILABLE_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 38. Unidirectional Available Bandwidth.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  identity IS_REACHABILITY_UTILIZED_BANDWIDTH {
+    base "IS_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 39. Unidirectional Utilized Bandwidth.";
+    reference
+      "RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.";
+  }
+
+  //sub-TLVs for TLVs 135, 235, 236, 237
+  identity IP_REACHABILITY_TAG {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 1. 32-bit Administrative Tag.";
+    reference
+      "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+      Reachability.";
+  }
+
+  identity IP_REACHABILITY_TAG64 {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 2. 64-bit Administrative Tag.";
+    reference
+      "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+      Reachability.";
+  }
+
+  identity IP_REACHABILITY_PREFIX_SID {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 3. Prefix Segment Identifier.";
+    reference
+      "draft-ietf-isis-segment-routing-extension.";
+  }
+
+  identity IP_REACHABILITY_PREFIX_FLAGS {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 4. Prefix Attribute Flags.";
+    reference
+      "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+      Reachability.";
+  }
+
+  identity IP_REACHABILITY_IPV4_ROUTER_ID {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 11. IPv4 Source Router ID.";
+    reference
+      "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+      Reachability.";
+  }
+
+  identity IP_REACHABILITY_IPV6_ROUTER_ID {
+    base "IP_REACHABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 12. IPv6 Source Router ID.";
+    reference
+      "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and IPv6
+      Reachability.";
+  }
+
+
+  //sub-TLVs for TLVs 242
+
+  identity ROUTER_CAPABILITY_SR_CAPABILITY {
+    base "ROUTER_CAPABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 2. Segment Routing Capability.";
+    reference
+      "draft-ietf-isis-segment-routing-extensions.";
+  }
+
+  identity ROUTER_CAPABILITY_SR_ALGORITHM {
+    base "ROUTER_CAPABILITY_SUBTLVS_TYPE";
+    description
+      "sub-TLV 19. Segment Routing Algorithm.";
+    reference
+      "draft-ietf-isis-segment-routing-extensions.";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis-lsp.yang b/models/openconfig/src/main/yang/isis/openconfig-isis-lsp.yang
new file mode 100644
index 0000000..81c48e6
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis-lsp.yang
@@ -0,0 +1,3542 @@
+submodule openconfig-isis-lsp {
+
+  belongs-to openconfig-isis {
+    prefix oc-isis;
+  }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-inet-types { prefix "inet"; }
+  import openconfig-isis-types { prefix "oc-isis-types"; }
+  import openconfig-isis-lsdb-types { prefix "oc-isis-lsdb-types"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-mpls-types { prefix "oc-mpls-types"; }
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net ";
+
+  description
+    "This sub-module describes a YANG model for the IS-IS Link State
+    Database (LSDB).
+
+    Portions of this code were derived from IETF RFCs relating to the
+    IS-IS protocol.
+    Please reproduce this note if possible.
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  typedef isis-metric-flags {
+    type enumeration {
+      enum INTERNAL {
+        description
+          "When this flag is not set, internal metrics are in use.";
+      }
+      enum UNSUPPORTED {
+        description
+          "When this flag (referred to as the S-bit) is set, then
+          the metric is unsupported.";
+      }
+    }
+    description
+      "Type definition for flags used in IS-IS metrics";
+  }
+
+  grouping isis-lsdb-link-characteristics-a-bit {
+    description
+      "Definition of the A bit, as used in IS-IS link delay TLVs.";
+
+    leaf a-bit {
+      type boolean;
+      description
+        "The A bit is set when the measured value of this parameter
+        exceeds its configured maximum threshold. The A bit is cleared
+        when the measured value falls below its configured reuse
+        threshold.";
+    }
+  }
+
+  grouping isis-lsdb-tlv-nlpid-state {
+    description
+      "NLP ID parameters for IS-IS.";
+
+    leaf-list nlpid {
+      type enumeration {
+        enum IPV4 {
+          description "IPv4 Address family.";
+        }
+        enum IPV6 {
+          description "IPv6 Address family.";
+        }
+      }
+      description
+        "Protocol supported. IPv4 is defined as (0xcc) and IPv6 -
+        (0x8e)";
+      reference
+        "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+        Dual Environments. TLV 129. ";
+    }
+  }
+
+  grouping isis-lsdb-subtlv-type-state {
+    description
+      "Per-subTLV type operational state parameters for ISIS.";
+
+    leaf type {
+      type identityref {
+        base oc-isis-lsdb-types:ISIS_SUBTLV_TYPE;
+      }
+      description
+        "The type of subTLV being described. The type of subTLV is
+        expressed as a canonical name.";
+    }
+  }
+
+  grouping isis-lsdb-tlv-type-state {
+    description
+      "Per-subTLV type operational state parameters for ISIS.";
+
+    leaf type {
+      type identityref {
+        base oc-isis-lsdb-types:ISIS_TLV_TYPE;
+      }
+      description
+        "The type of TLV being described. The type of TLV is
+        expressed as a canonical name.";
+    }
+  }
+
+  grouping is-reachability-neighbor-state {
+    description
+      "This grouping defines is-reachability neighbor.";
+
+    container subtlvs {
+      description
+        "This container describes IS Neighbor sub-TLVs.";
+
+      list subtlv {
+        key "type";
+
+        description
+          "List of subTLV types in the LSDB for the specified TLV.";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to the sub-TLV type.";
+        }
+
+        container state {
+          description
+            "State parameters of IS neighbor state";
+
+          uses isis-lsdb-subtlv-type-state;
+        }
+
+        container admin-group {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_ADMIN_GROUP'" {
+            description
+              "Only include the administrative group container when
+              the sub-TLV is type 3";
+          }
+          description
+            "This container defines sub-TLV 3.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 3.";
+
+            leaf-list admin-group {
+              type uint32;
+              description
+                "The administrative group sub-TLV contains a 4-octet
+                bit mask assigned by the network administrator.  Each
+                set bit corresponds to one administrative group
+                assigned to the interface. By convention, the least
+                significant bit is referred to as group 0, and the
+                most significant bit is referred to as group 31.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                sub-TLV 3: TLV 22,23,141,222, 223.";
+            }
+          }
+        }
+
+        container link-id {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_ID'" {
+            description
+              "Only include the link identifier container when the
+              sub-TLV is type 4";
+          }
+          description
+            "This container defines sub-TLV 4.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 4.";
+
+            leaf local {
+              type uint32;
+              description
+                "The value field of this sub-TLV contains 4 octets of
+                Link Local Identifier followed by 4 octets of Link
+                Remote Identifier.";
+              reference
+                "RFC5307: IS-IS Extensions in Support of Generalized
+                Multi-Protocol Label Switching (GMPLS). sub-TLV 3: TLV
+                22,23,141,222, 223.";
+            }
+
+            leaf remote {
+              type uint32;
+              description
+                "If the Link Remote Identifier is unknown, it is set
+                to 0.";
+              reference
+                "RFC5307: IS-IS Extensions in Support of Generalized
+                Multi-Protocol Label Switching (GMPLS). sub-TLV 3: TLV
+                22,23,141,222, 223.";
+            }
+          }
+        }
+
+        container ipv4-interface-address {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_IPV4_INTERFACE_ADDRESS'" {
+            description
+              "Only include the IPv4 interface address group container
+              when the sub-TLV is type 6";
+          }
+          description
+            "This container defines sub-TLV 6.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 6.";
+
+            leaf-list address {
+              type inet:ipv4-address;
+              description
+                "A 4-octet IPv4 address for the interface described by
+                the (main) TLV. This sub-TLV can occur multiple
+                times.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                sub-TLV 6: TLV 22,23,41,222,223.";
+            }
+          }
+        }
+
+        container ipv4-neighbor-address {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_IPV4_NEIGHBOR_ADDRESS'" {
+            description
+              "Only include the IPv4 neighbor address container when
+              the sub-TLV is type 8.";
+          }
+          description
+            "This container defines sub-TLV 8.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 8.";
+
+            leaf-list address {
+              type inet:ipv4-address;
+              description
+                "A single IPv4 address for a neighboring router on
+                this link. This sub-TLV can occur multiple times.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                sub-TLV 8: TLV 22,23, 141,222,223.";
+            }
+          }
+        }
+
+        container max-link-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_MAX_LINK_BANDWIDTH'" {
+            description
+              "Only include the maximum link bandwidth container when
+              the sub-TLV is type 9.";
+          }
+          description
+            "This container defines sub-TLV 9.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 9.";
+
+            leaf bandwidth {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "The maximum bandwidth that can be used on this link
+                in this direction (from the system originating the LSP
+                to its neighbors).  It is encoded in 32 bits in IEEE
+                floating point format.  The units are bytes (not
+                bits!) per second.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                sub-TLV 9: TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container max-reservable-link-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_MAX_RESERVABLE_BANDWIDTH'" {
+            description
+              "Only include the maximum reservable link bandwidth
+              container when the sub-TLV type is 10.";
+          }
+          description
+            "This container defines sub-TLV 10.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 10.";
+
+            leaf bandwidth {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "The maximum amount of bandwidth that can be reserved
+                in this direction on this link.  Note that for
+                oversubscription purposes,  this can be greater than
+                the bandwidth of the link. It is encoded  in 32 bits
+                in IEEE floating point format.  The units are bytes
+                (not bits!) per second.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                Sub-TLV 10: TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container unreserved-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_UNRESERVED_BANDWIDTH'" {
+            description
+              "Only include the unreserved bandwidth container when
+              the sub-TLV type is 11.";
+          }
+          description
+            "This container defines unreserved-bandwidth. The units
+            are bytes per second.";
+
+          reference
+            "RFC5305: IS-IS Extensions for Traffic Engineering. sub-
+            TLV 11: TLV 22,23,141,222,223";
+
+          list setup-priority {
+            key "priority";
+
+            leaf priority {
+              type leafref {
+                path "../state/priority";
+              }
+              description
+                "Reference to the setup priority to which the
+                unreserved bandwidth corresponds.";
+            }
+
+            description
+              "Setup priority (0 through 7) for unreserved
+              bandwidth.";
+
+            container state {
+              description
+                "State parameters of IS Extended Reachability sub-TLV
+                11.";
+
+              leaf priority {
+                type uint8 {
+                  range "0..7";
+                }
+                description
+                  "Setup priority level of 0 through 7 to be used by
+                  Unreserved Bandwidth sub-TLV 11.";
+              }
+
+              leaf bandwidth {
+                type oc-types:ieeefloat32;
+                units "bytes per second";
+                description
+                  "The amount of bandwidth reservable in this
+                  direction on this link. Note that for
+                  oversubscription purposes, this can be greater than
+                  the bandwidth of the link. It contains eight 32-bit
+                  IEEE floating point numbers(one for each priority).
+                  The units are bytes (not bits!) per second. The
+                  values correspond to the bandwidth that can be
+                  reserved with a setup priority of 0 through 7,
+                  arranged in increasing order with priority 0
+                  occurring at the start of the sub-TLV, and priority
+                  7 at the end of the sub-TLV.";
+              }
+            }
+          }
+        }
+
+        container ipv6-interface-address {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_IPV6_INTERFACE_ADDRESS'" {
+            description
+              "Only include the IPv6 interface address when the
+              sub-TLV type is 12.";
+          }
+          description
+            "This container defines sub-TLV 12.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 12.";
+
+            leaf-list address {
+              type inet:ipv6-address;
+              description
+                "Contains a 16-octet IPv6 address for the interface
+                described by the containing  Extended IS Reachability
+                TLV. This sub-TLV can occur multiple times.";
+              reference
+                "RFC6119: IPv6 Traffic Engineering in IS-IS. sub-TLV
+                12: TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container ipv6-neighbor-address {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_IPV6_NEIGHBOR_ADDRESS'" {
+            description
+              "Only include the IPv6 neighbor address when the
+              sub-TLV type is 13.";
+          }
+          description
+            "This container defines sub-TLV 13.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 13.";
+
+            leaf-list address {
+              type inet:ipv6-address;
+              description
+                "Contains a 16-octet IPv6 address for a neighboring
+                router on the link described by the (main) TLV. This
+                sub-TLV can occur multiple times.";
+              reference
+                "RFC6119: IPv6 Traffic Engineering in IS-IS. sub-TLV
+                13: ISIS TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container extended-admin-group {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_EXTENDED_ADMIN_GROUP'" {
+            description
+              "Only include the extended admin group when the
+              sub-TLV type is 14.";
+          }
+          description
+            "This container defines sub-TLV 14.";
+          container state {
+            description
+              "State parameters of sub-TLV 14.";
+
+            leaf-list extended-admin-group {
+              type uint32;
+              description
+                "The extended-admin-group sub-TLV is used in addition
+                to the Administrative Groups when it is desirable to
+                make more than 32 colors available for advertisement
+                in a network.";
+              reference
+                "RFC7308: Extended Administrative Groups in MPLS
+                Traffic Engineering (MPLS-TE). sub-TLV 14: TLV
+                22,23,141,222,223.";
+            }
+          }
+        }
+
+        container te-default-metric {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_TE_DEFAULT_METRIC'" {
+            description
+              "Only include the default traffic engineering metric
+              container when the sub-TLV type is 18.";
+          }
+          description
+            "This container defines sub-TLV 18.";
+          container state {
+            description
+              "State parameters of sub-TLV 18.";
+
+            leaf metric {
+              type uint32;
+              description
+                "This metric is administratively assigned and can be
+                used to present a differently weighted topology to
+                traffic engineering SPF calculations. To preclude
+                overflow within a traffic engineering SPF
+                implementation, all metrics greater than or equal to
+                MAX_PATH_METRIC SHALL be considered to have a metric
+                of MAX_PATH_METRIC.";
+              reference
+                "RFC5305: IS-IS Extensions for Traffic Engineering.
+                sub-TLV 18: TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container link-attributes {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_ATTRIBUTES'" {
+            description
+              "Only include the link attributes container when the
+              sub-TLV is type 19.";
+          }
+          description
+            "This container defines link-attributes.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              19.";
+
+            leaf-list local-protection {
+              type enumeration {
+                enum LOCAL_PROTECTION {
+                  description
+                    "If set, local protection is available for the
+                    link.";
+                }
+                enum LINK_EXCLUDED {
+                  description
+                    "If set, the link is excluded from local
+                    protection.";
+                }
+              }
+              description
+                "Link local-protection attributes.";
+
+              reference
+                "RFC5029: Definition of an IS-IS Link Attribute Sub-
+                TLV. TLV 22, sub-TLV 19.";
+            }
+          }
+        }
+
+        container link-protection-type {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_PROTECTION_TYPE'" {
+            description
+              "Only include the link protection type container when
+              the sub-TLV type 20.";
+          }
+          description
+            "ISIS LSDB parameters relating to the type of link
+            protection offered.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 20.";
+
+            leaf-list type {
+              type enumeration {
+                enum EXTRA_TRAFFIC {
+                  description
+                    "If set the link has extra traffic protection. If
+                    the link is of type Extra Traffic, it means that
+                    the link is protecting another link or links. The
+                    LSPs on a link of this type will be lost if any of
+                    the links it is protecting fail.";
+                }
+                enum UNPROTECTED {
+                  description
+                    "If set, the link is unprotected. If the link is
+                    of type Unprotected, it means that there is no
+                    other link protecting this link.  The LSPs on a
+                    link of this type will be lost if the link
+                    fails.";
+                }
+                enum SHARED {
+                  description
+                    "If set, the link has shared protection. If the
+                    link is of type Shared, it means that there are
+                    one or more disjoint links of type Extra Traffic
+                    that are protecting this link.  These Extra
+                    Traffic links are shared between one or more links
+                    of type Shared.";
+                }
+                enum ONE_ONE {
+                  description
+                    "If set, the link has dedicated 1:1 protection. If
+                    the link is of type Dedicated 1:1, it means that
+                    there is one dedicated disjoint link of type Extra
+                    Traffic that is protecting this link.";
+                }
+                enum PLUS_ONE {
+                  description
+                    "If set, the link has dedicated 1+1 protection. If
+                    the link is of type Dedicated 1+1, it means that a
+                    dedicated disjoint link is protecting this link.
+                    However, the protecting link is not advertised in
+                    the link state database and is therefore not
+                    available for the routing of LSPs.";
+                }
+                enum ENHANCED {
+                  description
+                    "If set the link has enhanced protection.  If the
+                    link is of type Enhanced, it means that a
+                    protection scheme that is more reliable than
+                    Dedicated 1+1, e.g., 4 fiber BLSR/MS-SPRING, is
+                    being used to protect this link.";
+                }
+              }
+              description
+                "Link protection capabilities.";
+              reference
+                "RFC5307: IS-IS Extensions in Support of Generalized
+                Multi-Protocol  Label Switching (GMPLS). sub-TLV 20:
+                TLV 22,23,141,222,223.";
+            }
+          }
+        }
+
+        container bandwidth-constraints {
+          when "../state/type =" +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_BANDWIDTH_CONSTRAINTS'" {
+            description
+              "Only include the bandwidth constraints container when
+              the sub-TLV is type 22.";
+          }
+          description
+            "This container defines bandwidth-constraints. For DS-TE,
+            the existing Maximum Reservable link bandwidth parameter
+            is retained, but its semantics is generalized and
+            interpreted as the aggregate bandwidth constraint across
+            all Class-Types";
+
+          reference
+            "RFC4124: Protocol Extensions for Support of Diffserv-
+            aware MPLS Traffic Engineering. sub-TLV 22: TLV 22, 23,
+            141, 222,223";
+
+          list bandwidth-constraint {
+            key "model-id";
+
+            description
+              "List of the Bandwidth Constraints sub-TLV instances
+              present in the TLV.";
+
+            leaf model-id {
+              type leafref {
+                path "../state/model-id";
+              }
+              description
+                "Reference to the model ID associated with the
+                instance of the Bandwidth Constraints sub-TLV.";
+            }
+
+            container state {
+              description
+                "State parameters of IS Extended Reachability sub-TLV
+                22.";
+
+              leaf model-id {
+                type uint8;
+                description
+                  "Identifier for the Bandwidth Constraints  Model
+                  currently in use by the LSR initiating the IGP
+                  advertisement.";
+              }
+            }
+
+            container constraints {
+              description
+                "Constraints contained within the Bandwidth
+                Constraints sub-TLV";
+
+              list constraint {
+                key "constraint-id";
+
+                description
+                  "List of the constraints within the Bandwidth
+                  Constraints sub-TLV. The BC0 level is indicated by
+                  the constraint-id leaf being set to 0, with BCN
+                  being indicated by constraint-id N.";
+
+                leaf constraint-id {
+                  type leafref {
+                    path "../state/constraint-id";
+                  }
+                  description
+                    "Reference to the unique ID for the BCN level.";
+                }
+
+                container state {
+                  description
+                    "Operational state parameters of the BCN level";
+
+                  leaf constraint-id {
+                    type uint32;
+                    description
+                      "Unique reference for the bandwidth constraint level. BC0
+                      is indicated by this leaf being set to zero, with BCN
+                      represented by this leaf being set to N.";
+                  }
+
+                  leaf bandwidth {
+                    type oc-types:ieeefloat32;
+                    units "bytes per second";
+                    description
+                      "The bandwidth constraint, expressed as a 32-bit IEEE
+                      floating point number expressed in bytes per second.";
+                  }
+                }
+              }
+            }
+          }
+        }
+
+        container unconstrained-lsp {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_UNCONSTRAINED_LSP'" {
+            description
+              "Only include the unconstrained LSP container when the
+              sub-TLV is type 23.";
+          }
+          description
+            "This container defines sub-TLV 23.";
+          container state {
+            description
+              "State parameters of sub-TLV 23.";
+
+            uses isis-lsdb-subtlv-type-state;
+
+            leaf count {
+              type uint16;
+              description
+                "Unconstrained TE LSP count(TE Label Switched Paths
+                (LSPs) signalled with zero bandwidth).";
+              reference
+                "RFC5330: A Link-Type sub-TLV to Convey the Number of
+                Traffic Engineering Label Switched Paths Signalled
+                with Zero Reserved Bandwidth across a Link. sub-TLV
+                23: TLV 22,23,141,222,223";
+            }
+          }
+        }
+
+        container adjacency-sids {
+          when "../state/type =   'oc-isis-lsdb-types:IS_REACHABILITY_ADJ_SID'" {
+            description
+              "Only include the adjacency SIDs container when the
+              sub-TLV type is 31";
+          }
+
+          description
+            "This container defines segment routing adjacency SIDs.";
+
+          list adjacency-sid {
+            key "value";
+
+            description
+              "Adjacency Segment-IDs List. An IGP-Adjacency Segment is
+              an IGP segment attached to a unidirectional adjacency or
+              a set of unidirectional adjacencies. By default, an IGP-
+              Adjacency Segment is local to the node which advertises
+              it.";
+
+            leaf value {
+              type leafref {
+                path "../state/value";
+              }
+              description
+                "Reference to the value of the Adjacency-SID.";
+            }
+
+            container state {
+              description
+                "State parameters of Adjacency-SID.";
+
+              leaf value {
+                type uint32;
+                description
+                  "Adjacency-SID value.";
+              }
+
+              leaf-list flags {
+                type enumeration {
+                  enum ADDRESS_FAMILY {
+                    description
+                      "Address-family flag. When unset, the Adj-SID
+                      refers to an adjacency with outgoing IPv4
+                      encapsulation. If set then the Adj-SID refers to
+                      an adjacency with outgoing IPv6 encapsulation.";
+                  }
+                  enum BACKUP {
+                    description
+                      "Backup flag. When set, the Adj-SID refers to an
+                      adjacency being protected (e.g.: using IPFRR or
+                      MPLS-FRR).";
+                  }
+                  enum VALUE {
+                    description
+                      "Value flag. When set, the SID carries a value
+                      (instead of an index). By default the flag is
+                      SET.";
+                  }
+                  enum LOCAL {
+                    description
+                      "Local flag. When set, the value/index carried
+                      by the SID has local significance. By default
+                      the flag is SET.";
+                  }
+                  enum SET {
+                    description
+                      "Set flag. When set, the S-Flag indicates that
+                      the Adj-SID refers to a set of adjacencies.";
+                  }
+                }
+                description
+                  "Flags associated with Adj-Segment-ID.";
+              }
+
+              leaf weight {
+                type uint8;
+                description
+                  "Value that represents the weight of the Adj-SID for
+                  the purpose of load balancing.";
+              }
+            }
+          }
+
+          reference
+            "draft-ietf-isis-segment-routing-extensions. sub-TLV 31:
+            TLV 22, 222, 223, 141. ";
+        }
+
+        container lan-adjacency-sids {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_ADJ_LAN_SID'" {
+            description
+              "Only include the LAN adjacency SID container when
+              the sub-TLV is type 32.";
+          }
+          description
+            "This container defines segment routing LAN adjacency
+            SIDs";
+
+          list lan-adjacency-sid {
+            key "value";
+
+            description
+              "Adjacency Segment-IDs List. An IGP-Adjacency Segment is
+              an IGP segment attached to a unidirectional adjacency or
+              a set of unidirectional adjacencies. By default, an IGP-
+              Adjacency Segment is local to the node which advertises
+              it.";
+
+            leaf value {
+              type leafref {
+                path "../state/value";
+              }
+              description
+                "Reference to the value of the LAN Adjacency-SID.";
+            }
+
+            container state {
+              description
+                "State parameters of LAN Adjacency-SID.";
+
+              leaf value {
+                type uint32;
+                description
+                  "LAN Adjacency-SID value.";
+              }
+
+              leaf-list flags {
+                type enumeration {
+                  enum ADDRESS_FAMILY {
+                    description
+                      "Address-family flag. When unset, the Adj-SID
+                      refers to an adjacency with outgoing IPv4
+                      encapsulation. If set then the Adj-SID refers to
+                      an adjacency with outgoing IPv6 encapsulation.";
+                  }
+                  enum BACKUP {
+                    description
+                      "Backup flag. When set, the Adj-SID refers to an
+                      adjacency being protected (e.g.: using IPFRR or
+                      MPLS-FRR).";
+                  }
+                  enum VALUE {
+                    description
+                      "Value flag. When set, the SID carries a value
+                      (instead of an index). By default the flag is
+                      SET.";
+                  }
+                  enum LOCAL {
+                    description
+                      "Local flag. When set, the value/index carried
+                      by the SID has local significance. By default
+                      the flag is SET.";
+                  }
+                  enum SET {
+                    description
+                      "Set flag. When set, the S-Flag indicates that
+                      the Adj-SID refers to a set of adjacencies.";
+                  }
+                }
+                description
+                  "Flags associated with LAN-Adj-Segment-ID.";
+              }
+
+              leaf weight {
+                type uint8;
+                description
+                   "Value that represents the weight of the Adj-SID
+                   for the purpose of load balancing.";
+              }
+
+              leaf neighbor-id {
+                type oc-isis-types:system-id;
+                description
+                  "System ID of the neighbor associated with the LAN-
+                  Adj-Segment-ID value.";
+              }
+            }
+          }
+
+          reference
+            "draft-ietf-isis-segment-routing-extensions. sub-TLV 32:
+            TLV 22, 222, 223, 141.";
+        }
+
+        container link-delay {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_DELAY'" {
+            description
+              "Include the link delay container only when the sub-TLV
+              type is type 33.";
+          }
+          description
+            "This container defines unidirectional link delay.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 33: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              33.";
+
+            uses isis-lsdb-link-characteristics-a-bit;
+
+            leaf delay {
+              type uint32;
+              units microseconds;
+              description
+                "Average link delay value (in microseconds) between
+                two directly connected IS-IS neighbors over a
+                configurable interval.";
+            }
+          }
+        }
+
+        container min-max-link-delay {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_MIN_MAX_LINK_DELAY'" {
+            description
+              "Only include the min/max link delay container when the
+              sub-TLV is type 34.";
+          }
+          description
+            "This container defines min/max link delay.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 34: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              34.";
+
+            uses isis-lsdb-link-characteristics-a-bit;
+
+            leaf min-delay {
+              type uint32;
+              units microseconds;
+              description
+                "Minimum measured link delay value(in microseconds)
+                between two directly connected IS-IS neighbors over a
+                configurable interval.";
+            }
+
+            leaf max-delay {
+              type uint32;
+              units microseconds;
+              description
+                "Maximum measured link delay value(in microseconds)
+                between two directly connected IS-IS neighbors over a
+                configurable interval.";
+            }
+          }
+        }
+
+        container link-delay-variation {
+          when "../state/type = " +
+                "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_DELAY_VARIATION'" {
+            description
+              "Only include the link delay variation container when
+              the sub-TLV is type 35.";
+          }
+          description
+            "This container defines unidirectional link delay
+            variation.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 35: TLV 22,23,141,222,223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              35.";
+
+            leaf delay {
+              type uint32;
+              units microseconds;
+              description
+                "Average link delay between two directly connected IS-
+                IS neighbors over a configurable interval.";
+            }
+          }
+        }
+
+        container link-loss {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_LINK_LOSS'" {
+            description
+              "Only include the link loss container when the sub-TLV
+              is type 36.";
+          }
+          description
+            "This container defines unidirectional link loss delay.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 36: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              36.";
+
+            uses isis-lsdb-link-characteristics-a-bit;
+
+            leaf link-loss {
+              type uint32;
+              description
+                "Link packet loss as a percentage of the total traffic
+                sent over a configurable interval. The basic unit is
+                0.000003%, where (2^24 - 2) is 50.331642%. This value
+                is the highest packet-loss percentage that can be
+                expressed (the assumption being that precision is more
+                important on high-speed links than the ability to
+                advertise loss rates greater than this, and that high-
+                speed links with over 50% loss are unusable).
+                Therefore, measured values that are larger than the
+                field maximum SHOULD be encoded as the maximum
+                value.";
+            }
+          }
+        }
+
+        container residual-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_RESIDUAL_BANDWIDTH'" {
+            description
+              "Only include the resdiual bandwidth container when the
+              sub-TLV is type 37.";
+          }
+          description
+            "This container defines unidirectional residual
+            bandwidth.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 37: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              37.";
+
+            leaf bandwidth {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "Residual bandwidth on a link,forwarding adjacency
+                [RFC4206], or bundled link in IEEE floating-point
+                format with units of bytes per second. For a link or
+                forwarding adjacency, residual bandwidth is defined to
+                be the Maximum Bandwidth [RFC5305] minus the bandwidth
+                currently allocated to RSVP-TE label switched paths.
+                For a bundled link, residual bandwidth is defined to
+                be the sum of the component link residual
+                bandwidths.";
+            }
+          }
+        }
+
+        container available-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_AVAILABLE_BANDWIDTH'" {
+            description
+              "Only include the available bandwdith container when the
+              sub-TLV is type 38.";
+          }
+          description
+            "This container defines unidirectional lavailable
+            bandwidth.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 38: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              38.";
+
+            uses isis-lsdb-subtlv-type-state;
+
+            leaf bandwidth {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "The available bandwidth on a link, forwarding
+                adjacency, or bundled link in IEEE floating-point
+                format with units of bytes per second. For a link or
+                forwarding adjacency, available bandwidth is defined
+                to be residual bandwidth minus the measured bandwidth
+                used for the actual forwarding of non-RSVP-TE label
+                switched path packets.  For a bundled link, available
+                bandwidth is defined to be the sum of the component
+                link available bandwidths minus the measured bandwidth
+                used for the actual forwarding of non-RSVP-TE label
+                switched path packets.  For a bundled link, available
+                bandwidth is defined to be the sum of the component
+                link available bandwidths.";
+            }
+          }
+        }
+
+        container utilized-bandwidth {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_REACHABILITY_UTILIZED_BANDWIDTH'" {
+            description
+              "Only include the utilized bandwidth container when the
+              TLV is type 39.";
+          }
+          description
+            "This container defines unidirectional utilized
+            bandwidth.";
+
+          reference
+            "RFC7810: IS-IS Traffic Engineering (TE) Metric
+            Extensions. sub-TLV 39: TLV 22, 23, 141, 222, 223.";
+
+          container state {
+            description
+              "State parameters of IS Extended Reachability sub-TLV
+              39.";
+
+            uses isis-lsdb-subtlv-type-state;
+
+            leaf bandwidth {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "The bandwidth utilization on a link, forwarding
+                adjacency, or bundled link in IEEE floating-point
+                format with units of bytes per second.  For a link or
+                forwarding adjacency, bandwidth utilization represents
+                the actual utilization of the link (i.e., as measured
+                by the advertising node).  For a bundled link,
+                bandwidth utilization is defined to be the sum of the
+                component link bandwidth utilizations.";
+            }
+          }
+        }
+      }
+    }
+
+    uses isis-lsdb-undefined-subtlv;
+  }
+
+  grouping isis-lsdb-undefined-tlv {
+    description
+      "Grouping for unknown TLVs in the IS-IS LSDB";
+
+    container undefined-tlvs {
+      description
+        "Surrounding container for a list of unknown TLVs.";
+
+      list undefined-tlv {
+        key "type";
+        description
+          "List of TLVs that are not defined within the model, or are
+          not recognised by the system.";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to the undefined TLV's type";
+        }
+
+        container state {
+          description
+            "State parameters of the undefined TLV.";
+
+          uses undefined-tlv-state;
+        }
+      }
+    }
+  }
+
+  grouping isis-lsdb-undefined-subtlv {
+    description
+      "Grouping for unknown Sub-TLVs in the IS-IS LSDB.";
+
+    container undefined-subtlvs {
+      description
+        "This container describes undefined ISIS TLVs.";
+
+      list undefined-subtlv {
+        key "type";
+
+        description
+          "Sub-TLVs that are not defined in the model or not
+          recognised by system.";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to the type of the undefined sub-TLV";
+        }
+
+        container state {
+          description
+            "State parameters of the undefined sub-TLV.";
+
+          uses undefined-subtlv-state;
+        }
+      }
+    }
+  }
+
+  grouping isis-lsdb-prefix-state {
+    description
+      "This grouping defines prefix reachability.";
+
+     container subtlvs {
+      description
+        "This container describes IS prefix sub-TLVs.";
+
+      list subtlv {
+        key "type";
+
+        description
+          "List of subTLV types in the LSDB for the specified TLV.";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to the sub-TLV type";
+        }
+
+        container state {
+          description
+            "State parameters for a prefix.";
+
+          uses isis-lsdb-subtlv-type-state;
+        }
+
+      container tag {
+        when "../state/type = " +
+             "'oc-isis-lsdb-types:IP_REACHABILITY_TAG'" {
+          description
+            "Only include the tag container when the sub-TLV is type
+            1.";
+        }
+        description
+          "This container defines sub-TLV 1.";
+
+        container state {
+          description
+            "State parameters of sub-TLV 1.";
+
+          leaf-list tag32 {
+            type uint32;
+            description
+              "List of 32-bit tags associated with the prefix. Example
+              uses of these tags include carrying BGP standard (or
+              extended) communities and controlling redistribution
+              between levels and areas, different routing protocols,
+              or multiple instances of IS-IS running on the same
+              router.";
+            reference
+              "RFC5130: A Policy Control Mechanism in IS-IS Using
+              Administrative Tags. sub-TLV 1.";
+          }
+        }
+      }
+
+      container tag64 {
+        when "../state/type = " +
+             "'oc-isis-lsdb-types:IP_REACHABILITY_TAG64'" {
+          description
+            "Only include the tag64 container when the sub-TLV is type
+            2.";
+        }
+        description
+          "This container defines sub-TLV 2.";
+
+        container state {
+          description
+            "State parameters of sub-TLV 2.";
+
+          leaf-list tag64 {
+            type uint64;
+            description
+              "List of 64-bit tags associated with the prefix. Example
+              uses of these tags include carrying BGP standard (or
+              extended) communities and controlling redistribution
+              between levels and areas, different routing protocols,
+              or multiple instances of IS-IS running on the same
+              router.";
+            reference
+              "RFC5130: A Policy Control Mechanism in IS-IS Using
+              Administrative Tags. sub-TLV 2.";
+          }
+        }
+      }
+
+      container flags {
+        when "../state/type = " +
+             "'oc-isis-lsdb-types:IP_REACHABILITY_PREFIX_FLAGS'" {
+          description
+            "Only include the flags container when the sub-TLV is type
+            4.";
+        }
+        description
+          "This container defines sub-TLV 4.";
+
+        container state {
+          description
+            "State parameters of sub-TLV 4.";
+
+          uses isis-lsdb-subtlv-type-state;
+
+          leaf-list flags {
+            type enumeration {
+              enum EXTERNAL_FLAG {
+                description
+                  "External prefix flag. Set if the prefix has been
+                  redistributed from another protocol. This includes
+                  the case where multiple virtual routers are
+                  supported and the source of the redistributed prefix
+                  is another IS-IS instance.";
+              }
+              enum READVERTISEMENT_FLAG {
+                description
+                  "Readvertisement flag. Set when the prefix has been
+                  leaked from one level to another (upwards or
+                  downwards).";
+              }
+              enum NODE_FLAG {
+                description
+                  "Node flag. Set when the prefix identifies the
+                  advertising router, i.e., the prefix is a host
+                  prefix advertising  a globally reachable address
+                  typically associated with a loopback address.";
+              }
+            }
+            description
+              "Additional prefix reachability flags.";
+
+            reference
+              "RFC7794: IS-IS Prefix Attributes for Extended IPv4 and
+              IPv6 Reachability. sub-TLV 4.";
+            }
+          }
+        }
+
+        container ipv4-source-router-id {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IP_REACHABILITY_IPV4_ROUTER_ID'" {
+            description
+              "Only include the IPv4 Source Router ID container when
+              the sub-TLV is type 11.";
+          }
+          description
+            "This container defines sub-TLV 11.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 11.";
+
+            uses isis-lsdb-subtlv-type-state;
+
+            leaf router-id {
+              type inet:ipv4-address;
+              description
+                "IPv4 Source router ID address. In cases where the
+                advertisement is an identifier for the advertising
+                router (e.g., with the N-flag set in the Prefix
+                Attribute Flags sub-TLV), it may be useful for other
+                routers to know the source of the advertisement. When
+                reachability advertisement is leaked from one level to
+                another, Router ID advertised is always the Router ID
+                of the IS-IS instance that originated the
+                advertisement. This would be true even if the prefix
+                had been learned from another protocol.";
+              reference
+                "RFC7794: IS-IS Prefix Attributes for Extended IPv4
+                and IPv6 Reachability. sub-TLV 11";
+            }
+          }
+        }
+
+        container ipv6-source-router-id {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IP_REACHABILITY_IPV6_ROUTER_ID'" {
+            description
+              "Only include the IPv6 Source Router ID container when
+              the sub-TLV is type 12.";
+          }
+          description
+            "This container defines sub-TLV 12.";
+
+          container state {
+            description
+              "State parameters of sub-TLV 12.";
+
+            uses isis-lsdb-subtlv-type-state;
+
+            leaf router-id {
+              type inet:ipv6-address;
+              description
+                "IPv6 Source router ID address. In cases where the
+                advertisement is an identifier for the advertising
+                router (e.g., with the N-flag set in the Prefix
+                Attribute Flags sub-TLV), it may be useful for other
+                routers to know the source of the advertisement. When
+                reachability advertisement is leaked from one level to
+                another, Router ID advertised is always the Router ID
+                of the IS-IS instance that originated the
+                advertisement. This would be true even if the prefix
+                had been learned from another protocol.";
+              reference
+                "RFC7794: IS-IS Prefix Attributes for Extended IPv4
+                and IPv6 Reachability. sub-TLV 12.";
+            }
+          }
+        }
+
+        uses isis-lsdb-prefix-sid-state;
+      }
+    }
+
+    uses isis-lsdb-undefined-subtlv;
+  }
+
+  grouping isis-lsdb-prefix-sid-state {
+    description
+      "This grouping defines ISIS Prefix SID.";
+
+    container prefix-sids {
+      when "../state/type = " +
+           "'oc-isis-lsdb-types:IP_REACHABILITY_PREFIX_SID'" {
+        description
+          "Only include the Prefix SID container when
+          the sub-TLV is type 3.";
+      }
+      description
+        "This container defines segment routing extensions for
+        prefixes.";
+
+      reference
+        "draft-ietf-isis-segment-routing-extensions. sub-TLV 3: TLV
+        135, 235, 236, 237.";
+
+      list prefix-sid {
+        key "value";
+
+        description
+         "Prefix Segment-ID list. IGP-Prefix Segment is an IGP segment
+         attached to an IGP prefix. An IGP-Prefix Segment is global
+         (unless explicitly advertised otherwise) within the SR/IGP
+         domain.";
+
+        leaf value {
+          type leafref {
+            path "../state/value";
+          }
+          description
+            "Reference to the value of the prefix SID.";
+        }
+
+        container state {
+          description
+            "State parameters for Prefix-SID.";
+
+          leaf value {
+            type uint32;
+            description
+              "IGP Prefix-SID value.";
+          }
+
+          leaf-list flags {
+            type enumeration {
+              enum READVERTISEMENT {
+                description
+                  "Readvertisment flag. When set, the prefix to which
+                  this Prefix-SID is attached, has been propagated by
+                  the router either from another level or from
+                  redistribution.";
+              }
+              enum NODE {
+                description
+                  "Node flag. When set, the Prefix-SID refers to the
+                  router identified by the prefix. Typically, the
+                  N-Flag is set on Prefix-SIDs attached to a router
+                  loopback address.";
+              }
+              enum NO_PHP {
+                description
+                  "Penultimate-Hop-Popping flag. When set, then the
+                  penultimate hop MUST NOT pop the Prefix-SID before
+                  delivering the packet to the node that advertised
+                  the Prefix-SID.";
+              }
+              enum EXPLICIT_NULL {
+                description
+                  "Explicit-Null flag. When set, any upstream neighbor
+                  of the Prefix-SID originator MUST replace the
+                  Prefix-SID with a Prefix-SID having an Explicit-NULL
+                  value (0 for IPv4 and 2 for IPv6) before forwarding
+                  the packet.";
+              }
+              enum VALUE {
+                description
+                  "Value flag. When set, the Prefix-SID carries a
+                  value (instead of an index). By default the flag is
+                  UNSET.";
+              }
+              enum LOCAL {
+                description
+                  "Local flag. When set, the value/index carried by
+                  the Prefix-SID has local significance. By default
+                  the flag is UNSET.";
+              }
+            }
+            description
+              "Flags associated with Prefix Segment-ID.";
+          }
+
+          leaf algorithm {
+            type uint8;
+            description
+              "Prefix-SID algorithm to be used for path computation.";
+          }
+        }
+      }
+    }
+  }
+
+  grouping isis-lsdb-common-metric-specification {
+    description
+      "Common definitions of the metric in IS-IS.";
+
+    container default-metric {
+      description
+        "This container defines ISIS Default Metric.";
+
+      container state {
+        description
+          "State parameters for default-metric.";
+
+        leaf flags {
+          type enumeration {
+            enum INTERNAL {
+              description
+                "When set to zero, indicates internal metrics.";
+            }
+          }
+          description
+            "ISIS Default-Metric Flags.";
+        }
+
+        leaf metric {
+          type oc-isis-types:narrow-metric;
+          description
+            "ISIS default metric value. This is a metric understood by
+            every Intermediate system in the domain. Each circuit
+            shall have a positive  integral value assigned for this
+            metric. The value may be associated with any  objective
+            function of the circuit, but by convention is intended to
+            measure the capacity of the circuit for handling traffic,
+            for example, its throughput in  bits-per-second. Higher
+            values indicate a lower capacity.";
+        }
+      }
+    }
+
+    container delay-metric {
+     description
+       "This container defines the ISIS delay metric.";
+
+      container state {
+        description
+          "State parameters of delay-metric.";
+
+        leaf metric {
+          type oc-isis-types:narrow-metric;
+          description
+            "ISIS delay metric value. This metric measures the transit
+            delay of the associated circuit. It is an optional metric,
+            which if assigned to a circuit shall have a positive
+            integral value. Higher values indicate a longer transit
+            delay.";
+        }
+
+        leaf-list flags {
+          type isis-metric-flags;
+          description
+            "ISIS Delay Metric Flags.";
+        }
+      }
+    }
+
+    container expense-metric {
+      description
+        "This container defines the ISIS expense metric.";
+
+      container state {
+        description
+          "State parameters of expense-metric.";
+
+        leaf metric {
+          type oc-isis-types:narrow-metric;
+          description
+            "ISIS expense metric value. This metric measures the
+            monetary cost of utilising the associated circuit. It is
+            an optional metric, which if assigned to a circuit shall
+            have a positive integral value1). Higher values indicate a
+            larger monetary expense.";
+        }
+
+        leaf-list flags {
+          type isis-metric-flags;
+          description
+            "ISIS Expense Metric Flags.";
+        }
+      }
+    }
+
+    container error-metric {
+      description
+        "This container defines the ISIS error metric.";
+
+      container state {
+        description
+          "State parameters of error-metric.";
+
+        leaf metric {
+          type oc-isis-types:narrow-metric;
+          description
+            "ISIS error metric value. This metric measures the
+            residual error probability of the associated circuit. It
+            is an optional metric, which if assigned to a circuit
+            shall have a non-zero value. Higher values indicate a
+            larger probability of undetected errors on the circuit.";
+        }
+
+        leaf-list flags {
+          type isis-metric-flags;
+          description
+            "IS-IS error metric flags.";
+        }
+      }
+    }
+  }
+
+  grouping isis-lsdb-neighbor {
+    description
+      "This grouping defines attributes of an ISIS standard
+      neighbor.";
+
+    container state {
+      description
+        "State parameters of IS standard neighbor.";
+
+      leaf system-id {
+        type oc-isis-types:system-id;
+        description
+          "System-ID of IS neighbor.";
+      }
+    }
+
+    uses isis-lsdb-common-metric-specification;
+
+  }
+
+  grouping ipv4-prefix-attributes-state {
+   description
+     "This group defines attributes of an IPv4 standard prefix.";
+
+    container state {
+     description
+       "State parameters of IPv4 standard prefix.";
+
+      leaf up-down {
+        type boolean;
+        description
+          "The up/down bit. Set if a prefix is advertised from a
+          higher level to a lower level (e.g., level 2 to level 1),
+          indicating that the prefix has traveled down the hierarchy.
+          Prefixes that have the up/down bit set may only be
+          advertised down the hierarchy, i.e., to lower levels. When a
+          prefix is first injected into IS-IS, the bit is UNSET.";
+      }
+
+      leaf prefix {
+        type inet:ipv4-prefix;
+        description
+          "IPv4 prefix contained within reachability TLVs.";
+      }
+    }
+
+    uses isis-lsdb-common-metric-specification;
+  }
+
+  grouping isis-lsdb-common-mt-id {
+    description
+      "Common definition of the multi-topology ID";
+
+    leaf mt-id {
+      type uint16 {
+        range "0..4095";
+      }
+      description
+        "Multi-topology ID";
+    }
+  }
+
+  grouping ipv4-prefix-extended-state {
+    description
+      "This grouping defines attributes of an IPv4 extended prefix.";
+
+    container state {
+      description
+        "State parameters of an IPv4 extended prefix.";
+      uses ipv4-prefix-extended-params-state;
+    }
+
+    uses isis-lsdb-prefix-state;
+  }
+
+  grouping ipv4-mt-prefix-extended-state {
+    description
+      "State parameters that relate to an IPv4 prefix in a
+      multi-topology context.";
+
+    container state {
+      description
+        "State parameters of an IPv4 extended prefix.";
+      uses ipv4-prefix-extended-params-state;
+      uses isis-lsdb-common-mt-id;
+    }
+
+    uses isis-lsdb-prefix-state;
+  }
+
+  grouping ipv4-prefix-extended-params-state {
+    description
+      "State parameters that relate to an IPv4 prefix";
+
+    leaf up-down {
+      type boolean;
+      description
+        "The up/down bit. Set if a prefix is advertised from a
+        higher level to a lower level (e.g., level 2 to level 1),
+        indicating that the prefix has traveled down the hierarchy.
+        Prefixes that have the up/down bit set may only be
+        advertised down the hierarchy, i.e., to lower levels. When a
+        prefix is first injected into IS-IS, the bit is UNSET.";
+    }
+
+    leaf s-bit {
+      type boolean;
+      description
+        "The Sub-TLV present bit. If UNSET, the octets of Sub-TLVs
+        are not present. Otherwise, the bit is set and the octet
+        following the prefix will contain the length of the Sub-TLV
+        portion of the structure.";
+    }
+
+    leaf prefix {
+      type inet:ipv4-prefix;
+      description
+        "IPv4 prefix contained within extended reachability TLVs.";
+    }
+
+    leaf metric {
+      type oc-isis-types:wide-metric;
+      description
+        "ISIS metric value.";
+    }
+  }
+
+  grouping ipv6-prefix-extended-state {
+    description
+      "State parameters relating to an IPv6 prefix.";
+
+    container state {
+      description
+        "State parameters of IPv6 prefix attributes";
+
+      uses ipv6-prefix-extended-params-state;
+    }
+
+    uses isis-lsdb-prefix-state;
+  }
+
+  grouping ipv6-mt-prefix-extended-state {
+    description
+      "State parameters relating to a multi-topology IPv6
+      prefix.";
+
+    container state {
+      description
+        "State parameters relating an IPv6 prefix attribute";
+      uses ipv6-prefix-extended-params-state;
+      uses isis-lsdb-common-mt-id;
+    }
+
+    uses isis-lsdb-prefix-state;
+  }
+
+  grouping ipv6-prefix-extended-params-state {
+    description
+      "Common parameters of an IPv6 extended prefix.";
+
+    leaf up-down {
+      type boolean;
+      description
+        "The up/down bit. Set if a prefix is advertised from a
+        higher level to a lower level (e.g., level 2 to level 1),
+        indicating that the prefix has traveled down the hierarchy.
+        Prefixes that have the up/down bit set may only be
+        advertised down the hierarchy, i.e., to lower levels. When a
+        prefix is first injected into IS-IS, the bit is UNSET.";
+    }
+
+    leaf x-bit {
+      type boolean;
+      description
+        "The external bit. Set when the prefix was distributed into
+        IS-IS from another routing protocol.";
+    }
+
+    leaf s-bit {
+      type boolean;
+      description
+        "The sub-tlv present bit. If UNSET, the octets of Sub-TLVs
+         are not present. Otherwise, the bit is set and the octet
+         following the prefix will contain the length of the Sub-TLV
+         portion of the structure.";
+    }
+
+    leaf prefix {
+      type inet:ipv6-prefix;
+      description
+        "IPv6 prefix contained within extended reachability TLVs.";
+    }
+
+    leaf metric {
+      type oc-isis-types:wide-metric;
+      description
+        "ISIS metric value.";
+    }
+  }
+
+  grouping mt-isis-neighbor {
+    description
+      "This grouping defines list of ISIS multi-topology neighbors for
+      extended ISIS LSP(multiple system IDs).";
+
+     container state {
+      description
+        "State parameters of MT neighbor.";
+
+      leaf mt-id {
+        type uint16 {
+          range "0..4095";
+        }
+        description
+          "Identifier of a topology being announced.";
+      }
+
+      leaf system-id {
+        type oc-isis-types:system-id;
+        description
+          "System-id of the IS neighbor.";
+      }
+
+      leaf metric {
+        type oc-isis-types:wide-metric;
+        description
+          "ISIS metric value.";
+      }
+    }
+    uses is-reachability-neighbor-state;
+  }
+
+  grouping isis-lsdb-generic-tlv {
+    description
+      "Generic TLV encoding grouping.";
+
+    leaf type {
+      type uint8;
+      description
+        "TLV Type.";
+    }
+
+    leaf length {
+      type uint8;
+      description
+        "TLV length.";
+    }
+
+    leaf value {
+      type binary;
+      description
+        "TLV value.";
+    }
+  }
+
+  grouping undefined-tlv-state {
+    description
+      "Generic grouping defining an unknown TLV.";
+
+    uses isis-lsdb-generic-tlv;
+  }
+
+  grouping undefined-subtlv-state {
+    description
+      "Generic grouping defining an unknown sub-TLV.";
+
+    uses isis-lsdb-generic-tlv;
+  }
+
+  grouping lsp-state {
+    description
+      "This grouping defines ISIS LSP state information.";
+
+    leaf lsp-id {
+     type leafref {
+        path "../state/lsp-id";
+      }
+
+      description
+        "A reference to the Link State PDU ID.";
+    }
+
+    container state {
+      description
+        "State parameters of Link State PDU.";
+
+      leaf lsp-id {
+        type oc-isis-types:lsp-id;
+        description
+          "LSP ID of the LSP.";
+      }
+
+      leaf maximum-area-addresses {
+        type uint8;
+        description
+          "Number of area addresses permitted for this ISs area. 0
+          indicates the IS only supports three area addresses (by
+          default). Any number inclusive of 1 and 254 indicates the
+          number of areas allowed.";
+      }
+
+      leaf version {
+        type uint8;
+        default 1;
+        description
+          "PDU version. This is set to 1.";
+      }
+
+      leaf version2 {
+        type uint8;
+        default 1;
+        description
+          "PDU version2. This is set to 1";
+      }
+
+      leaf id-length {
+        type uint8;
+        description
+          "Length of the ID field of NSAP addresses and NETs used in
+          this routing domain.";
+      }
+
+      leaf pdu-type {
+        type enumeration {
+          enum LEVEL_1 {
+            description "This enum describes ISIS level 1 PDU.";
+          }
+          enum LEVEL_2 {
+            description "This enum describes ISIS level 2 PDU.";
+          }
+        }
+         description
+           "Link State PDU type.";
+      }
+
+      leaf remaining-lifetime {
+         type uint16;
+         units "seconds";
+         description
+           "Remaining lifetime in seconds before the LSP expiration.";
+      }
+
+      leaf sequence-number {
+         type uint32;
+         description
+           "Sequence number of the LSP.";
+      }
+
+      leaf checksum {
+         type uint16;
+         description
+           "Checksum of the LSP.";
+      }
+
+      leaf pdu-length {
+         type uint16;
+         description
+           "Total length of the LSP.";
+      }
+
+      leaf-list flags {
+        type enumeration {
+          enum PARTITION_REPAIR {
+            description
+              "When set, the originator supports partition
+              repair.";
+          }
+          enum ATTACHED_ERROR {
+            description
+              "When set, the originator is attached to another
+              area using the referred metric.";
+          }
+          enum ATTACHED_EXPENSE {
+            description
+              "When set, the originator is attached to another
+              area using the referred metric.";
+          }
+          enum ATTACHED_DELAY {
+            description
+              "When set, the originator is attached to another
+              area using the referred metric.";
+          }
+          enum ATTACHED_DEFAULT {
+            description
+              "When set, the originator is attached to another
+              area using the referred metric.";
+          }
+          enum OVERLOAD {
+            description
+              "When set, the originator is overloaded, and must
+              be avoided in path calculation.";
+          }
+        }
+        description
+          "LSP Type-Block flags.";
+      }
+
+      leaf is-type {
+        type oc-isis-types:level-number;
+        description
+          "Type of neighboring system.";
+      }
+    }
+
+    container tlvs {
+      description
+        "This container defines Link State PDU State TLVs.";
+
+      list tlv {
+        key "type";
+
+        description
+          "List of TLV types in the LSDB for the specified LSP.";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to the TLV's type.";
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the specified
+            LSP";
+
+          uses isis-lsdb-tlv-type-state;
+        }
+
+        container area-address {
+          when "../state/type = 'oc-isis-lsdb-types:AREA_ADDRESSES'" {
+            description
+              "Include area address parameters only when the TLV type
+              is TLV 1.";
+          }
+
+          description
+            "This container defines TLV 1.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 1.";
+
+            leaf-list address {
+              type oc-isis-types:area-address;
+              description
+                "Area adress(es) of the IS. Set of manual area
+                addresses of this IS.";
+             reference
+              "ISO 10589 Intermediate System to Intermediate System
+              Intra- Domain Routeing Exchange Protocol for use in
+              Conjunction with the Protocol for Providing the
+              Connectionless-mode Network Service (ISO 8473 )
+              International Standard 10589: 2002, Second Edition,
+              2002. TLV 1.";
+            }
+          }
+        }
+
+        container lsp-buffer-size {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:LSP_BUFFER_SIZE'" {
+            description
+              "Include the LSP buffer size parameters only when the
+              TLV type is TLV 14.";
+          }
+
+          description
+            "This container defines TLV 14 - the LSP Buffer Size
+            TLV.";
+
+          container state {
+            description
+              "State parameters of TLV 14.";
+
+            leaf size {
+              type uint16;
+              units "bytes";
+              description
+                "The maximum MTU that the advertising system can
+                receive, expressed in bytes.";
+              reference
+               "ISO 10589 Intermediate System to Intermediate System
+               Intra- Domain Routeing Exchange Protocol for use in
+               Conjunction with the Protocol for Providing the
+               Connectionless-mode Network Service (ISO 8473 )
+               International Standard 10589: 2002, Second Edition,
+               2002. TLV 14.";
+            }
+          }
+        }
+
+        container nlpid {
+          when "../state/type = 'oc-isis-lsdb-types:NLPID'" {
+            description
+              "Include NLPID specification only when the TLV type is
+              TLV 129.";
+          }
+
+          description
+            "This container defines TLV 129.";
+
+          container state {
+           description
+             "State parameters of ISIS TLV 129.";
+
+            uses isis-lsdb-tlv-nlpid-state;
+          }
+        }
+
+        container hostname {
+          when "../state/type = 'oc-isis-lsdb-types:DYNAMIC_NAME'" {
+            description
+              "Include the dynamic hostname TLV only when the TLV is
+              type 137.";
+          }
+          description
+            "This container defines TLV 137.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 137.";
+
+            leaf-list hostname {
+              type string;
+              description
+                "Name of the node.";
+
+              reference
+                "RFC6233: IS-IS Registry Extension for Purges, RFC
+                5301: Dynamic Hostname Exchange Mechanism for IS-IS.
+                TLV 137";
+           }
+         }
+        }
+
+        container ipv4-interface-addresses {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV4_INTERFACE_ADDRESSES'" {
+            description
+              "Include the IPv4 interface addresses TLV only when the
+              TLV is type 132.";
+          }
+          description
+            "This container defines TLV 132.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 132.";
+
+            leaf-list address {
+              type inet:ipv4-address;
+              description
+                "IPv4 address(es) of the interface corresponding to
+                the SNPA over which this PDU is to be transmitted.";
+             reference
+              "RFC1195: Use of OSI IS-IS for Routing in TCP/IP and
+              Dual Environments. TLV 132.";
+            }
+          }
+        }
+
+        container ipv6-interface-addresses {
+          when "../state/type = " +
+                "'oc-isis-lsdb-types:IPV6_INTERFACE_ADDRESSES'" {
+            description
+              "Include the IPv6 interface addresses TLV only when the
+              TLV is type 232.";
+          }
+          description
+            "This container defines TLV 232.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 232.";
+
+            leaf-list address {
+              type inet:ipv6-address;
+              description
+                "IPv6 interface addresses of the node.  MUST contain
+                only the non-link-local IPv6 addresses assigned to the
+                IS.";
+              reference
+                "RFC5308: Routing IPv6 with IS-IS. TLV 232.";
+            }
+          }
+        }
+
+        container ipv4-te-router-id {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV4_TE_ROUTER_ID'" {
+            description
+              "Include the IPv4 traffic engineering router ID TLV only
+              when the TLV is type 134.";
+          }
+          description
+            "This container defines TLV 134.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 134.";
+
+            leaf-list router-id {
+              type inet:ipv4-address;
+              description
+                "IPv4 Traffic Engineering router ID of the node. For
+                traffic engineering, it guarantees that we have a
+                single stable address that can always be referenced in
+                a path that will be reachable from multiple hops away,
+                regardless of the state of the node's interfaces.";
+             reference
+              "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+              134.";
+            }
+          }
+        }
+
+        container ipv6-te-router-id {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV6_TE_ROUTER_ID'" {
+            description
+              "Include the IPv6 traffic engineering router ID TLV only
+              when the TLV is type 140.";
+          }
+          description
+            "This container defines TLV 140.";
+
+          container state {
+            description
+              "State parameters of ISIS TLV 140.";
+
+            leaf-list router-id {
+              type inet:ipv6-address;
+              description
+                "IPv6 Traffic Engineering router ID of the node. For
+                traffic engineering, it guarantees that we have a
+                single stable address that can always be referenced in
+                a path that will be reachable from multiple hops away,
+                regardless of the state of the node's interfaces.";
+              reference
+                "RFC6119: IPv6 Traffic Engineering in IS-IS. TLV
+                140.";
+            }
+          }
+        }
+
+        container instance-ids {
+          when "../state/type = 'oc-isis-lsdb-types:INSTANCE_ID'" {
+            description
+              "Include the ISIS Instance Identifier TLV only when the
+              TLV is type 7.";
+          }
+          description
+            "This container defines ISIS Instance Identifier TLV.";
+          reference "RFC6822: IS-IS Multi-Instance. TLV 7.";
+
+          list instance-id {
+            key "instance-id";
+
+            description
+              "A list of instance IDs received within TLV 7 within an
+              IS-IS LSP. In the case that more than one instance of
+              TLV 7 is included in the LSP, the instance IDs specified
+              within the instances are concatenated within this
+              list.";
+
+            leaf instance-id {
+              type leafref {
+                path "../state/instance-id";
+              }
+              description
+                "Reference to the unique instance ID.";
+            }
+            container state {
+              description
+                "State parameters of ISIS TLV 7.";
+
+              leaf instance-id {
+                type uint16;
+                description
+                  "An Instance Identifier (IID) to uniquely identify
+                  an IS-IS instance. When the IID = 0, the list of
+                  supported ITIDs MUST NOT be present. An IID-TLV with
+                  IID = 0 MUST NOT appear in an SNP or LSP. When the
+                  TLV appears (with a non-zero IID) in an SNP or LSP,
+                  exactly one ITID. MUST be present indicating the
+                  topology with which the PDU is associated. If no
+                  ITIDs or multiple ITIDs are present or the IID is
+                  zero, then the PDU MUST be ignored.";
+              }
+
+              leaf-list topology-id {
+                type uint16;
+                description
+                  "Instance-Specific Topology Identifiers (ITIDs).";
+              }
+            }
+          }
+        }
+
+        container ipv4-srlgs {
+          when "../state/type = 'oc-isis-lsdb-types:IPV4_SRLG'" {
+            description
+              "Include the IPv4 SRLG TLV only when the TLV is type
+              138.";
+          }
+         description
+           "This container defines ISIS SRLG TLV 138.";
+
+         reference
+            "RFC5307: IS-IS Extensions in Support of Generalized
+            Multi-Protocol Label Switching (GMPLS). TLV 138.";
+
+          list ipv4-srlg {
+            key "instance-number";
+
+            description
+              "Instance of the IPv4 SRLG TLV";
+
+            leaf instance-number {
+              type leafref {
+                path "../state/instance-number";
+              }
+              description
+                "Reference to the instance number of TLV 138.";
+            }
+
+            container state {
+              description
+                "State parameters of TLV 138.";
+
+              leaf instance-number {
+                type uint32;
+                description
+                  "An arbitrary unsigned 32-bit integer used to
+                  disambiguate the instance of TLV 138. The instance
+                  identifier is synthesised by the system
+                  and may be renumbered for the same SRLG definition
+                  in subsequent advertised LSPs if (and only if) the
+                  entire list of SRLGs is replaced.";
+              }
+
+              leaf system-id {
+                type oc-isis-types:system-id;
+                description
+                  "Neighbor system ID.";
+              }
+
+              leaf psn-number {
+                type uint8;
+                description
+                  "Pseudonode number if the neighbor is on a LAN
+                  interface.";
+              }
+
+              leaf-list flags {
+                type enumeration {
+                  enum NUMBERED {
+                    description
+                      "When set, the interface is numbered, whereas if
+                      unset indicates that the interface is
+                      unnumbered.";
+                  }
+                }
+                description
+                  "SRLG flags.";
+              }
+
+              leaf ipv4-interface-address {
+                type inet:ipv4-address;
+                description
+                  "IPv4 interface address.";
+              }
+
+              leaf ipv4-neighbor-address {
+                type inet:ipv4-address;
+                description
+                  "IPv4 neighbor address.";
+              }
+
+              leaf-list srlg-value {
+                type uint32;
+                description
+                  "List of SRLG values.";
+              }
+            }
+          }
+        }
+
+        container ipv6-srlgs {
+          when "../state/type = 'oc-isis-lsdb-types:IPV6_SRLG'" {
+            description
+              "Include the IPv6 SRLG TLV only when the TLV is type
+              139.";
+          }
+          description
+            "This container defines ISIS SRLG TLV.";
+
+          reference
+            "RFC6119: IPv6 Traffic Engineering in IS-IS. TLV 139.";
+
+          list ipv6-srlg {
+            key "instance-number";
+
+            description
+              "Instance of the IPv6 SRLG TLV.";
+
+            leaf instance-number {
+              type leafref {
+                path "../state/instance-number";
+              }
+              description
+                "Reference to the instance number of the IPv6 Shared
+                Risk Link Group (SRLG) TLV.";
+            }
+
+            container state {
+              description
+                "State parameters of TLV 139.";
+
+              leaf instance-number {
+                type uint32;
+                description
+                  "An arbitrary unsigned 32-bit integer used to
+                  disambiguate the instance of TLV 138. The instance
+                  identifier is synthesised by the system
+                  and may be renumbered for the same SRLG definition
+                  in subsequent advertised LSPs if (and only if) the
+                  entire list of SRLGs is replaced.";
+              }
+
+              leaf system-id {
+                type oc-isis-types:system-id;
+                description
+                  "Neighbor system ID.";
+              }
+
+              leaf psn-number {
+                type uint8;
+                description
+                  "Pseudonode number if the neighbor is on a LAN
+                  interface.";
+              }
+
+              leaf-list flags {
+                type enumeration {
+                  enum NA {
+                    description
+                      "When set, the IPv6 neighbour address is
+                      included, whereas if unset, it is omitted";
+                  }
+                }
+                description
+                  "IPv6 SRLG flags.";
+              }
+
+              leaf ipv6-interface-address {
+                type inet:ipv6-address;
+                description
+                  "IPv6 interface address or Link Local Identifier.";
+              }
+
+              leaf ipv6-neighbor-address {
+                type inet:ipv6-address;
+                description
+                  "IPv6 neighbor address or Link Remote Identifier.";
+              }
+
+              leaf-list srlg-value {
+                type uint32;
+                description
+                  "SRLG values.";
+              }
+            }
+          }
+        }
+
+        container purge-oi {
+          when "../state/type = 'oc-isis-lsdb-types:PURGE_OI'" {
+            description
+              "Only include the purge originator identitication TLV
+              when the TLV type is 13.";
+          }
+          description
+            "This container defines ISIS purge TLV.";
+
+          reference
+            "RFC6232: Purge Originator Identification TLV for IS-IS.
+            TLV 13.";
+
+          container state {
+            description
+              "State parameters of TLV 13.";
+
+            leaf system-id-count {
+              type uint8;
+              description
+                "Number of system IDs carried in this TLV.";
+            }
+
+            leaf source-system-id {
+              type oc-isis-types:system-id;
+              description
+                "System ID of the Intermediate System that inserted
+                this TLV.";
+            }
+
+            leaf received-system-id {
+              type oc-isis-types:system-id;
+              description
+                "System ID of the Intermediate System from which the
+                purge was received.";
+            }
+          }
+        }
+
+        container router-capabilities {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:ROUTER_CAPABILITY'" {
+            description
+              "Only include the router capability TLV when the TLV is
+              type 242.";
+          }
+          description
+            "This container defines router capabilities.";
+
+          list capability {
+            key "instance-number";
+
+            description
+              "This list describes IS Router capabilities.";
+
+            reference
+              "RFC4971: Intermediate System to Intermediate System
+              (IS-IS) Extensions for Advertising Router Information.
+              TLV 242.";
+
+            leaf instance-number {
+              type leafref {
+                path "../state/instance-number";
+              }
+              description
+                "Reference to the instance number of the router
+                capability TLV.";
+            }
+
+            container state {
+              description
+                "State parameters of TLV 242.";
+
+              leaf instance-number {
+                type uint32;
+                description
+                  "A unique instance number for the instance of the
+                  router capabilities TLV. The instance number should
+                  be autogenerated by the producer of the data and may
+                  be renumbered if the entire LSP contents are
+                  replaced in subsequent advertisements.";
+              }
+
+              leaf router-id {
+                type inet:ipv4-address;
+                description
+                  "IPv4 router-id.";
+              }
+
+              leaf-list flags {
+                type enumeration {
+                  enum FLOOD {
+                    description
+                      "When the S bit is set(1), the IS - IS Router
+                      CAPABILITY TLV MUST be flooded across the entire
+                      routing domain. When the S bit is not set(0),
+                      the TLV MUST NOT be leaked between levels . This
+                      bit MUST NOT be altered during the TLV
+                      leaking.";
+                  }
+                  enum DOWN {
+                    description
+                      "When the IS-IS Router CAPABILITY TLV is leaked
+                      from level - 2 to level-1, the Down bit MUST be
+                      set. Otherwise, this bit MUST be clear. IS - IS
+                      Router capability TLVs with the Down bit set
+                      MUST NOT be leaked from level - 1 to level-2.
+                      This is to prevent TLV looping.";
+                  }
+                }
+                description
+                  "Router capability flags.";
+              }
+            }
+
+            container subtlvs {
+              description
+                "This container describes router capability TLV
+                sub-TLVs";
+
+              list subtlv {
+                key "type";
+                description
+                  "List of subTLV types in the LSDB for the specified
+                  TLV";
+
+                leaf type {
+                  type leafref {
+                    path "../state/type";
+                  }
+                  description
+                    "Reference to the sub-TLV type";
+                }
+
+                container state {
+                  description
+                    "State parameters of IS Router Capabilities";
+
+                  uses isis-lsdb-subtlv-type-state;
+                 }
+
+                container segment-routing-algorithms {
+                  when "../state/type = " +
+                       "'oc-isis-lsdb-types:ROUTER_CAPABILITY_SR_ALGORITHM'" {
+                    description
+                      "Only include segment routing algorithm when the
+                      sub-TLV is type 19.";
+                  }
+                  description
+                    "This container defines SR algorithm sub-TLV 19.";
+
+                  reference
+                    "draft-ietf-isis-segment-routing-extensions.
+                     TLV 242, sub-TLV 19";
+
+                    container state {
+                      description
+                        "State parameters of sub-TLV 19 - Segment
+                        Routing Algorithm.";
+
+                      leaf-list algorithm {
+                        type enumeration {
+                          enum SPF {
+                            value 0;
+                            description
+                              "Shortest Path First (SPF) algorithm
+                              based on link metric.  This is the
+                              well-known shortest path algorithm as
+                              computed by the IS-IS Decision process.
+                              Consistent with the deployed practice
+                              for link-state protocols, algorithm 0
+                              permits any node to overwrite the SPF
+                              path with a different path based on
+                              local policy.";
+                          }
+                          enum STRICT_SPF {
+                            value 1;
+                            description
+                              "Strict Shortest Path First (SPF)
+                              algorithm based on link metric. The
+                              algorithm is identical to algorithm 0
+                              but algorithm 1 requires that all nodes
+                              along the path will honor the SPF
+                              routing decision. Local policy MUST NOT
+                              alter the forwarding decision computed
+                              by algorithm 1 at the node claiming to
+                              support algorithm 1.";
+                          }
+                        }
+                        description
+                          "The Segment Routing algorithm that is
+                          described by the TLV.";
+                      }
+                    }
+                }
+
+                container segment-routing-capability {
+                  when "../state/type = " +
+                       "'oc-isis-lsdb-types:ROUTER_CAPABILITY_SR_CAPABILITY'" {
+                    description
+                      "Only include the SR capability sub-TLV when
+                      the sub-TLV type is 2.";
+                  }
+                  description
+                    "This container defines SR Capability sub-TLV 2.";
+
+                  reference
+                    "draft-ietf-isis-segment-routing-extensions. TLV
+                    242, sub-TLV 2.";
+
+                  container state {
+                    description
+                      "State parameters of IS SR Router Capability";
+
+                    leaf-list flags {
+                      type enumeration {
+                        enum IPV4_MPLS {
+                          description
+                            "When set, the router is capable of
+                            processing SR MPLS encapsulated IPv4
+                            packets on all interfaces.";
+                        }
+                        enum IPV6_MPLS {
+                          description
+                            "When set, the router is capable of
+                            processing SR MPLS encapsulated IPv6
+                            packets on all interfaces.";
+                        }
+                        enum IPV6_SR {
+                          description
+                            "When set, the router is capable of
+                            processing the IPv6 Segment Routing Header
+                            on all interfaces.";
+                        }
+                      }
+                      description
+                        "Segment Routing Capability Flags.";
+                    }
+                  }
+
+                  container srgb-descriptors {
+                    description
+                      "SRGB Descriptors included within the SR
+                      capability sub-TLV";
+
+                    list srgb-descriptor {
+                      key "range";
+                      description
+                        "Descriptor entry within the SR capabilty
+                        sub-TLV";
+
+                      leaf range {
+                        type leafref {
+                          path "../state/range";
+                        }
+                        description
+                          "Reference to unique SRGB Descriptor.";
+                      }
+
+                      container state {
+                        description
+                          "State parameters of the SR range";
+
+                        leaf range {
+                          type uint32;
+                          description
+                            "Number of SRGB elements. The range
+                            value MUST be greater than 0.";
+                        }
+
+                        leaf label {
+                          type oc-mpls-types:mpls-label;
+                          description
+                            "The first value of the SRGB when
+                            expressed as an MPLS label.";
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+            uses isis-lsdb-undefined-subtlv;
+          }
+        }
+
+        container is-reachability {
+          when "../state/type = 'oc-isis-lsdb-types:IIS_NEIGHBORS'" {
+            description
+              "Include IIS_NEIGHBORS sub-TLV when the TLV type is 2.";
+          }
+          description
+            "This container describes list of ISIS neighbors and
+            attributes.";
+
+           reference
+             "ISO 10589, Intermediate System to Intermediate System
+             Intra- Domain Routeing Exchange Protocol for use in
+             Conjunction with the Protocol for Providing the
+             Connectionless-mode Network Service (ISO 8473),
+             International Standard 10589: 2002, Second Edition,
+             2002. TLV 2.";
+
+          container neighbors {
+            description
+              "This container describes IS neighbors.";
+
+            list neighbor {
+              key "system-id";
+              description
+                "IS reachability neighbor attributes.";
+
+              leaf system-id {
+                type leafref {
+                  path "../state/system-id";
+                }
+                description
+                  "Reference to the system ID of the neighbor.";
+              }
+
+              uses isis-lsdb-neighbor;
+            }
+          }
+        }
+
+        container ipv4-internal-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV4_INTERNAL_REACHABILITY'" {
+            description
+              "Include IPv4 internal reachability TLV when the TLV
+              type is specified as 128.";
+          }
+          description
+            "This container defines list of IPv4 internal reachability
+            information.";
+
+          reference
+            "RFC1195: OSI ISIS for IP and Dual Environments. RFC5302:
+            Domain-Wide Prefix Distribution with Two-Level IS-IS. TLV
+            128";
+
+          container prefixes {
+            description
+              "This container describes IS prefixes.";
+
+            list prefix {
+              key "prefix";
+
+              description
+                "IPv4 prefixes and internal reachability attributes.";
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the IPv4 prefix";
+              }
+
+              uses ipv4-prefix-attributes-state;
+            }
+          }
+        }
+
+        container ipv4-external-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV4_EXTERNAL_REACHABILITY'" {
+            description
+              "Include IPv4 external reachability when the TLV type
+              is set to 130.";
+          }
+          description
+           "This container defines list of IPv4 external reachability
+            information.";
+
+          reference
+            "RFC1195: OSI ISIS for IP and Dual Environments.  RFC5302:
+            Domain-Wide Prefix Distribution with Two-Level IS-IS. TLV
+            130";
+
+          container prefixes {
+            description
+              "This container describes IS neighbors.";
+
+            list prefix {
+              key "prefix";
+
+              description
+                "IPv4 external prefixes and reachability attributes.";
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the IPv4 prefix.";
+              }
+
+              uses ipv4-prefix-attributes-state;
+            }
+          }
+        }
+
+        container authentication {
+          when "../state/type = 'oc-isis-lsdb-types:AUTHENTICATION'" {
+            description
+              "Only include the authentication TLV when the TLV is
+              type 10.";
+          }
+          description
+            "This container defines authentication information of the
+            node.";
+
+          reference
+            "ISO 10589 Intermediate System to Intermediate System
+            Intra- Domain Routeing Exchange Protocol for use in
+            Conjunction with the Protocol for Providing the
+            Connectionless-mode Network Service (ISO 8473)
+            International Standard 10589: 2002, Second Edition, 2002.
+            TLV 10.";
+
+          container state {
+            description
+              "State parameters of TLV 10.";
+
+            leaf crypto-type {
+              type enumeration {
+                enum HMAC_MD5 {
+                  description
+                    "HMAC-MD5 Authentication type.";
+                }
+                enum CLEARTEXT {
+                  description
+                    "Cleartext Authentication type.";
+                }
+               }
+               description
+                 "Authentication type to be used.";
+            }
+
+            leaf authentication-key {
+              type string;
+              description
+                "Authentication key to be used.";
+            }
+          }
+        }
+
+        container extended-is-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:EXTENDED_IS_REACHABILITY'" {
+            description
+              "Only included the extended IS reachability TLV when the
+              TLV is type 22.";
+          }
+
+          description
+            "This container defines list of ISIS extended reachability
+            neighbors.";
+
+          reference
+            "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+            22.";
+
+          container neighbors {
+            description
+              "This container describes IS neighbors.";
+
+            list neighbor {
+              key "system-id";
+              description
+                "This list describes ISIS extended neigbors and
+                reachability attributes.";
+
+              leaf system-id {
+                type leafref {
+                  path "../state/system-id";
+                }
+                description
+                  "Reference to the neighboring system's system ID.";
+              }
+
+              container state {
+                description
+                  "State parameters of extended neighbor";
+
+                leaf system-id {
+                  type oc-isis-types:system-id;
+                  description
+                    "System-id of the neighbor.";
+                }
+                leaf metric {
+                  type oc-isis-types:wide-metric;
+                  description
+                    "Metric value.";
+                }
+              }
+              uses is-reachability-neighbor-state;
+            }
+          }
+        }
+
+        container extended-ipv4-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:EXTENDED_IPV4_REACHABILITY'" {
+            description
+              "Only include the extended IPv4 reachability container
+              when the TLV type is 135.";
+          }
+          description
+            "This container defines list of IPv4 extended reachability
+            information.";
+
+          reference
+            "RFC5305: IS-IS Extensions for Traffic Engineering. TLV
+            135";
+
+          container prefixes {
+            description
+              "This container describes IS prefixes.";
+
+            list prefix {
+              key "prefix";
+
+              description
+                "This list describes IPv4 extended prefixes and
+                attributes.";
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the IPv4 prefix that the TLV describes
+                  the attributes of.";
+              }
+
+              uses ipv4-prefix-extended-state;
+            }
+          }
+        }
+
+        container ipv6-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IPV6_REACHABILITY'" {
+            description
+              "Only include the IPv6 reachability container when the
+              TLV type is 236.";
+          }
+          description
+            "This container defines list of IPv6 reachability
+            information.";
+
+          reference
+            "RFC5308: Routing IPv6 with IS-IS. TLV 236";
+
+          container prefixes {
+            description
+              "This container describes IS prefixes.";
+
+            list prefix {
+              key "prefix";
+
+              description
+                "This list defines IPv6 extended prefix attributes.";
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the IPv6 prefix that the TLV
+                  corresponds to.";
+              }
+
+              uses ipv6-prefix-extended-state;
+            }
+          }
+        }
+
+        container multi-topology {
+          when "../state/type = 'oc-isis-lsdb-types:MULTI_TOPOLOGY'" {
+            description
+              "Only include the multi-topology container when the TLV
+              is type 229.";
+          }
+
+          description
+            "This container defines the topology supported.";
+
+          reference
+            "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+            Intermediate System to Intermediate Systems (IS-ISs). TLV
+            229";
+
+          container topologies {
+            description
+              "This container describes IS topologies.";
+
+            list topology {
+              key "mt-id";
+
+              description
+                "This list describes a topology.";
+
+              leaf mt-id {
+                type leafref {
+                  path "../state/mt-id";
+                }
+                description
+                  "Reference to the multi-topology ID being described
+                  by the list entry.";
+              }
+
+              container state {
+                description
+                  "State parameters of IS multi-topology TLV 229.";
+
+                leaf mt-id {
+                  type uint16 {
+                    range "0 .. 4095";
+                  }
+                  description
+                    "Multi-topology ID.";
+                }
+
+                leaf attributes {
+                  type enumeration {
+                    enum OVERLOAD {
+                      description
+                        "When set, node is overloaded, still part of
+                        the topology but cannot be used for transit.";
+                    }
+                    enum ATTACHED {
+                      description
+                        "When set, node is attached to another area
+                        using the referred metric and can be used as
+                        default gateway.";
+                    }
+                  }
+                  description
+                    "Attributes of the LSP for the associated
+                    topology.";
+                }
+              }
+            }
+          }
+        }
+
+        container isis-neighbor-attribute {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:IS_NEIGHBOR_ATTRIBUTE'" {
+            description
+              "Only include the neighbor attribute container when the
+              TLV is type 23.";
+          }
+          description
+            "This container defines list of ISIS topology neighbors
+            for extended ISIS LSP (multiple system IDs). ";
+
+          reference
+            "RFC5311: Simplified Extension of Link State PDU (LSP)
+            Space for IS-IS. TLV 23. It is identical in format  to the
+            extended IS reachability TLV 22.";
+
+          container neighbors {
+            description
+              "This container describes IS neighbors.";
+
+            list neighbor {
+              key "system-id";
+
+              leaf system-id {
+                type leafref {
+                  path "../state/system-id";
+                }
+                description
+                  "Reference to the neighboring IS";
+              }
+
+              container state {
+                description
+                  "State parameters of extended neighbor.";
+
+                leaf system-id {
+                  type oc-isis-types:system-id;
+                  description
+                    "System-id of the neighbor.";
+                }
+                leaf metric {
+                  type oc-isis-types:wide-metric;
+                  description
+                    "Metric value.";
+                }
+              }
+              uses is-reachability-neighbor-state;
+
+              description
+                "This list defines ISIS extended reachability neighbor
+                attributes.";
+            }
+          }
+        }
+
+        container is-alias-id {
+          when "../state/type = 'oc-isis-lsdb-types:ISIS_ALIAS_ID'" {
+            description
+              "Only include the ISIS alias ID container when the TLV
+              is type 24.";
+          }
+
+          description
+            "This container defines the IS-Alias TLV which allows
+             extension-capable ISs to recognize the Originating System
+             of an Extended LSP set. It identifies the Normal system-
+             id of the Originating System.";
+
+          reference
+            "RFC5311: Simplified Extension of Link State PDU (LSP)
+             Space for IS-IS TLV 24.";
+
+          container state {
+            config false;
+            description
+              "State parameters of alias ID.";
+
+            leaf alias-id {
+              type oc-isis-types:system-id;
+              description
+                "List of alias ID(s).";
+            }
+          }
+        }
+
+        container mt-isn {
+          when "../state/type = 'oc-isis-lsdb-types:MT_ISN'" {
+            description
+              "Only include the MT ISN container when the TLV is type
+              222.";
+          }
+          description
+            "This container defines list of ISIS multi-topology
+            neighbors.";
+
+          reference
+            "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+            Intermediate System to Intermediate Systems (IS-ISs). TLV
+            222.";
+
+          container neighbors {
+            description
+              "MT-IS neigbor attributes.";
+
+            list neighbor {
+              key "mt-id system-id";
+              description
+                "This container describes IS neighbors.";
+
+              leaf mt-id {
+                type leafref {
+                  path "../state/mt-id";
+                }
+                description
+                "Reference to the topology that the neighbor is
+                within.";               
+							}
+
+              leaf system-id {
+                type leafref {
+                  path "../state/system-id";
+                }
+                description
+                  "Reference to the System ID of the neighbor.";
+              }
+
+              uses mt-isis-neighbor;
+            }
+          }
+        }
+
+        container mt-isis-neighbor-attribute {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:MT_IS_NEIGHBOR_ATTRIBUTE'" {
+            description
+              "Only include the MT ISIS neighbor attribute container
+              when the TLV is type 223.";
+          }
+
+          description
+            "This container defines list of ISIS multi-topology
+            neighbors.";
+
+          reference
+            "RFC5311: Simplified Extension of Link State PDU (LSP)
+            Space for IS-IS. TLV 223. It is identical in format to the
+            MT-ISN TLV 222.";
+
+          container neighbors {
+            description
+              "This container describes IS neighbors.";
+
+            list neighbor {
+              key "mt-id system-id";
+              description
+                "List of multi-topology neighbors.";
+
+              leaf mt-id {
+                type leafref {
+                  path "../state/mt-id";
+                }
+                description
+                  "Reference to the topology that the neighbor is
+                  within.";
+              }
+
+              leaf system-id {
+                type leafref {
+                  path "../state/system-id";
+                }
+                description
+                  "Reference to the system ID of the neighbor";
+              }
+
+              uses mt-isis-neighbor;
+            }
+          }
+        }
+
+        container mt-ipv4-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:MT_IPV4_REACHABILITY'" {
+            description
+              "Only include the multi-topology IPv4 reachability
+              container when the TLV is type 235.";
+          }
+          description
+            "This container defines list of IPv4 reachability
+            Information in multi-topology environment.";
+
+          reference
+            "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+            Intermediate System to Intermediate Systems (IS-ISs). TLV
+            235.";
+
+          container prefixes {
+            description
+              "This container describes IS prefixes.";
+
+            list prefix {
+              key "mt-id prefix";
+
+              leaf mt-id {
+                type leafref {
+                  path "../state/mt-id";
+                }
+                description
+                  "Reference to the topology ID of the topology that
+                  the prefix is within.";
+              }
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the prefix to which reachability is
+                  being advertised.";
+              }
+
+              description
+                "IPv4 prefixes that are contained within MT
+                reachability TLV.";
+
+              uses ipv4-mt-prefix-extended-state;
+            }
+          }
+        }
+
+        container mt-ipv6-reachability {
+          when "../state/type = " +
+               "'oc-isis-lsdb-types:MT_IPV6_REACHABILITY'" {
+            description
+              "Only include the multi-topology IPv6 reachability
+              container when the TLV is type 237.";
+          }
+          description
+            "This container defines list of IPv6 reachability
+            information in multi - topology environment.";
+
+          reference
+            "RFC5120: M-ISIS: Multi Topology (MT) Routing in
+            Intermediate System to Intermediate Systems (IS-ISs). TLV
+            237.";
+
+          container prefixes {
+            description
+              "This container describes IS prefixes.";
+
+            list prefix {
+              key "prefix mt-id";
+              description
+                  "List of IPv6 prefixes contained within MT
+                  reachability TLV.";
+
+              leaf prefix {
+                type leafref {
+                  path "../state/prefix";
+                }
+                description
+                  "Reference to the IPv6 prefix described by the
+                  TLV.";
+              }
+
+              leaf mt-id {
+                type leafref {
+                  path "../state/mt-id";
+                }
+                description
+                  "Reference to the multi-topology ID.";
+              }
+
+              uses ipv6-mt-prefix-extended-state;
+            }
+          }
+        }
+      }
+    }
+
+    uses isis-lsdb-undefined-tlv;
+  }
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis-policy.yang b/models/openconfig/src/main/yang/isis/openconfig-isis-policy.yang
new file mode 100644
index 0000000..3d5de82
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis-policy.yang
@@ -0,0 +1,180 @@
+module openconfig-isis-policy {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/openconfig-isis-policy";
+
+  prefix "oc-isis-pol";
+
+  // import some basic types
+  import openconfig-routing-policy {prefix rpol; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-isis-types { prefix isis-types; }
+
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net ";
+
+  description
+    "This module contains data definitions for ISIS routing policy.
+    It augments the base routing-policy module with BGP-specific
+    options for conditions and actions.";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+   grouping isis-match-conditions {
+    description
+      "Criteria used to match IS-IS routes within the policy";
+
+    container isis-conditions {
+      description
+        "Match conditions relating to the IS-IS protocol";
+
+      container config {
+        description
+          "Configuration parameters relating to IS-IS match
+          conditions";
+
+        uses isis-match-conditions-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to IS-IS match
+          conditions";
+        uses isis-match-conditions-config;
+      }
+    }
+  }
+
+  grouping isis-match-conditions-config {
+    description
+      "Match conditions for IS-IS";
+
+    leaf level-eq {
+      type isis-types:level-number;
+      description
+        "Match the level that the IS-IS prefix is within. This can
+        be used in the case that import or export policies refer
+        to an IS-IS instance that has multiple levels configured
+        within it";
+    }
+  }
+
+  grouping isis-actions {
+    description
+      "Actions supplied by the IS-IS protocol to be set on a
+      route within the policy";
+
+    container isis-actions {
+      description
+        "Actions that can be performed by IS-IS within a policy";
+
+      container config {
+        description
+          "Configuration parameters relating to IS-IS actions";
+
+        uses isis-actions-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state associated with IS-IS actions";
+
+        uses isis-actions-config;
+      }
+    }
+  }
+
+  grouping isis-actions-config {
+    description
+      "Actions for IS-IS";
+
+    leaf set-level {
+      type isis-types:level-number;
+      description
+        "Set the level that a prefix is to be imported into.";
+    }
+
+    leaf set-metric-type {
+      type isis-types:level-number;
+      description
+        "Set the type of metric that is to be specified when the
+        set metric leaf is specified";
+    }
+
+    leaf set-metric {
+      type isis-types:wide-metric;
+      description
+        "Set the metric of the IS-IS prefix";
+    }
+  }
+
+  // augment statements
+ augment "/rpol:routing-policy/rpol:policy-definitions/" +
+    "rpol:policy-definition/rpol:statements/rpol:statement/" +
+    "rpol:actions" {
+    description "This augments igp-actions with ISIS conditions";
+    uses isis-actions;
+
+  }
+
+  augment "/rpol:routing-policy/rpol:policy-definitions/" +
+    "rpol:policy-definition/rpol:statements/rpol:statement/" +
+    "rpol:conditions" {
+    description "This augments igp-conditions with ISIS conditions";
+    uses isis-match-conditions;
+  }
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis-routing.yang b/models/openconfig/src/main/yang/isis/openconfig-isis-routing.yang
new file mode 100644
index 0000000..ac1f779
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis-routing.yang
@@ -0,0 +1,375 @@
+submodule openconfig-isis-routing {
+
+  belongs-to openconfig-isis {
+    prefix "oc-isis";
+  }
+
+  // import some basic types
+  import openconfig-isis-types { prefix oc-isis-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-mpls-types { prefix oc-mplst; }
+  import openconfig-segment-routing { prefix oc-sr; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module describes YANG model for ISIS Routing";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping rt-admin-config {
+    description
+      "Re-usable grouping to enable or disable a particular IS-IS feature.";
+
+    leaf enabled {
+      type boolean;
+      description
+        "When set to true, the functionality within which this leaf is
+        defined is enabled, when set to false it is explicitly disabled.";
+    }
+  }
+
+  grouping isis-afi-safi-config {
+    description
+      "This grouping defines Address-Family configuration parameters";
+
+    leaf afi-name {
+      type identityref {
+        base oc-isis-types:AFI_TYPE;
+      }
+      description
+        "Address-family type.";
+    }
+
+    leaf safi-name {
+      type identityref {
+        base oc-isis-types:SAFI_TYPE;
+      }
+      description
+        "Subsequent address-family type.";
+    }
+  }
+
+  grouping isis-shortcuts-afi-config {
+    description
+      "This grouping defines ISIS Shortcuts configuration parameters";
+
+    leaf afi-name {
+      type identityref {
+        base oc-isis-types:AFI_TYPE;
+      }
+      description "Address-family type.";
+    }
+
+    leaf-list nh-type {
+      type identityref {
+        base oc-mplst:PATH_SETUP_PROTOCOL;
+      }
+      description "Tunnel NH Type(RSVP,SR). When present it implies
+      	that nh-type shortcut is enabled for a specified AFI.";
+    }
+  }
+
+  grouping isis-shortcuts-config {
+    description
+      "This grouping defines ISIS Shortcuts consfiguration parameters";
+
+    container config {
+      description "This container defines ISIS shortcuts configuration.";
+      uses rt-admin-config;
+    }
+
+    container state {
+      config false;
+      description "This container defines state for ISIS shortcuts.";
+      uses rt-admin-config;
+    }
+  }
+
+  grouping isis-mt-config {
+    description
+      "This grouping defines ISIS multi-topology configuration parameters";
+
+    leaf afi-name {
+      type identityref {
+        base oc-isis-types:AFI_TYPE;
+      }
+      description
+        "Address-family type.";
+    }
+    leaf safi-name {
+      type identityref {
+        base oc-isis-types:SAFI_TYPE;
+      }
+      description
+        "Subsequent address-family type.";
+    }
+    //prefer single topology
+  }
+
+
+
+  // *********** STRUCTURE GROUPINGS **********************
+
+  grouping isis-metric-config {
+    description
+      "This grouping defines ISIS metric configuration";
+
+    leaf metric {
+      type uint32;
+      default 10;
+      description "ISIS metric value(default=10).";
+    }
+  }
+
+  grouping isis-afi-safi-list {
+    description
+      "This grouping defines address-family configuration and state
+      information";
+
+    list af {
+      key "afi-name safi-name";
+
+      description
+            "Address-family/Subsequent Address-family list.";
+
+      leaf afi-name {
+        type leafref {
+          path "../config/afi-name";
+        }
+        description
+           "Reference to address-family type";
+      }
+
+      leaf safi-name {
+        type leafref {
+          path "../config/safi-name";
+        }
+        description
+           "Reference to subsequent address-family type";
+      }
+
+      container config {
+        description
+          "This container defines AFI-SAFI configuration parameters";
+
+        uses isis-afi-safi-config;
+        uses isis-metric-config;
+        uses rt-admin-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines AFI-SAFI State information";
+
+        uses isis-afi-safi-config;
+        uses isis-metric-config;
+        uses rt-admin-config;
+      }
+
+      uses isis-mt-list;
+    }
+  }
+
+  grouping isis-if-afi-safi-list {
+    description
+      "This grouping defines address-family configuration and state
+      information";
+
+    list af {
+      key "afi-name safi-name";
+
+      description
+            "Address-family/Subsequent Address-family list.";
+
+      leaf afi-name {
+        type leafref {
+          path "../config/afi-name";
+        }
+        description
+           "Reference to address-family type";
+      }
+
+      leaf safi-name {
+        type leafref {
+          path "../config/safi-name";
+        }
+        description
+           "Reference to subsequent address-family type";
+      }
+
+      container config {
+        description
+           "This container defines AFI-SAFI configuration parameters. Single
+            topology is the default setting.";
+        uses isis-afi-safi-config;
+        uses isis-metric-config;
+        uses rt-admin-config;
+      }
+
+      container state {
+        config false;
+        description
+           "This container defines AFI-SAFI State information";
+        uses isis-afi-safi-config;
+        uses isis-metric-config;
+        uses rt-admin-config;
+      }
+
+      uses oc-sr:sr-igp-interface-top;
+    }
+  }
+  
+  grouping isis-if-global-afi-safi-list {
+    description
+      "This grouping defines address-family configuration and state
+      information";
+
+    list af {
+      key "afi-name safi-name";
+
+      description
+            "Address-family/Subsequent Address-family list.";
+
+      leaf afi-name {
+        type leafref {
+          path "../config/afi-name";
+        }
+        description
+           "Reference to address-family type";
+      }
+
+      leaf safi-name {
+        type leafref {
+          path "../config/safi-name";
+        }
+        description
+           "Reference to subsequent address-family type";
+      }
+
+      container config {
+        description
+           "This container defines AFI-SAFI configuration parameters. Single
+            topology is the default setting.";
+        uses isis-afi-safi-config;
+        uses rt-admin-config;
+      }
+
+      container state {
+        config false;
+        description
+           "This container defines AFI-SAFI State information";
+        uses isis-afi-safi-config;
+        uses rt-admin-config;
+      }
+    }
+  }
+
+  grouping isis-shortcuts-afi-list {
+    description
+      "This grouping defines ISIS Shorcuts configuration and
+      state information";
+
+    list afi {
+      key "afi-name";
+
+      description
+        "Address-family list.";
+
+      leaf afi-name {
+        type leafref {
+          path "../config/afi-name";
+        }
+        description
+          "Reference to address-family type.";
+      }
+
+      container config {
+        description
+          "This container defines ISIS Shortcuts configuration parameters";
+        uses isis-shortcuts-afi-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS Shortcuts state information";
+        uses isis-shortcuts-afi-config;
+      }
+    }
+  }
+
+  grouping isis-mt-list {
+    description
+      "This grouping defines multi-topology address-family configuration and
+      state information. MT0 - IPv4 Unicast, MT2 - IPv6 Unicast, MT3 -
+      IPv4 Multicast, MT4 - IPv6 Multicast";
+
+    container multi-topology {
+      description
+        "This container defines multi-topology address-family configuration
+        and state information. ISIS TLV 235, 237.";
+
+      container config {
+      description
+        "This container defines AFI-SAFI multi-topology configuration
+        parameters";
+      uses isis-mt-config;
+      }
+
+      container state {
+      config false;
+      description
+        "This container defines AFI-SAFI multi-topology state information";
+      uses isis-mt-config;
+      uses rt-admin-config;
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis-types.yang b/models/openconfig/src/main/yang/isis/openconfig-isis-types.yang
new file mode 100644
index 0000000..fc474c9
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis-types.yang
@@ -0,0 +1,330 @@
+module openconfig-isis-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/isis-types";
+
+  prefix "oc-isis-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains general data definitions for use in ISIS YANG
+    model.";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  // identity statements
+  identity OVERLOAD_RESET_TRIGGER_TYPE {
+    description
+      "Base identify type for triggers that reset Overload Bit";
+  }
+
+  identity WAIT_FOR_BGP {
+    base OVERLOAD_RESET_TRIGGER_TYPE;
+    description
+      "Base identity type for resetting Overload Bit when BGP has converged. ";
+  }
+
+  identity WAIT_FOR_SYSTEM {
+    base OVERLOAD_RESET_TRIGGER_TYPE;
+    description
+      "Base identity type for resetting Overload Bit when system resources have
+      been restored. ";
+  }
+
+  identity MT_TYPE {
+    description
+      "Base identify type for multi-topology";
+  }
+
+  identity SAFI_TYPE {
+    description
+      "Base identify type for SAFI";
+  }
+
+  identity AFI_TYPE {
+    description
+      "Base identify type for AFI";
+  }
+
+  identity AFI_SAFI_TYPE {
+    description
+      "Base identify type for AFI/SAFI";
+  }
+
+  identity IPV4_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Base identify type for IPv4 Unicast address family";
+  }
+
+  identity IPV6_MULTICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Base identify type for IPv6 multicast address family";
+  }
+
+  identity IPV4_MULTICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Base identify type for IPv4 multicast address family";
+  }
+
+  identity IPV6_UNICAST {
+    base AFI_SAFI_TYPE;
+    description
+      "Base identify type for IPv6 unicast address family";
+  }
+
+  identity UNICAST {
+    base SAFI_TYPE;
+    description
+      "Base identify type for IPv4 Unicast address family";
+  }
+
+  identity MULTICAST {
+    base SAFI_TYPE;
+    description
+      "Base identify type for IPv6 multicast address family";
+  }
+
+  identity IPV4 {
+    base AFI_TYPE;
+    description
+      "Base identify type for IPv4 address family";
+  }
+
+  identity IPV6 {
+    base AFI_TYPE;
+    description
+      "Base identify type for IPv6 address family";
+  }
+
+  // typedef statements
+  typedef level-type {
+    type enumeration {
+      enum LEVEL_1 {
+        description "This enum describes ISIS level 1";
+      }
+      enum LEVEL_2 {
+        description "This enum describes ISIS level 2";
+      }
+      enum LEVEL_1_2 {
+        description "This enum describes ISIS level 1-2";
+      }
+    }
+    description
+        "This type defines ISIS level types";
+  }
+
+  typedef level-number {
+    type uint8 {
+      range "1..2";
+    }
+    description
+        "This type defines ISIS level.";
+  }
+
+  typedef adaptive-timer-type {
+    type enumeration {
+      enum LINEAR {
+        description "This enum describes linear algorithm timer";
+      }
+      enum EXPONENTIAL {
+        description "This enum describes exponential algorithm timer";
+      }
+    }
+    description
+        "This type defines ISIS adaptive timer types";
+  }
+
+  typedef hello-padding-type {
+    type enumeration {
+      enum STRICT {
+        description "This enum describes strict padding";
+      }
+      enum LOOSE {
+        description "This enum describes loose padding";
+      }
+      enum ADAPTIVE {
+        description "This enum describes adaptive padding";
+      }
+      enum DISABLE {
+        description "This enum disables padding";
+      }
+    }
+    description
+        "This type defines ISIS hello padding type";
+  }
+
+  typedef circuit-type {
+    type enumeration {
+      enum POINT_TO_POINT {
+        description "This enum describes a point-to-point interface";
+      }
+      enum BROADCAST {
+        description "This enum describes a broadcast interface";
+      }
+    }
+    description
+        "This type defines ISIS interface types ";
+  }
+
+  typedef metric-type {
+    type enumeration {
+      enum INTERNAL {
+        description "This enum describes internal route type";
+      }
+      enum EXTERNAL {
+        description "This enum describes external route type";
+      }
+    }
+    description
+      "This type defines ISIS metric type";
+  }
+
+  typedef wide-metric {
+    type uint32 {
+      range "1..16777215";
+    }
+    description
+        "This type defines ISIS wide metric.";
+  }
+
+  typedef narrow-metric {
+    type uint8 {
+      range "1..63";
+    }
+    description
+        "This type defines ISIS narrow metric.";
+  }
+
+  typedef metric-style {
+    type enumeration {
+      enum NARROW_METRIC {
+        description
+                "This enum describes narrow metric style";
+        reference "RFC1195";
+      }
+      enum WIDE_METRIC {
+        description
+                "This enum describes wide metric style";
+        reference "RFC5305";
+      }
+    }
+    description
+        "This type defines ISIS metric styles";
+  }
+
+  typedef isis-interface-adj-state {
+    type enumeration {
+      enum UP {
+        description
+          "This state describes that adjacency is established.";
+      }
+      enum DOWN {
+        description
+          "This state describes that adjacency is NOT established.";
+      }
+      enum INIT {
+        description
+          "This state describes that adjacency is establishing.";
+      }
+      enum FAILED {
+        description
+          "This state describes that adjacency is failed.";
+      }
+    }
+    description
+      "This type defines the state of the interface.";
+  }
+
+  typedef net {
+    type string {
+      pattern '^[a-fA-F0-9]{2}(\.[a-fA-F0-9]{4}){3,9}\.[a-fA-F0-9]{2}$';
+    }
+    description
+      "This type defines OSI NET address. A NET should should be in
+      the form xx.yyyy.yyyy.yyyy.00 with up to 9 sets of yyyy.";
+  }
+
+  typedef area-address {
+    type string {
+      pattern '^[0-9A-Fa-f]{2}\.([0-9A-Fa-f]{4}\.){0,3}$';
+    }
+    description
+        "This type defines the ISIS area address.";
+  }
+
+  typedef system-id {
+    type string {
+      pattern '^[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}$';
+    }
+    description
+      "This type defines ISIS system id using pattern, system id looks
+       like : 0143.0438.AeF0";
+  }
+
+  typedef extended-circuit-id {
+    type uint32;
+    description
+      "This type defines interface circuit ID.";
+  }
+
+  typedef lsp-id {
+    type string {
+      pattern
+            '^[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}\.[0-9A-Fa-f]'
+      +      '{4}\.[0-9][0-9]-[0-9][0-9]$';
+    }
+    description
+      "This type defines ISIS LSP ID. ISIS LSP ID type should be in
+      the form of xxxx.xxxx.xxxx.xx-xx";
+  }
+  typedef snpa {
+    type string {
+      length "0 .. 20";
+    }
+    description
+      "This type defines Subnetwork Point of Attachment format.";
+  }
+}
diff --git a/models/openconfig/src/main/yang/isis/openconfig-isis.yang b/models/openconfig/src/main/yang/isis/openconfig-isis.yang
new file mode 100644
index 0000000..ce8e669
--- /dev/null
+++ b/models/openconfig/src/main/yang/isis/openconfig-isis.yang
@@ -0,0 +1,2032 @@
+module openconfig-isis {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/openconfig-isis";
+
+  prefix "oc-isis";
+
+  // import some basic types
+  import ietf-inet-types { prefix "inet"; }
+  import ietf-yang-types { prefix "yang"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-isis-types { prefix "oc-isis-types"; }
+  import openconfig-routing-policy { prefix "oc-rpol"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+  import openconfig-segment-routing { prefix "oc-sr"; }
+  // TODO(robjs): Import authentication and keychain following merge of these
+  // modules.
+  //import openconfig-authentication-types { prefix "oc-auth-types"; }
+  //import openconfig-keychain { prefix "oc-keychain"; }
+
+  // Include submodules:
+  // IS-IS LSP is the LSDB for IS-IS.
+  include openconfig-isis-lsp;
+  // IS-IS RT is routing-related features for IS-IS
+  include openconfig-isis-routing;
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net ";
+
+  description
+    "This module describes a YANG model for ISIS protocol configuration.
+    It is a limited subset of all of the configuration parameters
+    available in the variety of vendor implementations, hence it is
+    expected that it would be augmented with vendor - specific configuration
+    data as needed. Additional modules or submodules to handle other
+    aspects of ISIS configuration, including policy, routing, types,
+    LSDB and additional address families are also expected. This model
+    supports the following ISIS configuration level hierarchy:
+
+    ISIS
+    +-> { global ISIS configuration}
+        +-> levels +-> { level config}
+            +-> { system-level-counters }
+            +-> { level link-state-database}
+        +-> interface +-> { interface config }
+            +-> { circuit-counters }
+            +-> { levels config }
+            +-> { level adjacencies }";
+
+  oc-ext:openconfig-version "0.3.2";
+
+  revision "2017-07-26" {
+    description
+      "Update LSDB and fix bugs.";
+    reference "0.3.2";
+  }
+
+  revision "2017-05-15" {
+    description
+      "Refactor LSDB.";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Remove top-level /isis container";
+    reference "0.2.1";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to IS-IS module";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-18" {
+    description
+      "Initial revision of IS-IS models.";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping isis-global-config {
+    description
+      "This grouping defines lobal configuration options for ISIS router.";
+
+    // multi-instance
+    leaf instance {
+      type string;
+      default 0;
+      description
+        "ISIS Instance.";
+    }
+
+    leaf-list net {
+      type oc-isis-types:net;
+      description
+        "ISIS network entity title (NET). The first 8 bits are usually
+        49 (private AFI), next 16 bits represent area, next 48 bits represent
+        system id and final 8 bits are set to 0.";
+      reference
+        "International Organization for Standardization, Information
+        technology - Open Systems Interconnection-Network service
+        Definition - ISO/ IEC 8348:2002.";
+    }
+
+    leaf maximum-area-addresses {
+      type uint8;
+      default 3;
+      description
+        "Maximum areas supported.";
+    }
+
+    leaf level-capability {
+      type oc-isis-types:level-type;
+      default "LEVEL_1_2";
+      description
+        "ISIS level capability(level-1, level-2,vlevel-1-2).";
+    }
+
+    leaf max-ecmp-paths {
+      type uint8;
+      description
+        "ISIS max-paths count.";
+    }
+
+    leaf poi-tlv {
+      type boolean;
+      default false;
+      description
+        "ISIS purge TLV. When set to true, a TLV is added to purges to record
+         the system ID  of the IS generating the purge.";
+      reference "RFC6232: Purge Originator Identification TLV for IS-IS. TLV 13.";
+    }
+
+    leaf iid-tlv {
+      type boolean;
+      default false;
+      description
+        "ISIS Instance Identifier TLV. When set to trues, the IID-TLV identifies
+        the unique instance as well as the topology/topologies to which the
+        PDU applies.";
+      reference "RFC6822: IS-IS Multi-Instance. TLV 7";
+    }
+
+    leaf fast-flooding {
+      type boolean;
+      default true;
+      description
+        "When set to true, IS will always flood the LSP that triggered an SPF
+     before the router actually runs the SPF computation.";
+    }
+  }
+
+  grouping admin-config {
+    description
+      "Re-usable grouping to enable or disable a particular IS-IS feature.";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "When set to true, the functionality within which this leaf is
+        defined is enabled, when set to false it is explicitly disabled.";
+    }
+  }
+
+  grouping isis-bfd-config {
+    description
+      "This grouping defines Bidirectionl-Forwarding-Detection
+      configuration.";
+
+    //There is also BFD state under adjacency
+    leaf bfd-tlv {
+      type boolean;
+      description
+        "When set to true, BFD TLV is used. This enables support for the IS-IS
+        BFD TLV options, which specify that a BFD session must be established
+        before an IS-IS adjacency can transition to the established state.
+        This option should be enabled on all IS-IS neighbors on a shared
+        interface.";
+      reference "RFC6213. TLV 148";
+    }
+    reference "RFC5880: Bidirectional Forwarding Detection (BFD).";
+  }
+
+  grouping isis-authentication-check-config {
+    description
+      "This grouping defines ISIS authentication check.";
+
+    leaf authentication-check {
+      type boolean;
+      default true;
+      description
+        "When set to true, reject all ISIS protocol PDUs that either have a mismatch
+        in authentication-type or authentication-key.";
+    }
+  }
+
+  grouping isis-metric-style-config {
+    description
+      "This grouping defines ISIS metric style.";
+
+    leaf metric-style {
+      type oc-isis-types:metric-style;
+      description
+        "ISIS metric style types(narrow, wide).";
+    }
+  }
+
+  grouping authentication-key-config {
+    description
+      "This grouping defines authentication key configuration.";
+
+    leaf auth-password {
+      type oc-types:routing-password;
+      description
+        "Authentication key string.";
+    }
+  }
+
+  grouping keychain-base-group {
+    description
+      "This grouping defines keychain configuration.";
+
+    container keychain {
+      description
+        "This container defines keychain parameters.";
+
+      // TODO(robjs): Import keychain parameters following merge of the auth
+      // models.
+      //uses oc-keychain:keychain-common-base;
+      //uses oc-keychain:tolerance-base;
+      //uses oc-keychain:keychain-key-base;
+    }
+  }
+
+  grouping isis-authentication-config {
+    description
+      "This grouping defines ISIS authentication configuration.";
+
+    // TODO(robjs): Add authentication following merge of auth modules.
+    //leaf auth-type {
+    //  type oc-auth-types:auth-type;
+    //  description
+    //    "ISIS authentication type (key, key-chain).";
+    //}
+
+    leaf csnp-authentication {
+      type boolean;
+      default false;
+      description
+        "Enable or disable for IS-IS CSNPs.";
+    }
+
+    leaf psnp-authentication {
+      type boolean;
+      default false;
+      description
+        "Enable or disable authentication for IS-IS PSNPs.";
+    }
+
+    leaf lsp-authentication {
+      type boolean;
+      default false;
+      description
+        "Enable or disable authentication for IS-IS LSPs.";
+    }
+  }
+
+  grouping isis-authentication-group {
+   description
+     "This grouping defines ISIS authentication.";
+
+    container config {
+      description
+        "This container defines ISIS authentication configuration.";
+
+      uses isis-authentication-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines ISIS authentication state.";
+
+      uses isis-authentication-config;
+    }
+
+    container key {
+      description
+        "This container defines ISIS authentication key";
+      container config {
+        description
+          "This container defines ISIS authentication key configuration.";
+
+        uses authentication-key-group-config {
+          when "../auth-type = KEY";
+        }
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS authentication key state.";
+
+        uses authentication-key-group-config {
+          when "../auth-type = KEY";
+        }
+      }
+    }
+
+    uses keychain-base-group  {
+      when "../auth-type = KEY_CHAIN";
+    }
+  }
+
+  grouping isis-hello-authentication-config {
+    description
+      "Configuration options for IS-IS hello authentication.";
+
+    leaf hello-authentication {
+      type boolean;
+      default false;
+      description
+        "Enabled or disable ISIS Hello authentication.";
+    }
+
+    // TODO(robjs): Add hello-auth-type following merge of auth models.
+    //leaf hello-auth-type {
+    //  type oc-auth-types:auth-type;
+    //  description
+    //    "ISIS authentication type (key, key-chain).";
+    //}
+  }
+
+  grouping isis-hello-authentication-group {
+    description
+      "This grouping defines ISIS hello-authentication.";
+
+    container config {
+      description
+        "This container defines ISIS authentication configuration.";
+
+      uses isis-hello-authentication-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines ISIS authentication state.";
+
+      uses isis-hello-authentication-config;
+    }
+
+    container key {
+      description
+        "This container defines ISIS authentication key";
+
+      container config {
+        description
+          "This container defines ISIS authentication key configuration.";
+
+        uses authentication-key-group-config {
+          when "../auth-type = KEY";
+        }
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS authentication key state.";
+
+        uses authentication-key-group-config {
+          when "../auth-type = KEY";
+        }
+      }
+    }
+
+    uses keychain-base-group  {
+      when "../auth-type = KEY_CHAIN";
+    }
+  }
+
+  grouping isis-ldp-igp-config {
+    description
+      "This grouping defines ISIS/LDP Synchronization configuration.";
+
+    leaf enabled {
+      type boolean;
+      default true;
+      description
+        "When set to true, rely on IGP/LDP synchronization. IGP cost for
+     link is maintained at max until LDP adjacencies are established ";
+      reference "RFC5443: LDP IGP Synchronization.";
+    }
+
+    leaf post-session-up-delay {
+      type uint16;
+      units seconds;
+      description
+        "Specifies a delay, expressed in units of seconds,
+        between the LDP session to the IGP neighbor being established, and
+        it being considered synchronized by the IGP.";
+    }
+  }
+
+  grouping isis-te-config {
+    description
+      "This grouping defines ISIS Traffic Engineering configuration.";
+
+    leaf ipv4-router-id {
+      type inet:ipv4-address-no-zone;
+      description
+        "IPv4 MPLS Traffic Engineering Router-ID.";
+    }
+
+    leaf ipv6-router-id {
+      type inet:ipv6-address-no-zone;
+      description
+        "IPv6 MPLS Traffic Engineering Router-ID.";
+    }
+  }
+
+  grouping isis-reference-bandwidth-config {
+    description
+      "This grouping defines ISIS Reference Bandwidth Configuration.";
+
+    leaf reference-bandwidth {
+      type uint32;
+      description
+        "ISIS Reference Bandwidth value";
+    }
+  }
+
+  grouping isis-overload-bit-set-config {
+    description
+      "This grouping defines ISIS Overload Bit.";
+
+    leaf set-bit {
+      type boolean;
+      default false;
+      description
+        "When set to true, IS-IS overload bit is set.";
+    }
+
+    leaf set-bit-on-boot {
+      type boolean;
+      default false;
+      description
+        "When set to true, the IS-IS overload bit is set on system boot.";
+    }
+
+    leaf advertise-high-metric {
+      type boolean;
+      default false;
+      description
+        "When set to true, the local IS advertises links with the highest
+        available metric regardless of their configured metric. The metric
+        value is based on the metric style - if wide metrics are utilised
+        the metric is advertised as 16777214, otherwise they are advertised
+        with a value of 63.";
+    }
+  }
+
+  grouping isis-overload-bit-reset-config {
+    description
+      "This grouping defines ISIS Overload Bit Reset Triggers";
+
+    leaf reset-trigger {
+      type identityref {
+          base oc-isis-types:OVERLOAD_RESET_TRIGGER_TYPE;
+      }
+      description
+        "In the case that the system sets the overload bit on start, the
+        system should reset the bit (i.e., clear the overload bit) upon
+        the specified trigger.";
+    }
+
+    leaf delay {
+      type uint16;
+      units seconds;
+      description
+        "If a reset trigger is specified, the system should delay resetting
+        the overload bit for the specified number of seconds after the
+        trigger occurs.";
+    }
+  }
+
+  grouping isis-attached-bit-config {
+    description
+      "This grouping defines ISIS Attached Bit";
+
+    leaf ignore-bit {
+      type boolean;
+      default false;
+      description
+        "When set to true, if the attached bit is set on an incoming Level 1
+        IS-IS, the local system ignores it. In this case the local system
+        does not set a default route to the L1L2 router advertising the PDU
+        with the attached bit set.";
+    }
+
+    leaf suppress-bit {
+      type boolean;
+      default false;
+      description
+        "When set to true, if the local IS acts as a L1L2 router, then the
+        attached bit is not advertised in locally generated PDUs.";
+    }
+  }
+
+  grouping overload-bit-group {
+    description
+      "This grouping defines ISIS Overload Bit.";
+
+    container config {
+      description
+        "This container defines ISIS Overload Bit configuration.";
+
+      uses isis-overload-bit-set-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines state for ISIS Overload Bit.";
+
+      uses isis-overload-bit-set-config;
+    }
+
+    container reset-triggers {
+      description
+        "This container defines state for ISIS Overload Bit reset triggers";
+
+      list reset-trigger {
+        key "reset-trigger";
+
+        description
+          "This list describes ISIS Overload reset trigger reasons.";
+
+        leaf reset-trigger {
+          type leafref {
+            path "../config/reset-trigger";
+          }
+          description
+            "Reference to the reset trigger reason";
+        }
+
+        container config {
+          description
+            "This container defines ISIS Overload Bit reset trigger
+            configuration.";
+
+          uses isis-overload-bit-reset-config;
+        }
+
+        container state {
+          config false;
+          description
+            "This container defines state for ISIS Overload Bit reset
+            triggers.";
+
+          uses isis-overload-bit-reset-config;
+        }
+      }
+    }
+  }
+
+
+  grouping isis-base-level-config {
+    description
+      "This grouping defines ISIS Level configuration.";
+
+    leaf level-number {
+      type oc-isis-types:level-number;
+      description
+        "ISIS level number (level-1, level-2).";
+    }
+  }
+
+  grouping isis-interface-level-config {
+    description
+      "This grouping defines ISIS Interface Level configuration.";
+
+    leaf level-number {
+      type oc-isis-types:level-number;
+      description
+        "ISIS level number(level-1, level-2).";
+    }
+
+    leaf passive {
+      type boolean;
+      default false;
+      description
+        "ISIS passive interface admin enable/disable function.";
+    }
+
+    leaf priority {
+      type uint8 {
+        range "0 .. 127";
+      }
+      description
+        "ISIS neighbor priority(LAN hello PDU only).";
+    }
+  }
+
+  grouping isis-hello-timers-config {
+    description
+      "This grouping defines ISIS hello timers configuration.";
+
+    leaf hello-interval {
+      type uint32;
+      description
+        "ISIS hello-interval value.";
+    }
+
+    leaf hello-multiplier {
+      type uint8;
+      description
+        "ISIS hello-multiplier value.";
+    }
+  }
+
+  grouping isis-interface-config {
+    description
+      "This grouping defines ISIS interface configuration.";
+
+    leaf interface-id {
+      type oc-if:interface-id;
+      description
+        "Interface for which ISIS configuration is to be applied.";
+    }
+
+    leaf passive {
+      type boolean;
+      default false;
+      description
+        "When set to true, the referenced interface is a passive interface
+        such that it is not eligible to establish adjacencies with other
+        systems, but is advertised into the IS-IS topology.";
+    }
+
+    leaf hello-padding {
+      type oc-isis-types:hello-padding-type;
+      description
+        "This leaf controls padding type for IS-IS Hello PDUs.";
+    }
+
+    leaf circuit-type {
+      type oc-isis-types:circuit-type;
+      description
+        "ISIS circuit type (p2p, broadcast).";
+    }
+  }
+
+  grouping isis-adaptive-timers-state {
+    description
+      "This grouping defines ISIS adaptive timers state";
+
+    leaf adaptive-timer {
+      type oc-isis-types:adaptive-timer-type;
+        description
+          "ISIS adaptive timer types (linear, exponential).";
+    }
+  }
+
+  grouping isis-lsp-generation-timers-config {
+    description
+      "This grouping defines ISIS LSP Generation timers configuration";
+
+    leaf lsp-max-wait-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "Time interval in milliseconds that specifies max interval between
+         two consecutive occurrences of an LSP being generated.";
+    }
+
+    leaf lsp-first-wait-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "Time interval in milliseconds that specifies the first LSP generation
+        delay.";
+    }
+
+    leaf lsp-second-wait-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "Time interval in milliseconds that specifies the millisecond LSP
+         generation delay.";
+    }
+  }
+
+  grouping isis-lsp-timers-config {
+    description
+      "This grouping defines ISIS LSP timers configuration";
+
+    leaf lsp-lifetime-interval {
+      type uint16;
+      units seconds;
+      default 1200;
+      description
+        "Time interval in seconds that specifies how long an LSP remains in
+        LSDB without being refreshed.";
+    }
+
+    leaf lsp-refresh-interval {
+      type uint16;
+      units seconds;
+      description
+        "Time interval in seconds that specifies how often route topology
+         that a device originates is transmitted in LSPs.";
+    }
+  }
+
+  grouping isis-spf-timers-config {
+    description
+      "This grouping defines ISIS SPF timers configuration.";
+
+    leaf spf-hold-interval {
+      type uint64;
+      units milliseconds;
+      default 5000;
+      description
+        "SPF Hold Down time interval in milliseconds.";
+    }
+
+    leaf spf-first-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "Time interval in milliseconds between the
+        detection of topology change and when the SPF algorithm runs.";
+    }
+    leaf spf-second-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "Time interval in milliseconds between the first and second
+         SPF calculation.";
+    }
+  }
+
+  grouping isis-interface-timers-config {
+    description
+      "This grouping defines ISIS interface timers configuration.";
+
+    leaf csnp-interval {
+      type uint16;
+      units seconds;
+      description
+        "The interval, specified in seconds, at which periodic CSNP packets
+        should be transmitted by the local IS.";
+    }
+
+    leaf lsp-pacing-interval {
+      type uint64;
+      units milliseconds;
+      description
+        "The interval interval in milliseconds between the
+        detection of topology change and when the SPF algorithm runs.";
+    }
+  }
+
+  grouping isis-transport-config {
+    description
+      "This grouping defines configuration parameters relating to the
+      transport protocol used by the ISIS.";
+
+    leaf lsp-mtu-size {
+      type uint16;
+      description
+        "The maximum size in bytes of an IS-IS Link state PDU.";
+    }
+  }
+
+  grouping isis-graceful-restart-config {
+    description
+      "This grouping defines ISIS graceful restart configuration.";
+
+    leaf helper-only {
+      type boolean;
+      description
+        "Enable or disable the IS-IS graceful restart helper function. When
+        this leaf is set, the local system does not utilise the IS-IS
+        graceful restart procedures during its own restart, but supports
+        retaining forwarding information during a remote speaker's restart.";
+    }
+    reference "RFC 5306: Restart Signaling for IS-IS.";
+  }
+
+  // configuration context containers
+  grouping inter-level-propagation-policies-structural {
+    description
+      "Propagate prefixes between IS-IS levels.";
+
+    container inter-level-propagation-policies {
+      description
+        "Policies to propagate prefixes between IS-IS levels.";
+
+      container level1-to-level2 {
+        description
+          "Policies relating to prefixes to be propagated from
+          Level 1 to Level 2.";
+
+        container config {
+          description
+            "Configuration parameters relating to the propagation
+            of prefixes from IS-IS Level 1 to Level 2.";
+
+          uses inter-level-propagation-policy-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the
+            propagation of prefixes from IS-IS Level 1 to Level 2.";
+
+          uses inter-level-propagation-policy-config;
+        }
+
+      }
+
+      container level2-to-level1 {
+        description
+          "Policies relating to prefixes to be propagated from
+           Level2 to Level 1.";
+
+        container config {
+          description
+            "Configuration parameters relating to the propagation
+            of prefixes from IS-IS Level 2 to Level 1.";
+
+          uses inter-level-propagation-policy-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the propagation
+            of prefixes from IS-IS Level 2 to Level 1.";
+
+          uses inter-level-propagation-policy-config;
+        }
+      }
+    }
+  }
+
+  grouping inter-level-propagation-policy-config {
+    description
+      "Policy governing the propagation of prefixes between levels.";
+
+    uses oc-rpol:apply-policy-import-config;
+  }
+
+  grouping authentication-key-group-config {
+    description
+      "This grouping defines ISIS authentication key configuration.";
+
+    uses authentication-key-config;
+
+    // TODO(robjs): Add crypto-algorithm after merge of authentication modules.
+    //leaf crypto-algorithm {
+    //  type identityref {
+    //    base oc-auth-types:CRYPTO_TYPE;
+    //  }
+    //  description
+    //    "Authentication key cryptographic algorithm to be used for key encryption.";
+    //}
+  }
+
+  grouping isis-global-base {
+    description
+      "This grouping describes ISIS Global router.";
+
+    container config {
+      description
+        "This container defines ISIS global configuration router.";
+
+      uses isis-authentication-check-config;
+      uses isis-global-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines state for ISIS global router.";
+
+      uses isis-authentication-check-config;
+      uses isis-global-config;
+    }
+
+    container lsp-bit {
+      description
+        "This container defines ISIS LSP Operational Bits.";
+
+      container overload-bit {
+        description
+          "This container defines Overload Bit configuration.";
+        uses overload-bit-group;
+      }
+
+      container attached-bit {
+        description
+          "This container defines Attached Bit.";
+
+        container config {
+          description
+            "This container defines Attached Bit configuration.";
+
+          uses isis-attached-bit-config;
+        }
+
+        container state {
+          config false;
+          description
+            "This container defines state for Link State PDU Bit.";
+
+          uses isis-attached-bit-config;
+        }
+      }
+    }
+
+    container reference-bandwidth {
+      description
+        "This container defines ISIS Reference Bandwidth.";
+
+      container config {
+        description
+          "This container defines Reference Bandwidth configuration";
+        uses isis-reference-bandwidth-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state for Reference Bandwidth.";
+
+        uses isis-reference-bandwidth-config;
+      }
+    }
+
+    container nsr {
+      description
+        "This container defines ISIS Non-Stop Routing.";
+
+      container config {
+        description
+          "This container defines Non-Stop-Routing configuration.";
+
+        uses admin-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state for Non-Stop-Routing";
+
+        uses admin-config;
+      }
+    }
+
+    container graceful-restart {
+      description
+        "This container defines ISIS Graceful Restart.";
+
+      container config {
+        description
+          "This container defines ISIS graceful-restart configuration.";
+
+        uses admin-config;
+        uses isis-graceful-restart-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state information for ISIS graceful-restart.";
+
+        uses admin-config;
+        uses isis-graceful-restart-config;
+      }
+    }
+
+    container timers {
+      description
+        "This container defines ISIS timers.";
+
+      container config {
+        description
+          "This container defines ISIS global timers configuration.";
+
+        uses isis-lsp-timers-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state information for ISIS global timers.";
+
+        uses isis-lsp-timers-config;
+      }
+
+      container spf {
+        description
+          "This container defines ISIS SPF timer settings.";
+
+        container config {
+          description
+            "This container defines ISIS SPF timers configuration.";
+
+          uses isis-spf-timers-config;
+        }
+
+        container state {
+         config false;
+         description
+          "This container defines state information for ISIS SPF timers.";
+
+         uses isis-spf-timers-config;
+         uses isis-adaptive-timers-state;
+       }
+      }
+
+      container lsp-generation {
+        description
+          "This container defines ISIS LSP Generation.";
+
+        container config {
+          description
+            "This container defines ISIS LSP Generation timers
+            configuration.";
+
+          uses isis-lsp-generation-timers-config;
+        }
+
+        container state {
+          config false;
+          description
+            "This container defines state information for ISIS LSP Generation
+            timers.";
+
+          uses isis-lsp-generation-timers-config;
+          uses isis-adaptive-timers-state;
+        }
+      }
+    }
+
+    container transport {
+      description
+        "This container defines ISIS transport.";
+
+      container config {
+        description
+          "This container defines ISIS transport related configuration.";
+
+        uses isis-transport-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state information for ISIS transport
+          parameters.";
+
+        uses isis-transport-config;
+      }
+    }
+
+    container mpls {
+      description
+        "Configuration and operational state relating to MPLS-related
+        features in IS-IS";
+
+      container igp-ldp-sync {
+        description
+          "Configuration and operational state relating to synchronisation
+          between the LDP and IS-IS";
+
+        container config {
+          description
+            "This container defines ISIS/IGP configuration.";
+
+          uses isis-ldp-igp-config;
+        }
+
+        container state {
+          config false;
+          description
+            "This container defines state information for ISIS/LDP Sync.";
+
+          uses isis-ldp-igp-config;
+        }
+      }
+    }
+
+    container igp-shortcuts {
+      description
+        "This container defines IGP shortcuts configuration and state
+        information.";
+
+      uses isis-shortcuts-afi-list;
+    }
+
+    container afi-safi {
+      description
+        "This container defines address-family specific configuration
+        and state information.";
+
+      uses isis-afi-safi-list;
+    }
+
+    uses oc-sr:sr-igp-top;
+  }
+
+  grouping isis-route-preference-config {
+    description
+      "This grouping defines ISIS route preference configuration";
+
+    leaf external-route-preference {
+      type uint8 {
+        range "1..max";
+      }
+      description
+        "Administrative Distance(preference) for external ISIS routes.";
+    }
+
+    leaf internal-route-preference {
+      type uint8 {
+        range "1..max";
+      }
+      description
+        "Administrative Distance(preference) for internal ISIS routes.";
+    }
+  }
+
+  grouping isis-interfaces {
+    description
+      "This grouping defines ISIS interfaces configured on local system.";
+
+    list interface {
+      key "interface-id";
+
+      description
+        "This list contains ISIS interfaces.";
+
+      leaf interface-id {
+        type leafref {
+          path "../config/interface-id";
+        }
+        description
+          "Reference to interface-id";
+      }
+
+      uses isis-interface-group;
+      uses oc-if:interface-ref;
+    }
+  }
+
+  grouping isis-interface-group {
+    description
+      "This grouping defines ISIS interfaces configured on local system.";
+
+    container config {
+      description
+        "This container defines ISIS interface configuration.";
+
+      uses admin-config;
+      uses isis-interface-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines state information for ISIS interfaces.";
+
+      uses admin-config;
+      uses isis-interface-config;
+    }
+
+    container circuit-counters {
+      description
+        "This container defines state information for ISIS circuit counters.";
+
+      uses circuit-counters-structural;
+    }
+
+    container authentication {
+      description
+        "This container defines ISIS authentication.";
+
+      uses isis-hello-authentication-group;
+    }
+
+    container afi-safi {
+      description
+        "This container defines address-family specific configuration
+        and state information.";
+
+      uses isis-if-global-afi-safi-list;
+    }
+
+    container levels {
+      description
+        "This container defines ISIS level specific configuration and
+        state information.";
+
+      uses isis-interface-levels;
+    }
+
+    container timers {
+      description
+        "This container describes ISIS interface timers configuration";
+
+      container config {
+        description
+          "Configuration parameters relating to interface
+          timers for IS-IS";
+
+        uses isis-interface-timers-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines state information for ISIS interface timers.";
+
+        uses isis-interface-timers-config;
+      }
+    }
+
+    container bfd {
+      //TODO(bogdanov): Integrate BFD model/module
+      description
+        "This container defines BFD.";
+
+      container config {
+        description
+          "This container defines BFD configuration parameters.";
+
+        uses isis-bfd-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines BFD state information.";
+
+        uses isis-bfd-config;
+      }
+    }
+  }
+
+  grouping isis-levels {
+    description
+      "This grouping defines global ISIS Levels.";
+
+    list level {
+      key "level-number";
+
+      description
+        "Configuration and operational state parameters related to a
+        particular level within the IS-IS protocol instance";
+
+      leaf level-number {
+        type leafref {
+          path "../config/level-number";
+        }
+        description
+          "Reference to ISIS level-number.";
+      }
+
+      uses isis-level-group;
+    }
+  }
+
+  grouping isis-interface-levels {
+    description
+      "This grouping defines ISIS interface Levels.";
+
+    list level {
+      key "level-number";
+      description
+        "Configuration and operational state parameters related to a
+        particular level on an IS-IS enabled interface.";
+
+      leaf level-number {
+        type leafref {
+          path "../config/level-number";
+        }
+        description
+          "Reference to ISIS level-number.";
+      }
+
+      uses isis-interface-level-group;
+    }
+  }
+
+  grouping isis-level-group {
+    description
+      "This grouping defines ISIS level configuration and state
+      information.";
+
+    container config {
+      description
+        "This container defines ISIS level based configuration.";
+
+      uses admin-config;
+      uses isis-base-level-config;
+      uses isis-metric-style-config;
+      uses isis-authentication-check-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines ISIS level state information.";
+
+      uses admin-config;
+      uses isis-base-level-config;
+      uses isis-metric-style-config;
+      uses isis-authentication-check-config;
+    }
+
+    container system-level-counters {
+      description
+        "This container defines ISIS system level counters.";
+
+      uses system-level-counters-structural;
+    }
+
+    container link-state-database {
+      config false;
+      description
+        "This container defines ISIS LSDB.";
+
+      list lsp {
+        key "lsp-id";
+        description
+          "This list describes LSPs in the LSDB.";
+        uses lsp-state;
+      }
+    }
+
+    container traffic-engineering {
+      description
+        "This container defines ISIS TE.";
+
+      container config {
+        description
+          "This container defines ISIS TE configuration.";
+
+        uses admin-config;
+        uses isis-te-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS TE state information.";
+
+        uses admin-config;
+        uses isis-te-config;
+      }
+    }
+
+    container route-preference {
+      description
+        "This container defines Administrative Distance (or preference)
+        assigned to ISIS routes (level1 internal, level2 internal, level1
+        external, level2 external).";
+
+      container config {
+        description
+          "This container defines route preference configuration.";
+        uses isis-route-preference-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS route preference state information.";
+        uses isis-route-preference-config;
+      }
+    }
+
+    container authentication {
+      description
+        "This container defines ISIS authentication.";
+      uses isis-authentication-group;
+    }
+
+  }
+
+  grouping isis-interface-level-group {
+    description
+      "This grouping defines ISIS interface level.";
+
+    container config {
+      description
+        "This container defines interface ISIS level configuration.";
+
+      uses isis-interface-level-config;
+      uses admin-config;
+    }
+
+    container state {
+      config false;
+      description
+        "This container defines interface ISIS level state information.";
+
+      uses isis-interface-level-config;
+      uses admin-config;
+    }
+
+    container packet-counters {
+      description
+        "This container defines ISIS interface packet counters.";
+
+      uses packet-counters-structural;
+    }
+
+    container adjacencies {
+      config false;
+      description
+        "This container defines ISIS adjacencies.";
+
+      list adjacency {
+        key "system-id";
+
+        description
+          "List of the local system's IS-IS adjacencies.";
+
+        leaf system-id {
+          type leafref {
+            path "../state/system-id";
+          }
+          description
+            "Reference to the IS neighbor.";
+        }
+
+        container state {
+          description
+            "Operational state relating to the IS-IS adjacency with the
+            remote system";
+
+          uses adjacency-state;
+        }
+      }
+    }
+
+    container timers {
+      description
+        "This container defines ISIS timers.";
+
+      container config {
+        description
+          "This container defines ISIS interface hello-timers configuration.";
+
+        uses isis-hello-timers-config;
+      }
+
+      container state {
+        config false;
+        description
+          "This container defines ISIS interface hello-timers state.";
+
+        uses isis-hello-timers-config;
+      }
+    }
+
+    container afi-safi {
+      description
+        "This container defines address-family specific configuration
+        and state information.";
+
+      uses isis-if-afi-safi-list;
+    }
+
+    container hello-authentication {
+      description
+        "This container defines ISIS authentication.";
+
+      uses isis-hello-authentication-group;
+    }
+  }
+
+
+  grouping isis-top {
+    description
+      "This grouping define top-level ISIS model data.";
+
+    container isis {
+      description
+        "This container defines top-level ISIS configuration and state
+        information.";
+
+      container global {
+        description
+          "This container defines global ISIS configuration and state
+          information.";
+
+        uses isis-global-base;
+        uses inter-level-propagation-policies-structural;
+      }
+
+      container levels {
+        description
+          "This container defines ISIS level configuration and state
+          information.";
+        uses isis-levels;
+      }
+
+      container interfaces {
+        description
+          "This container defines global ISIS interface configuration and
+          state information.";
+        uses isis-interfaces;
+      }
+    }
+  }
+
+  grouping adjacency-state {
+    description
+      "This grouping defines ISIS adjacency.";
+
+    leaf system-id {
+     type oc-isis-types:system-id;
+      description
+        "ISIS neighbor system-id.";
+    }
+
+    leaf neighbor-ipv4-address {
+      type inet:ipv4-address-no-zone;
+      description
+        "ISIS Neighbor IPv4 address.";
+    }
+
+    leaf neighbor-ipv6-address {
+      type inet:ipv6-address-no-zone;
+      description
+        "ISIS Neighbor IPv6 address.";
+    }
+
+    leaf neighbor-snpa {
+      type oc-isis-types:snpa;
+      description
+        "ISIS neighbor SNPA.";
+    }
+
+    leaf local-extended-circuit-id {
+      type oc-isis-types:extended-circuit-id;
+      description
+        "Local extended circuit ID.";
+    }
+    leaf neighbor-extended-circuit-id {
+      type oc-isis-types:extended-circuit-id;
+      description
+        "ISIS neighbor extended circuit ID.";
+    }
+
+    leaf priority {
+      type uint8 {
+        range "0..127";
+      }
+      description
+        "Priority of the neighboring IS(LAN Hello only).";
+    }
+
+    leaf dis-system-id {
+      type oc-isis-types:system-id;
+      description
+        "DIS System ID(LAN hello only).";
+    }
+
+    leaf neighbor-circuit-type {
+      type oc-isis-types:level-type;
+      description
+        "Received ISIS circuit type (level-1, level-2, level-1-2).";
+    }
+
+    leaf adjacency-type {
+      type oc-isis-types:level-type;
+      description
+        "Formed ISIS adjacency type(level-1, level-2, level-1-2).";
+    }
+
+    leaf adjacency-state {
+      type oc-isis-types:isis-interface-adj-state;
+      description
+        "P2P 3-way ISIS adjacency state(up, down, init, failed).";
+      reference "RFC4303. TLV 240.";
+    }
+
+    leaf remaining-hold-time {
+      type uint16;
+      units seconds;
+      description
+        "Holding time in seconds for adjacency. This value is based on received
+        hello PDUs and the elapsed time since receipt.";
+    }
+
+    leaf up-time {
+      type yang:timestamp;
+      description
+        "Adjacency up time.";
+    }
+
+    leaf multi-topology {
+      type boolean;
+      description
+        "When set to true, ISIS multi-topology is supported.";
+      reference "RFC5129. TLV 229.";
+    }
+
+    leaf-list topology {
+      type identityref {
+        base oc-isis-types:AFI_SAFI_TYPE;
+      }
+      description
+        "ISIS topology type support(ipv4-unicast, ipv6-unicast,
+        ipv4-multicast, ipv6-multicast).";
+    }
+
+    leaf restart-support {
+      type boolean;
+      description
+        "When set to true, Graceful-restart signaling is supported.";
+    }
+
+    leaf restart-suppress {
+      type boolean;
+      description
+        "When set to true, adjacency is not advertised. The SA bit is used by a
+        starting router to  request that its neighbor suppress advertisement of
+        the adjacency  to the starting router in the neighbor's LSPs.";
+    }
+
+    leaf restart-status {
+      type boolean;
+      description
+        "When set to true, neighbor is being helped. The RR bit is used by a
+        (re)starting router to signal to its neighbors that a (re)start is in
+        progress.";
+    }
+
+    leaf-list area-address {
+      type oc-isis-types:area-address;
+      description
+        "List of ISIS area-address(es).";
+    }
+
+    leaf-list nlpid {
+      type enumeration {
+        enum IPV4 {
+          description
+      "IPv4 Address family.";
+        }
+        enum IPV6 {
+          description
+      "IPv6 Address family.";
+        }
+      }
+      description
+        "Supported Protocol. IPv4 is defined as (0xcc)
+        and IPv6 - (0x8e). ISIS reference is TLV 129.";
+    }
+
+    // TODO(bogdanov): update when BFD model is integrated.
+    //leaf ipv4-bfd-status {
+      //type oc-isis-types:bfd-state;
+      //description
+      //  "IPv4 BFD session status.";
+    //}
+    //leaf ipv6-bfd-status {
+      //type oc-isis-types:bfd-state;
+      //description
+      //  "IPv4 BFD session status. ";
+    //}
+
+  }
+
+  grouping packet-counters-generic-state {
+    description
+      "Operational state parameters relating to LSP packet counters.";
+
+    leaf received {
+      type yang:counter32;
+      description
+        "The number of the specified type of PDU received on the interface.";
+    }
+    leaf processed {
+      type yang:counter32;
+      description
+        "The number of the specified type of PDU received on the interface
+        that have been processed by the local system.";
+    }
+    leaf dropped {
+      type yang:counter32;
+      description
+        "The number of the specified type of PDU received on the interface
+        that have been dropped.";
+    }
+
+    leaf sent {
+      type yang:counter32;
+      description
+        "The number of the specified type of PDU that have been sent by the
+        local system on the interface.";
+    }
+
+    leaf retransmit {
+      type yang:counter32;
+      description
+        "The number of the specified type of PDU that that have been
+        retransmitted by the local system on the interface.";
+    }
+  }
+
+  grouping packet-counters-structural {
+    description
+      "This grouping defines ISIS packet counter state.";
+
+    container lsp {
+      description
+        "This container defines LSP packet counters.";
+
+     container state {
+      config false;
+      description
+        "This container defines LSP PDU counters.";
+
+      uses packet-counters-generic-state;
+     }
+    }
+
+    container iih {
+      description
+        "This container defines IIH packet counters.";
+
+      container state {
+        config false;
+        description
+          "Operational counters relating to IIH PDUs";
+
+        uses packet-counters-generic-state;
+      }
+    }
+
+    container ish {
+      description
+        "This container defines ISH packet counters.";
+
+     container state {
+      config false;
+      description
+        "Operational state relating to ISH PDUs.";
+
+      uses packet-counters-generic-state;
+     }
+    }
+
+    container esh {
+     description
+       "This container defines ESH packet counters.";
+     container state {
+      config false;
+      description
+        "Operational state relating to ESH PDUs";
+
+      uses packet-counters-generic-state;
+     }
+    }
+
+    container psnp {
+     description
+      "This container defines PSNP packet counters.";
+
+      container state {
+        config false;
+        description
+          "Packet counters relating to PSNPs.";
+
+        uses packet-counters-generic-state;
+      }
+    }
+
+    container csnp {
+      description
+        "Operational state parameters relating to CSNPs.";
+
+      container state {
+        config false;
+        description
+          "Packet counters relating to CSNPs.";
+
+        uses packet-counters-generic-state;
+      }
+    }
+
+    container unknown {
+      description
+        "Operational state parameters relating to IS-IS PDUs that are not
+        otherwise classified - referred to as Unknown PDUs.";
+
+      container state {
+        config false;
+        description
+          "Packet counters relating to unknown PDUs.";
+
+        uses packet-counters-generic-state;
+      }
+    }
+  }
+
+  grouping system-level-counters-state {
+    description
+      "IS-IS counters that are relevant to the system IS-IS context.";
+
+    leaf corrupted-lsps {
+      type yang:counter32;
+      description
+        "Number of corrupted in-memory LSPs detected. LSPs received from the
+        wire with a bad checksum are silently dropped and not counted. LSPs
+        received from the wire with parse errors are counted by lsp-errors. MIB
+        Entry: SysCorrLSPs.";
+    }
+
+    leaf database-overloads {
+      type yang:counter32;
+      description
+        "Number of times the database has become
+        overloaded.
+        MIB entry: SysLSPL(Level)DbaseOloads.";
+    }
+
+    leaf manual-address-drop-from-areas {
+      type yang:counter32;
+      description
+        "Number of times a manual address has been dropped from area.
+        MIB Entry: SysManAddrDropFromAreas.";
+    }
+
+    leaf exceed-max-seq-nums {
+      type yang:counter32;
+      description
+        "The number of times the system has attempted to exceed the maximum
+        sequence number. MIB Entry: SysAttmptToExMaxSeqNums.";
+    }
+    leaf seq-num-skips {
+      type yang:counter32;
+      description
+        "Number of times a sequence number skip has occurred. MIB Entry:
+        SysSeqNumSkips.";
+    }
+
+    leaf own-lsp-purges {
+      type yang:counter32;
+      description
+        "Number of times a zero-aged copy of the system's
+        own LSP is received from some other node.
+        MIB Entry: isisSysOwnLSPPurges.";
+    }
+
+    leaf id-len-mismatch {
+      type yang:counter32;
+      description
+        "Number of times a PDU is received with a different value for ID field
+        length from that of the receiving system. MIB Entry:
+        isisSysIDFieldLenMismatches.";
+    }
+
+    leaf part-changes {
+      type yang:counter32;
+      description
+        "The number of partition changes detected. MIB Entry: SysPartChanges.";
+    }
+
+    leaf max-area-address-mismatches {
+      type yang:counter32;
+      description
+        "Number of times a PDU is received with a different value for
+        MaximumAreaAddresses from that of the receiving system. MIB Entry:
+        SysMaxAreaAddrMismatches.";
+    }
+
+    leaf auth-fails {
+      type yang:counter32;
+      description
+        "The number of authentication key failures.
+         MIB Entry: SysAuthFails.";
+    }
+
+    leaf spf-runs {
+      type yang:counter32;
+      description
+        "The number of times SPF was ran at this level.";
+    }
+
+    leaf auth-type-fails {
+      type yang:counter32;
+      description
+        "The number of authentication type mismatches.";
+    }
+
+    leaf lsp-errors {
+      type yang:counter32;
+      description
+        "The number of received LSPs with errors.";
+    }
+  }
+
+  grouping system-level-counters-structural {
+    description
+      "This grouping defines system level counters.";
+
+    container state {
+      config false;
+      description
+        "The container defines a list of system counters for the IS.";
+
+      uses system-level-counters-state;
+    }
+  }
+
+  grouping circuit-counters-state {
+    description
+      "Operational state parameters relating to counters specific to one
+      interface or circuit.";
+
+    leaf adj-changes {
+      type yang:counter32;
+      description
+        "Number of times an adjacency state change has occurred on this circuit.
+        MIB Entry: CircAdjChanges.";
+    }
+
+    leaf init-fails {
+      type yang:counter32;
+      description
+        "Number of times initialization of this circuit has failed. This counts
+        events such as PPP NCP failures. MIB Entry: CircInitFails.";
+    }
+
+    leaf rejected-adj {
+      type yang:counter32;
+      description
+        "Number of times an adjacency has been rejected on this circuit. MIB
+        Entry: CircRejAdjs.";
+    }
+
+    leaf id-field-len-mismatches {
+      type yang:counter32;
+      description
+        "Number of times an IS-IS control PDU with an ID field length different
+        from that for this system has been received.
+        MIB Entry: CircIDFieldLenMismatches.";
+    }
+
+    leaf max-area-address-mismatches {
+      type yang:counter32;
+      description
+        "Number of times an IS-IS control PDU with a max area address field
+        different from that for this system has been received. MIB Entry:
+        CircMaxAreaAddrMismatches.";
+    }
+
+    leaf auth-type-fails {
+      type yang:counter32;
+      description
+        "Number of times an IS-IS control PDU with an auth type field different
+        from that for this system has been received. MIB Entry:
+        CircAuthTypeFails.";
+    }
+
+    leaf auth-fails {
+      type yang:counter32;
+      description
+        "Number of times an IS-IS control PDU with the correct auth type has
+        failed to pass authentication validation. MIB Entry: CircAuthFails.";
+    }
+
+    leaf lan-dis-changes {
+      type yang:counter32;
+      description
+        "Number of times the Designated IS has changed on this circuit at this
+        level. If the circuit is point to point, this count is zero. MIB Entry:
+        CircLANDesISChanges.";
+    }
+
+    leaf adj-number {
+      type uint32;
+      description
+        "Number of adjacencies on this circuit.
+        MIB Entry: CircNumAdj.";
+    }
+  }
+
+  grouping circuit-counters-structural {
+    description
+      "This grouping defines circuit counters.";
+
+    container state {
+      config false;
+      description
+          "The container defines a list of counters for IS circuit.";
+
+     uses circuit-counters-state;
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/lacp/openconfig-lacp.yang b/models/openconfig/src/main/yang/lacp/openconfig-lacp.yang
new file mode 100644
index 0000000..e49dcb6
--- /dev/null
+++ b/models/openconfig/src/main/yang/lacp/openconfig-lacp.yang
@@ -0,0 +1,461 @@
+module openconfig-lacp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/lacp";
+
+  prefix "oc-lacp";
+
+  // import some basic types
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module describes configuration and operational state
+    data for Link Aggregation Control Protocol (LACP) for
+    managing aggregate interfaces.   It works in conjunction with
+    the OpenConfig interfaces and aggregate interfaces models.";
+
+  oc-ext:openconfig-version "1.1.0";
+
+  revision "2017-05-05" {
+    description
+      "Add member local and remote port num";
+    reference "1.1.0";
+  }
+
+  revision "2016-05-26" {
+    description
+      "OpenConfig public release";
+    reference "1.0.2";
+  }
+
+
+  // typedef statements
+
+  typedef lacp-activity-type {
+    type enumeration {
+      enum ACTIVE {
+        description
+          "Interface is an active member, i.e., will detect and
+          maintain aggregates";
+      }
+      enum PASSIVE {
+        description
+          "Interface is a passive member, i.e., it participates
+          with an active partner";
+      }
+    }
+    description
+      "Describes the LACP membership type, active or passive, of the
+      interface in the aggregate";
+    reference "IEEE 802.1AX-2008";
+  }
+
+  typedef lacp-timeout-type {
+    type enumeration {
+      enum LONG {
+        description
+          "Participant wishes to use long timeouts to detect
+          status of the aggregate, i.e., will expect less frequent
+          transmissions. Long timeout is 90 seconds.";
+      }
+      enum SHORT {
+        description
+          "Participant wishes to use short timeouts, i.e., expects
+          frequent transmissions to aggressively detect status
+          changes. Short timeout is 3 seconds.";
+      }
+    }
+    description
+      "Type of timeout used, short or long, by LACP participants";
+    reference "IEEE 802.1AX-2008";
+  }
+
+  typedef lacp-synchronization-type {
+    type enumeration {
+      enum IN_SYNC {
+        description
+          "Participant is in sync with the system id and key
+          transmitted";
+      }
+      enum OUT_SYNC {
+        description
+          "Participant is not in sync with the system id and key
+          transmitted";
+      }
+    }
+    description
+      "Indicates LACP synchronization state of participant";
+    reference "IEEE 802.1AX-2008";
+  }
+
+  typedef lacp-period-type {
+    type enumeration {
+      enum FAST {
+        description "Send LACP packets every second";
+      }
+      enum SLOW {
+        description "Send LACP packets every 30 seconds";
+      }
+    }
+    description
+      "Defines the period options for the time between sending
+      LACP messages";
+    reference "IEEE 802.3ad";
+  }
+
+  // grouping statements
+
+
+  grouping aggregation-lacp-members-config {
+    description
+      "Configuration data for lacp member interfaces";
+
+    //currently a placeholder -- the list of member interfaces
+    //and their status is considered opstate only
+  }
+
+  grouping aggregation-lacp-members-state {
+    description
+      "Operational status data for the member interfaces";
+
+    leaf interface {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to interface member of the LACP aggregate";
+    }
+
+    leaf activity {
+      type lacp-activity-type;
+      description "Indicates participant is active or passive";
+    }
+
+    leaf timeout {
+      type lacp-timeout-type;
+      description
+        "The timeout type (short or long) used by the
+        participant";
+    }
+
+    leaf synchronization {
+      type lacp-synchronization-type;
+      description
+        "Indicates whether the participant is in-sync or
+        out-of-sync";
+    }
+
+    leaf aggregatable {
+      type boolean;
+      description
+        "A true value indicates that the participant will allow
+        the link to be used as part of the aggregate. A false
+        value indicates the link should be used as an individual
+        link";
+    }
+
+    leaf collecting {
+      type boolean;
+      description
+        "If true, the participant is collecting incoming frames
+        on the link, otherwise false";
+    }
+
+    leaf distributing {
+      type boolean;
+      description
+        "When true, the participant is distributing outgoing
+        frames; when false, distribution is disabled";
+    }
+
+    leaf system-id {
+      type oc-yang:mac-address;
+      description
+        "MAC address that defines the local system ID for the
+        aggregate interface";
+    }
+
+    leaf oper-key {
+      type uint16;
+      description
+        "Current operational value of the key for the aggregate
+        interface";
+    }
+
+    leaf partner-id {
+      type oc-yang:mac-address;
+      description
+        "MAC address representing the protocol partner's interface
+        system ID";
+    }
+
+    leaf partner-key {
+      type uint16;
+      description
+        "Operational value of the protocol partner's key";
+    }
+
+    leaf port-num {
+      type uint16;
+      description
+        "Port number of the local (actor) aggregation member";
+    }
+
+    leaf partner-port-num {
+      type uint16;
+      description
+        "Port number of the partner (remote) port for this member
+        port";
+    }
+  }
+
+grouping aggregation-lacp-members-statistics {
+    description
+      "LACP packet statistics for the member interfaces";
+
+    container counters {
+      description
+        "LACP protocol counters";
+
+      leaf lacp-in-pkts {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDUs received";
+      }
+
+      leaf lacp-out-pkts {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDUs transmitted";
+      }
+
+      leaf lacp-rx-errors {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDU receive packet errors";
+      }
+
+      leaf lacp-tx-errors {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDU transmit packet errors";
+      }
+
+      leaf lacp-unknown-errors {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDU unknown packet errors";
+      }
+
+      leaf lacp-errors {
+        type oc-yang:counter64;
+        description
+          "Number of LACPDU illegal packet errors";
+      }
+    }
+  }
+
+  grouping aggregation-lacp-members-top {
+    description
+      "Top-level grouping for aggregate members list";
+
+    container members {
+      config false;
+      description
+        "Enclosing container for the list of members interfaces of
+        the aggregate. This list is considered operational state
+        only so is labeled config false and has no config container";
+
+      list member {
+        key "interface";
+        description
+          "List of member interfaces and their associated status for
+          a LACP-controlled aggregate interface.  Member list is not
+          configurable here -- each interface indicates items
+          its participation in the LAG.";
+
+        leaf interface {
+          type leafref {
+            path "../state/interface";
+          }
+          description
+            "Reference to aggregate member interface";
+        }
+
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for aggregate members";
+
+          uses aggregation-lacp-members-state;
+          uses aggregation-lacp-members-statistics;
+        }
+      }
+    }
+  }
+
+  grouping lacp-interfaces-config {
+    description
+      "Configuration data for each LACP-enabled interface";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the interface on which LACP should be
+        configured.   The type of the target interface must be
+        ieee8023adLag";
+    }
+
+    leaf interval {
+      type lacp-period-type;
+      default SLOW;
+      description
+        "Set the period between LACP messages -- uses
+        the lacp-period-type enumeration.";
+    }
+
+    leaf lacp-mode {
+      type lacp-activity-type;
+      default ACTIVE;
+      description
+        "ACTIVE is to initiate the transmission of LACP packets.
+         PASSIVE is to wait for peer to initiate the transmission of
+         LACP packets.";
+        //TODO:some implementations configure the LACP mode on each
+        //member interface rather than on the LAG interface.  There
+        //may be use cases for this identified at a later time.
+    }
+
+    leaf system-id-mac {
+      type oc-yang:mac-address;
+      description
+        "The MAC address portion of the node's System ID. This is
+        combined with the system priority to construct the 8-octet
+        system-id";
+    }
+
+    uses aggregation-lacp-global-config;
+  }
+
+  grouping lacp-interfaces-state {
+    description
+      "Operational state data for each LACP-enabled interface";
+  }
+
+  grouping lacp-interfaces-top {
+    description
+      "Top-level grouping for LACP-enabled interfaces";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of LACP-enabled
+        interfaces";
+
+      list interface {
+        key "name";
+        description
+          "List of aggregate interfaces managed by LACP";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container config {
+          description
+            "Configuration data for each LACP aggregate interface";
+
+          uses lacp-interfaces-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each LACP aggregate
+            interface";
+
+          uses lacp-interfaces-config;
+          uses lacp-interfaces-state;
+        }
+
+        uses aggregation-lacp-members-top;
+      }
+    }
+  }
+
+  grouping aggregation-lacp-global-config {
+    description
+      "Configuration data for LACP aggregate interfaces";
+
+
+    leaf system-priority {
+      type uint16;
+      description
+        "Sytem priority used by the node on this LAG interface.
+        Lower value is higher priority for determining which node
+        is the controlling system.";
+    }
+  }
+
+  grouping aggregation-lacp-global-state {
+    description
+      "Operational data for LACP aggregate interfaces";
+
+  }
+
+  grouping aggregation-lacp-top {
+    description
+      "Top level configuration and state variable containers for
+      LACP data";
+
+    container lacp {
+      description
+        "Configuration and operational state data for LACP protocol
+        operation on the aggregate interface";
+
+      container config {
+        description
+          "Configuration data for LACP";
+
+        uses aggregation-lacp-global-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Operational state data for LACP";
+
+        uses aggregation-lacp-global-config;
+        uses aggregation-lacp-global-state;
+      }
+      uses lacp-interfaces-top;
+    }
+  }
+
+  // data definition statements
+  uses aggregation-lacp-top;
+
+  // augment statements
+
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/lldp/openconfig-lldp-types.yang b/models/openconfig/src/main/yang/lldp/openconfig-lldp-types.yang
new file mode 100644
index 0000000..cc7f9f5
--- /dev/null
+++ b/models/openconfig/src/main/yang/lldp/openconfig-lldp-types.yang
@@ -0,0 +1,296 @@
+module openconfig-lldp-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/lldp/types";
+
+  prefix "oc-lldp-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines types related to the LLDP protocol model.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2016-05-16" {
+    description
+      "Initial public revision";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+  identity LLDP_SYSTEM_CAPABILITY {
+    description
+      "Base identity for standard LLDP system capabilities.
+      The system capabilities field contains a bit-map of the
+      capabilities that define the primary function(s) of
+      the system. A system may advertise more than one capability.";
+    reference
+      "Table 8-4 System Capabilities, IEEE 802.1AB-2009";
+  }
+
+  identity OTHER {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Other capability not specified; bit position 1";
+  }
+
+  identity REPEATER {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Repeater capability; bit position 2";
+    reference
+      "IETF RFC 2108";
+  }
+
+  identity MAC_BRIDGE {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "MAC bridge capability; bit position 3";
+    reference
+      "IEEE Std 802.1D";
+  }
+
+  identity WLAN_ACCESS_POINT {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "WLAN access point capability; bit position 4";
+    reference
+      "IEEE Std 802.11 MIB";
+  }
+
+  identity ROUTER {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Router; bit position 5";
+    reference
+      "IETF RFC 1812";
+  }
+
+  identity TELEPHONE {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Telephone capability; bit position 6";
+    reference
+      "IETF RFC 4293";
+  }
+
+  identity DOCSIS_CABLE_DEVICE {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "DOCSIS cable device; bit position 7";
+    reference
+      "IETF RFC 4639 and IETF RFC 4546";
+  }
+
+  identity STATION_ONLY {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Station only capability, for devices that implement only an
+      end station capability, and for which none of the other
+      capabilities apply; bit position 8";
+    reference
+      "IETF RFC 4293";
+  }
+
+  identity C_VLAN {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "C-VLAN component of a VLAN Bridge; bit position 9";
+    reference
+      "IEEE Std 802.1Q";
+  }
+
+  identity S_VLAN {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "S-VLAN component of a VLAN Bridge; bit position 10";
+    reference
+      "IEEE Std 802.1Q";
+  }
+
+  identity TWO_PORT_MAC_RELAY {
+    base LLDP_SYSTEM_CAPABILITY;
+    description
+      "Two-port MAC Relay (TPMR) capability; bit position 11";
+    reference
+      "IEEE Std 802.1Q";
+  }
+
+  identity LLDP_TLV {
+    description
+      "A base identity which describes the TLVs in LLDP";
+  }
+
+  identity CHASSIS_ID {
+    base LLDP_TLV;
+    description
+      "The chassis identifier of the device associated with
+      the transmitting LLDP agent";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity PORT_ID {
+    base LLDP_TLV;
+    description
+      "The port identifier associated with the interface
+      on with the LLDP agent is transmitting";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity PORT_DESCRIPTION {
+    base LLDP_TLV;
+    description
+      "The description of the port that is associated with
+      the interface on which the LLDP agent is transmitting";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity SYSTEM_NAME {
+    base LLDP_TLV;
+    description
+      "The assigned name (sysName or hostname) of the device
+      which is transmitting the LLDP PDU";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity SYSTEM_DESCRIPTION {
+    base LLDP_TLV;
+    description
+      "The description (sysDescr) of the device which is
+      transmitting the LLDP PDU";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity SYSTEM_CAPABILITIES {
+    base LLDP_TLV;
+    description
+      "The primary functions of the device transmitting the
+      LLDP PDU and their administrative status";
+    reference "IEEE Std 802.1AB";
+  }
+
+  identity MANAGEMENT_ADDRESS {
+    base LLDP_TLV;
+    description
+      "The address associated with the device transmitting the
+      LLDP PDU which can be used for higher-layer network
+      management";
+    reference "IEEE Std 802.1AB";
+  }
+
+  // typedef statements
+
+  typedef chassis-id-type {
+    type enumeration {
+      enum CHASSIS_COMPONENT {
+        description
+          "Chassis identifier based on the value of entPhysicalAlias
+          object defined in IETF RFC 2737";
+      }
+      enum INTERFACE_ALIAS {
+        description
+          "Chassis identifier based on the value of ifAlias object
+          defined in IETF RFC 2863";
+      }
+      enum PORT_COMPONENT {
+        description
+          "Chassis identifier based on the value of entPhysicalAlias
+          object defined in IETF RFC 2737 for a port or backplane
+          component";
+      }
+      enum MAC_ADDRESS {
+        description
+          "Chassis identifier based on the value of a unicast source
+          address (encoded in network byte order and IEEE 802.3
+          canonical bit order), of a port on the containing chassis
+          as defined in IEEE Std 802-2001";
+      }
+      enum NETWORK_ADDRESS {
+        description
+          "Chassis identifier based on a network address,
+          associated with a particular chassis.  The encoded address
+          is composed of two fields.  The first field is a single
+          octet, representing the IANA AddressFamilyNumbers value
+          for the specific address type, and the second field is the
+          network address value";
+      }
+      enum INTERFACE_NAME {
+        description
+          "Chassis identifier based on the name of the interface,
+          e.g., the value of ifName object defined in IETF RFC 2863";
+      }
+      enum LOCAL {
+        description
+          "Chassis identifier based on a locally defined value";
+      }
+    }
+    description
+      "Type definition with enumerations describing the source of
+      the chassis identifier";
+    reference
+      "IEEE 802.1AB LLDP MIB";
+  }
+
+  typedef port-id-type {
+    type enumeration {
+      enum INTERFACE_ALIAS {
+        description
+          "Chassis identifier based on the value of ifAlias object
+          defined in IETF RFC 2863";
+      }
+      enum PORT_COMPONENT {
+        description
+          "Port identifier based on the value of entPhysicalAlias
+          object defined in IETF RFC 2737 for a port component";
+      }
+      enum MAC_ADDRESS {
+        description
+          "Port identifier based on the value of a unicast source
+          address (encoded in network byte order and IEEE 802.3
+          canonical bit order) associated with a port";
+      }
+      enum NETWORK_ADDRESS {
+        description
+          "Port identifier based on a network address,
+          associated with a particular port";
+      }
+      enum INTERFACE_NAME {
+        description
+          "Port identifier based on the name of the interface,
+          e.g., the value of ifName object defined in IETF RFC 2863";
+      }
+      enum AGENT_CIRCUIT_ID {
+        description
+          "Port identifer based on the circuit id in the DHCP
+          relay agent information option as defined in IETF
+          RFC 3046";
+      }
+      enum LOCAL {
+        description
+          "Port identifier based on a locally defined alphanumeric
+          string";
+      }
+    }
+    description
+      "Type definition with enumerations describing the basis of
+      the port identifier";
+    reference
+      "IEEE 802.1AB LLDP MIB";
+  }
+
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang b/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang
new file mode 100644
index 0000000..9c1d87c
--- /dev/null
+++ b/models/openconfig/src/main/yang/lldp/openconfig-lldp.yang
@@ -0,0 +1,635 @@
+module openconfig-lldp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/lldp";
+
+  prefix "oc-lldp";
+
+  import openconfig-lldp-types { prefix oc-lldp-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import ietf-yang-types { prefix yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    for the LLDP protocol.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2016-05-16" {
+    description
+      "Initial public revision";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+
+  // grouping statements
+
+  grouping lldp-common-counters {
+    description
+      "Definition of global and per-interface counters";
+
+    leaf frame-in {
+      type yang:counter64;
+      description
+        "The number of lldp frames received.";
+    }
+
+    leaf frame-out {
+      type yang:counter64;
+      description
+        "The number of frames transmitted out.";
+    }
+
+    leaf frame-error-in {
+      type yang:counter64;
+      description
+        "The number of LLDP frames received with errors.";
+    }
+
+    leaf frame-discard {
+      type yang:counter64;
+      description
+        "The number of LLDP frames received and discarded.";
+    }
+
+    leaf tlv-discard {
+      type yang:counter64;
+      description
+        "The number of TLV frames received and discarded.";
+    }
+
+    leaf tlv-unknown {
+      type yang:counter64;
+      description
+        "The number of frames received with unknown TLV.";
+    }
+
+    leaf last-clear {
+      type yang:date-and-time;
+      description
+        "Indicates the last time the counters were
+        cleared.";
+    }
+  }
+
+  grouping lldp-global-counters {
+    description
+      "Definition of global LLDP counters";
+
+    uses lldp-common-counters;
+
+    leaf tlv-accepted {
+      type yang:counter64;
+      description
+        "The number of valid TLVs received.";
+    }
+
+    leaf entries-aged-out {
+      type yang:counter64;
+      description
+        "The number of entries aged out due to timeout.";
+    }
+
+  }
+
+  grouping lldp-interface-counters {
+    description
+      "Definition of per-interface LLDP counters";
+
+      uses lldp-common-counters;
+
+      leaf frame-error-out {
+        type yang:counter64;
+        description
+          "The number of frame transmit errors on the
+          interface.";
+      }
+  }
+
+  grouping lldp-system-info-config {
+    description
+      "Configuration data for system-level local and remote
+      LLDP information";
+
+    leaf system-name {
+      type string {
+        length 0..255;
+      }
+      description
+        "The system name field shall contain an alpha-numeric string
+        that indicates the system's administratively assigned name.
+        The system name should be the system's fully qualified domain
+        name. If implementations support IETF RFC 3418, the sysName
+        object should be used for this field.";
+    }
+
+    leaf system-description {
+      type string {
+        length 0..255;
+      }
+      description
+        "The system description field shall contain an alpha-numeric
+        string that is the textual description of the network entity.
+        The system description should include the full name and
+        version identification of the system's hardware type,
+        software operating system, and networking software. If
+        implementations support IETF RFC 3418, the sysDescr object
+        should be used for this field.";
+    }
+
+    leaf chassis-id {
+      type string;
+      description
+        "The Chassis ID is a mandatory TLV which identifies the
+        chassis component of the endpoint identifier associated with
+        the transmitting LLDP agent";
+    }
+
+    leaf chassis-id-type {
+      type oc-lldp-types:chassis-id-type;
+      description
+        "This field identifies the format and source of the chassis
+        identifier string. It is an enumerator defined by the
+        LldpChassisIdSubtype object from IEEE 802.1AB MIB.";
+    }
+  }
+
+  grouping lldp-system-info-state {
+    description
+      "Operational state data reported for the local and remote
+      systems";
+
+  }
+
+  grouping lldp-neighbor-config {
+    description
+      "Configuration data for LLDP neighbors";
+
+  }
+
+  grouping lldp-neighbor-state {
+    description
+      "Operational state data for LLDP neighbors";
+
+    leaf id {
+      type string;
+      description
+        "System generated identifier for the neighbor on the
+        interface.";
+    }
+
+    leaf age {
+      type uint64;
+      units "seconds";
+      description
+        "Age since discovery";
+    }
+
+    leaf last-update {
+      type int64;
+      description
+        "Seconds since last update received.";
+    }
+
+    leaf port-id {
+      type string;
+      description
+        "The Port ID is a mandatory TLV which identifies the port
+        component of the endpoint identifier associated with the
+        transmitting LLDP agent. If the specified port is an IEEE
+        802.3 Repeater port, then this TLV is optional.";
+    }
+
+    leaf port-id-type {
+      type oc-lldp-types:port-id-type;
+      description
+        "This field identifies the format and source of the port
+        identifier string. It is an enumerator defined by the
+        PtopoPortIdType object from RFC2922.";
+    }
+
+    leaf port-description {
+      type string;
+      description
+        "The binary string containing the actual port identifier for
+        the port which this LLDP PDU was transmitted. The source and
+        format of this field is defined by PtopoPortId from
+        RFC2922.";
+    }
+
+    leaf management-address {
+      type string;
+      description
+        "The Management Address is a mandatory TLV which identifies a
+        network address associated with the local LLDP agent, which
+        can be used to reach the agent on the port identified in the
+        Port ID TLV.";
+    }
+
+    leaf management-address-type {
+      type string;
+      description
+        "The enumerated value for the network address type
+        identified in this TLV. This enumeration is defined in the
+        'Assigned Numbers' RFC [RFC3232] and the
+        ianaAddressFamilyNumbers object.";
+    }
+  }
+
+  grouping lldp-capabilities-config {
+    description
+      "Configuration data for LLDP capabilities";
+  }
+
+  grouping lldp-capabilities-state {
+    description
+      "Operational state data for LLDP capabilities";
+
+    leaf name {
+      type identityref {
+        base oc-lldp-types:LLDP_SYSTEM_CAPABILITY;
+      }
+      description
+        "Name of the system capability advertised by the neighbor.
+        Capabilities are represented in a bitmap that defines the
+        primary functions of the system. The capabilities are
+        defined in IEEE 802.1AB.";
+    }
+
+    leaf enabled {
+      type boolean;
+      description
+        "Indicates whether the corresponding system capability is
+        enabled on the neighbor.";
+      reference
+        "Sec 8.5.8.2 of IEEE 802.1AB-2009";
+    }
+  }
+
+  grouping lldp-capabilities-top {
+    description
+      "Top-level grouping for LLDP capabilities";
+
+    container capabilities {
+      config false;
+      description
+        "Enclosing container for list of LLDP capabilities";
+
+      list capability {
+        key "name";
+        description
+          "List of LLDP system capabilities advertised by the
+          neighbor";
+
+        leaf name {
+          type leafref {
+            path "../state/name";
+          }
+          description
+            "Reference to capabilities list key";
+        }
+
+        container config {
+          description
+            "Configuration data for LLDP capabilities";
+
+          uses lldp-capabilities-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for LLDP capabilities";
+
+          uses lldp-capabilities-config;
+          uses lldp-capabilities-state;
+        }
+      }
+    }
+  }
+
+  grouping lldp-custom-tlv-config {
+    description
+      "Configuration data for custom LLDP TLVs";
+  }
+
+  grouping lldp-custom-tlv-state {
+    description
+      "Operational state data for custom LLDP TLVs";
+
+    leaf type {
+      type int32;
+      description
+        "The integer value identifying the type of information
+        contained in the value field.";
+    }
+
+    leaf oui {
+      type string;
+      description
+        "The organizationally unique identifier field shall contain
+        the organization's OUI as defined in Clause 9 of IEEE Std
+        802. The high-order octet is 0 and the low-order 3 octets
+        are the SMI Network Management Private Enterprise Code of
+        the Vendor in network byte order, as defined in the
+        'Assigned Numbers' RFC [RFC3232].";
+    }
+
+    leaf oui-subtype {
+      type string;
+      description
+        "The organizationally defined subtype field shall contain a
+        unique subtype value assigned by the defining organization.";
+    }
+
+    // TODO: consider making this string type
+    leaf value {
+      type binary;
+      description
+        "A variable-length octet-string containing the
+        instance-specific information for this TLV.";
+    }
+  }
+
+  grouping lldp-custom-tlv-top {
+    description
+      "Top-level grouping for custom LLDP TLVs";
+
+    container custom-tlvs {
+      config false;
+      description
+        "Enclosing container for list of custom TLVs from a
+        neighbor";
+
+      list tlv {
+        key "type oui oui-subtype";
+        description
+          "List of custom LLDP TLVs from a neighbor";
+
+        leaf type {
+          type leafref {
+            path "../state/type";
+          }
+          description
+            "Reference to type list key";
+        }
+
+        leaf oui {
+          type leafref {
+            path "../state/oui";
+          }
+          description
+            "Reference to oui list key";
+        }
+
+        leaf oui-subtype {
+          type leafref {
+            path "../state/oui-subtype";
+          }
+          description
+            "Reference to oui-subtype list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses lldp-custom-tlv-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses lldp-custom-tlv-config;
+          uses lldp-custom-tlv-state;
+        }
+      }
+    }
+  }
+
+  grouping lldp-neighbor-top {
+    description
+      "Top-level grouping for the LLDP neighbor list";
+
+    container neighbors {
+      config false;
+      description
+        "Enclosing container for list of LLDP neighbors on an
+        interface";
+
+      list neighbor {
+        key "id";
+        description
+          "List of LLDP neighbors";
+
+        leaf id {
+          type leafref {
+            path "../state/id";
+          }
+          description
+            " ";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses lldp-neighbor-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses lldp-system-info-config;
+          uses lldp-system-info-state;
+          uses lldp-neighbor-config;
+          uses lldp-neighbor-state;
+        }
+
+        uses lldp-custom-tlv-top;
+        uses lldp-capabilities-top;
+      }
+    }
+  }
+
+  grouping lldp-interface-config {
+    description
+      "Configuration data for LLDP on each interface";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the LLDP Ethernet interface";
+    }
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "Enable or disable the LLDP protocol on the interface.";
+    }
+  }
+
+  grouping lldp-interface-state {
+    description
+      "Operational state data for LLDP on each interface";
+
+    container counters {
+      description
+        "LLDP counters on each interface";
+
+      uses lldp-interface-counters;
+    }
+  }
+
+  grouping lldp-interface-top {
+    description
+      "Top-level grouping ";
+
+    container interfaces {
+      description
+        "Enclosing container ";
+
+      list interface {
+        key "name";
+        description
+          "List of interfaces on which LLDP is enabled / available";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container config {
+          description
+            "Configuration data for LLDP on each interface";
+
+          uses lldp-interface-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses lldp-interface-config;
+          uses lldp-interface-state;
+        }
+
+        uses lldp-neighbor-top;
+      }
+    }
+  }
+
+
+  grouping lldp-config {
+    description
+      "Configuration data for global LLDP parameters";
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "System level state of the LLDP protocol.";
+    }
+
+    leaf hello-timer {
+      type uint64;
+      units "seconds";
+      description
+        "System level hello timer for the LLDP protocol.";
+    }
+
+    leaf-list suppress-tlv-advertisement {
+      type identityref {
+        base oc-lldp-types:LLDP_TLV;
+      }
+      description
+        "Indicates whether the local system should suppress the
+        advertisement of particular TLVs with the LLDP PDUs that it
+        transmits. Where a TLV type is specified within this list, it
+        should not be included in any LLDP PDU transmitted by the
+        local agent.";
+    }
+  }
+
+  grouping lldp-state {
+    description
+      "Operational state data for global LLDP parameters";
+
+    container counters {
+      description
+        "Global LLDP counters";
+
+      uses lldp-global-counters;
+    }
+  }
+
+  grouping lldp-top {
+    description
+      "Top-level grouping for LLDP model";
+
+    container lldp {
+      description
+        "Top-level container for LLDP configuration and state data";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses lldp-config;
+        uses lldp-system-info-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses lldp-config;
+        uses lldp-system-info-config;
+        uses lldp-system-info-state;
+        uses lldp-state;
+      }
+
+      uses lldp-interface-top;
+    }
+  }
+
+  // data definition statements
+
+  uses lldp-top;
+
+
+}
diff --git a/models/openconfig/src/main/yang/local-routing/openconfig-local-routing.yang b/models/openconfig/src/main/yang/local-routing/openconfig-local-routing.yang
new file mode 100644
index 0000000..5184fe7
--- /dev/null
+++ b/models/openconfig/src/main/yang/local-routing/openconfig-local-routing.yang
@@ -0,0 +1,408 @@
+module openconfig-local-routing {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/local-routing";
+
+  prefix "oc-loc-rt";
+
+  // import some basic types
+  import openconfig-inet-types { prefix inet; }
+  import openconfig-policy-types { prefix oc-pt; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-interfaces { prefix oc-if; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module describes configuration and operational state data
+    for routes that are locally generated, i.e., not created by
+    dynamic routing protocols.  These include static routes, locally
+    created aggregate routes for reducing the number of constituent
+    routes that must be advertised, summary routes for IGPs, etc.
+
+    This model expresses locally generated routes as generically as
+    possible, avoiding configuration of protocol-specific attributes
+    at the time of route creation.  This is primarily to avoid
+    assumptions about how underlying router implementations handle
+    route attributes in various routing table data structures they
+    maintain.  Hence, the definition of locally generated routes
+    essentially creates 'bare' routes that do not have any protocol-
+    specific attributes.
+
+    When protocol-specific attributes must be attached to a route
+    (e.g., communities on a locally defined route meant to be
+    advertised via BGP), the attributes should be attached via a
+    protocol-specific policy after importing the route into the
+    protocol for distribution (again via routing policy).";
+
+  oc-ext:openconfig-version "1.0.1";
+
+  revision "2017-05-15" {
+    description
+      "Update to resolve style guide non-compliance.";
+    reference "1.0.1";
+  }
+
+  revision "2016-05-11" {
+    description
+      "OpenConfig public release";
+    reference "1.0.0";
+  }
+
+
+  // identity statements
+
+  identity LOCAL_DEFINED_NEXT_HOP {
+    description
+      "A base identity type of local defined next-hops";
+  }
+
+  identity DROP {
+    base LOCAL_DEFINED_NEXT_HOP;
+    description
+      "Discard traffic for the corresponding destination";
+  }
+
+  identity LOCAL_LINK {
+    base LOCAL_DEFINED_NEXT_HOP;
+    description
+      "Treat traffic towards addresses within the specified
+      next-hop prefix as though they are connected to a local
+      link. When the LOCAL_LINK next-hop type is specified,
+      an interface must also be specified such that
+      the local system can determine which link to trigger
+      link-layer address discovery against";
+  }
+
+  // typedef statements
+
+  typedef local-defined-next-hop {
+    type identityref {
+      base LOCAL_DEFINED_NEXT_HOP;
+    }
+    description
+      "Pre-defined next-hop designation for locally generated
+      routes";
+  }
+
+  // grouping statements
+
+  grouping local-generic-settings {
+    description
+      "Generic options that can be set on local routes When
+      they are defined";
+
+    leaf set-tag {
+      type oc-pt:tag-type;
+      description
+        "Set a generic tag value on the route. This tag can be
+        used for filtering routes that are distributed to other
+        routing protocols.";
+    }
+  }
+
+  grouping local-static-config {
+    description
+      "Configuration data for static routes.";
+
+    leaf prefix {
+      type inet:ip-prefix;
+      description
+        "Destination prefix for the static route, either IPv4 or
+        IPv6.";
+    }
+
+    uses local-generic-settings;
+  }
+
+  grouping local-static-state {
+    description
+      "Operational state data for static routes";
+  }
+
+
+  grouping local-static-nexthop-config {
+    description
+      "Configuration parameters related to each next-hop entry
+      specified for a static route";
+
+    leaf index {
+      type string;
+      description
+        "An user-specified identifier utilised to uniquely reference
+        the next-hop entry in the next-hop list. The value of this
+        index has no semantic meaning other than for referencing
+        the entry.";
+    }
+
+    leaf next-hop {
+      type union {
+        type inet:ip-address;
+        type local-defined-next-hop;
+      }
+      description
+        "The next-hop that is to be used for the static route
+        - this may be specified as an IP address, an interface
+        or a pre-defined next-hop type - for instance, DROP or
+        LOCAL_LINK. When this leaf is not set, and the interface-ref
+        value is specified for the next-hop, then the system should
+        treat the prefix as though it is directly connected to the
+        interface.";
+    }
+
+    leaf metric {
+      type uint32;
+      description
+        "A metric which is utilised to specify the preference of
+        the next-hop entry when it is injected into the RIB. The
+        lower the metric, the more preferable the prefix is. When
+        this value is not specified the metric is inherited from
+        the default metric utilised for static routes within the
+        network instance that the static routes are being
+        instantiated. When multiple next-hops are specified for a
+        static route, the metric is utilised to determine which of
+        the next-hops is to be installed in the RIB. When multiple
+        next-hops have the same metric (be it specified, or simply
+        the default) then these next-hops should all be installed
+        in the RIB";
+    }
+
+    leaf recurse {
+      type boolean;
+      default false;
+      description
+        "Determines whether the next-hop should be allowed to
+        be looked up recursively - i.e., via a RIB entry which has
+        been installed by a routing protocol, or another static route
+        - rather than needing to be connected directly to an
+        interface of the local system within the current network
+        instance. When the interface reference specified within the
+        next-hop entry is set (i.e., is not null) then forwarding is
+        restricted to being via the interface specified - and
+        recursion is hence disabled.";
+    }
+  }
+
+  grouping local-static-nexthop-state {
+    description
+      "Operational state parameters relating to a next-hop entry
+      for a static route";
+  }
+
+
+  grouping local-static-top {
+    description
+      "Top-level grouping for the list of static route definitions";
+
+    container static-routes {
+      description
+        "Enclosing container for the list of static routes";
+
+      list static {
+        key "prefix";
+        description
+          "List of locally configured static routes";
+
+        leaf prefix {
+          type leafref {
+            path "../config/prefix";
+          }
+          description
+            "Reference to the destination prefix list key.";
+        }
+
+        container config {
+          description
+            "Configuration data for static routes";
+
+          uses local-static-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for static routes";
+
+          uses local-static-config;
+          uses local-static-state;
+        }
+
+        container next-hops {
+          description
+            "Configuration and state parameters relating to the
+            next-hops that are to be utilised for the static
+            route being specified";
+
+          list next-hop {
+            key "index";
+
+            description
+              "A list of next-hops to be utilised for the static
+              route being specified.";
+
+            leaf index {
+              type leafref {
+                path "../config/index";
+              }
+              description
+                "A reference to the index of the current next-hop.
+                The index is intended to be a user-specified value
+                which can be used to reference the next-hop in
+                question, without any other semantics being
+                assigned to it.";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the next-hop
+                entry";
+
+              uses local-static-nexthop-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the
+                next-hop entry";
+
+              uses local-static-nexthop-config;
+              uses local-static-nexthop-state;
+            }
+
+            uses oc-if:interface-ref;
+          }
+        }
+      }
+    }
+  }
+
+  grouping local-aggregate-config {
+    description
+      "Configuration data for aggregate routes";
+
+    leaf prefix {
+      type inet:ip-prefix;
+      description
+        "Aggregate prefix to be advertised";
+    }
+
+    leaf discard {
+      type boolean;
+      default false;
+      description
+        "When true, install the aggregate route with a discard
+        next-hop -- traffic destined to the aggregate will be
+        discarded with no ICMP message generated.  When false,
+        traffic destined to an aggregate address when no
+        constituent routes are present will generate an ICMP
+        unreachable message.";
+    }
+
+    uses local-generic-settings;
+
+  }
+
+  grouping local-aggregate-state {
+    description
+      "Operational state data for local aggregate advertisement
+      definitions";
+  }
+
+  grouping local-aggregate-top {
+    description
+      "Top-level grouping for local aggregates";
+
+    container local-aggregates {
+      description
+        "Enclosing container for locally-defined aggregate
+        routes";
+
+      list aggregate {
+        key "prefix";
+        description
+          "List of aggregates";
+
+        leaf prefix {
+          type leafref {
+            path "../config/prefix";
+          }
+          description
+            "Reference to the configured prefix for this aggregate";
+        }
+
+        container config {
+          description
+            "Configuration data for aggregate advertisements";
+
+          uses local-aggregate-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for aggregate
+            advertisements";
+
+          uses local-aggregate-config;
+          uses local-aggregate-state;
+        }
+      }
+    }
+  }
+
+  grouping local-routes-config {
+    description
+      "Configuration data for locally defined routes";
+  }
+
+  grouping local-routes-state {
+    description
+      "Operational state data for locally defined routes";
+  }
+
+  grouping local-routes-top {
+    description
+      "Top-level grouping for local routes";
+
+    container local-routes {
+      description
+        "Top-level container for local routes";
+
+      container config {
+        description
+          "Configuration data for locally defined routes";
+
+        uses local-routes-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for locally defined routes";
+
+        uses local-routes-config;
+        uses local-routes-state;
+      }
+
+      uses local-static-top;
+      uses local-aggregate-top;
+    }
+  }
+
+  uses local-routes-top;
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-igp.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-igp.yang
new file mode 100644
index 0000000..309be68
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-igp.yang
@@ -0,0 +1,98 @@
+submodule openconfig-mpls-igp {
+
+  yang-version "1";
+
+  belongs-to "openconfig-mpls" {
+    prefix "oc-mpls";
+  }
+
+
+  // import some basic types
+  import openconfig-mpls-ldp { prefix oc-ldp; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration generic configuration parameters for IGP-congruent
+    LSPs";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // grouping statements
+
+
+  grouping igp-lsp-common {
+    description
+      "common definitions for IGP-congruent LSPs";
+
+  }
+
+
+  grouping igp-lsp-setup {
+    description
+      "signaling protocol definitions for IGP-based LSPs";
+
+    container path-setup-protocol {
+      description
+        "select and configure the signaling method for
+          the LSP";
+
+      // uses path-setup-common;
+      uses oc-ldp:igp-lsp-ldp-setup;
+    }
+  }
+
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-ldp.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-ldp.yang
new file mode 100644
index 0000000..b055d05
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-ldp.yang
@@ -0,0 +1,102 @@
+module openconfig-mpls-ldp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/ldp";
+
+  prefix "ldp";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration of Label Distribution Protocol global and LSP-
+    specific parameters for IGP-congruent LSPs";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // grouping statements
+
+   grouping ldp-global {
+    description
+      "global LDP signaling configuration";
+
+    container ldp {
+      description
+        "LDP global signaling configuration";
+    }
+  }
+
+
+  grouping igp-tunnel-ldp {
+    description
+      "common defintiions for LDP-signaled LSP tunnel
+      types";
+  }
+
+  grouping igp-lsp-ldp-setup {
+    description
+      "grouping for LDP setup attributes";
+
+    container ldp {
+      description
+        "LDP signaling setup for IGP-congruent LSPs";
+
+      uses igp-tunnel-ldp;
+
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-rsvp.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-rsvp.yang
new file mode 100644
index 0000000..900b498
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-rsvp.yang
@@ -0,0 +1,1140 @@
+module openconfig-mpls-rsvp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/rsvp";
+
+  prefix "oc-rsvp";
+
+  // import some basic types
+  import openconfig-inet-types { prefix inet; }
+  import openconfig-mpls-types { prefix oc-mplst; }
+  import openconfig-yang-types { prefix yang; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-interfaces { prefix oc-if; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+     netopenconfig@googlegroups.com";
+
+  description
+    "Configuration for RSVP-TE signaling, including global protocol
+     parameters and LSP-specific configuration for constrained-path
+     LSPs";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // grouping statements
+
+  grouping mpls-rsvp-soft-preemption_config {
+    description
+      "Configuration for MPLS soft preemption";
+    leaf enable {
+      type boolean;
+      default false;
+      description
+        "Enables soft preemption on a node.";
+    }
+
+    leaf soft-preemption-timeout {
+      type uint16 {
+        range 0..max;
+      }
+      default 30;
+      description
+        "Timeout value for soft preemption to revert
+         to hard preemption. The default timeout for
+         soft-preemption is 30 seconds - after which
+         the local system reverts to hard pre-emption.";
+      reference "RFC5712 MPLS-TE soft preemption";
+    }
+  }
+
+  grouping mpls-rsvp-soft-preemption {
+    description
+      "Top level group for MPLS soft preemption";
+    container soft-preemption {
+      description
+        "Protocol options relating to RSVP
+         soft preemption";
+      container config {
+        description
+          "Configuration parameters relating to RSVP
+           soft preemption support";
+        uses mpls-rsvp-soft-preemption_config;
+      }
+      container state {
+        config false;
+        description
+          "State parameters relating to RSVP
+           soft preemption support";
+        uses mpls-rsvp-soft-preemption_config;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-hellos_config {
+    description
+      "RSVP protocol options configuration.";
+
+    leaf hello-interval {
+      type uint16 {
+        range 1000..60000;
+      }
+      units milliseconds;
+      default 9000;
+      description
+        "set the interval in ms between RSVP hello
+         messages";
+      reference
+        "RFC 3209: RSVP-TE: Extensions to RSVP for
+         LSP Tunnels.
+         RFC 5495: Description of the Resource
+         Reservation Protocol - Traffic-Engineered
+         (RSVP-TE) Graceful Restart Procedures";
+    }
+
+    leaf refresh-reduction {
+      type boolean;
+      default true;
+      description
+        "enables all RSVP refresh reduction message
+         bundling, RSVP message ID, reliable message delivery
+         and summary refresh";
+      reference
+        "RFC 2961 RSVP Refresh Overhead Reduction
+         Extensions";
+    }
+  }
+
+  grouping mpls-rsvp-hellos {
+    description
+      "Top level grouping for RSVP hellos parameters";
+    // TODO: confirm that the described semantics are supported
+    // on various implementations. Finer grain configuration
+    // will be vendor-specific
+
+    container hellos {
+      description
+        "Top level container for RSVP hello parameters";
+
+      container config {
+        description
+          "Configuration parameters relating to RSVP
+           hellos";
+        uses mpls-rsvp-hellos_config;
+      }
+      container state {
+        config false;
+        description
+          "State information associated with RSVP hellos";
+        uses mpls-rsvp-hellos_config;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-subscription_config {
+    description
+      "RSVP subscription configuration";
+
+    leaf subscription {
+      type oc-types:percentage;
+      description
+        "percentage of the interface bandwidth that
+         RSVP can reserve";
+    }
+  }
+
+  grouping mpls-rsvp-subscription_state {
+    description
+      "Operational state parameters relating to the
+      bandwidth subscription on an interface";
+
+    leaf calculated-absolute-subscription-bw {
+      type uint64;
+      units "kbps";
+      description
+        "The calculated absolute value of the bandwidth
+        which is reservable to RSVP-TE on the interface
+        prior to any adjustments that may be made from
+        external sources.";
+    }
+  }
+
+  grouping mpls-rsvp-subscription {
+    description
+      "Top level group for RSVP subscription options";
+
+    container subscription {
+      description
+        "Bandwidth percentage reservable by RSVP
+         on an interface";
+
+      container config {
+        description
+          "Configuration parameters relating to RSVP
+          subscription options";
+        uses mpls-rsvp-subscription_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters relating to RSVP
+          subscription options";
+        uses mpls-rsvp-subscription_config;
+        uses mpls-rsvp-subscription_state;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-graceful-restart_config {
+    description
+      "Configuration parameters relating to RSVP Graceful-Restart";
+
+    leaf enable {
+      type boolean;
+      default false;
+      description
+        "Enables graceful restart on the node.";
+    }
+
+    leaf restart-time {
+      type uint32;
+      description
+        "Graceful restart time (seconds).";
+      reference
+        "RFC 5495: Description of the Resource
+         Reservation Protocol - Traffic-Engineered
+         (RSVP-TE) Graceful Restart Procedures";
+    }
+    leaf recovery-time {
+      type uint32;
+      description
+        "RSVP state recovery time";
+    }
+  }
+
+  grouping mpls-rsvp-graceful-restart {
+    description
+      "Top level group for RSVP graceful-restart
+       parameters";
+
+    container graceful-restart {
+      description
+        "Operational state and configuration parameters relating to
+        graceful-restart for RSVP";
+
+      container config {
+        description
+          "Configuration parameters relating to
+           graceful-restart";
+        uses mpls-rsvp-graceful-restart_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information associated with
+           RSVP graceful-restart";
+        uses mpls-rsvp-graceful-restart_config;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-authentication_config {
+    description
+      "RSVP authentication parameters container.";
+
+    leaf enable {
+      type boolean;
+      default false;
+      description
+        "Enables RSVP authentication on the node.";
+    }
+
+    leaf authentication-key {
+      type string {
+        // Juniper supports 1..16 while
+        // Cisco has a much bigger range, up to 60.
+        length "1..32";
+      }
+      description
+        "authenticate RSVP signaling
+         messages";
+      reference
+        "RFC 2747: RSVP Cryptographic Authentication";
+    }
+  }
+
+  grouping mpls-rsvp-authentication {
+    description
+      "Top level group for RSVP authentication,
+       as per RFC2747";
+
+    container authentication {
+      description
+        "Configuration and state parameters relating to RSVP
+        authentication as per RFC2747";
+
+      container config {
+        description
+          "Configuration parameters relating
+           to authentication";
+        uses mpls-rsvp-authentication_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State information associated
+           with authentication";
+        uses mpls-rsvp-authentication_config;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-protection_config {
+    description
+      "RSVP facility (link/node) protection configuration";
+
+    leaf link-protection-style-requested {
+      type identityref {
+        base oc-mplst:PROTECTION_TYPE;
+      }
+      default oc-mplst:LINK_NODE_PROTECTION_REQUESTED;
+      description
+        "Style of mpls frr protection desired:
+        link, link-node, or unprotected";
+    }
+
+    leaf bypass-optimize-interval {
+      type uint16;
+      units seconds;
+      description
+        "interval between periodic optimization
+        of the bypass LSPs";
+      // note: this is interface specific on juniper
+      // on iox, this is global. need to resolve.
+    }
+    // to be completed, things like enabling link protection,
+    // optimization times, etc.
+  }
+
+  grouping mpls-rsvp-link-protection {
+    description
+      "Top level group for RSVP protection";
+    container protection {
+      description
+        "link-protection (NHOP) related configuration";
+
+      container config {
+        description
+          "Configuration for link-protection";
+        uses mpls-rsvp-protection_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State for link-protection";
+        uses mpls-rsvp-protection_config;
+      }
+    }
+  }
+
+  grouping mpls-rsvp-statistics {
+    description
+      "Top level grouping for RSVP protocol state";
+
+    uses mpls-rsvp-protocol-state;
+  }
+
+  grouping rsvp-global {
+    description
+      "Global RSVP protocol configuration";
+    container rsvp-te {
+      description
+        "RSVP-TE global signaling protocol configuration";
+
+      uses mpls-rsvp-session-state;
+
+      container neighbors {
+        description
+          "Configuration and state for RSVP neighbors connecting
+          to the device";
+
+        list neighbor {
+          key "address";
+
+          config false;
+
+          description
+            "List of RSVP neighbors of the local system";
+
+          leaf address {
+            type leafref {
+              path "../state/address";
+            }
+            description
+              "Reference to the address of the RSVP neighbor";
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to the
+              RSVP neighbor";
+            uses mpls-rsvp-neighbor-state;
+          }
+        }
+      }
+
+      container global {
+        description
+          "Platform wide RSVP configuration and state";
+        uses mpls-rsvp-graceful-restart;
+        uses mpls-rsvp-soft-preemption;
+        uses mpls-rsvp-hellos;
+
+        container state {
+          config false;
+          description
+            "Platform wide RSVP state, including counters";
+          // TODO - reconcile global and per-interface
+          // protocol-related statistics
+
+          container counters {
+            config false;
+            description
+              "Platform wide RSVP statistics and counters";
+            uses mpls-rsvp-global-protocol-state;
+            uses mpls-rsvp-statistics;
+          }
+        }
+      }
+
+      container interface-attributes {
+        // interfaces, bw percentages, hello timers, etc goes here";
+        description
+          "Attributes relating to RSVP-TE enabled interfaces";
+
+        list interface {
+          key "interface-id";
+          description
+            "list of per-interface RSVP configurations";
+
+          leaf interface-id {
+            type leafref {
+              path "../config/interface-id";
+            }
+            description
+              "reference to the interface-id data";
+          }
+
+
+          container config {
+            description
+              "Configuration of per-interface RSVP parameters";
+            uses mpls-rsvp-interfaces-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Per-interface RSVP protocol and state information";
+
+            uses mpls-rsvp-interfaces-state;
+            uses mpls-rsvp-interfaces-config;
+
+            container counters {
+              config false;
+              description
+                "Interface specific RSVP statistics and counters";
+              uses mpls-rsvp-protocol-state;
+            }
+          }
+
+          uses oc-if:interface-ref;
+          uses mpls-rsvp-interface-reservations;
+          uses mpls-rsvp-hellos;
+          uses mpls-rsvp-authentication;
+          uses mpls-rsvp-subscription;
+          uses mpls-rsvp-link-protection;
+        }
+      }
+    }
+  }
+
+  grouping rsvp-p2p-tunnel-attributes_config {
+    description
+      "properties of RSPP point-to-point paths";
+
+    leaf source {
+      when "/mpls/lsps/constrained-path/tunnel/config" +
+        "/signaling-protocol = 'PATH_SETUP_RSVP'" {
+        description
+          "When the signaling protocol is RSVP-TE ";
+      }
+      type inet:ip-address;
+      description
+        "RSVP-TE tunnel source address";
+    }
+
+    leaf soft-preemption {
+      when "/mpls/lsps/constrained-path/tunnel/config" +
+        "/signaling-protocol = 'PATH_SETUP_RSVP'" {
+        description
+          "When the signaling protocol is RSVP-TE ";
+      }
+      type boolean;
+      default false;
+      description
+        "Enables RSVP soft-preemption on this LSP";
+    }
+
+    uses rsvp-priorities_config;
+  }
+
+  grouping rsvp-priorities_config {
+    description
+      "Configuration paramters related to RSVP-TE priorities";
+
+    leaf setup-priority {
+      when "/mpls/lsps/constrained-path/tunnel/config" +
+        "/signaling-protocol = 'PATH_SETUP_RSVP'" {
+        description
+          "When the signaling protocol is RSVP-TE ";
+      }
+      type uint8 {
+        range 0..7;
+      }
+      default 7;
+      description
+        "RSVP-TE preemption priority during LSP setup, lower is
+         higher priority; default 7 indicates that LSP will not
+         preempt established LSPs during setup";
+      reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+         LSP Tunnels";
+    }
+
+    leaf hold-priority {
+      when "/mpls/lsps/constrained-path/tunnel/config" +
+        "/signaling-protocol = 'PATH_SETUP_RSVP'" {
+        description
+           "When the signaling protocol is RSVP-TE ";
+      }
+      type uint8 {
+        range 0..7;
+      }
+      default 0;
+      description
+        "preemption priority once the LSP is established,
+         lower is higher priority; default 0 indicates other LSPs
+         will not preempt the LSPs once established";
+      reference "RFC 3209 - RSVP-TE: Extensions to RSVP for
+        LSP Tunnels";
+    }
+  }
+
+  grouping rsvp-p2p-path-attributes_config {
+    description
+      "properties of RSPP point-to-point paths";
+
+    uses rsvp-priorities_config;
+
+    leaf retry-timer {
+      when "/mpls/lsps/constrained-path/tunnel/config" +
+        "/signaling-protocol = 'PATH_SETUP_RSVP'" {
+        description
+        "When the signaling protocol is RSVP-TE ";
+      }
+      type uint16 {
+        range 1..600;
+      }
+      units seconds;
+      description
+        "sets the time between attempts to establish the
+         LSP";
+    }
+  }
+
+  grouping mpls-rsvp-neighbor-state {
+    description
+      "State information for RSVP neighbors";
+
+    leaf address {
+      type inet:ip-address;
+      description
+        "Address of RSVP neighbor";
+    }
+
+    leaf detected-interface {
+      type string;
+      description
+        "Interface where RSVP neighbor was detected";
+    }
+
+    leaf neighbor-status {
+      type enumeration {
+        enum UP {
+          description
+            "RSVP hello messages are detected from the neighbor";
+        }
+        enum DOWN {
+          description
+            "RSVP neighbor not detected as up, due to a
+             communication failure or IGP notification
+             the neighbor is unavailable";
+        }
+      }
+      description
+        "Enumuration of possible RSVP neighbor states";
+    }
+
+    leaf refresh-reduction {
+      type boolean;
+      description
+        "Suppport of neighbor for RSVP refresh reduction";
+      reference
+        "RFC 2961 RSVP Refresh Overhead Reduction
+         Extensions";
+    }
+
+  }
+
+  grouping mpls-rsvp-session-state {
+    description
+      "State information for RSVP TE sessions";
+
+    container sessions {
+      description
+        "Enclosing container for sessions";
+
+      list session {
+        key "local-index";
+        config false;
+
+        description
+          "List of RSVP sessions";
+
+        leaf local-index {
+          type leafref {
+            path "../state/local-index";
+          }
+          description
+            "Reference to the local index for the RSVP
+            session";
+        }
+
+        uses mpls-rsvp-record-route-object-top;
+
+        container state {
+          description
+            "Operational state parameters relating to the
+            RSVP session";
+
+          leaf local-index {
+            type uint64;
+            description
+              "The index used to identify the RSVP session
+               on the local network element. This index is
+               generated by the device and is unique only
+               to the local network element.";
+          }
+
+          leaf source-address {
+            type inet:ip-address;
+            description
+              "Origin address of RSVP session";
+          }
+
+          leaf destination-address {
+            type inet:ip-address;
+            description
+              "Destination address of RSVP session";
+          }
+
+          leaf tunnel-id {
+            type uint16;
+            description
+              "The tunnel ID is an identifier used in the
+               RSVP session, which remains constant over
+               the life of the tunnel.";
+            reference "RFC 3209";
+          }
+
+          leaf lsp-id {
+            type uint16;
+            description
+              "The LSP ID distinguishes between two LSPs
+               originated from the same headend, and is
+               commonly used to distinguish RSVP sessions
+               during make before break operations.";
+            reference "RFC 3209";
+          }
+
+          leaf session-name {
+            type string;
+            description
+              "The signaled name of this RSVP session.";
+          }
+
+          leaf status {
+            type enumeration {
+              enum UP {
+                description
+                  "RSVP session is up";
+              }
+              enum DOWN {
+                description
+                  "RSVP session is down";
+              }
+            }
+            description
+              "Enumeration of RSVP session states";
+          }
+
+          leaf type {
+            type identityref {
+              base oc-mplst:LSP_ROLE;
+            }
+            description
+              "The type/role of the RSVP session, signifing
+              the session's role on the current device, such as
+              a transit session vs. an ingress session.";
+          }
+
+          leaf protection-requested {
+            type identityref {
+              base oc-mplst:PROTECTION_TYPE;
+            }
+            description
+              "The type of protection requested for the RSVP session";
+          }
+
+          leaf label-in {
+            type oc-mplst:mpls-label;
+            description
+              "Incoming MPLS label associated with this RSVP session";
+          }
+
+          leaf label-out {
+            type oc-mplst:mpls-label;
+            description
+              "Outgoing MPLS label associated with this RSVP session";
+          }
+
+          container sender-tspec {
+            description
+              "Operational state statistics relating to the SENDER_TSPEC
+              received for the RSVP session";
+
+            leaf rate {
+              type oc-types:ieeefloat32;
+              units "Bps";
+              description
+                "The rate at which the head-end device generates traffic,
+                expressed in bytes per second.";
+              reference
+                "RFC2210: RSVP with INTSERV";
+            }
+
+            leaf size {
+              type oc-types:ieeefloat32;
+              units "bytes per second";
+              description
+                "The size of the token bucket that is used to determine
+                the rate at which the head-end device generates traffic,
+                expressed in bytes per second.";
+              reference
+                "RFC2210: RSVP with INTSERV";
+            }
+
+            leaf peak-data-rate {
+              type union {
+                type oc-types:ieeefloat32;
+                type enumeration {
+                  enum INFINITY {
+                    description
+                      "The head-end device has no maximum data rate.";
+                  }
+                }
+              }
+              units "bytes per second";
+              description
+                "The maximum traffic generation rate that the head-end
+                device sends traffic at.";
+              reference
+                "RFC2210: RSVP with INTSERV";
+            }
+          }
+        }
+      }
+    }
+  } //rsvp-session-state
+
+  grouping mpls-rsvp-interfaces-config {
+    description
+      "RSVP configuration information relevant to an interface";
+
+    leaf interface-id {
+      type oc-if:interface-id;
+      description
+        "Identifier for the interface";
+    }
+  }
+
+  grouping mpls-rsvp-interfaces-state {
+    description
+      "RSVP state information relevant to an interface";
+
+    // Placeholder grouping
+  }
+
+  grouping mpls-rsvp-interface-reservations {
+    description
+      "Operational state related to interface bandwidth
+      reservations";
+
+    container bandwidth-reservations {
+      description
+        "Enclosing container for bandwidth reservation";
+      list bandwidth-reservation {
+        key "priority";
+        config false;
+        description
+          "Available and reserved bandwidth by priority on
+           the interface.";
+
+        leaf priority {
+          type leafref {
+            path "../state/priority";
+          }
+          description "Reference to the RSVP priority level";
+        }
+
+        container state {
+          description
+            "Operational state parameters relating to a
+            bandwidth reservation at a certain priority";
+
+          leaf priority {
+            type union {
+              type uint8 {
+                range 0..7;
+              }
+              type enumeration {
+                enum ALL {
+                  description
+                    "The ALL keyword represents the overall
+                    state of the interface - i.e., the union
+                    of all of the priority levels";
+                }
+              }
+            }
+            description
+              "RSVP priority level for LSPs traversing the interface";
+          }
+
+          leaf available-bandwidth {
+            type oc-mplst:bandwidth-mbps;
+            description
+              "Bandwidth currently available with the priority level,
+              or for the entire interface when the priority is set to
+              ALL";
+          }
+
+          leaf reserved-bandwidth {
+            type oc-mplst:bandwidth-mbps;
+            description
+              "Bandwidth currently reserved within the priority level,
+              or the sum of all priority levels when the keyword is set
+              to ALL";
+          }
+
+          leaf active-reservations-count {
+            type yang:gauge64;
+            description
+              "Number of active RSVP reservations in the associated
+              priority, or the sum of all reservations when the priority
+              level is set to ALL";
+          }
+
+          leaf highwater-mark {
+            type oc-mplst:bandwidth-mbps;
+            description
+              "Maximum bandwidth reserved on the interface within the
+              priority, or across all priorities in the case that the
+              priority level is set to ALL";
+          }
+        }
+      }
+    }
+  }
+
+  grouping mpls-rsvp-global-protocol-state {
+    description
+      "RSVP protocol statistics which may not apply
+      on an interface, but are significant globally.";
+
+    leaf path-timeouts {
+      type yang:counter64;
+      description
+        "TODO";
+    }
+
+    leaf reservation-timeouts {
+      type yang:counter64;
+      description
+        "TODO";
+    }
+
+    leaf rate-limited-messages {
+      type yang:counter64;
+      description
+        "RSVP messages dropped due to rate limiting";
+    }
+  }
+
+  grouping mpls-rsvp-protocol-state {
+    description
+      "RSVP protocol statistics and message counters";
+
+    leaf in-path-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Path messages";
+    }
+
+    leaf in-path-error-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Path Error messages";
+    }
+
+    leaf in-path-tear-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Path Tear messages";
+    }
+
+    leaf in-reservation-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Resv messages";
+    }
+
+    leaf in-reservation-error-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Resv Error messages";
+    }
+
+    leaf in-reservation-tear-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP Resv Tear messages";
+    }
+
+    leaf in-hello-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP hello messages";
+    }
+
+    leaf in-srefresh-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP summary refresh messages";
+    }
+
+    leaf in-ack-messages {
+      type yang:counter64;
+      description
+        "Number of received RSVP refresh reduction ack
+         messages";
+    }
+
+    leaf out-path-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP PATH messages";
+    }
+
+    leaf out-path-error-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP Path Error messages";
+    }
+
+    leaf out-path-tear-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP Path Tear messages";
+    }
+
+    leaf out-reservation-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP Resv messages";
+    }
+
+    leaf out-reservation-error-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP Resv Error messages";
+    }
+
+    leaf out-reservation-tear-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP Resv Tear messages";
+    }
+
+    leaf out-hello-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP hello messages";
+    }
+
+    leaf out-srefresh-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP summary refresh messages";
+    }
+
+    leaf out-ack-messages {
+      type yang:counter64;
+      description
+        "Number of sent RSVP refresh reduction ack messages";
+    }
+  }
+
+  grouping mpls-rsvp-record-route-object-top {
+    description
+      "Top-level structure grouping for list of record route
+      objects.";
+
+    container record-route-objects {
+      description
+        "Enclosing container for MPLS RRO objects associated with the
+        traffic engineered tunnel.";
+
+      list record-route-object {
+
+        key "index";
+        config false;
+        description
+        "Read-only list of record route objects associated with the
+        traffic engineered tunnel. Each entry in the list
+        may contain a hop IP address, MPLS label allocated
+        at the hop, and the flags associated with the entry.";
+
+        leaf index {
+          type leafref {
+            path "../state/index";
+          }
+          description
+            "Reference to the index of the record route object.
+            The index is used to indicate the ordering of hops in
+            the path.";
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Information related to RRO objects. The hop, label, and
+            optional flags are present for each entry in the list.";
+
+          uses mpls-rsvp-record-route-object-state;
+        }
+      }
+    }
+  }
+
+  grouping mpls-rsvp-record-route-object-state {
+    description
+      "Grouping to hold information relating to record route
+       objects relevant to a traffic engineering LSP.";
+
+    leaf index {
+      type uint8;
+      description
+        "Index of object in the list. Used for ordering.";
+    }
+
+    leaf address {
+      type inet:ip-address;
+      description
+        "IP router hop for RRO entry";
+    }
+
+    leaf reported-label {
+      type oc-mplst:mpls-label;
+      description
+        "Label reported for RRO hop";
+    }
+
+    leaf reported-flags {
+      type uint8;
+      description
+        "Subobject flags for MPLS label";
+    }
+  }
+
+
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-sr.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-sr.yang
new file mode 100644
index 0000000..aa2befc
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-sr.yang
@@ -0,0 +1,107 @@
+module openconfig-mpls-sr {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/mpls-sr";
+
+  prefix "oc-mpls-sr";
+
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration for MPLS with segment routing-based LSPs,
+    including global parameters, and LSP-specific configuration for
+    both constrained-path and IGP-congruent LSPs";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  grouping sr-path-attributes_config {
+    description
+      "Configuration parameters relating to SR-TE LSPs";
+
+    leaf sid-selection-mode {
+      type enumeration {
+        enum ADJ_SID_ONLY {
+          description
+            "The SR-TE tunnel should only use adjacency SIDs
+            to build the SID stack to be pushed for the LSP";
+        }
+        enum MIXED_MODE {
+          description
+            "The SR-TE tunnel can use a mix of adjacency
+            and prefix SIDs to build the SID stack to be pushed
+            to the LSP";
+        }
+      }
+      default MIXED_MODE;
+      description
+        "The restrictions placed on the SIDs to be selected by the
+        calculation method for the explicit path when it is
+        instantiated for a SR-TE LSP";
+    }
+
+    leaf sid-protection-required {
+      type boolean;
+      default "false";
+      description
+        "When this value is set to true, only SIDs that are
+        protected are to be selected by the calculating method
+        when the explicit path is instantiated by a SR-TE LSP.";
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-static.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-static.yang
new file mode 100644
index 0000000..182c0dc
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-static.yang
@@ -0,0 +1,280 @@
+submodule openconfig-mpls-static {
+
+  yang-version "1";
+
+  belongs-to "openconfig-mpls" {
+    prefix "mpls";
+  }
+
+  // import some basic types
+  import openconfig-mpls-types {prefix oc-mplst; }
+  import openconfig-inet-types { prefix inet; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Defines static LSP configuration";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // grouping statements
+
+  grouping static-lsp-common-config {
+    description
+      "common definitions for static LSPs";
+
+    leaf next-hop {
+      type inet:ip-address;
+      description
+        "next hop IP address for the LSP";
+    }
+
+    leaf incoming-label {
+      type oc-mplst:mpls-label;
+      description
+        "label value on the incoming packet";
+    }
+
+    leaf push-label {
+      type oc-mplst:mpls-label;
+      description
+        "label value to push at the current hop for the
+        LSP";
+    }
+  }
+
+  grouping static-lsp-ingress-config {
+    description
+      "Configuration data for ingress LSPs";
+
+    uses static-lsp-common-config;
+  }
+
+  grouping static-lsp-ingress-state {
+    description
+      "Operational state data for ingress LSPs";
+  }
+
+  grouping static-lsp-ingress-top {
+    description
+      "Top-level grouping for ingress LSP data";
+
+    container ingress {
+      description
+        "Static LSPs for which the router is an
+          ingress node";
+
+      container config {
+        description
+          "Configuration data for ingress LSPs";
+
+        uses static-lsp-ingress-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for ingress LSPs";
+
+        uses static-lsp-ingress-config;
+        uses static-lsp-ingress-state;
+      }
+    }
+  }
+
+  grouping static-lsp-transit-config {
+    description
+      "Configuration data for transit LSPs";
+
+    uses static-lsp-common-config;
+  }
+
+  grouping static-lsp-transit-state {
+    description
+      "Operational state data for transit LSPs";
+  }
+
+  grouping static-lsp-transit-top {
+    description
+      "Top-level grouping for transit LSP data";
+
+    container transit {
+      description
+        "Static LSPs for which the router is an
+          transit node";
+
+      container config {
+        description
+          "Configuration data for transit LSPs";
+
+        uses static-lsp-transit-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for transit LSPs";
+
+        uses static-lsp-transit-config;
+        uses static-lsp-transit-state;
+      }
+    }
+  }
+
+  grouping static-lsp-egress-config {
+    description
+      "Configuration data for egress LSPs";
+
+    uses static-lsp-common-config;
+  }
+
+  grouping static-lsp-egress-state {
+    description
+      "Operational state data for egress LSPs";
+  }
+
+  grouping static-lsp-egress-top {
+    description
+      "Top-level grouping for egress LSP data";
+
+    container egress {
+      description
+        "Static LSPs for which the router is an
+          egress node";
+
+      container config {
+        description
+          "Configuration data for egress LSPs";
+
+        uses static-lsp-egress-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for egress LSPs";
+
+        uses static-lsp-egress-config;
+        uses static-lsp-egress-state;
+      }
+    }
+  }
+
+  grouping static-lsp-config {
+    description
+      "Configuration data for static LSPs";
+
+    leaf name {
+      type string;
+      description
+        "name to identify the LSP";
+    }
+  }
+
+  grouping static-lsp-state {
+    description
+      "Operational state data for static LSPs";
+
+  }
+
+  grouping static-lsp-top {
+    description
+      "grouping for top level list of static LSPs";
+
+
+    list static-lsp {
+      key "name";
+      description
+        "list of defined static LSPs";
+
+      leaf name {
+        type leafref {
+          path "../config/name";
+        }
+        description
+          "Reference the name list key";
+      }
+
+      container config {
+        description
+          "Configuration data for the static lsp";
+
+        uses static-lsp-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for the static lsp";
+
+        uses static-lsp-config;
+        uses static-lsp-state;
+
+      }
+
+      // TODO: separation into ingress, transit, egress may help
+      // to figure out what exactly is configured, but need to
+      // consider whether implementations can support the
+      // separation
+      uses static-lsp-ingress-top;
+      uses static-lsp-transit-top;
+      uses static-lsp-egress-top;
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang
new file mode 100644
index 0000000..7feb012
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-te.yang
@@ -0,0 +1,1297 @@
+submodule openconfig-mpls-te {
+
+  yang-version "1";
+
+  belongs-to "openconfig-mpls" {
+    prefix "oc-mpls";
+  }
+
+
+  // import some basic types
+  import openconfig-inet-types { prefix inet; }
+  import openconfig-mpls-rsvp { prefix oc-rsvp; }
+  import openconfig-mpls-sr { prefix oc-sr; }
+  import openconfig-mpls-types {prefix oc-mplst; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-yang-types { prefix yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration related to constrained-path LSPs and traffic
+    engineering.  These definitions are not specific to a particular
+    signaling protocol or mechanism (see related submodules for
+    signaling protocol-specific configuration).";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // typedef statements
+
+ typedef te-bandwidth-type {
+    type enumeration {
+      enum SPECIFIED {
+        description
+          "Bandwidth is explicitly specified";
+      }
+      enum AUTO {
+        description
+          "Bandwidth is automatically computed";
+      }
+    }
+    description
+      "enumerated type for specifying whether bandwidth is
+       explicitly specified or automatically computed";
+  }
+
+  typedef mpls-srlg-flooding-type {
+    type enumeration {
+      enum FLOODED_SRLG {
+        description
+          "SRLG is flooded in the IGP";
+      }
+      enum STATIC_SRLG {
+        description
+          "SRLG is not flooded, the members are
+           statically configured";
+      }
+    }
+    description
+      "Enumerated bype for specifying how the SRLG is flooded";
+  }
+
+  typedef mpls-hop-type {
+    type enumeration {
+      enum LOOSE {
+        description
+          "loose hop in an explicit path";
+      }
+      enum STRICT {
+        description
+          "strict hop in an explicit path";
+      }
+    }
+    description
+     "enumerated type for specifying loose or strict
+      paths";
+  }
+
+  typedef te-metric-type {
+    type union {
+      type enumeration {
+        enum IGP {
+          description
+           "set the LSP metric to track the underlying
+            IGP metric";
+        }
+      }
+      type uint32;
+    }
+    description
+     "union type for setting the LSP TE metric to a
+      static value, or to track the IGP metric";
+  }
+
+  typedef cspf-tie-breaking {
+    type enumeration {
+      enum RANDOM {
+        description
+         "CSPF calculation selects a random path among
+          multiple equal-cost paths to the destination";
+      }
+      enum LEAST_FILL {
+        description
+         "CSPF calculation selects the path with greatest
+          available bandwidth";
+      }
+      enum MOST_FILL {
+        description
+          "CSPF calculation selects the path with the least
+          available bandwidth";
+      }
+    }
+    default RANDOM;
+    description
+     "type to indicate the CSPF selection policy when
+      multiple equal cost paths are available";
+  }
+
+
+  // grouping statements
+
+  grouping te-tunnel-reoptimize_config {
+    description
+      "Definition for reoptimize timer configuration";
+
+    leaf reoptimize-timer {
+      type uint16;
+      units seconds;
+      description
+       "frequency of reoptimization of
+        a traffic engineered LSP";
+    }
+  }
+
+
+  grouping te-lsp-auto-bandwidth_config {
+    description
+      "Configuration parameters related to autobandwidth";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "enables mpls auto-bandwidth on the
+         lsp";
+    }
+
+    leaf min-bw {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "set the minimum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf max-bw {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "set the maximum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf adjust-interval {
+      type uint32;
+      description
+        "time in seconds between adjustments to
+         LSP bandwidth";
+    }
+
+    leaf adjust-threshold {
+      type oc-types:percentage;
+      description
+        "percentage difference between the LSP's
+         specified bandwidth and its current bandwidth
+         allocation -- if the difference is greater than the
+         specified percentage, auto-bandwidth adjustment is
+         triggered";
+    }
+  }
+
+  grouping te-lsp-overflow_config {
+    description
+     "configuration for mpls lsp bandwidth
+      overflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables mpls lsp bandwidth overflow
+        adjustment on the lsp";
+    }
+
+    leaf overflow-threshold {
+      type oc-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        an overflow event";
+
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive overflow sample
+        events needed to trigger an overflow adjustment";
+    }
+  }
+
+  grouping te-lsp-underflow_config {
+    description
+      "configuration for mpls lsp bandwidth
+      underflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables bandwidth underflow
+        adjustment on the lsp";
+    }
+
+    leaf underflow-threshold {
+      type oc-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        and underflow event";
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive underflow sample
+        events needed to trigger an underflow adjustment";
+    }
+  }
+
+  grouping te-path-placement-constraints-config {
+    description
+      "Configuration data for link affinities";
+
+    leaf-list exclude-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups to exclude in
+        path calculation.";
+    }
+
+    leaf-list include-all-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups of which all must
+        be included";
+    }
+
+    leaf-list include-any-group {
+      type leafref {
+        path "../../../../../../../../../../te-global-attributes" +
+          "/mpls-admin-groups/admin-group/admin-group-name";
+      }
+      description
+        "list of references to named admin-groups of which one must
+        be included";
+    }
+  }
+
+  grouping te-path-placement-constraints-state {
+    description
+      "Operational state data for link affinities";
+    //TODO: currently a placeholder
+  }
+
+  grouping te-path-placement-constraints-top {
+    description
+      "Top-level grouping ";
+
+    container admin-groups {
+      description
+        "Top-level container for include/exclude constraints for
+        link affinities";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses te-path-placement-constraints-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses te-path-placement-constraints-config;
+        uses te-path-placement-constraints-state;
+      }
+    }
+  }
+
+  grouping te-tunnel-protection_config {
+    description
+     "Configuration parameters related to LSP
+      protection";
+    leaf protection-style-requested {
+      type identityref {
+        base oc-mplst:PROTECTION_TYPE;
+      }
+      default oc-mplst:UNPROTECTED;
+      description
+        "style of mpls frr protection desired: can be
+        link, link-node or unprotected.";
+    }
+  }
+
+  grouping explicit-route-subobject-config {
+    description
+      "The explicit route subobject grouping";
+
+    leaf address {
+     type inet:ip-address;
+     description
+      "router hop for the LSP path";
+    }
+
+    leaf hop-type {
+      type mpls-hop-type;
+      description
+        "strict or loose hop";
+    }
+
+    leaf index {
+      type uint8 {
+        range "0..255";
+      }
+      description
+        "Index of this explicit route object to express
+        the order of hops in the path";
+    }
+
+  }
+
+  grouping named-explicit-path-config {
+    description
+      "Configuration parameters relating to a named
+       explicit path";
+
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies an explicit
+         path";
+    }
+  }
+
+  // Explicit paths config somewhat following the IETF model
+  grouping explicit-paths_top {
+    description
+      "Top level global explicit path configuration
+      grouping";
+
+    container named-explicit-paths {
+      description
+        "Enclosing container for the named explicit paths";
+      list named-explicit-path {
+        key "name";
+        description
+          "A list of explicit paths";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "A string name that uniquely identifies
+            an explicit path";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to named explicit
+            paths";
+          uses named-explicit-path-config;
+          uses oc-sr:sr-path-attributes_config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the named
+            explicit paths";
+          uses named-explicit-path-config;
+          uses oc-sr:sr-path-attributes_config;
+        }
+
+        container explicit-route-objects {
+          description
+            "Enclosing container for EROs";
+
+          list explicit-route-object {
+            key "index";
+            description
+              "List of explicit route objects";
+
+            leaf index {
+              type leafref {
+                path "../config/index";
+              }
+
+              description
+                "Index of this explicit route object,
+                 to express the order of hops in path";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to an explicit
+                route";
+              uses explicit-route-subobject-config;
+            }
+
+
+            container state {
+              config false;
+              description
+                "State parameters relating to an explicit route";
+              uses explicit-route-subobject-config;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping mpls-te-srlg_config {
+    description
+      "Configuration of various attributes associated
+      with the SRLG";
+
+    leaf name {
+      type string;
+      description
+        "SRLG group identifier";
+    }
+
+    leaf value {
+      type uint32;
+      description
+        "group ID for the SRLG";
+    }
+
+    leaf cost {
+      type uint32;
+      description
+        "The cost of the SRLG to the computation
+        algorithm";
+    }
+
+    leaf flooding-type {
+      type mpls-srlg-flooding-type;
+      default FLOODED_SRLG;
+      description
+        "The type of SRLG, either flooded in the IGP or
+         statically configured";
+    }
+  }
+
+  grouping mpls-te-srlg-members_config {
+    description
+      "Configuration of the membership of the SRLG";
+
+    leaf from-address {
+      type inet:ip-address;
+      description
+        "IP address of the a-side of the SRLG link";
+    }
+
+    leaf to-address {
+      type inet:ip-address;
+      description
+        "IP address of the z-side of the SRLG link";
+    }
+  }
+
+  grouping mpls-te-srlg-top {
+    description
+      "Top level grouping for MPLS shared
+      risk link groups.";
+
+    container srlgs {
+      description
+        "Shared risk link groups attributes";
+      list srlg {
+        key "name";
+        description
+          "List of shared risk link groups";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "The SRLG group identifier";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to the SRLG";
+          uses mpls-te-srlg_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to the SRLG";
+          uses mpls-te-srlg_config;
+        }
+
+        container static-srlg-members {
+          when "../config/flooding-type = 'STATIC_SRLG'" {
+            description
+              "Include this container for static
+              SRLG specific configuration";
+          }
+          description
+            "SRLG members for static (not flooded) SRLGs ";
+
+          list members-list {
+            key "from-address";
+            description
+             "List of SRLG members, which are expressed
+              as IP address endpoints of links contained in the
+              SRLG";
+
+            leaf from-address {
+              type leafref {
+                path "../config/from-address";
+                // Requires YANG 1.1
+                //require-instance true;
+              }
+              description
+                "The from address of the link in the SRLG";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the
+                SRLG members";
+              uses mpls-te-srlg-members_config;
+            }
+
+            container state {
+              config false;
+              description
+                "State parameters relating to the SRLG
+                members";
+              uses mpls-te-srlg-members_config;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping te-global-tunnel_config {
+    description
+      "Configuration parameters relevant to a single
+       traffic engineered tunnel.";
+
+    leaf name {
+      type string;
+      description
+        "The tunnel name";
+    }
+
+    leaf type {
+      type identityref {
+        base oc-mplst:TUNNEL_TYPE;
+      }
+      description
+        "Tunnel type, p2p or p2mp";
+    }
+
+    leaf signaling-protocol {
+      type identityref {
+        base oc-mplst:PATH_SETUP_PROTOCOL;
+      }
+      description
+        "Signaling protocol used to set up this tunnel";
+    }
+
+    leaf description {
+      type string;
+      description
+        "optional text description for the tunnel";
+    }
+
+    leaf admin-status {
+      type identityref {
+        base oc-mplst:TUNNEL_ADMIN_STATUS;
+      }
+      default oc-mplst:ADMIN_UP;
+      description
+        "TE tunnel administrative state.";
+    }
+
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this tunnel.
+        A lower number signifies a better preference";
+    }
+
+    leaf metric-type {
+      type identityref {
+        base oc-mplst:LSP_METRIC_TYPE;
+      }
+      default oc-mplst:LSP_METRIC_INHERITED;
+      description
+        "The type of metric specification that should be used to set
+        the LSP(s) metric";
+    }
+
+    leaf metric {
+      type int32;
+      description
+        "The value of the metric that should be specified. The value
+        supplied in this leaf is used in conjunction with the metric
+        type to determine the value of the metric used by the system.
+        Where the metric-type is set to LSP_METRIC_ABSOLUTE - the
+        value of this leaf is used directly; where it is set to
+        LSP_METRIC_RELATIVE, the relevant (positive or negative)
+        offset is used to formulate the metric; where metric-type
+        is LSP_METRIC_INHERITED, the value of this leaf is not
+        utilised";
+    }
+
+    leaf shortcut-eligible {
+      type boolean;
+      default "true";
+      description
+        "Whether this LSP is considered to be eligible for us as a
+        shortcut in the IGP. In the case that this leaf is set to
+        true, the IGP SPF calculation uses the metric specified to
+        determine whether traffic should be carried over this LSP";
+    }
+
+    leaf protection-style-requested {
+      type identityref {
+        base oc-mplst:PROTECTION_TYPE;
+      }
+      default oc-mplst:UNPROTECTED;
+      description
+        "style of mpls frr protection desired: can be
+        link, link-node or unprotected.";
+    }
+
+    uses te-tunnel-reoptimize_config;
+    uses oc-rsvp:rsvp-p2p-tunnel-attributes_config;
+
+  }
+
+  grouping tunnel-p2p-attributes_config {
+    description
+      "Configuration related to p2p LSPs";
+    leaf destination {
+      type inet:ip-address;
+      description
+        "P2P tunnel destination address";
+    }
+  }
+
+  grouping p2p-path_state {
+    description
+      "Operational state parameters for p2p paths";
+
+    leaf associated-rsvp-session {
+      type leafref {
+        path "../../../../../../../../../signaling-protocols/" +
+             "rsvp-te/sessions/session/local-index";
+      }
+      description
+        "If the signalling protocol specified for this path is
+        RSVP-TE, this leaf provides a reference to the associated
+        session within the RSVP-TE protocol sessions list, such
+        that details of the signaling can be retrieved.";
+    }
+  }
+
+  grouping p2p-path_config {
+    description
+      "Configuration parameters for p2p paths";
+
+    leaf name {
+      type string;
+      description
+        "Path name";
+    }
+
+    leaf path-computation-method {
+      type identityref {
+        base oc-mplst:PATH_COMPUTATION_METHOD;
+      }
+      default oc-mplst:LOCALLY_COMPUTED;
+      description
+        "The method used for computing the path, either
+        locally computed, queried from a server or not
+        computed at all (explicitly configured).";
+    }
+
+    leaf use-cspf {
+      when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+        description
+          "The use of cspf when the path-computation method is
+           local computation";
+      }
+      type boolean;
+      description
+        "Flag to enable CSPF for locally computed LSPs";
+    }
+
+    leaf cspf-tiebreaker {
+      when "../path-computation-method = 'LOCALLY_COMPUTED'" {
+        description
+          "The cspf tiebreaking method when the path is
+           locally computed";
+      }
+      type cspf-tie-breaking;
+      description
+        "Determine the tie-breaking method to choose between
+        equally desirable paths during CSFP computation";
+    }
+
+
+    leaf path-computation-server {
+      when "../path-computation-method = 'EXTERNALLY_QUERIED'" {
+        description
+          "The path-computation server when the path is
+           externally queried";
+      }
+      type inet:ip-address;
+      description
+        "Address of the external path computation
+         server";
+    }
+
+    leaf explicit-path-name {
+      when "../path-computation-method = 'EXPLICITLY_DEFINED'" {
+        description
+          "The name of the explicitly defined path used";
+      }
+
+      type leafref {
+        path "../../../../../../../"
+             + "named-explicit-paths/named-explicit-path/"
+             + "config/name";
+        // Requires YANG 1.1
+        //require-instance true;
+      }
+      description
+        "reference to a defined path";
+    }
+
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this path. The lower the
+        number higher the preference";
+    }
+
+    uses oc-rsvp:rsvp-p2p-path-attributes_config;
+  }
+
+
+  grouping te-tunnel-p2p_top {
+    description
+      "Top level grouping for p2p configuration";
+
+    container p2p-tunnel-attributes {
+      when "../config/type = 'P2P'" {
+        description
+         "Include this container for LSPs of type P2P";
+      }
+      description
+        "Parameters related to LSPs of type P2P";
+
+      container config {
+       description
+         "Configuration parameters for P2P LSPs";
+       uses tunnel-p2p-attributes_config;
+      }
+
+      container state {
+       config false;
+       description
+         "State parameters for P2P LSPs";
+       uses tunnel-p2p-attributes_config;
+      }
+
+      uses p2p-primary-paths_top;
+      uses p2p-secondary-paths_top;
+    }
+  }
+
+
+  grouping te-tunnel_state {
+    description
+      "Counters and statistical data relevent to a single
+       tunnel.";
+
+    leaf oper-status {
+      type identityref {
+        base oc-mplst:LSP_OPER_STATUS;
+      }
+      description
+       "The operational status of the TE tunnel";
+    }
+
+    leaf role {
+      type identityref {
+        base oc-mplst:LSP_ROLE;
+      }
+      description
+       "The lsp role at the current node, whether it is headend,
+        transit or tailend.";
+    }
+
+    container counters {
+      description
+        "State data for MPLS label switched paths. This state
+        data is specific to a single label switched path.";
+
+      leaf bytes {
+        type yang:counter64;
+        description
+          "Number of bytes that have been forwarded over the
+           label switched path.";
+      }
+
+      leaf packets {
+        type yang:counter64;
+        description
+          "Number of pacets that have been forwarded over the
+           label switched path.";
+      }
+
+      leaf path-changes {
+        type yang:counter64;
+        description
+          "Number of path changes for the label switched path";
+      }
+
+      leaf state-changes {
+        type yang:counter64;
+        description
+          "Number of state changes for the label switched path";
+      }
+
+      leaf online-time {
+        type yang:date-and-time;
+        description
+          "Indication of the time the label switched path
+           transitioned to an Oper Up or in-service state";
+      }
+
+      leaf current-path-time {
+        type yang:date-and-time;
+        description
+          "Indicates the time the LSP switched onto its
+           current path. This is reset upon a LSP path
+           change.";
+      }
+
+      leaf next-reoptimization-time {
+        type yang:date-and-time;
+        description
+          "Indicates the next scheduled time the LSP
+           will be reoptimized.";
+      }
+    }
+  }
+
+  grouping te-tunnel-bandwidth_config {
+    description
+      "Configuration parameters related to bandwidth for a tunnel";
+
+    leaf specification-type {
+      type te-bandwidth-type;
+      default SPECIFIED;
+      description
+        "The method used for settign the bandwidth, either explicitly
+        specified or configured";
+    }
+
+    leaf set-bandwidth {
+      when "../specification-type = 'SPECIFIED'" {
+       description
+         "The bandwidth value when bandwidth is explicitly
+          specified";
+      }
+      type oc-mplst:bandwidth-kbps;
+      description
+       "set bandwidth explicitly, e.g., using
+        offline calculation";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_state {
+    description
+      "Operational state parameters relating to bandwidth for a tunnel";
+
+    leaf signaled-bandwidth {
+      type oc-mplst:bandwidth-kbps;
+      description
+        "The currently signaled bandwidth of the LSP. In the case where
+        the bandwidth is specified explicitly, then this will match the
+        value of the set-bandwidth leaf; in cases where the bandwidth is
+        dynamically computed by the system, the current value of the
+        bandwidth should be reflected.";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_top {
+    description
+      "Top level grouping for specifying bandwidth for a tunnel";
+
+    container bandwidth {
+      description
+        "Bandwidth configuration for TE LSPs";
+
+      container config {
+        description
+          "Configuration parameters related to bandwidth on TE
+          tunnels:";
+        uses te-tunnel-bandwidth_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters related to bandwidth
+          configuration of TE tunnels";
+        uses te-tunnel-bandwidth_config;
+        uses te-tunnel-bandwidth_state;
+      }
+
+      container auto-bandwidth {
+        when "../config/specification-type = 'AUTO'" {
+          description
+            "Include this container for auto bandwidth
+            specific configuration";
+        }
+        description
+          "Parameters related to auto-bandwidth";
+
+        container config {
+          description
+            "Configuration parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+
+        container overflow {
+          description
+            "configuration of MPLS overflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+        }
+
+        container underflow {
+          description
+            "configuration of MPLS underflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS underflow bandwidth
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "State information for MPLS underflow bandwidth
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+        }
+      }
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-config {
+    description
+      "Configuration parameters relating to a secondary path which
+      is a candidate for a particular primary path";
+
+    leaf secondary-path {
+      type leafref {
+        path "../../../../../../p2p-secondary-paths/" + 
+             "p2p-secondary-path/config/name";
+      }
+      description
+        "A reference to the secondary path that should be utilised
+        when the containing primary path option is in use";
+    }
+
+    leaf priority {
+      type uint16;
+      description
+        "The priority of the specified secondary path option. Higher
+        priority options are less preferable - such that a secondary
+        path reference with a priority of 0 is the most preferred";
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-state {
+    description
+      "Operational state parameters relating to a secondary path
+      which is a candidate for a particular primary path";
+
+    leaf active {
+      type boolean;
+      description
+        "Indicates the current active path option that has
+        been selected of the candidate secondary paths";
+    }
+  }
+
+  grouping p2p-primary-paths_top {
+    description
+      "Top level grouping for p2p primary paths";
+
+    container p2p-primary-path {
+      description
+        "Primary paths associated with the LSP";
+
+      list p2p-primary-path {
+        key "name";
+        description
+         "List of p2p primary paths for a tunnel";
+
+        leaf name {
+         type leafref {
+           path "../config/name";
+           // Requires YANG 1.1
+           //require-instance true;
+         }
+         description
+          "Path name";
+        }
+
+        container config {
+         description
+          "Configuration parameters related to paths";
+         uses p2p-path_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to paths";
+          uses p2p-path_config;
+          uses p2p-path_state;
+        }
+
+        container candidate-secondary-paths {
+          description
+            "The set of candidate secondary paths which may be used
+            for this primary path. When secondary paths are specified
+            in the list the path of the secondary LSP in use must be
+            restricted to those path options referenced. The
+            priority of the secondary paths is specified within the
+            list. Higher priority values are less preferred - that is
+            to say that a path with priority 0 is the most preferred
+            path. In the case that the list is empty, any secondary
+            path option may be utilised when the current primary path
+            is in use.";
+
+          list candidate-secondary-path {
+            key "secondary-path";
+
+            description
+              "List of secondary paths which may be utilised when the
+              current primary path is in use";
+
+            leaf secondary-path {
+              type leafref {
+                path "../config/secondary-path";
+              }
+              description
+                "A reference to the secondary path option reference
+                which acts as the key of the candidate-secondary-path
+                list";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+              uses p2p-path-candidate-secondary-path-state;
+            }
+          }
+        }
+
+        uses te-path-placement-constraints-top;
+
+      }
+    }
+  }
+
+  grouping p2p-secondary-paths_top {
+    description
+      "Top level grouping for p2p secondary paths";
+
+    container p2p-secondary-paths {
+      description
+        "Secondary paths for the LSP";
+
+      list p2p-secondary-path {
+        key "name";
+        description
+          "List of p2p primary paths for a tunnel";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "Path name";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to paths";
+          uses p2p-path_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to paths";
+          uses p2p-path_config;
+          uses p2p-path_state;
+        }
+
+        uses te-path-placement-constraints-top;
+      }
+    }
+  }
+
+  grouping te-tunnels_top {
+    description
+      "Top level grouping for TE tunnels";
+
+    container tunnels {
+      description
+        "Enclosing container for tunnels";
+      list tunnel {
+        key "name";
+        description
+          "List of TE tunnels. This list contains only the LSPs that the
+          current device originates (i.e., for which it is the head-end).
+          Where the signaling protocol utilised for an LSP allows a mid-point
+          or tail device to be aware of the LSP (e.g., RSVP-TE), then the
+          associated sessions are maintained per protocol";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+            // Requires YANG 1.1
+            //require-instance true;
+          }
+          description
+            "The tunnel name";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to TE tunnels:";
+          uses te-global-tunnel_config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to TE tunnels";
+          uses te-global-tunnel_config;
+          uses te-tunnel_state;
+
+        }
+
+        uses te-tunnel-bandwidth_top;
+        uses te-tunnel-p2p_top;
+        // TODO - add the p2mp configuration
+      }
+    }
+  }
+
+// data definition statements
+
+// augment statements
+
+// rpc statements
+
+// notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls-types.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls-types.yang
new file mode 100644
index 0000000..3ccd2db
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls-types.yang
@@ -0,0 +1,395 @@
+module openconfig-mpls-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/mpls-types";
+
+  prefix "oc-mpls-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "General types for MPLS / TE data model";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+  // identity statements
+
+  identity PATH_COMPUTATION_METHOD {
+    description
+     "base identity for supported path computation
+      mechanisms";
+  }
+
+  identity LOCALLY_COMPUTED {
+    base PATH_COMPUTATION_METHOD;
+    description
+      "indicates a constrained-path LSP in which the
+      path is computed by the local LER";
+  }
+
+  identity EXTERNALLY_QUERIED {
+    base PATH_COMPUTATION_METHOD;
+    description
+     "Constrained-path LSP in which the path is
+      obtained by querying an external source, such as a PCE server.
+      In the case that an LSP is defined to be externally queried, it may
+      also have associated explicit definitions (which are provided to the
+      external source to aid computation); and the path that is returned by
+      the external source is not required to provide a wholly resolved
+      path back to the originating system - that is to say, some local
+      computation may also be required";
+  }
+
+  identity EXPLICITLY_DEFINED {
+    base PATH_COMPUTATION_METHOD;
+    description
+     "constrained-path LSP in which the path is
+      explicitly specified as a collection of strict or/and loose
+      hops";
+  }
+
+
+  // using identities rather than enum types to simplify adding new
+  // signaling protocols as they are introduced and supported
+  identity PATH_SETUP_PROTOCOL {
+    description
+      "base identity for supported MPLS signaling
+      protocols";
+  }
+
+  identity PATH_SETUP_RSVP {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "RSVP-TE signaling protocol";
+  }
+
+  identity PATH_SETUP_SR {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "Segment routing";
+  }
+
+  identity PATH_SETUP_LDP {
+    base PATH_SETUP_PROTOCOL;
+    description
+      "LDP - RFC 5036";
+  }
+
+
+  identity PROTECTION_TYPE {
+    description
+      "base identity for protection type";
+  }
+
+  identity UNPROTECTED {
+    base PROTECTION_TYPE;
+    description
+      "no protection is desired";
+  }
+
+  identity LINK_PROTECTION_REQUIRED {
+    base PROTECTION_TYPE;
+    description
+      "link protection is desired";
+  }
+
+  identity LINK_NODE_PROTECTION_REQUESTED {
+    base PROTECTION_TYPE;
+    description
+      "node and link protection are both desired";
+  }
+
+  identity LSP_ROLE {
+    description
+      "Base identity for describing the role of
+       label switched path at the current node";
+  }
+
+  identity INGRESS {
+    base LSP_ROLE;
+    description
+      "Label switched path is an ingress (headend)
+       LSP";
+  }
+
+  identity EGRESS {
+    base LSP_ROLE;
+    description
+      "Label switched path is an egress (tailend)
+       LSP";
+  }
+
+  identity TRANSIT {
+    base LSP_ROLE;
+    description
+      "Label switched path is a transit LSP";
+  }
+
+
+  identity TUNNEL_TYPE {
+    description
+      "Base identity from which specific tunnel types are
+      derived.";
+  }
+
+  identity P2P {
+    base TUNNEL_TYPE;
+    description
+      "TE point-to-point tunnel type.";
+  }
+
+  identity P2MP {
+    base TUNNEL_TYPE;
+    description
+      "TE point-to-multipoint tunnel type.";
+  }
+
+
+  identity LSP_OPER_STATUS {
+    description
+      "Base identity for LSP operational status";
+  }
+
+  identity DOWN {
+    base LSP_OPER_STATUS;
+    description
+      "LSP is operationally down or out of service";
+  }
+
+  identity UP {
+    base LSP_OPER_STATUS;
+    description
+      "LSP is operationally active and available
+       for traffic.";
+  }
+
+  identity TUNNEL_ADMIN_STATUS {
+    description
+      "Base identity for tunnel administrative status";
+  }
+
+  identity ADMIN_DOWN {
+    base TUNNEL_ADMIN_STATUS;
+    description
+      "LSP is administratively down";
+  }
+
+  identity ADMIN_UP {
+    base TUNNEL_ADMIN_STATUS;
+    description
+      "LSP is administratively up";
+  }
+
+ identity NULL_LABEL_TYPE {
+    description
+      "Base identity from which specific null-label types are
+      derived.";
+  }
+
+  identity EXPLICIT {
+    base NULL_LABEL_TYPE;
+    description
+      "Explicit null label is used.";
+  }
+
+  identity IMPLICIT {
+    base NULL_LABEL_TYPE;
+    description
+      "Implicit null label is used.";
+  }
+
+  identity LSP_METRIC_TYPE {
+    description
+      "Base identity for types of LSP metric specification";
+  }
+
+  identity LSP_METRIC_RELATIVE {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric specified for the LSPs to which this identity refers
+      is specified as a relative value to the IGP metric cost to the
+      LSP's tail-end.";
+  }
+
+  identity LSP_METRIC_ABSOLUTE {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric specified for the LSPs to which this identity refers
+      is specified as an absolute value";
+  }
+
+  identity LSP_METRIC_INHERITED {
+    base LSP_METRIC_TYPE;
+    description
+      "The metric for for the LSPs to which this identity refers is
+      not specified explicitly - but rather inherited from the IGP
+      cost directly";
+  }
+
+  // typedef statements
+  typedef mpls-label {
+    type union {
+      type uint32 {
+        range 16..1048575;
+      }
+      type enumeration {
+        enum IPV4_EXPLICIT_NULL {
+          value 0;
+          description
+            "valid at the bottom of the label stack,
+            indicates that stack must be popped and packet forwarded
+            based on IPv4 header";
+        }
+        enum ROUTER_ALERT {
+          value 1;
+          description
+            "allowed anywhere in the label stack except
+            the bottom, local router delivers packet to the local CPU
+            when this label is at the top of the stack";
+        }
+        enum IPV6_EXPLICIT_NULL {
+          value 2;
+          description
+            "valid at the bottom of the label stack,
+            indicates that stack must be popped and packet forwarded
+            based on IPv6 header";
+        }
+        enum IMPLICIT_NULL {
+          value 3;
+          description
+            "assigned by local LSR but not carried in
+            packets";
+        }
+        enum ENTROPY_LABEL_INDICATOR {
+          value 7;
+          description
+            "Entropy label indicator, to allow an LSR
+            to distinguish between entropy label and applicaiton
+            labels RFC 6790";
+        }
+        enum NO_LABEL {
+          description
+            "This value is utilised to indicate that the packet that
+            is forwarded by the local system does not have an MPLS
+            header applied to it. Typically, this is used at the
+            egress of an LSP";
+        }
+      }
+    }
+    description
+      "type for MPLS label value encoding";
+    reference "RFC 3032 - MPLS Label Stack Encoding";
+  }
+
+  typedef tunnel-type {
+    type enumeration {
+      enum P2P {
+        description
+          "point-to-point label-switched-path";
+      }
+      enum P2MP {
+        description
+          "point-to-multipoint label-switched-path";
+      }
+      enum MP2MP {
+        description
+          "multipoint-to-multipoint label-switched-path";
+      }
+    }
+    description
+      "defines the tunnel type for the LSP";
+    reference
+      "RFC 6388 - Label Distribution Protocol Extensions for
+      Point-to-Multipoint and Multipoint-to-Multipoint Label Switched
+      Paths
+      RFC 4875 - Extensions to  Resource Reservation Protocol
+      - Traffic Engineering (RSVP-TE) for Point-to-Multipoint TE
+      Label Switched Paths (LSPs)";
+  }
+
+  typedef bandwidth-kbps {
+    type uint64;
+    units "Kbps";
+    description
+      "Bandwidth values expressed in kilobits per second";
+  }
+
+  typedef bandwidth-mbps {
+    type uint64;
+    units "Mbps";
+    description
+      "Bandwidth values expressed in megabits per second";
+  }
+
+  typedef bandwidth-gbps {
+    type uint64;
+    units "Gbps";
+    description
+      "Bandwidth values expressed in gigabits per second";
+  }
+
+  typedef mpls-tc {
+    type uint8 {
+      range "0..7";
+    }
+    description
+      "Values of the MPLS Traffic Class (formerly known as
+      Experimental, EXP) bits";
+  }
+
+  // grouping statements
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/mpls/openconfig-mpls.yang b/models/openconfig/src/main/yang/mpls/openconfig-mpls.yang
new file mode 100644
index 0000000..c214ce2
--- /dev/null
+++ b/models/openconfig/src/main/yang/mpls/openconfig-mpls.yang
@@ -0,0 +1,703 @@
+module openconfig-mpls {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/mpls";
+
+  prefix "oc-mpls";
+
+
+  // import some basic types
+  import openconfig-mpls-types { prefix oc-mplst; }
+  import openconfig-mpls-rsvp { prefix oc-rsvp; }
+  import openconfig-mpls-ldp { prefix oc-ldp; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-segment-routing { prefix oc-sr; }
+
+  // include submodules
+  include openconfig-mpls-te;
+  include openconfig-mpls-igp;
+  include openconfig-mpls-static;
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module provides data definitions for configuration of
+    Multiprotocol Label Switching (MPLS) and associated protocols for
+    signaling and traffic engineering.
+
+    RFC 3031: Multiprotocol Label Switching Architecture
+
+    The MPLS / TE data model consists of several modules and
+    submodules as shown below.  The top-level MPLS module describes
+    the overall framework.  Three types of LSPs are supported:
+
+    i) traffic-engineered (or constrained-path)
+
+    ii) IGP-congruent (LSPs that follow the IGP path)
+
+    iii) static LSPs which are not signaled
+
+    The structure of each of these LSP configurations is defined in
+    corresponding submodules.  Companion modules define the relevant
+    configuration and operational data specific to key signaling
+    protocols used in operational practice.
+
+
+                              +-------+
+            +---------------->| MPLS  |<--------------+
+            |                 +-------+               |
+            |                     ^                   |
+            |                     |                   |
+       +----+-----+      +--------+-------+     +-----+-----+
+       | TE LSPs  |      | IGP-based LSPs |     |static LSPs|
+       |          |      |                |     |           |
+       +----------+      +----------------+     +-----------+
+           ^  ^                    ^  ^
+           |  +----------------+   |  +--------+
+           |                   |   |           |
+           |   +------+      +-+---+-+      +--+--+
+           +---+ RSVP |      |SEGMENT|      | LDP |
+               +------+      |ROUTING|      +-----+
+                             +-------+
+    ";
+
+  oc-ext:openconfig-version "2.4.0";
+
+  revision "2017-06-21" {
+    description
+      "Add TC bits typedef.";
+    reference "2.4.0";
+  }
+
+  revision "2017-03-22" {
+    description
+      "Add RSVP calculated-absolute-subscription-bw";
+    reference "2.3.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add RSVP Tspec, clarify units for RSVP, remove unused LDP";
+    reference "2.2.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add additional MPLS parameters";
+    reference "2.1.0";
+  }
+
+  revision "2016-09-01" {
+    description
+      "Revisions based on implementation feedback";
+    reference "2.0.0";
+  }
+
+  revision "2016-08-08" {
+    description
+      "Public release of MPLS models";
+    reference "1.0.1";
+  }
+
+
+  // grouping statements
+
+  grouping mpls-admin-group_config {
+    description
+      "configuration data for MPLS link admin groups";
+
+      leaf admin-group-name {
+        type string;
+        description
+          "name for mpls admin-group";
+      }
+
+      leaf bit-position {
+        type uint32;
+        description
+          "bit-position value for mpls admin-group. The value
+           for the admin group is an integer that represents one
+           of the bit positions in the admin-group bitmask. Values
+           between 0 and 31 are interpreted as the original limit
+           of 32 admin groups. Values >=32 are interpreted as
+           extended admin group values as per RFC7308.";
+      }
+
+  }
+
+  grouping mpls-admin-groups-top {
+
+    description
+      "top-level mpls admin-groups config
+      and state containers";
+
+    container mpls-admin-groups {
+      description
+        "Top-level container for admin-groups configuration
+        and state";
+
+      list admin-group {
+        key "admin-group-name";
+        description
+          "configuration of value to name mapping
+          for mpls affinities/admin-groups";
+
+        leaf admin-group-name {
+          type leafref {
+            path "../config/admin-group-name";
+          }
+          description
+            "name for mpls admin-group";
+        }
+        container config {
+          description
+            "Configurable items for admin-groups";
+          uses mpls-admin-group_config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state for admin-groups";
+          uses mpls-admin-group_config;
+        }
+      }
+    }
+  }
+
+  grouping mpls-te-igp-flooding-bandwidth_config {
+    description
+      "Configurable items for igp flooding bandwidth
+      threshold configuration.";
+    leaf threshold-type {
+      type enumeration {
+        enum DELTA {
+          description
+            "DELTA indicates that the local
+            system should flood IGP updates when a
+            change in reserved bandwidth >= the specified
+            delta occurs on the interface.";
+        }
+        enum THRESHOLD_CROSSED {
+          description
+            "THRESHOLD-CROSSED indicates that
+            the local system should trigger an update (and
+            hence flood) the reserved bandwidth when the
+            reserved bandwidth changes such that it crosses,
+            or becomes equal to one of the threshold values.";
+        }
+      }
+      description
+        "The type of threshold that should be used to specify the
+        values at which bandwidth is flooded. DELTA indicates that
+        the local system should flood IGP updates when a change in
+        reserved bandwidth >= the specified delta occurs on the
+        interface. Where THRESHOLD_CROSSED is specified, the local
+        system should trigger an update (and hence flood) the
+        reserved bandwidth when the reserved bandwidth changes such
+        that it crosses, or becomes equal to one of the threshold
+        values";
+    }
+
+    leaf delta-percentage {
+      when "../threshold-type = 'DELTA'" {
+        description
+          "The percentage delta can only be specified when the
+          threshold type is specified to be a percentage delta of
+          the reserved bandwidth";
+      }
+      type oc-types:percentage;
+      description
+        "The percentage of the maximum-reservable-bandwidth
+        considered as the delta that results in an IGP update
+        being flooded";
+    }
+
+    leaf threshold-specification {
+      when "../threshold-type = 'THRESHOLD_CROSSED'" {
+        description
+          "The selection of whether mirrored or separate threshold
+          values are to be used requires user specified thresholds to
+          be set";
+      }
+      type enumeration {
+        enum MIRRORED_UP_DOWN {
+          description
+            "MIRRORED_UP_DOWN indicates that a single set of
+            threshold values should be used for both increasing
+            and decreasing bandwidth when determining whether
+            to trigger updated bandwidth values to be flooded
+            in the IGP TE extensions.";
+        }
+        enum SEPARATE_UP_DOWN {
+          description
+            "SEPARATE_UP_DOWN indicates that a separate
+            threshold values should be used for the increasing
+            and decreasing bandwidth when determining whether
+            to trigger updated bandwidth values to be flooded
+            in the IGP TE extensions.";
+        }
+      }
+      description
+        "This value specifies whether a single set of threshold
+        values should be used for both increasing and decreasing
+        bandwidth when determining whether to trigger updated
+        bandwidth values to be flooded in the IGP TE extensions.
+        MIRRORED-UP-DOWN indicates that a single value (or set of
+        values) should be used for both increasing and decreasing
+        values, where SEPARATE-UP-DOWN specifies that the increasing
+        and decreasing values will be separately specified";
+    }
+
+    leaf-list up-thresholds {
+      when "../threshold-type = 'THRESHOLD_CROSSED'" +
+        "and ../threshold-specification = 'SEPARATE_UP_DOWN'" {
+          description
+            "A list of up-thresholds can only be specified when the
+            bandwidth update is triggered based on crossing a
+            threshold and separate up and down thresholds are
+            required";
+        }
+      type oc-types:percentage;
+      description
+        "The thresholds (expressed as a percentage of the maximum
+        reservable bandwidth) at which bandwidth updates are to be
+        triggered when the bandwidth is increasing.";
+    }
+
+    leaf-list down-thresholds {
+      when "../threshold-type = 'THRESHOLD_CROSSED'" +
+        "and ../threshold-specification = 'SEPARATE_UP_DOWN'" {
+          description
+            "A list of down-thresholds can only be specified when the
+            bandwidth update is triggered based on crossing a
+            threshold and separate up and down thresholds are
+            required";
+        }
+      type oc-types:percentage;
+      description
+        "The thresholds (expressed as a percentage of the maximum
+        reservable bandwidth) at which bandwidth updates are to be
+        triggered when the bandwidth is decreasing.";
+    }
+
+    leaf-list up-down-thresholds {
+      when "../threshold-type = 'THRESHOLD_CROSSED'" +
+        "and ../threshold-specification = 'MIRRORED_UP_DOWN'" {
+          description
+            "A list of thresholds corresponding to both increasing
+            and decreasing bandwidths can be specified only when an
+            update is triggered based on crossing a threshold, and
+            the same up and down thresholds are required.";
+        }
+      type oc-types:percentage;
+      description
+        "The thresholds (expressed as a percentage of the maximum
+        reservable bandwidth of the interface) at which bandwidth
+        updates are flooded - used both when the bandwidth is
+        increasing and decreasing";
+    }
+  }
+
+
+  grouping  mpls-te-igp-flooding-bandwidth {
+    description
+      "Top level group for traffic engineering
+      database flooding options";
+    container igp-flooding-bandwidth {
+      description
+        "Interface bandwidth change percentages
+        that trigger update events into the IGP traffic
+        engineering database (TED)";
+      container config {
+        description
+          "Configuration parameters for TED
+          update threshold ";
+        uses  mpls-te-igp-flooding-bandwidth_config;
+      }
+      container state {
+        config false;
+        description
+          "State parameters for TED update threshold ";
+        uses  mpls-te-igp-flooding-bandwidth_config;
+      }
+    }
+  }
+
+
+  grouping te-lsp-delay_config {
+    description
+      "Group for the timers goerning the delay
+      in installation and cleanup of TE LSPs";
+
+    leaf install-delay {
+      type uint16 {
+        range 0..3600;
+      }
+      units seconds;
+      description
+        "delay the use of newly installed te lsp for a
+        specified amount of time.";
+    }
+
+    leaf cleanup-delay {
+      type uint16;
+      units seconds;
+      description
+        "delay the removal of old te lsp for a specified
+        amount of time";
+    }
+  }
+
+  grouping te-interface-attributes-top {
+    description
+      "Top level grouping for attributes
+      for TE interfaces.";
+
+    list interface {
+      key "interface-id";
+      description
+        "List of TE interfaces";
+
+      leaf interface-id {
+        type leafref {
+          path "../config/interface-id";
+        }
+        description
+          "Reference to the interface id list key";
+      }
+
+      container config {
+        description
+          "Configuration parameters related to TE interfaces:";
+        uses te-interface-attributes_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters related to TE interfaces";
+        uses te-interface-attributes_config;
+      }
+
+      uses oc-if:interface-ref;
+
+      uses  mpls-te-igp-flooding-bandwidth;
+    }
+  }
+
+  grouping te-interface-attributes_config {
+    description
+      "global level definitions for interfaces
+      on which TE is run";
+
+    leaf interface-id {
+      type oc-if:interface-id;
+      description
+        "Id of the interface";
+    }
+
+    leaf te-metric {
+      type uint32;
+      description
+        "TE specific metric for the link";
+    }
+
+    leaf-list srlg-membership {
+      type leafref {
+          path "../../../../te-global-attributes/srlgs/srlg/name";
+      }
+      description
+        "list of references to named shared risk link groups that the
+        interface belongs to.";
+    }
+
+    leaf-list admin-group {
+      type string;
+      description
+        "list of admin groups (by name) on the interface";
+    }
+  }
+
+  grouping mpls-te-lsp-timers {
+    description
+      "Grouping for traffic engineering timers";
+    container te-lsp-timers {
+      description
+        "Definition for delays associated with setup
+        and cleanup of TE LSPs";
+
+      container config {
+        description
+          "Configuration parameters related
+          to timers for TE LSPs";
+
+        uses te-lsp-delay_config;
+        uses te-tunnel-reoptimize_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State related to timers for TE LSPs";
+
+        uses te-lsp-delay_config;
+        uses te-tunnel-reoptimize_config;
+      }
+    }
+  }
+
+  grouping mpls-global_config {
+    description
+      "Definition of global MPLS configuration parameters";
+
+    leaf null-label {
+      type identityref {
+        base oc-mplst:NULL_LABEL_TYPE;
+      }
+      default oc-mplst:IMPLICIT;
+      description
+        "The null-label type used, implicit or explicit";
+    }
+  }
+
+ grouping mpls-global-top {
+    description
+      "Top level grouping for global MPLS configuration ";
+
+      container config {
+        description
+          "Top level global MPLS configuration";
+        uses mpls-global_config;
+      }
+
+      container state {
+        config false;
+        description
+          "Top level global MPLS state";
+        uses mpls-global_config;
+      }
+ }
+
+ grouping mpls-interfaces-top {
+    description
+      "Top level grouping for attributes
+      for MPLS-enabled interfaces.";
+    container interface-attributes {
+      description
+        "Parameters related to MPLS interfaces";
+      list interface {
+        key "interface-id";
+        description
+          "List of TE interfaces";
+
+        leaf interface-id {
+          type leafref {
+            path "../config/interface-id";
+          }
+          description
+            "Reference to the interface id list key";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to MPLS interfaces:";
+          uses mpls-interface-attributes-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to TE interfaces";
+          uses mpls-interface-attributes-config;
+        }
+
+        uses oc-if:interface-ref;
+      }
+    }
+  }
+
+  grouping mpls-interface-attributes-config {
+    description
+      "global level definitions for interfaces
+      on which MPLS is run";
+
+    leaf interface-id {
+      type oc-if:interface-id;
+      description
+        "Indentifier for the MPLS interface";
+    }
+
+    leaf mpls-enabled {
+      type boolean;
+      default false;
+      description
+        "Enable MPLS forwarding on this interface";
+    }
+  }
+
+  grouping mpls-label-block-config {
+    description
+      "Configuration parameters relating to an MPLS label block.";
+
+    leaf local-id {
+      type string;
+      description
+        "A local identifier for the global label block allocation.";
+    }
+
+    leaf lower-bound {
+      type oc-mplst:mpls-label;
+      description
+        "Lower bound of the global label block. The block is defined to include
+        this label.";
+    }
+
+    leaf upper-bound {
+      type oc-mplst:mpls-label;
+      description
+        "Upper bound for the global label block. The block is defined to include
+        this label.";
+    }
+  }
+
+  grouping mpls-label-blocks-top {
+    description
+      "Top-level configuration and operational state parameters corresponding
+      to reserved label blocks.";
+
+    container reserved-label-blocks {
+      description
+        "A range of labels starting with the start-label and up-to and including
+        the end label that should be allocated as reserved. These labels should
+        not be utilised by any dynamic label allocation on the local system unless
+        the allocating protocol is explicitly configured to specify that
+        allocation of labels should be out of the label block specified.";
+
+      list reserved-label-block {
+        key "local-id";
+
+        description
+          "A range of labels starting with the start-label up to and including
+          the end label that should be allocated for use by a specific protocol.";
+
+        leaf local-id {
+          type leafref {
+            path "../config/local-id";
+          }
+          description
+            "A reference to a unique local identifier for this label block.";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the label block.";
+
+          uses mpls-label-block-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters relating to the label block.";
+
+          uses mpls-label-block-config;
+        }
+      }
+    }
+  }
+
+  grouping mpls-top {
+    description
+      "Top level grouping for MPLS configuration and state";
+
+    container mpls {
+      description
+        "Anchor point for mpls configuration and operational
+        data";
+
+      container global {
+        // entropy label support, label ranges will be added here.
+       description
+        "general mpls configuration applicable to any
+        type of LSP and signaling protocol - label ranges,
+        entropy label supportmay be added here";
+       uses mpls-global-top;
+       uses mpls-interfaces-top;
+       uses mpls-label-blocks-top;
+      }
+
+      container te-global-attributes {
+        description
+          "traffic-engineering global attributes";
+        uses mpls-te-srlg-top;
+        uses mpls-admin-groups-top;
+        uses mpls-te-lsp-timers;
+      }
+
+      container te-interface-attributes {
+        description
+          "traffic engineering attributes specific
+          for interfaces";
+        uses te-interface-attributes-top;
+      }
+
+      container signaling-protocols {
+        description
+          "top-level signaling protocol configuration";
+
+        uses oc-rsvp:rsvp-global;
+        uses oc-ldp:ldp-global;
+        uses oc-sr:sr-mpls-top;
+      }
+
+      container lsps {
+        description
+          "LSP definitions and configuration";
+
+        container constrained-path {
+          description
+            "traffic-engineered LSPs supporting different
+            path computation and signaling methods";
+          uses explicit-paths_top;
+          uses te-tunnels_top;
+        }
+
+        container unconstrained-path {
+          description
+            "LSPs that use the IGP-determined path, i.e., non
+            traffic-engineered, or non constrained-path";
+
+          uses igp-lsp-common;
+          uses igp-lsp-setup;
+        }
+
+        container static-lsps {
+          description
+            "statically configured LSPs, without dynamic
+            signaling";
+
+          uses static-lsp-top;
+        }
+      }
+    }
+  }
+
+  uses mpls-top;
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l2.yang b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l2.yang
new file mode 100644
index 0000000..a5af674
--- /dev/null
+++ b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l2.yang
@@ -0,0 +1,295 @@
+submodule openconfig-network-instance-l2 {
+
+  belongs-to openconfig-network-instance {
+    prefix "oc-netinst";
+  }
+
+
+  // import some basic types
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+  import ietf-yang-types { prefix "yang"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains groupings which specifically relate to
+    Layer 2 network instance configuration and operational state
+    parameters.";
+
+  oc-ext:openconfig-version "0.8.0";
+
+  revision "2017-02-28" {
+    description
+      "Add OSPFv2 to network instance";
+    reference "0.8.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add policy forwarding to network instance";
+    reference "0.7.0";
+  }
+    
+  revision "2017-01-13" {
+    description
+      "Add AFT to the network instance";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to network instance";
+    reference "0.5.0";
+  }
+
+  revision "2016-11-10" {
+    description
+      "Update model to include IS-IS.";
+    reference "0.4.1";
+  }
+
+  revision "2016-10-12" {
+    description
+      "Update table connections";
+    reference "0.4.0";
+  }
+
+  revision "2016-09-28" {
+    description
+      "Change L2 instance to submodule; add MAC table";
+    reference "0.3.0";
+  }
+
+  revision "2016-08-11" {
+    description
+      "Resolve repeated container names in routing protocols";
+    reference "0.2.3";
+  }
+
+  revision "2016-07-08" {
+    description
+      "Updated with refactored routing protocol models";
+    reference "0.2.1";
+  }
+
+  revision "2016-03-29" {
+    description
+      "Initial revision";
+    reference "0.2.0";
+  }
+
+  revision "2015-11-20" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  grouping l2ni-instance {
+    description
+      "Configuration and operational state parameters relating
+      to a Layer 2 network instance";
+
+    container fdb {
+      description
+        "Operational state and configuration parameters relating to
+        the forwarding database of the network instance";
+
+      container config {
+        description
+          "Configuration parameters relating to the FDB";
+        uses l2ni-fdb-mac-config;
+      }
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to the FDB";
+        uses l2ni-fdb-mac-config;
+      }
+
+       uses l2ni-mac-table-top;
+    }
+  }
+
+  grouping l2ni-instance-common-config {
+    description
+      "Common configuration options which are specific to Layer 2
+      network instances";
+
+    leaf mtu {
+      type uint16;
+      description
+        "The maximum frame size which should be supported for this
+        instance for Layer 2 frames";
+    }
+
+  }
+
+  grouping l2ni-fdb-mac-config {
+    description
+      "Parameters relating to FDB behaviour relating to MAC
+      addresses";
+
+    leaf mac-learning {
+      type boolean;
+      description
+        "When this leaf is set to true, MAC learning is enabled for
+        the network instance, such that MAC addresses are learned
+        from ingress frames and added to the FDB.";
+    }
+
+    leaf mac-aging-time {
+      // Cisco supports one aging time for local and remote, but
+      // can specify this time is absolute or against inactivity.
+      // ALU SROS supports different aging times for local and remote
+      // but does not allow absolute/inactivity specification.
+      // JNPR supports only a single aging time, and no specification
+      // of whether inactivity/absolute is used.
+      // It is easy to augment new options in here for local remote
+      // and an extra leaf to allow specification of the type of aging
+      // so this is left as a single value.
+      type uint16;
+      units seconds;
+      description
+        "The number of seconds of inactivity after which the entry
+        in the local FDB is timed out.";
+    }
+
+    leaf maximum-entries {
+      type uint16;
+      description
+        "The maximum number of MAC address entries that should be
+        accepted into the FDB";
+    }
+  }
+
+  grouping l2ni-encapsulation-config {
+    description
+      "Encapsulation related configuration parameters for a L2
+      network instance";
+
+    leaf control-word {
+      type boolean;
+      description
+        "Whether the control-word should be used for the network
+        instance";
+      reference "RFC3985";
+    }
+  }
+
+  grouping l2ni-mac-table-config {
+    description
+      "Configuration data for MAC table entries";
+
+    leaf mac-address {
+      type yang:mac-address;
+      description
+        "MAC address for the dynamic or static MAC table
+        entry";
+    }
+
+    leaf vlan {
+      //TODO(aashaikh): Consider whether this should just reflect the
+      //VLAN id or be a union type to also support displaying/setting
+      //the VLAN by name (i.e., global VLAN configured in the VLAN
+      // model).
+      type leafref {
+        path "../../../../../../vlans/vlan/config/vlan-id";
+      }
+      description
+        "VLAN from which this MAC address was received";
+    }
+  }
+
+  grouping l2ni-mac-table-state {
+    description
+      "Operational state data for MAC table entries";
+
+    leaf age {
+      type uint64;
+      units seconds;
+      description
+        "The time in seconds since the MAC address has been in the
+        table";
+    }
+
+    leaf entry-type {
+      type enumeration {
+        enum STATIC {
+          description
+            "Statically programmed MAC table entry";
+        }
+        enum DYNAMIC {
+          description
+            "Dynamically learned MAC table entry";
+        }
+      }
+      description
+        "Indicates whether the entry was statically configured, or
+        dynamically learned.";
+    }
+
+  }
+
+  grouping l2ni-mac-table-top {
+    description
+      "Top-level grouping for MAC table list";
+
+
+    container mac-table {
+      description
+        "Table of learned or statically configured MAC addresses and
+        corresponding VLANs in the bridge domain";
+
+      container entries {
+        description
+          "Enclosing container for list of MAC table entries";
+
+        list entry {
+          key "mac-address";
+          description
+            "List of learned MAC addresses";
+
+          leaf mac-address {
+            type leafref {
+              path "../config/mac-address";
+            }
+            description
+              "Reference to mac-address list key";
+          }
+
+          container config {
+            description
+              "Configuration data for MAC table entries";
+
+            uses l2ni-mac-table-config;
+          }
+
+          container state {
+
+            config false;
+
+            description
+              "Operational state data for MAC table entries";
+
+            uses l2ni-mac-table-config;
+            uses l2ni-mac-table-state;
+          }
+
+          container interface {
+            description
+              "Reference to the base and/or subinterface for the
+              MAC table entry";
+
+            uses oc-if:interface-ref;
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l3.yang b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l3.yang
new file mode 100644
index 0000000..72fb8af
--- /dev/null
+++ b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-l3.yang
@@ -0,0 +1,112 @@
+module openconfig-network-instance-l3 {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/network-instance-l3";
+
+  prefix "oc-ni-l3";
+
+  // import some basic types
+  //import ietf-inet-types { prefix inet; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-types { prefix "octypes"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains groupings which specifically relate to
+    Layer 2 network instance configuration and operational state
+    parameters.";
+
+  oc-ext:openconfig-version "0.8.0";
+
+  revision "2017-02-28" {
+    description
+      "Add OSPFv2 to network instance";
+    reference "0.8.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add policy forwarding to network instance";
+    reference "0.7.0";
+  }
+    
+  revision "2017-01-13" {
+    description
+      "Add AFT to the network instance";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to network instance";
+    reference "0.5.0";
+  }
+
+  revision "2016-11-10" {
+    description
+      "Update model to include IS-IS.";
+    reference "0.4.1";
+  }
+
+  revision "2016-09-28" {
+    description
+      "Change L2 instance to submodule; add MAC table";
+    reference "0.3.0";
+  }
+
+  revision "2016-08-11" {
+    description
+      "Resolve repeated container names in routing protocols";
+    reference "0.2.3";
+  }
+
+  revision "2016-07-08" {
+    description
+      "Updated with refactored routing protocol models";
+    reference "0.2.1";
+  }
+
+  revision "2016-03-29" {
+    description
+      "Initial revision";
+    reference "0.2.0";
+  }
+
+  revision "2016-03-14" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  grouping l3ni-instance {
+    description
+      "Configuration and operational state parameters relevant
+      to network instances that include a Layer 3 type";
+
+  }
+
+  grouping l3ni-instance-common-config {
+    description
+      "Configuration parameters that are common to L3 network
+      instances other than the default instance";
+
+    leaf-list enabled-address-families {
+      type identityref {
+        base octypes:ADDRESS_FAMILY;
+      }
+      description
+        "The address families that are to be enabled for this
+        network instance.";
+    }
+  }
+
+
+}
diff --git a/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-policy.yang b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-policy.yang
new file mode 100644
index 0000000..acb17d0
--- /dev/null
+++ b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-policy.yang
@@ -0,0 +1,116 @@
+module openconfig-network-instance-policy {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/network-instance/policy";
+
+  prefix "oc-ni-pol";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-routing-policy { prefix oc-rpol; }
+  import openconfig-policy-types { prefix oc-pol-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines routing policy statements (conditions and
+    actions) for the network instance model.  These statements are
+    generally added to the routing policy model.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-15" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+
+  // grouping statements
+
+  grouping protocol-instance-policy-config {
+    description
+      "Configuration data for policy matching on protocol instance";
+
+      leaf protocol-identifier {
+        type identityref {
+          base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+        }
+        description
+          "The identifier (protocol type) of the
+          protocol instance to match on in the local network
+          instance.";
+      }
+
+      leaf protocol-name {
+        type string;
+        description
+          "The name of the protocol instance to match
+          on in the local network instance";
+      }
+  }
+
+  grouping protocol-instance-policy-state {
+    description
+      "Operational state data for policy matching on protocol
+      instance";
+  }
+
+  grouping protocol-instance-policy-top {
+    description
+      "Top-level grouping for policy matching on protocol instance";
+
+    container match-protocol-instance {
+      description
+        "Top-level container for protocol instance match condition
+        in policy statements.  The protocol instance is referenced
+        by an identifier and name";
+
+      container config {
+        description
+          "Configuration data for policy matching on protocol
+          instance";
+
+        uses protocol-instance-policy-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for policy matching on protocol instance";
+
+        uses protocol-instance-policy-config;
+        uses protocol-instance-policy-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+    "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+    "oc-rpol:conditions" {
+    description
+      "Add match conditions for protocol instances to the routing
+      policy model.";
+
+    uses protocol-instance-policy-top;
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-types.yang b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-types.yang
new file mode 100644
index 0000000..bcbe8ca
--- /dev/null
+++ b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance-types.yang
@@ -0,0 +1,255 @@
+module openconfig-network-instance-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/network-instance-types";
+
+  prefix "oc-ni-types";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Types associated with a network instance";
+
+  oc-ext:openconfig-version "0.8.0";
+
+  revision "2017-02-28" {
+    description
+      "Add OSPFv2 to network instance";
+    reference "0.8.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add policy forwarding to network instance";
+    reference "0.7.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Add AFT to the network instance";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to network instance";
+    reference "0.5.0";
+  }
+
+  revision "2016-11-10" {
+    description
+      "Update model to include IS-IS.";
+    reference "0.4.1";
+  }
+
+  revision "2016-10-12" {
+    description
+      "Update table connections";
+    reference "0.4.0";
+  }
+
+  revision "2016-09-28" {
+    description
+      "Change L2 instance to submodule; add MAC table";
+    reference "0.3.0";
+  }
+
+  revision "2016-08-11" {
+    description
+      "Resolve repeated container names in routing protocols";
+    reference "0.2.3";
+  }
+
+  revision "2016-07-08" {
+    description
+      "Updated with refactored routing protocol models";
+    reference "0.2.1";
+  }
+
+  revision "2016-03-29" {
+    description
+      "Initial revision";
+    reference "0.2.0";
+  }
+
+  revision "2015-10-18" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  // identity statements
+  identity NETWORK_INSTANCE_TYPE {
+  	description
+  	 "A base identity which can be extended to indicate different
+     types of network instance supported by a device.";
+  }
+
+  identity DEFAULT_INSTANCE {
+    base NETWORK_INSTANCE_TYPE;
+    description
+      "A special routing instance which acts as the 'default' or
+      'global' routing instance for a network device.";
+  }
+
+  identity L3VRF {
+    base NETWORK_INSTANCE_TYPE;
+    description
+      "A private Layer 3 only routing instance which is formed of
+      one or more RIBs";
+  }
+
+  identity L2VSI {
+    base NETWORK_INSTANCE_TYPE;
+    description
+      "A private Layer 2 only switch instance which is formed of
+      one or more L2 forwarding tables";
+  }
+
+  identity L2P2P {
+    base NETWORK_INSTANCE_TYPE;
+    description
+      "A private Layer 2 only forwarding instance which acts as
+      a point to point connection between two endpoints";
+  }
+
+  identity L2L3 {
+    base NETWORK_INSTANCE_TYPE;
+    description
+      "A private Layer 2 and Layer 2 forwarding instance";
+  }
+
+  identity ENDPOINT_TYPE {
+    description
+      "Specification of the type of endpoint that is being associated
+      with a network instance";
+  }
+
+  identity LOCAL {
+    base ENDPOINT_TYPE;
+    description
+      "A local interface which is being associated with the endpoint";
+  }
+
+  identity REMOTE {
+    base ENDPOINT_TYPE;
+    description
+      "A remote interface which is being associated with the
+      endpoint";
+  }
+
+  identity LABEL_ALLOCATION_MODE {
+    description
+      "Base identity to be used to express types of label allocation
+      strategies to be used within a network instance";
+  }
+
+  identity PER_PREFIX {
+    base LABEL_ALLOCATION_MODE;
+    description
+      "A label is to be allocated per prefix entry in the RIB for the
+      network instance";
+  }
+
+  identity PER_NEXTHOP {
+    base LABEL_ALLOCATION_MODE;
+    description
+      "A label is to be allocated per nexthop entry in the RIB for
+      the network instance";
+  }
+
+  identity INSTANCE_LABEL {
+    base LABEL_ALLOCATION_MODE;
+    description
+      "A single label is to be used for the instance";
+  }
+
+  identity ENCAPSULATION {
+    description
+      "On the wire encapsulations that can be used when
+      differentiating network instances";
+  }
+
+  identity MPLS {
+    base ENCAPSULATION;
+    description
+      "Use MPLS labels to distinguish network instances on the wire";
+  }
+
+  identity VXLAN {
+    base ENCAPSULATION;
+    description
+      "Use VXLAN (RFC7348) VNIs to distinguish network instances on
+      the wire";
+  }
+
+  identity SIGNALLING_PROTOCOL {
+    description
+      "The signalling protocol that should be used to diseminate
+      entries within a forwarding instance";
+  }
+
+  identity LDP {
+    base SIGNALLING_PROTOCOL;
+    description
+      "Use LDP-based setup for signalling. Where the instance is
+      a point-to-point service this refers to RFC4447 ('Martini')
+      setup. Where the service is an L2VSI, or L2L3 instance it
+      refers to RFC4762 LDP-signalled VPLS instances";
+  }
+
+  identity BGP_VPLS {
+    base SIGNALLING_PROTOCOL;
+    description
+      "Use BGP-based signalling and autodiscovery for VPLS instances
+      as per RFC4761";
+  }
+
+  identity BGP_EVPN {
+    base SIGNALLING_PROTOCOL;
+    description
+      "Use BGP-based Ethernet VPN (RFC7432) based signalling for
+      the network instance";
+  }
+
+  // rjs note:
+  // this should move to openconfig-types when merged
+  typedef route-distinguisher {
+    type union {
+      // type 0: <2-byte administrator>:<4-byte assigned number>
+      type string {
+        pattern '^(65[0-5][0-3][0-5]|[1-5][1-5][0-9][0-9][0-9]|'
+                + '[1-9]?[1-9]?[0-9][0-9]|[1-9]):'
+                + '(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-5]|'
+                + '[0-3][0-9]{9}|[1-9][0-9]{1,8}|[1-9])$';
+      }
+      // type 1: <ip-address>:<2-byte assigned number>
+      type string {
+        pattern
+          '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+          +  '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]):'
+          +  '(65[0-5][0-3][0-5]|[1-5][1-5][0-9][0-9][0-9]|'
+          +  '[1-9]?[1-9]?[0-9][0-9]|[1-9])$';
+      }
+      // type 2: <4-byte as-number>:<2-byte assigned number>
+      type string {
+        pattern
+          '^(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-5]|'
+          + '[0-3][0-9]{9}|[1-9][0-9]{1,8}|[1-9]):'
+          + '(65[0-5][0-3][0-5]|[1-5]{2}[0-9]{3}|'
+          + '[1-9]{0,2}[0-9][0-9]|[1-9])$';
+      }
+    }
+    description "A route distinguisher value";
+    reference "RFC4364";
+  }
+}
diff --git a/models/openconfig/src/main/yang/network-instance/openconfig-network-instance.yang b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance.yang
new file mode 100644
index 0000000..e857c95
--- /dev/null
+++ b/models/openconfig/src/main/yang/network-instance/openconfig-network-instance.yang
@@ -0,0 +1,1016 @@
+module openconfig-network-instance {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/network-instance";
+
+  prefix "oc-netinst";
+
+  // import some basic types
+  //import ietf-inet-types { prefix inet; }
+  import ietf-yang-types { prefix "yang"; }
+  import ietf-inet-types { prefix "inet"; }
+  import openconfig-network-instance-types { prefix "oc-ni-types"; }
+  import openconfig-policy-types { prefix "oc-pol-types"; }
+  import openconfig-routing-policy { prefix "oc-rpol"; }
+  import openconfig-local-routing { prefix "oc-loc-rt"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-network-instance-l3 { prefix "oc-ni-l3"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-bgp { prefix "oc-bgp"; }
+  import openconfig-mpls { prefix "oc-mpls"; }
+  import openconfig-vlan { prefix "oc-vlan"; }
+  import openconfig-ospfv2 { prefix "oc-ospfv2"; }
+  import openconfig-policy-forwarding { prefix "oc-pf"; }
+  import openconfig-segment-routing { prefix "oc-sr"; }
+  import openconfig-isis { prefix "oc-isis"; }
+  import openconfig-aft { prefix "oc-aft"; }
+
+  // include submodules
+  include openconfig-network-instance-l2;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "An OpenConfig description of a network-instance. This may be
+    a Layer 3 forwarding construct such as a virtual routing and
+    forwarding (VRF) instance, or a Layer 2 instance such as a
+    virtual switch instance (VSI). Mixed Layer 2 and Layer 3
+    instances are also supported.";
+
+  oc-ext:openconfig-version "0.8.0";
+
+  revision "2017-02-28" {
+    description
+      "Add OSPFv2 to network instance";
+    reference "0.8.0";
+  }
+
+  revision "2017-01-26" {
+    description
+      "Add policy forwarding to network instance";
+    reference "0.7.0";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Add AFT to the network instance";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Add segment routing to network instance";
+    reference "0.5.0";
+  }
+
+  revision "2016-11-10" {
+    description
+      "Add IS-IS to OpenConfig network instance";
+    reference "0.4.1";
+  }
+
+  revision "2016-10-12" {
+    description
+      "Update table connections";
+    reference "0.4.0";
+  }
+
+  revision "2016-09-28" {
+    description
+      "Change L2 instance to submodule; add MAC table";
+    reference "0.3.0";
+  }
+
+  revision "2016-08-11" {
+    description
+      "Resolve repeated container names in routing protocols";
+    reference "0.2.3";
+  }
+
+  revision "2016-07-08" {
+    description
+      "Updated with refactored routing protocol models";
+    reference "0.2.1";
+  }
+
+  revision "2016-03-29" {
+    description
+      "Initial revision";
+    reference "0.2.0";
+  }
+
+  revision "2015-10-18" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  grouping network-instance-top {
+    description
+      "Top-level grouping containing a list of network instances.";
+
+    container network-instances {
+      description
+        "The L2, L3, or L2+L3 forwarding instances that are
+        configured on the local system";
+
+      list network-instance {
+        key "name";
+
+        description
+          "Network instances configured on the local system";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "A unique name identifying the network instance";
+        }
+
+        uses l2ni-instance {
+            when "../type = 'L2VSI' or ../type = 'L2P2P'" +
+                 " or ../type = 'L2L3' or ../type = 'DEFAULT_INSTANCE'" {
+                    description
+                      "Layer 2 configuration parameters included when
+                      a network instance is a Layer 2 instance or a
+                      combined L2L3 instance";
+            }
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to a network
+            instance";
+          uses network-instance-config;
+          uses network-instance-type-dependent-config;
+        }
+
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to a network
+            instance";
+          uses network-instance-config;
+          uses network-instance-type-dependent-config;
+          uses network-instance-state;
+        }
+
+        container encapsulation {
+          when "../config/type != 'DEFAULT_INSTANCE'" {
+            description
+              "Only allow the encapsulation of the instance to be
+              set when the instance is not the default instance";
+          }
+          description
+            "Configuration parameters relating to the encapsulation
+            used for the network instance";
+
+          container config {
+            description
+              "Configuration parameters relating to the encapsulation
+              of the network instance";
+
+            uses encapsulation-config;
+
+            uses l2ni-encapsulation-config {
+              when "../../../type = 'L2VSI' or ../../../type = 'L2P2P'
+                      or ../../../type = 'L2L3'" {
+                        description
+                          "Only allow L2 encapsulations to be set
+                          when the instance is of a type that supports
+                          L2";
+              }
+            }
+          }
+
+          container state {
+            config false;
+            description
+              "State parameters relating to the encapsulation of
+              the network instance";
+            uses encapsulation-config;
+
+            uses l2ni-encapsulation-config {
+              when "../../../type = 'L2VSI' or ../../../type = 'L2P2P'
+                      or ../../../type = 'L2L3'" {
+                        description
+                          "Only allow L2 encapsulations to be set
+                          when the instance is of a type that supports
+                          L2";
+              }
+            }
+          }
+        }
+
+        container inter-instance-policies {
+          description
+            "Policies dictating how RIB or FIB entries are imported
+            to and exported from this instance";
+
+          uses oc-rpol:apply-policy-group;
+        }
+
+        container table-connections {
+          description
+            "Policies dictating how RIB or FIB entries are propagated
+            between tables";
+
+          list table-connection {
+            key "src-protocol dst-protocol address-family";
+
+            description
+              "A list of connections between pairs of routing or
+              forwarding tables, the leaking of entries between
+              which is specified by the import policy.
+
+              A connection connecting a source table to a destination
+              table implies that routes that match the policy specified
+              for the connection are available for the destination
+              protocol to advertise, or match within its policies.";
+
+            leaf src-protocol {
+              type leafref {
+                path "../config/src-protocol";
+              }
+              description
+                "The name of the protocol associated with the table
+                which should be utilised as the source of forwarding
+                or routing information";
+            }
+
+            leaf dst-protocol {
+              type leafref {
+                path "../config/dst-protocol";
+              }
+              description
+                "The table to which routing entries should be
+                exported";
+            }
+
+            leaf address-family {
+              type leafref {
+                path "../config/address-family";
+              }
+              description
+                "The address family associated with the connection";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the connection
+                between tables";
+              uses inter-table-policies-config;
+            }
+            container state {
+              config false;
+              description
+                "State parameters relating to the connection between
+                tables";
+              uses inter-table-policies-config;
+            }
+          }
+        }
+
+        container interfaces {
+          description
+            "The interfaces that are associated with this network
+            instance";
+
+          list interface {
+            key "id";
+            unique "config/interface config/subinterface";
+
+            description
+              "An interface associated with the network instance";
+
+            leaf id {
+              type leafref {
+                path "../config/id";
+              }
+              description
+                "A reference to an identifier for this interface which
+                acts as a key for this list";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the associated
+                interface";
+              uses instance-interfaces-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the
+                associated interface";
+
+              uses instance-interfaces-config;
+              uses instance-interfaces-state;
+            }
+          }
+        }
+
+        container tables {
+          description
+            "The routing tables that are managed by this network
+            instance";
+
+          list table {
+            key "protocol address-family";
+
+            description
+              "A network instance manages one or more forwarding or
+              routing tables. These may reflect a Layer 2 forwarding
+              information base, a Layer 3 routing table, or an MPLS
+              LFIB.
+
+              The table populated by a protocol within an instance is
+              identified by the protocol identifier (e.g., BGP, IS-IS)
+              and the address family (e.g., IPv4, IPv6) supported by
+              that protocol. Multiple instances of the same protocol
+              populate a single table -- such that
+              a single IS-IS or OSPF IPv4 table exists per network
+              instance.
+
+              An implementation is expected to create entries within
+              this list when the relevant protocol context is enabled.
+              i.e., when a BGP instance is created with IPv4 and IPv6
+              address families enabled, the protocol=BGP,
+              address-family=IPv4 table is created by the system.";
+
+            leaf protocol {
+              type leafref {
+                path "../config/protocol";
+              }
+              description
+                "A reference to the protocol that populates
+                the table";
+            }
+
+            leaf address-family {
+              type leafref {
+                path "../config/address-family";
+              }
+              description
+                "A reference to the address-family that the
+                table represents";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the
+                table";
+              uses table-config;
+            }
+
+            container state {
+              config false;
+              description
+                "State parameters related to the table";
+              uses table-config;
+            }
+          }
+        }
+
+        container connection-points {
+          description
+            "The set of connection points within a forwarding
+            instance";
+
+          list connection-point {
+            key "connection-point-id";
+
+            description
+              "A connection point within a Layer 2 network instance.
+              Each connection-point consists of a set of interfaces
+              only one of which is active at any one time. Other than
+              the specification of whether an interface is local
+              (i.e., exists within this network-instance), or remote,
+              all configuration and state parameters are common";
+
+            leaf connection-point-id {
+              type leafref {
+                path "../config/connection-point-id";
+              }
+              description
+                "A locally significant reference for the
+                connection-point";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to a Layer 2
+                network instance connection point";
+              uses instance-connection-point-config;
+            }
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to a Layer 2
+                network instance connection point";
+
+              uses instance-connection-point-config;
+              uses instance-connection-point-state;
+            }
+
+            container endpoints {
+              when "../config/type = 'L2P2P' " +
+                 "or ../config/type = 'L2VSI'" {
+                description
+                  "Configuration parameters to associate interfaces
+                   into a common group for use in Layer 2 network
+                   instances";
+              }
+
+              description
+                "The set of endpoints which are grouped within the
+                connection point";
+
+              list endpoint {
+                key "endpoint-id";
+
+                description
+                  "A list of the endpoints (interfaces or remote
+                  connection points that can be used for this
+                  connection point). The active endpoint is selected
+                  based on the precedence that it is configured
+                  with";
+
+                leaf endpoint-id {
+                  type leafref {
+                    path "../config/endpoint-id";
+                  }
+                  description
+                    "A pointer to the configured identifier for the
+                    endpoint";
+                }
+
+                container config {
+                  description
+                    "Configuration parameters relating to the
+                    endpoint";
+                  uses instance-endpoint-config;
+                }
+                container state {
+                  config false;
+                  description
+                    "Operational state parameters relating to the
+                    endpoint";
+                  uses instance-endpoint-config;
+                  uses instance-endpoint-state;
+                }
+
+                container local {
+                  when "../config/type = 'LOCAL'" {
+                    description
+                      "Only include the local configuration when
+                      the endpoint is specified to be local to
+                      the network element";
+                  }
+
+                  description
+                    "Configuration and operational state parameters
+                    relating to a local interface";
+
+                  container config {
+                    description
+                      "Configuration parameters relating to a local
+                      endpoint";
+                    uses instance-endpoint-local-config;
+                  }
+
+                  container state {
+                    config false;
+                    description
+                      "Operational state parameters relating to a
+                      local endpoint";
+                    uses instance-endpoint-local-config;
+                  }
+                }
+
+                container remote {
+                  when "../config/type = 'REMOTE'" {
+                    description
+                      "Only include the remote configuration when
+                      the endpoint is specified to be remote to
+                      the network element";
+                  }
+
+                  description
+                    "Configuration and operational state parameters
+                    relating to a remote interface";
+
+                  container config {
+                    description
+                      "Configuration parameters relating to a remote
+                      endpoint";
+                    uses instance-endpoint-remote-config;
+                  }
+
+                  container state {
+                    config false;
+                    description
+                      "Operational state parameters relating to
+                      a remote endpoint";
+                    uses instance-endpoint-remote-config;
+                  }
+                }
+              }
+            }
+          }
+        }
+
+        uses oc-mpls:mpls-top {
+          when "../config/type = 'DEFAULT'" {
+            description
+              "MPLS configuration is only valid within the default
+              network instance.";
+          }
+        }
+
+        uses oc-sr:sr-top {
+          when "../config/type = 'DEFAULT'" {
+            description
+              "Segment routing configuration is only valid with the default
+              network instance.";
+          }
+        }
+
+        uses oc-vlan:vlan-top;
+
+        uses oc-pf:policy-forwarding-top;
+
+        uses oc-aft:aft-top;
+
+        container protocols {
+          description
+            "The routing protocols that are enabled for this
+            network-instance.";
+
+          list protocol {
+            key "identifier name";
+
+            description
+              "A process (instance) of a routing protocol. Some
+              systems may not support more than one instance of
+              a particular routing protocol";
+
+            leaf identifier {
+              type leafref {
+                path "../config/identifier";
+              }
+              description
+                "The protocol name for the routing or forwarding
+                protocol to be instantiated";
+            }
+
+            leaf name {
+              type leafref {
+                path "../config/name";
+              }
+              description
+                "An operator-assigned identifier for the routing
+                or forwarding protocol. For some processes this
+                leaf may be system defined.";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the routing
+                protocol instance";
+
+              uses protocols-config;
+            }
+
+            container state {
+              config false;
+              description
+                "State parameters relating to the routing protocol
+                instance";
+
+              uses protocols-config;
+              uses protocols-state;
+            }
+
+            uses oc-loc-rt:local-static-top {
+              when "../config/identifier = 'STATIC'" {
+                description
+                  "Include static route parameters only when the
+                  protocol is set to static";
+              }
+              description
+                "Configuration and state parameters relating to
+                static routes";
+            }
+
+            uses oc-loc-rt:local-aggregate-top {
+              when "../config/identifier = 'LOCAL_AGGREGATE'" {
+                description
+                  "Include aggregate route parameters only when the
+                  protocol is set to aggregate";
+              }
+              description
+                "Configuration and state parameters relating to
+                locally generated aggregate routes";
+            }
+
+            uses oc-bgp:bgp-top {
+              when "../config/identifier = 'BGP'" {
+                description
+                  "Include BGP parameters only when the protocol
+                  is of type BGP";
+              }
+              description
+                "Configuration and state parameters relating to
+                Border Gateway Protocol (BGP)";
+            }
+
+            uses oc-ospfv2:ospfv2-top {
+              when "../config/identifier = 'OSPF2'" {
+                description
+                  "Include OSPFv2 parameters only when the protocol
+                  is of type OSPFv2";
+              }
+            }
+
+            uses oc-isis:isis-top {
+              when "../config/identifier = 'ISIS'" {
+                description
+                  "Include IS-IS configuration when the protocol is of type
+                  IS-IS";
+              }
+              description
+                "Configuration and state parameters relating to Intermediate
+                System to Intermediate System (IS-IS).";
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping network-instance-type-dependent-config {
+    description
+      "Type dependent network instance configuration";
+
+    uses oc-ni-l3:l3ni-instance-common-config {
+      when "../type = 'L3VRF' or ../type = 'L2L3'" {
+        description
+          "Layer 3 VRF configuration parameters included when a
+          network instance is a L3VRF or combined L2L3 instance";
+      }
+    }
+
+    uses l2ni-instance-common-config {
+      when "../type = 'L2VSI' or ../type = 'L2P2P'" +
+           " or ../type = 'L2L3'" {
+              description
+                "Layer 2 configuration parameters included when
+                a network instance is a Layer 2 instance or a
+                combined L2L3 instance";
+      }
+    }
+  }
+
+  grouping instance-endpoint-config {
+    description
+      "Configuration data relating to an forwarding-instance
+      endpoint";
+
+    leaf endpoint-id {
+      type string;
+      description
+        "An identifier for the endpoint";
+    }
+
+    leaf precedence {
+      type uint16;
+      description
+        "The precedence of the endpoint - the lowest precendence
+        viable endpoint will be utilised as the active endpoint
+        within a connection";
+    }
+
+    leaf type {
+      type identityref {
+        base "oc-ni-types:ENDPOINT_TYPE";
+      }
+      description
+        "The type of endpoint that is referred to by the current
+        endpoint";
+    }
+
+  }
+
+  grouping instance-endpoint-local-config {
+    description
+      "Configuration parameters relating to an endpoint that is local
+      to the current system";
+
+      uses oc-if:interface-ref-common;
+  }
+
+  grouping instance-endpoint-remote-config {
+    description
+      "Configuration parameters relating to an endpoint that is
+      remote from the local system";
+    leaf remote-system {
+      type inet:ip-address;
+      description
+        "The IP address of the device which hosts the
+        remote end-point";
+    }
+
+    leaf virtual-circuit-identifier {
+      type uint32;
+      description
+        "The virtual-circuit identifier that identifies the
+        connection at the remote end-point";
+    }
+  }
+
+  grouping instance-endpoint-state {
+    description
+      "Operational state data relating to a forwarding-instance
+      endpoint";
+    leaf active {
+      type boolean;
+      description
+        "When the backup endpoint is active, the value of this
+        parameter is set to true";
+    }
+  }
+
+  grouping instance-connection-point-config {
+    description
+      "Configuration data relating to a forwarding-instance
+      connection point";
+
+    leaf connection-point-id {
+      type string;
+      description
+        "An identifier for a connection point";
+    }
+  }
+
+  grouping instance-connection-point-state {
+    description
+      "Operational state data relating to a forwarding-instance
+      connection point";
+  }
+
+  grouping table-config {
+    description
+      "Config parameters relating to an L2/L2.5/L3 table that exists
+      within a network instance";
+
+    leaf protocol {
+      type leafref {
+        path "../../../../protocols/protocol/config/identifier";
+      }
+      description
+        "Reference to the protocol that the table is associated with.";
+    }
+
+    leaf address-family {
+      type identityref {
+        base oc-types:ADDRESS_FAMILY;
+      }
+      description
+        "The address family (IPv4, IPv6) of the table's entries";
+    }
+  }
+
+  grouping instance-interfaces-config {
+    description
+      "Configuration parameters related to an interface associated
+      with the network instance";
+
+    leaf id {
+      type string;
+      description
+        "A unique identifier for this interface - this is expressed
+        as a free-text string";
+    }
+
+    uses oc-if:interface-ref-common;
+
+    leaf-list associated-address-families {
+      type identityref {
+        base oc-types:ADDRESS_FAMILY;
+      }
+      description
+        "The address families on the subinterface which are to be
+        associated with this network instance. When this leaf-list
+        is empty and the network instance requires Layer 3 information
+        the address families for which the network instance is
+        enabled should be imported. If the value of this leaf-list
+        is specified then the association MUST only be made for
+        those address families that are included in the list.";
+    }
+  }
+
+  grouping instance-interfaces-state {
+    description
+      "Operational state parameters relating to an interface
+      associated with this network instance";
+  }
+
+  grouping inter-table-policies-config {
+    description
+      "Configuration entries that relate to how RIB or FIB entries
+      are propagated between tables within the same network
+      instance";
+
+    leaf src-protocol {
+      type leafref {
+        // we are at table-connections/table-connection/config/.
+        path "../../../../tables/table/config/protocol";
+      }
+      description
+        "The source protocol for the table connection";
+    }
+
+    leaf address-family {
+      type leafref {
+        // we are at table-connections/table-connection/config/.
+        path "../../../../tables/" +
+          "table[protocol=current()/../src-protocol]/" +
+          "config/address-family";
+      }
+      description
+        "The address family associated with the connection. This
+        must be defined for the source protocol. The target
+        address family is implicitly defined by the address family
+        specified for the source protocol.";
+    }
+
+    leaf dst-protocol {
+      type leafref {
+        path "../../../../tables/table/config/protocol";
+      }
+      description
+        "The destination protocol for the table connection";
+    }
+
+    uses oc-rpol:apply-policy-import-config;
+  }
+
+  grouping network-instance-config {
+    description
+      "Configuration parameters relating to a top-level network
+      instance";
+
+    leaf name {
+      type string;
+      description
+        "An operator-assigned unique name for the forwarding
+        instance";
+    }
+
+    leaf type {
+      type identityref {
+        base "oc-ni-types:NETWORK_INSTANCE_TYPE";
+      }
+      description
+        "The type of network instance. The value of this leaf
+        indicates the type of forwarding entries that should be
+        supported by this network instance";
+    }
+
+    leaf enabled {
+      type boolean;
+      description
+        "Whether the network instance should be configured to be
+        active on the network element";
+    }
+
+    leaf description {
+      type string;
+      description
+        "A free-form string to be used by the network operator to
+        describe the function of this network instance";
+    }
+
+    leaf router-id {
+      type yang:dotted-quad;
+      description
+        "A identifier for the local network instance - typically
+        used within associated routing protocols or signalling
+        routing information in another network instance";
+    }
+
+    leaf route-distinguisher {
+      type oc-ni-types:route-distinguisher;
+      description
+        "The route distinguisher that should be used for the local
+        VRF or VSI instance when it is signalled via BGP.";
+    }
+  }
+
+  grouping network-instance-state {
+    description
+      "Operational state parameters relating to a network instance";
+  }
+
+  grouping protocols-config {
+    description
+      "Configuration parameters relating to a generic protocol
+      instance within a network instance";
+
+    leaf identifier {
+      type identityref {
+        base "oc-pol-types:INSTALL_PROTOCOL_TYPE";
+      }
+      description
+        "The protocol identifier for the instance";
+    }
+
+    leaf name {
+      type string;
+      description
+        "A unique name for the protocol instance";
+    }
+
+    leaf enabled {
+      type boolean;
+      description
+        "A boolean value indicating whether the local protocol
+        instance is enabled.";
+    }
+
+    leaf default-metric {
+      type uint32;
+      description
+        "The default metric within the RIB for entries that are
+        installed by this protocol instance. This value may
+        be overridden by protocol specific configuration options.
+        The lower the metric specified the more preferable the RIB
+        entry is to be selected for use within the network instance.
+        Where multiple entries have the same metric value then these
+        equal cost paths should be treated according to the specified
+        ECMP path selection behaviour for the instance";
+    }
+  }
+
+  grouping protocols-state {
+    description
+      "Operational state parameters relating to a protocol instance";
+  }
+
+  grouping instance-interface-association-config {
+    description
+      "Grouping containing leaves that are to be augmented into an
+      interface or subinterface to include mapping to a network
+      instance";
+
+    leaf network-instance {
+      type leafref {
+        path "/network-instances/network-instance/name";
+      }
+      description
+        "The network instance that this interface is associated
+        with";
+    }
+  }
+
+  grouping encapsulation-config {
+    description
+      "Type agnostic configuration parameters relating to the
+      encapsulation of the network instance";
+
+    leaf encapsulation-type {
+      type identityref {
+        base oc-ni-types:ENCAPSULATION;
+      }
+      description
+        "The on-the-wire encapsulation that should be used when
+        sending traffic from this network instance";
+    }
+
+    // rjs: This is left here as I suspect that this can
+    // be used in EVPN. Need to validate implementations, otherwise
+    // move to L3. (TODO)
+    leaf label-allocation-mode {
+      type identityref {
+        base oc-ni-types:LABEL_ALLOCATION_MODE;
+      }
+      description
+        "The label allocation mode to be used for L3 entries
+        in the network instance";
+    }
+  }
+
+  uses network-instance-top;
+}
diff --git a/models/openconfig/src/main/yang/openconfig-extensions.yang b/models/openconfig/src/main/yang/openconfig-extensions.yang
new file mode 100644
index 0000000..f39ecf6
--- /dev/null
+++ b/models/openconfig/src/main/yang/openconfig-extensions.yang
@@ -0,0 +1,91 @@
+module openconfig-extensions {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/openconfig-ext";
+
+  prefix "oc-ext";
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module provides extensions to the YANG language to allow
+    OpenConfig specific functionality and meta-data to be defined.";
+
+  revision "2017-04-11" {
+    description
+      "rename password type to 'hashed' and clarify description";
+    reference "0.3.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Added extension for annotating encrypted values.";
+    reference "0.2.0";
+  }
+
+  revision "2015-10-09" {
+    description
+      "Initial OpenConfig public release";
+    reference "0.1.0";
+  }
+
+
+  // extension statements
+  extension openconfig-version {
+    argument "semver" {
+      yin-element false;
+    }
+    description
+      "The OpenConfig version number for the module. This is
+      expressed as a semantic version number of the form:
+        x.y.z
+      where:
+        * x corresponds to the major version,
+        * y corresponds to a minor version,
+        * z corresponds to a patch version.
+      This version corresponds to the model file within which it is
+      defined, and does not cover the whole set of OpenConfig models.
+      Where several modules are used to build up a single block of
+      functionality, the same module version is specified across each
+      file that makes up the module.
+
+      A major version number of 0 indicates that this model is still
+      in development (whether within OpenConfig or with industry
+      partners), and is potentially subject to change.
+
+      Following a release of major version 1, all modules will
+      increment major revision number where backwards incompatible
+      changes to the model are made.
+
+      The minor version is changed when features are added to the
+      model that do not impact current clients use of the model.
+
+      The patch-level version is incremented when non-feature changes
+      (such as bugfixes or clarifications to human-readable
+      descriptions that do not impact model functionality) are made
+      that maintain backwards compatibility.
+
+      The version number is stored in the module meta-data.";
+  }
+
+  extension openconfig-hashed-value {
+    description
+      "This extension provides an annotation on schema nodes to
+      indicate that the corresponding value should be stored and
+      reported in hashed form.
+
+      Hash algorithms are by definition not reversible. Clients
+      reading the configuration or applied configuration for the node
+      should expect to receive only the hashed value. Values written
+      in cleartext will be hashed. This annotation may be used on
+      nodes such as secure passwords in which the device never reports
+      a cleartext value, even if the input is provided as cleartext.";
+  }
+}
diff --git a/models/openconfig/src/main/yang/openflow/openconfig-openflow-types.yang b/models/openconfig/src/main/yang/openflow/openconfig-openflow-types.yang
new file mode 100644
index 0000000..d08676b
--- /dev/null
+++ b/models/openconfig/src/main/yang/openflow/openconfig-openflow-types.yang
@@ -0,0 +1,87 @@
+module openconfig-openflow-types {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/openflow/types";
+
+  prefix "openflow-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines types related to the Openflow configuration
+    and operational state model.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-06-01" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+
+  typedef failure-mode {
+    type enumeration {
+      enum SECURE {
+        description
+          "Packets and messages destined to the controllers are
+          dropped. Flow entries continue to expire according to
+          their timeouts.";
+      }
+      enum STANDALONE {
+        description
+          "Processes all packets using the OFPP_NORMAL reserved
+          port. The switch acts as a legacy Ethernet switch or
+          router.";
+      }
+    }
+    description
+      "Type to define Openflow failure mode.";
+  }
+
+  typedef transport {
+    type enumeration {
+      enum TCP {
+        description
+          "Transmission Control Protocol (TCP).";
+      }
+      enum TLS {
+        description
+          "Transport Layer Security (TLS).";
+      }
+    }
+    description
+      "Type to define Openflow transport protocol.";
+  }
+
+  typedef auxiliary-id {
+    type uint8 {
+      range "0..15";
+    }
+    description
+      "A Controller may have multiple auxiliary connections as
+      specified by the Openflow protocol. The main Controller
+      connection should always have the auxiliary-id set to zero.
+      All other connections must have an auxiliary-id different
+      from 0.";
+  }
+
+  typedef datapath-id {
+    type string {
+      pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){7}$';
+    }
+    description
+        "The datapath-id type represents an OpenFlow
+        datapath identifier. The lower 48-bits are for
+        a MAC address, while the upper 16-bits are
+        implementer-defined.";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/openflow/openconfig-openflow.yang b/models/openconfig/src/main/yang/openflow/openconfig-openflow.yang
new file mode 100644
index 0000000..a7b8489
--- /dev/null
+++ b/models/openconfig/src/main/yang/openflow/openconfig-openflow.yang
@@ -0,0 +1,300 @@
+module openconfig-openflow {
+
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/openflow";
+
+  prefix "openflow";
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-openflow-types { prefix of-types; }
+  import openconfig-system { prefix oc-sys; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data for
+    Openflow.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-06-01" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  grouping openflow-controller-config {
+    description
+      "Openflow controller config";
+
+    leaf name {
+      type string;
+      description "Name of this Openflow controller. All connections
+      for the same controller need to have the same name.";
+    }
+  }
+
+  grouping openflow-controller-state {
+    description
+      "Openflow controller state";
+  }
+
+  grouping openflow-controllers-top {
+    description
+      "Top-level for the Openflow controllers model";
+
+    container controllers {
+      description
+        "Container for the Openflow controllers model";
+
+      list controller {
+        key "name";
+
+        description
+          "The Openflow Switch connects to all Openflow controllers
+          configured";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "The name identifies the controller.";
+        }
+
+        container config {
+          description
+            "Container for the Openflow controller config.";
+
+          uses openflow-controller-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Container for the Openflow controller state.";
+
+          uses openflow-controller-config;
+          uses openflow-controller-state;
+        }
+
+        uses openflow-connections-top;
+      }
+    }
+  }
+
+
+  grouping openflow-connections-config {
+    description
+      "Configuration data for OpenFlow controller connections";
+
+    leaf aux-id {
+      type of-types:auxiliary-id;
+      description
+        "Controller auxiliary ID. Must be 0 for the main controller.
+        One controller may have multiple auxiliary connections as
+        specified by the Openflow protocol. Besides configuring the
+        main controller, it is also possible to configure auxiliary
+        connections. The main controller must have the aux-id
+        set to zero. All others must have an aux-id different
+        from 0.";
+    }
+
+    leaf priority {
+      type uint8;
+      description
+        "Optional value for servicing auxiliary connections with
+        different priorities.";
+    }
+
+    leaf address {
+      type oc-inet:ip-address;
+      description
+        "The IP address of the controller.";
+    }
+
+    leaf port {
+      type oc-inet:port-number;
+      default 6653;
+      description
+        "Controller port to use.";
+    }
+
+    leaf transport {
+      type of-types:transport;
+      default TCP;
+      description
+        "Controller transport protocol used.";
+    }
+
+    leaf source-interface {
+      type oc-if:base-interface-ref;
+      description
+        "Optionally specify the source interface for the
+        controller connection.";
+    }
+  }
+
+  grouping openflow-connections-state {
+    description
+      "Operational state data for OpenFlow controller connections";
+
+    leaf connected {
+      type boolean;
+      description
+        "When set to true, indicates the connection between the
+        switch and controller is established.";
+    }
+  }
+
+  grouping openflow-connections-top {
+    description
+      "Top-level grouping for OpenFlow controller connections";
+
+    container connections {
+      description
+        "Enclosing container for list of controller connections";
+
+      list connection {
+        key "aux-id";
+        description
+          "List of connections to the OpenFlow controller.
+          The Openflow switch always connects to configured Openflow
+          controllers. Each controller can have more than one
+          connection, called auxiliary Openflow connections.";
+
+        leaf aux-id {
+          type leafref {
+            path "../config/aux-id";
+          }
+          description
+            "Reference to auxiliary id list key";
+        }
+
+        container config {
+          description
+            "Configuration data for OpenFlow controller connections";
+
+          uses openflow-connections-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for OpenFlow controller
+            connections";
+
+          uses openflow-connections-config;
+          uses openflow-connections-state;
+        }
+      }
+    }
+  }
+
+
+  grouping openflow-agent-config {
+    description
+      "Openflow agent config";
+ 
+    leaf datapath-id {
+      type of-types:datapath-id;
+      description
+        "Datapath unique ID. The lower 48-bits are for
+        a MAC address, while the upper 16-bits are
+        implementer-defined.";
+    }
+
+    leaf failure-mode {
+      type of-types:failure-mode;
+      description
+        "Failure mode for Openflow.";
+    }
+
+    leaf backoff-interval {
+      type uint32;
+      units seconds;
+      description
+        "Openflow agent connection backoff interval.";
+    }
+
+    leaf max-backoff {
+      type uint32;
+      units seconds;
+      description
+        "Openflow agent max backoff time.";
+    }
+
+    leaf inactivity-probe {
+      type uint32;
+      units seconds;
+      description
+        "Openflow agent inactivity probe period.";
+    }
+  }
+
+  grouping openflow-agent-state {
+    description
+      "Openflow agent state";
+  }
+
+  grouping openflow-agent-top {
+    description
+      "Top-level for the Openflow agent model";
+
+    container agent {
+      description
+        "Container for the Openflow agent model.";
+
+      container config {
+        description
+          "Container for the Openflow agent config.";
+
+        uses openflow-agent-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Container for the Openflow agent state.";
+
+        uses openflow-agent-config;
+        uses openflow-agent-state;
+      }
+    }
+  }
+
+
+  grouping openflow-top {
+    description
+      "Top-level for the Openflow model";
+
+    container openflow {
+      description
+        "Container for Openflow model";
+
+
+      uses openflow-controllers-top;
+      uses openflow-agent-top;
+    }
+  }
+
+
+  augment "/oc-sys:system" {
+    description
+      "Adding OpenConfig data to the system model";
+
+    uses openflow-top;
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-channel-monitor.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-channel-monitor.yang
new file mode 100644
index 0000000..f745005
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-channel-monitor.yang
@@ -0,0 +1,324 @@
+module openconfig-channel-monitor {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/channel-monitor";
+
+  prefix "oc-chan-monitor";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+      www.openconfig.net";
+
+  description
+    "This model describes operational state data for an optical
+    channel monitor (OCM) for optical transport line system
+    elements such as wavelength routers (ROADMs) and amplifiers.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Support multiple OCMs, add refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-09-14" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+
+
+  // grouping statements
+
+  grouping media-channel-port-config {
+    description
+      "Configuration data for a media channel source/dest port";
+
+    leaf port-name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the corresponding node interface";
+    }
+  }
+
+  grouping media-channel-port-state {
+    description
+      "Operational state data for a media channel source/dest port";
+  }
+
+  grouping media-channel-source-port-top {
+    description
+      "Top-level grouping for source of the media channel";
+
+    container source {
+      description
+        "Top-level container for media channel source";
+
+      container config {
+        description
+          "Configuration data for the media channel source";
+
+        uses media-channel-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the media channel source";
+
+        uses media-channel-port-config;
+        uses media-channel-port-state;
+      }
+    }
+  }
+
+  grouping media-channel-dest-port-top {
+    description
+      "Top-level grouping for destination of the media channel";
+
+    container dest {
+      description
+        "Top-level container for media channel destination";
+
+      container config {
+        description
+          "Configuration data for the media channel destination";
+
+        uses media-channel-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the media channel destination";
+
+        uses media-channel-port-config;
+        uses media-channel-port-state;
+      }
+    }
+  }
+
+  grouping media-channel-psd-state {
+    description
+      "Operational state data for the media channel PSD";
+
+    leaf lower-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "Lower frequency of the specified PSD";
+    }
+
+    leaf upper-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "Upper frequency of the specified PSD";
+    }
+
+    leaf psd {
+      type oc-types:ieeefloat32;
+      units "nW/MHz";
+      description
+        "Power spectral density expressed in nanowatts per
+        megahertz, nW/MHz.  These units allow the value to often
+        be greater than 1.0.  It also avoids dealing with zero values
+        for 0dBm.  For example, a 40GHz wide channel
+        with 0dBm power would be:
+          0dBm = 1mW = 10^6nW
+          40GHz = 40,000MHz
+          0dBm/40GHz = 10^6nW/40,000MHz = 1000/40 = 25";
+    }
+  }
+
+
+  grouping media-channel-psd-top {
+    description
+      "Top-level grouping ";
+
+    container channels {
+      description
+        "Enclosing container for the list of values describing
+        the power spectral density distribution";
+
+      list channel {
+        key "lower-frequency upper-frequency";
+        config false;
+        description
+          "List of tuples describing the PSD distribution";
+
+        leaf lower-frequency {
+          type leafref {
+            path "../state/lower-frequency";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        leaf upper-frequency {
+          type leafref {
+            path "../state/upper-frequency";
+          }
+          description
+            "Reference to the list key";
+        }
+
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for PSD";
+
+          uses media-channel-psd-state;
+        }
+      }
+    }
+  }
+
+  grouping media-channel-config {
+    description
+      "Configuration data for media channel definitions";
+
+    leaf index {
+      type uint32;
+      description
+        "Identifier for the defined media channel";
+    }
+
+    leaf lower-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "The lower frequency for the spectrum defined by this media
+        channel";
+    }
+
+    leaf upper-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "The upper frequency for the spectrum defined by this media
+        channel";
+    }
+
+  }
+
+  grouping channel-monitor-config {
+    description
+      "Configuration data for the optical channel monitor";
+
+    leaf name {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to system-supplied name of the port on the
+        optical channel monitor (OCM). If this port is embedded
+        in another card (i.e. an amplifier card) the device
+        should still define a port representing the OCM even if
+        it is internal and not physically present on the
+        faceplate of the card";
+    }
+
+    leaf monitor-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to system-supplied name of the port that the
+        channel monitor is physically connected to. This port
+        will be of type MONITOR. This port is a tap off of the
+        monitored-port and would be in the same card as the
+        monitored port. If this port is embedded in another card
+        (i.e. an amplifier card) the device should still define
+        a port representing the monitor port if it is internal
+        and not physically present on the faceplate of the card";
+    }
+  }
+
+  grouping channel-monitor-state {
+    description
+      "Operational state data ";
+  }
+
+  grouping channel-monitor-top {
+    description
+      "Top-level grouping ";
+
+    container channel-monitors {
+      description
+        "Top-level container for optical channel monitors";
+
+      list channel-monitor {
+        key "name";
+        description
+          "List of channel monitors, keyed by channel monitor name.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "References the optical channel monitor name";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses channel-monitor-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses channel-monitor-config;
+          uses channel-monitor-state;
+        }
+
+        uses media-channel-psd-top;
+      }
+    }
+  }
+
+  // data definition statements
+
+  uses channel-monitor-top;
+
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-optical-amplifier.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-optical-amplifier.yang
new file mode 100644
index 0000000..02b668c
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-optical-amplifier.yang
@@ -0,0 +1,403 @@
+module openconfig-optical-amplifier {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/optical-amplfier";
+
+  prefix "oc-opt-amp";
+
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-transport-line-common { prefix oc-line-com; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This model describes configuration and operational state data
+    for optical amplifiers, deployed as part of a transport
+    line system.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Add monitor port type and refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-03-31" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity OPTICAL_AMPLIFIER_TYPE {
+    description
+      "Type definition for different types of optical amplifiers";
+  }
+
+  identity EDFA {
+    base OPTICAL_AMPLIFIER_TYPE;
+    description
+      "Erbium doped fiber amplifer (EDFA)";
+  }
+
+  identity FORWARD_RAMAN {
+    base OPTICAL_AMPLIFIER_TYPE;
+    description
+      "Forward pumping Raman amplifier";
+  }
+
+  identity BACKWARD_RAMAN {
+    base OPTICAL_AMPLIFIER_TYPE;
+    description
+      "Backward pumping Raman amplifier";
+  }
+
+  identity HYBRID {
+    base OPTICAL_AMPLIFIER_TYPE;
+    description
+      "Hybrid backward pumping Raman + EDFA amplifier";
+  }
+
+  identity GAIN_RANGE {
+    description
+      "Base type for expressing the gain range for a switched gain
+      amplifier.  The gain range is expressed as a generic setting,
+      e.g., LOW/MID/HIGH. The actual db range will be determined
+      by the implementation.";
+  }
+
+  identity LOW_GAIN_RANGE {
+    base GAIN_RANGE;
+    description
+      "LOW gain range setting";
+  }
+
+  identity MID_GAIN_RANGE {
+    base GAIN_RANGE;
+    description
+      "MID gain range setting";
+  }
+
+  identity HIGH_GAIN_RANGE {
+    base GAIN_RANGE;
+    description
+      "HIGH gain range setting";
+  }
+
+  identity FIXED_GAIN_RANGE {
+    base GAIN_RANGE;
+    description
+      "Fixed or non-switched gain amplfier";
+  }
+
+  identity OPTICAL_AMPLIFIER_MODE {
+    description
+      "Type definition for different types of optical amplifier
+      operating modes";
+  }
+
+  identity CONSTANT_POWER {
+      base OPTICAL_AMPLIFIER_MODE;
+      description
+        "Constant power mode";
+  }
+
+  identity CONSTANT_GAIN {
+      base OPTICAL_AMPLIFIER_MODE;
+      description
+        "Constant gain mode";
+  }
+
+
+  // grouping statements
+
+  grouping optical-amplifier-config {
+    description
+      "Configuration data for optical amplifiers";
+
+    leaf name {
+      type string;
+      description
+        "User-defined name assigned to identify a specific amplifier
+        in the device";
+    }
+
+    leaf type {
+      type identityref {
+        base OPTICAL_AMPLIFIER_TYPE;
+      }
+      description
+        "Type of the amplifier";
+    }
+
+    leaf target-gain {
+      type decimal64 {
+        fraction-digits 2;
+        range 0..max;
+      }
+      units dB;
+      description
+        "Positive gain applied by the amplifier.";
+    }
+
+    leaf target-gain-tilt {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "Gain tilt control";
+    }
+
+    leaf gain-range {
+      type identityref {
+        base GAIN_RANGE;
+      }
+      description
+        "Selected gain range.  The gain range is a platform-defined
+        value indicating the switched gain amplifier setting";
+    }
+
+    leaf amp-mode {
+      type identityref {
+        base OPTICAL_AMPLIFIER_MODE;
+      }
+      description
+        "The operating mode of the amplifier";
+    }
+
+    leaf target-output-power {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "Output optical power of the amplifier.";
+    }
+
+    leaf enabled {
+      type boolean;
+      description
+        "Turns power on / off to the amplifiers gain module.";
+    }
+
+  }
+
+  grouping optical-amplifier-state {
+    description
+      "Operational state data for optical amplifiers";
+
+    leaf ingress-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to system-supplied name of the amplifier ingress
+        port. This leaf is only valid for ports of type INGRESS.";
+    }
+
+    leaf egress-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to system-supplied name of the amplifier egress
+        port. This leaf is only valid for ports of type EGRESS.";
+    }
+
+    container actual-gain {
+      description
+        "The actual gain applied by the amplifier in units of
+        0.01dB. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dB;
+    }
+
+    container actual-gain-tilt {
+      description
+        "The actual tilt applied by the amplifier in units of
+        0.01dB. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dB;
+    }
+
+    container input-power-total {
+      description
+        "The total input optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container input-power-c-band {
+      description
+        "The C band (consisting of approximately 191 to 195 THz or
+        1530nm to 1565 nm) input optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container input-power-l-band {
+      description
+        "The L band (consisting of approximately 184 to 191 THz or
+        1565 to 1625 nm) input optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container output-power-total {
+      description
+        "The total output optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container output-power-c-band {
+      description
+        "The C band (consisting of approximately 191 to 195 THz or
+        1530nm to 1565 nm)output optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container output-power-l-band {
+      description
+        "The L band (consisting of approximately 184 to 191 THz or
+        1565 to 1625 nm)output optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container laser-bias-current {
+      description
+        "The current applied by the system to the transmit laser to
+        achieve the output power. The current is expressed in mA
+        with up to two decimal precision. If avg/min/max statistics
+        are not supported, just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-mA;
+    }
+
+    container optical-return-loss {
+      description
+        "The optical return loss (ORL) is the ratio of the light
+        reflected back into the port to the light launched out of
+        the port. ORL is in units of 0.01dBm. If avg/min/max
+        statistics are not supported, just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping optical-amplifier-top {
+    description
+      "Top-level grouping for optical amplifier data";
+
+    container optical-amplifier {
+      description
+        "Enclosing container for amplifiers and supervisory channels";
+
+      container amplifiers {
+        description
+          "Enclosing container for list of amplifiers";
+
+        list amplifier {
+          key "name";
+          description
+            "List of optical amplifiers present in the device";
+
+          leaf name {
+            type leafref {
+              path "../config/name";
+            }
+            description
+              "Reference to the name of the amplifier";
+          }
+
+          container config {
+            description
+              "Configuration data for the amplifier";
+
+            uses optical-amplifier-config;
+          }
+
+          container state {
+
+            config false;
+
+            description
+              "Operational state data for the amplifier";
+
+            uses optical-amplifier-config;
+            uses optical-amplifier-state;
+          }
+        }
+      }
+
+      container supervisory-channels {
+        description
+          "Enclosing container for list of supervisory channels";
+
+        list supervisory-channel {
+          key "interface";
+          description
+            "List of supervisory channels";
+
+          leaf interface {
+            type leafref {
+              path "../config/interface";
+            }
+            description
+              "Reference to the interface of the supervisory channel";
+          }
+
+          uses oc-line-com:optical-osc-top;
+        }
+      }
+    }
+  }
+
+  // data definition statements
+
+  uses optical-amplifier-top;
+
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-terminal-device.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-terminal-device.yang
new file mode 100644
index 0000000..0319a6c
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-terminal-device.yang
@@ -0,0 +1,1141 @@
+module openconfig-terminal-device {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/terminal-device";
+
+  prefix "oc-opt-term";
+
+  import openconfig-types { prefix oc-types; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-platform-transceiver { prefix oc-transceiver; }
+  import openconfig-extensions { prefix oc-ext; }
+  import ietf-yang-types { prefix yang; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module describes a terminal optics device model for
+    managing the terminal systems (client and line side) in a
+    DWDM transport network.
+
+    Elements of the model:
+
+    physical port: corresponds to a physical, pluggable client
+    port on the terminal device. Examples includes 10G, 40G, 100G
+    (e.g., 10x10G, 4x25G or 1x100G) and 400G/1T in the future.
+    Physical client ports will have associated operational state or
+    PMs.
+
+    physical channel: a physical lane or channel in the
+    physical client port.  Each physical client port has 1 or more
+    channels. An example is 100GBASE-LR4 client physical port having
+    4x25G channels. Channels have their own optical PMs and can be
+    monitored independently within a client physical port (e.g.,
+    channel power).  Physical client channels are defined in the
+    model as part of a physical client port, and are modeled
+    primarily for reading their PMs.
+
+    logical channel: a logical grouping of logical grooming elements
+    that may be assigned to subsequent grooming stages for
+    multiplexing / de-multiplexing, or to an optical channel for
+    line side transmission.  The logical channels can represent, for
+    example, an ODU/OTU logical packing of the client
+    data onto the line side.  Tributaries are similarly logical
+    groupings of demand that can be represented in this structure and
+    assigned to an optical channel.  Note that different types of
+    logical channels may be present, each with their corresponding
+    PMs.
+
+    optical channel:  corresponds to an optical carrier and is
+    assigned a wavelength/frequency.  Optical channels have PMs
+    such as power, BER, and operational mode.
+
+    Directionality:
+
+    To maintain simplicity in the model, the configuration is
+    described from client-to-line direction.  The assumption is that
+    equivalent reverse configuration is implicit, resulting in
+    the same line-to-client configuration.
+
+    Physical layout:
+
+    The model does not assume a particular physical layout of client
+    and line ports on the terminal device (e.g., such as number of
+    ports per linecard, separate linecards for client and line ports,
+    etc.).";
+
+  oc-ext:openconfig-version "1.0.0";
+
+  revision "2017-07-08" {
+    description
+      "Adds test-signal";
+    reference "1.0.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes and additions to terminal optics model";
+    reference "0.4.0";
+  }
+
+
+  grouping terminal-input-optical-power {
+    description
+      "Reusable leaves related to input optical power";
+
+    leaf input-power {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The input optical power of this port in units of 0.01dBm.
+        If the port is an aggregate of multiple physical channels,
+        this attribute is the total power or sum of all channels.";
+    }
+  }
+
+  grouping terminal-ethernet-protocol-config {
+    description
+      "Configuration data for logical channels with Ethernet
+      framing";
+
+    //TODO:currently a empty container
+  }
+
+  grouping terminal-ethernet-protocol-state {
+    description
+      "Ethernet-specific counters when logical channel
+      is using Ethernet protocol framing, e.g., 10GE, 100GE";
+
+      uses oc-eth:ethernet-interface-state-counters;
+  }
+
+  grouping terminal-ethernet-protocol-top {
+    description
+      "Top-level grouping for data related to Ethernet protocol
+      framing on logical channels";
+
+    container ethernet {
+      description
+        "Top level container for data related to Ethernet framing
+        for the logical channel";
+
+      container config {
+        description
+          "Configuration data for Ethernet protocol framing on
+          logical channels";
+
+        uses terminal-ethernet-protocol-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state data for Ethernet protocol framing
+          on logical channels";
+
+        uses terminal-ethernet-protocol-state;
+      }
+    }
+  }
+
+  grouping terminal-otn-protocol-config {
+    description
+      "OTU configuration when logical channel
+      framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";
+
+    leaf tti-msg-transmit {
+      type string;
+      description
+        "Trail trace identifier (TTI) message transmitted";
+    }
+
+    leaf tti-msg-expected {
+      type string;
+      description
+        "Trail trace identifier (TTI) message expected";
+    }
+
+    leaf tti-msg-auto {
+      type boolean;
+      description
+        "Trail trace identifier (TTI) transmit message automatically
+        created.  If true, then setting a custom transmit message
+        would be invalid.";
+    }
+  }
+
+  grouping terminal-otn-protocol-counter-stats {
+    description
+      "Counter based statistics containers for logical channels
+      using OTN framing";
+
+    leaf errored-seconds {
+      type yang:counter64;
+      description
+        "The number of seconds that at least one errored blocks
+        occurs, at least one code violation occurs, loss of sync is
+        detected or loss of signal is detected";
+    }
+
+    leaf severely-errored-seconds {
+      type yang:counter64;
+      description
+        "The number of seconds that loss of frame is detected OR
+        the number of errored blocks, code violations, loss of sync
+        or loss of signal is detected exceeds a predefined
+        threshold";
+    }
+
+    leaf unavailable-seconds {
+      type yang:counter64;
+      description
+        "The number of seconds during which the link is unavailable";
+    }
+
+    leaf code-violations {
+      type yang:counter64;
+      description
+        "For ethernet or fiberchannel links, the number of 8b/10b
+        coding violations. For SONET/SDH, the number of BIP (bit
+        interleaved parity) errors";
+    }
+
+    leaf fec-uncorrectable-words {
+      type yang:counter64;
+      description
+        "The number words that were uncorrectable by the FEC";
+    }
+
+    leaf fec-corrected-bytes {
+      type yang:counter64;
+      description
+        "The number of bytes that were corrected by the FEC";
+    }
+
+    leaf fec-corrected-bits {
+      type yang:counter64;
+      description
+        "The number of bits that were corrected by the FEC";
+    }
+
+    leaf background-block-errors {
+      type yang:counter64;
+      description
+        "The number of background block errors";
+    }
+  }
+
+  grouping terminal-otn-protocol-multi-stats {
+    description
+      "Multi-value statistics containers for logical channels using
+      OTN framing (e.g., max, min, avg, instant)";
+
+    container pre-fec-ber {
+      description
+        "Bit error rate before forward error correction -- computed
+        value with 18 decimal precision. Note that decimal64
+        supports values as small as i x 10^-18 where i is an
+        integer. Values smaller than this should be reported as 0
+        to inidicate error free or near error free performance.
+        Values include the instantaneous, average, minimum, and
+        maximum statistics. If avg/min/max statistics are not
+        supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
+    }
+
+    container post-fec-ber {
+      description
+        "Bit error rate after forward error correction -- computed
+        value with 18 decimal precision. Note that decimal64
+        supports values as small as i x 10^-18 where i is an
+        integer. Values smaller than this should be reported as 0
+        to inidicate error free or near error free performance.
+        Values include the instantaneous, average, minimum, and
+        maximum statistics. If avg/min/max statistics are not
+        supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-opt-types:avg-min-max-instant-stats-precision18-ber;
+    }
+
+    container q-value {
+      description
+        "Quality value (factor) in dB of a channel with two
+        decimal precision. Values include the instantaneous,
+        average, minimum, and maximum statistics. If avg/min/max
+        statistics are not supported, the target is expected
+        to just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dB;
+    }
+
+    container esnr {
+      description
+        "Electrical signal to noise ratio. Baud rate
+        normalized signal to noise ratio based on
+        error vector magnitude in dB with two decimal
+        precision. Values include the instantaneous, average,
+        minimum, and maximum statistics. If avg/min/max
+        statistics are not supported, the target is expected
+        to just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dB;
+    }
+  }
+
+  grouping terminal-otn-protocol-state {
+    description
+      "OTU operational state when logical channel
+      framing is using an OTU protocol, e.g., OTU1, OTU3, etc.";
+
+
+      leaf tti-msg-recv {
+        type string;
+        description
+          "Trail trace identifier (TTI) message received";
+      }
+
+      leaf rdi-msg {
+        type string;
+        description
+          "Remote defect indication (RDI) message received";
+      }
+      uses terminal-otn-protocol-counter-stats;
+      uses terminal-otn-protocol-multi-stats;
+  }
+
+  grouping terminal-otn-protocol-top {
+    description
+      "Top-level grouping for data related to OTN protocol framing";
+
+    container otn {
+      description
+        "Top level container for OTU configuration when logical
+        channel framing is using an OTU protocol, e.g., OTU1, OTU3,
+        etc.";
+
+      container config {
+        description
+          "Configuration data for OTN protocol framing";
+
+        uses terminal-otn-protocol-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for OTN protocol PMs, statistics,
+          etc.";
+
+        uses terminal-otn-protocol-config;
+        uses terminal-otn-protocol-state;
+      }
+    }
+  }
+
+  grouping terminal-client-port-assignment-config {
+    description
+      "Configuration data for assigning physical client ports to
+      logical channels";
+
+    leaf index {
+      type uint32;
+      description
+        "Index of the client port assignment";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Descriptive name for the client port-to-logical channel
+        mapping";
+    }
+
+    leaf logical-channel {
+      type leafref {
+        path "/oc-opt-term:terminal-device/oc-opt-term:logical-channels" +
+          "/oc-opt-term:channel/oc-opt-term:index";
+      }
+      description
+        "Reference to the logical channel for this
+        assignment";
+    }
+
+    leaf allocation {
+      type decimal64 {
+        fraction-digits 3;
+      }
+      units Gbps;
+      description
+        "Allocation of the client physical port to the assigned
+        logical channel expressed in Gbps.  In most cases,
+        the full client physical port rate is assigned to a single
+        logical channel.";
+    }
+
+  }
+
+  grouping terminal-client-port-assignment-state {
+    description
+      "Operational state data for assigning physical client ports
+      to logical channels";
+  }
+
+  grouping terminal-client-port-assignment-top {
+    description
+      "Top-level grouping for the assigment of client physical ports
+      to logical channels";
+    //TODO: this grouping could be removed, instead reusing a common
+    //grouping for logical client assignment pointers
+
+    container logical-channel-assignments {
+      description
+        "Enclosing container for client port to logical client
+        mappings";
+
+      list assignment {
+        key "index";
+        description
+          "List of assignments to logical clients";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Reference to the index of this logical client
+            assignment";
+        }
+
+        container config {
+          description
+            "Configuration data for the logical client assignment";
+
+          uses terminal-client-port-assignment-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for the logical client
+            assignment";
+
+          uses terminal-client-port-assignment-config;
+          uses terminal-client-port-assignment-state;
+        }
+      }
+    }
+  }
+
+
+  grouping terminal-logical-chan-assignment-config {
+    description
+      "Configuration data for assigning client logical channels
+      to line-side tributaries";
+
+    leaf index {
+      type uint32;
+      description
+        "Index of the current logical client channel to tributary
+        mapping";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Name assigned to the logical client channel";
+    }
+
+    leaf assignment-type {
+      type enumeration {
+        enum LOGICAL_CHANNEL {
+          description
+            "Subsequent channel is a logical channel";
+        }
+        enum OPTICAL_CHANNEL {
+          description
+            "Subsequent channel is a optical channel / carrier";
+        }
+      }
+      description
+        "Each logical channel element may be assigned to subsequent
+        stages of logical elements to implement further grooming, or
+        can be assigned to a line-side optical channel for
+        transmission.  Each assignment also has an associated
+        bandwidth allocation.";
+    }
+
+    leaf logical-channel {
+      type leafref {
+        path "/oc-opt-term:terminal-device/" +
+          "oc-opt-term:logical-channels/oc-opt-term:channel/" +
+          "oc-opt-term:index";
+      }
+      must "../assignment-type = 'LOGICAL_CHANNEL'" {
+        description
+          "The assignment-type must be set to LOGICAL_CHANNEL for
+          this leaf to be valid";
+      }
+      description
+         "Reference to another stage of logical channel elements.";
+    }
+
+    leaf optical-channel {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      must "../assignment-type = 'OPTICAL_CHANNEL'" {
+        description
+          "The assignment-type must be set to OPTICAL_CHANNEL for
+          this leaf to be valid";
+      }
+      description
+        "Reference to the line-side optical channel that should
+        carry the current logical channel element.  Use this
+        reference to exit the logical element stage.";
+    }
+
+    leaf allocation {
+      type decimal64 {
+        fraction-digits 3;
+      }
+      units Gbps;
+      description
+        "Allocation of the logical client channel to the tributary
+        or sub-channel, expressed in Gbps";
+    }
+
+  }
+
+  grouping terminal-logical-chan-assignment-state {
+    description
+      "Operational state data for the assignment of logical client
+      channel to line-side tributary";
+  }
+
+  grouping terminal-logical-chan-assignment-top {
+    description
+      "Top-level grouping for the list of logical client channel-to-
+      tributary assignments";
+
+    container logical-channel-assignments {
+      //TODO: we need a commonly understood name for this logical
+      //channel structure
+      description
+        "Enclosing container for tributary assignments";
+
+      list assignment {
+        key "index";
+        description
+          "Logical channel elements may be assigned directly to
+          optical channels for line-side transmission, or can be
+          further groomed into additional stages of logical channel
+          elements.  The grooming can multiplex (i.e., split the
+          current element into multiple elements in the subsequent
+          stage) or de-multiplex (i.e., combine the current element
+          with other elements into the same element in the subsequent
+          stage) logical elements in each stage.
+
+          Note that to support the ability to groom the logical
+          elements, the list of logical channel elements should be
+          populated with an entry for the logical elements at
+          each stage, starting with the initial assignment from the
+          respective client physical port.
+
+          Each logical element assignment consists of a pointer to
+          an element in the next stage, or to an optical channel,
+          along with a bandwidth allocation for the corresponding
+          assignment (e.g., to split or combine signal).";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Reference to the index for the current tributary
+            assignment";
+        }
+
+        container config {
+          description
+            "Configuration data for tributary assignments";
+
+          uses terminal-logical-chan-assignment-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for tributary assignments";
+
+          uses terminal-logical-chan-assignment-config;
+          uses terminal-logical-chan-assignment-state;
+        }
+      }
+    }
+  }
+
+  grouping terminal-logical-channel-ingress-config {
+    description
+      "Configuration data for ingress signal to logical channel";
+
+    leaf transceiver {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+        "oc-platform:name";
+      }
+      description
+        "Reference to the transceiver carrying the input signal
+        for the logical channel.  If specific physical channels
+        are mapped to the logical channel (as opposed to all
+        physical channels carried by the transceiver), they can be
+        specified in the list of physical channel references.";
+    }
+
+    leaf-list physical-channel {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-transceiver:transceiver/" +
+          "oc-transceiver:physical-channels/" +
+          "oc-transceiver:channel/oc-transceiver:index";
+      }
+      description
+        "This list should be populated with references
+        to the client physical channels that feed this logical
+        channel from the transceiver specified in the 'transceiver'
+        leaf, which must be specified.  If this leaf-list is empty,
+        all physical channels in the transceiver are assumed to be
+        mapped to the logical channel.";
+    }
+  }
+
+  grouping terminal-logical-channel-ingress-state {
+    description
+      "Operational state data for ingress signal to logical channel";
+  }
+
+  grouping terminal-logical-channel-ingress-top {
+    description
+      "Top-level grouping for ingress signal to logical channel";
+
+    container ingress {
+      description
+        "Top-level container for specifying references to the
+        source of signal for the logical channel, either a
+        transceiver or individual physical channels";
+
+      container config {
+        description
+          "Configuration data for the signal source for the
+          logical channel";
+
+        uses terminal-logical-channel-ingress-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the signal source for the
+          logical channel";
+
+        uses terminal-logical-channel-ingress-config;
+        uses terminal-logical-channel-ingress-state;
+      }
+    }
+  }
+
+  grouping terminal-logical-channel-config {
+    description
+      "Configuration data for logical channels";
+
+    leaf index {
+      type uint32;
+      description
+        "Index of the current logical channel";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Description of the logical channel";
+    }
+
+    leaf admin-state {
+      type oc-opt-types:admin-state-type;
+      description
+          "Sets the admin state of the logical channel";
+    }
+
+    leaf rate-class {
+      type identityref {
+        base oc-opt-types:TRIBUTARY_RATE_CLASS_TYPE;
+      }
+      description
+        "Rounded bit rate of the tributary signal. Exact bit rate
+        will be refined by protocol selection.";
+    }
+
+    leaf trib-protocol {
+      type identityref {
+        base oc-opt-types:TRIBUTARY_PROTOCOL_TYPE;
+      }
+      description
+        "Protocol framing of the tributary signal. If this
+        LogicalChannel is directly connected to a Client-Port or
+        Optical-Channel, this is the protocol of the associated port.
+        If the LogicalChannel is connected to other LogicalChannels,
+        the TributaryProtocol of the LogicalChannels will define a
+        specific mapping/demapping or multiplexing/demultiplexing
+        function.
+
+        Not all protocols are valid, depending on the value
+        of trib-rate-class.  The expectation is that the NMS
+        will validate that a correct combination of rate class
+        and protocol are specfied.  Basic combinations are:
+
+        rate class: 1G
+        protocols: 1GE
+
+        rate class: 2.5G
+        protocols: OC48, STM16
+
+        rate class: 10G
+        protocols:  10GE LAN, 10GE WAN, OC192, STM64, OTU2, OTU2e,
+                    OTU1e, ODU2, ODU2e, ODU1e
+
+        rate class: 40G
+        protocols:  40GE, OC768, STM256, OTU3, ODU3
+
+        rate class: 100G
+        protocols:  100GE, 100G MLG, OTU4, OTUCn, ODU4";
+    }
+
+    leaf logical-channel-type {
+      type identityref {
+        base oc-opt-types:LOGICAL_ELEMENT_PROTOCOL_TYPE;
+      }
+      description
+        "The type / stage of the logical element determines the
+        configuration and operational state parameters (PMs)
+        available for the logical element";
+    }
+
+    leaf loopback-mode {
+      type oc-opt-types:loopback-mode-type;
+      description
+        "Sets the loopback type on the logical channel. Setting the
+        mode to something besides NONE activates the loopback in
+        the specified mode.";
+    }
+
+    leaf test-signal {
+      type boolean;
+      description
+        "When enabled the logical channel's DSP will generate a pseudo
+        randmon bit stream (PRBS) which can be used during testing.";
+    }
+  }
+
+
+  grouping terminal-logical-channel-state {
+    description
+      "Operational state data for logical client channels";
+
+    leaf link-state {
+      type enumeration {
+        enum UP {
+          description
+            "Logical channel is operationally up";
+        }
+        enum DOWN {
+          description
+            "Logical channel is operationally down";
+        }
+      }
+      description
+        "Link-state of the Ethernet protocol on the logical channel,
+        SONET / SDH framed signal, etc.";
+    }
+
+  }
+
+  grouping terminal-logical-channel-top {
+    description
+      "Top-level grouping for logical channels";
+
+    container logical-channels {
+      description
+        "Enclosing container the list of logical channels";
+
+      list channel {
+        key "index";
+        description
+          "List of logical channels";
+        //TODO: naming for this list of logical elements should be
+        //revisited.
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Reference to the index of the logical channel";
+        }
+
+        container config {
+          description
+            "Configuration data for logical channels";
+
+          uses terminal-logical-channel-config;
+
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for logical channels";
+
+          uses terminal-logical-channel-config;
+          uses terminal-logical-channel-state;
+        }
+
+        uses terminal-otn-protocol-top {
+          when "config/logical-channel-type = 'PROT_OTN'" {
+            description
+              "Include the OTN protocol data only when the
+              channel is using OTN framing.";
+          }
+        }
+        uses terminal-ethernet-protocol-top {
+          when "config/logical-channel-type = 'PROT_ETHERNET'" {
+            description
+              "Include the Ethernet protocol statistics only when the
+              protocol used by the link is Ethernet.";
+          }
+        }
+        uses terminal-logical-channel-ingress-top;
+        uses terminal-logical-chan-assignment-top;
+      }
+    }
+  }
+
+
+  grouping terminal-optical-channel-config {
+    description
+      "Configuration data for describing optical channels";
+
+    leaf frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "Frequency of the optical channel, expressed in MHz";
+    }
+
+    leaf target-output-power {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "Target output optical power level of the optical channel,
+        expressed in increments of 0.01 dBm (decibel-milliwats)";
+    }
+
+    leaf operational-mode {
+      type uint16;
+      description
+        "Vendor-specific mode identifier -- sets the operational
+        mode for the channel.  The specified operational mode must
+        exist in the list of supported operational modes supplied
+        by the device";
+      //
+      // Ideally, this leaf should be a leafref to the supported
+      // operational modes, but YANG 1.0 does not allow a r/w
+      // leaf to be a leafref to a r/o leaf.
+    }
+
+
+    leaf line-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to the line-side physical port that carries
+        this optical channel.  The target port should be
+        a component in the physical inventory data model.";
+    }
+  }
+
+  grouping terminal-optical-channel-state {
+    description
+      "Operational state data for optical channels";
+
+    leaf group-id {
+      type uint32;
+      description
+        "If the device places constraints on which optical
+        channels must be managed together (e.g., transmitted on the
+        same line port), it can indicate that by setting the group-id
+        to the same value across related optical channels.";
+    }
+
+    uses oc-transceiver:optical-power-state;
+
+    container chromatic-dispersion {
+      description
+        "Chromatic Dispersion of an optical channel in
+        picoseconds / nanometer (ps/nm) as reported by receiver
+        with two decimal precision. Values include the instantaneous,
+        average, minimum, and maximum statistics. If avg/min/max
+        statistics are not supported, the target is expected to just
+        supply the instant value";
+
+      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps-nm;
+    }
+
+    container polarization-mode-dispersion {
+      description
+        "Polarization Mode Dispersion of an optical channel
+        in picosends (ps) as reported by receiver with two decimal
+        precision. Values include the instantaneous, average,
+        minimum, and maximum statistics. If avg/min/max statistics
+        are not supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps;
+    }
+
+    container second-order-polarization-mode-dispersion {
+      description
+        "Second Order Polarization Mode Dispersion of an optical
+        channel in picoseconds squared (ps^2) as reported by
+        receiver with two decimal precision. Values include the
+        instantaneous, average, minimum, and maximum statistics.
+        If avg/min/max statistics are not supported, the target
+        is expected to just supply the instant value";
+
+      uses oc-opt-types:avg-min-max-instant-stats-precision2-ps2;
+    }
+
+    container polarization-dependent-loss {
+      description
+        "Polarization Dependent Loss of an optical channel
+        in dB as reported by receiver with two decimal precision.
+        Values include the instantaneous, average, minimum, and
+        maximum statistics. If avg/min/max statistics are not
+        supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dB;
+    }
+  }
+
+  grouping terminal-optical-channel-top {
+    description
+      "Top-level grouping for optical channel data";
+
+    container optical-channel {
+      description
+        "Enclosing container for the list of optical channels";
+
+      container config {
+        description
+          "Configuration data for optical channels";
+
+        uses terminal-optical-channel-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for optical channels";
+
+        uses terminal-optical-channel-config;
+        uses terminal-optical-channel-state;
+      }
+    }
+  }
+
+  grouping terminal-operational-mode-config {
+    description
+      "Configuration data for vendor-supported operational modes";
+  }
+
+  grouping terminal-operational-mode-state {
+    description
+      "Operational state data for vendor-supported operational
+      modes";
+
+      leaf mode-id {
+        type uint16;
+        description
+          "Two-octet encoding of the vendor-defined operational
+          mode";
+      }
+
+      leaf description {
+        type string;
+        description
+          "Vendor-supplied textual description of the characteristics
+          of this operational mode to enable operators to select the
+          appropriate mode for the application.";
+      }
+
+      //TODO: examples of the kind of info that would be useful to
+      //report in the operational mode:
+      //Symbol rate (32G, 40G, 43G, 64G, etc.)
+      //Modulation (QPSK, 8-QAM, 16-QAM, etc.)
+      //Differential encoding (on, off/pilot symbol, etc)
+      //State of polarization tracking mode (default, med.
+      //high-speed, etc.)
+      //Pulse shaping (RRC, RC, roll-off factor)
+      //FEC mode (SD, HD, % OH)
+
+      leaf vendor-id {
+        type string;
+        description
+          "Identifier to represent the vendor / supplier of the
+          platform and the associated operational mode information";
+      }
+  }
+
+  grouping terminal-operational-mode-top {
+    description
+      "Top-level grouping for vendor-supported operational modes";
+
+    container operational-modes {
+      description
+        "Enclosing container for list of operational modes";
+
+      list mode {
+        key "mode-id";
+        config false;
+        description
+          "List of operational modes supported by the platform.
+          The operational mode provides a platform-defined summary
+          of information such as symbol rate, modulation, pulse
+          shaping, etc.";
+
+        leaf mode-id {
+          type leafref {
+            path "../state/mode-id";
+          }
+          description
+            "Reference to mode-id";
+        }
+
+        container config {
+          description
+            "Configuration data for operational mode";
+
+          uses terminal-operational-mode-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for the platform-defined
+            operational mode";
+
+          uses terminal-operational-mode-config;
+          uses terminal-operational-mode-state;
+        }
+      }
+    }
+  }
+
+
+  grouping terminal-device-config {
+    description
+      "Configuration data for transport terminal devices at a
+      device-wide level";
+  }
+
+  grouping terminal-device-state {
+    description
+      "Operational state data for transport terminal devices at a
+      device-wide level";
+  }
+
+  grouping terminal-device-top {
+    description
+      "Top-level grouping for data for terminal devices";
+
+    container terminal-device {
+      description
+        "Top-level container for the terminal device";
+
+      container config {
+        description
+          "Configuration data for global terminal-device";
+
+        uses terminal-device-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for global terminal device";
+
+        uses terminal-device-config;
+        uses terminal-device-state;
+      }
+
+      uses terminal-logical-channel-top;
+      uses terminal-operational-mode-top;
+
+    }
+  }
+
+  // data definition statements
+
+  uses terminal-device-top;
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component" {
+    when "/oc-platform:components/oc-platform:component/" +
+      "oc-platform:state/oc-platform:type = 'OPTICAL_CHANNEL'" {
+      description
+        "Augment is active when component is of type
+        OPTICAL_CHANNEL";
+    }
+    description
+      "Adding optical channel data to physical inventory";
+
+    uses terminal-optical-channel-top {
+    }
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-common.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-common.yang
new file mode 100644
index 0000000..ccd5159
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-common.yang
@@ -0,0 +1,295 @@
+module openconfig-transport-line-common {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/transport-line-common";
+
+  prefix "oc-line-com";
+
+  // import some basic types
+  import iana-if-type { prefix ift; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines common data elements for OpenConfig data
+    models for optical transport line system elements, such as
+    amplifiers and ROADMs (wavelength routers).";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Add monitor port type and refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-03-31" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity OPTICAL_LINE_PORT_TYPE {
+    description
+      "Type definition for optical node port types";
+  }
+
+  identity INGRESS {
+    base OPTICAL_LINE_PORT_TYPE;
+    description
+      "Ingress port, corresponding to a signal entering
+      a line device such as an amplifier or wavelength
+      router.";
+  }
+
+  identity EGRESS {
+    base OPTICAL_LINE_PORT_TYPE;
+    description
+      "Egress port, corresponding to a signal exiting
+      a line device such as an amplifier or wavelength
+      router.";
+  }
+
+  identity ADD {
+    base OPTICAL_LINE_PORT_TYPE;
+    description
+      "Add port, corresponding to a signal injected
+      at a wavelength router.";
+  }
+
+  identity DROP {
+    base OPTICAL_LINE_PORT_TYPE;
+    description
+      "Drop port, corresponding to a signal dropped
+      at a wavelength router.";
+  }
+
+  identity MONITOR {
+    base OPTICAL_LINE_PORT_TYPE;
+    description
+      "Monitor port, corresponding to a signal used by an optical
+      channel monitor. This is used to represent the connection
+      that a channel monitor port is connected to. This
+      connection may be via physical cable and faceplate ports or
+      internal to the device";
+  }
+
+  // typedef statements
+
+  // grouping statements
+
+   grouping optical-osc-config {
+    description
+      "Configuration data for OSC interfaces";
+
+    leaf-list interface {
+      type oc-if:base-interface-ref;
+      description
+        "List of references to OSC interfaces";
+    }
+  }
+
+  grouping optical-osc-state {
+    description
+      "Operational state data for OSC interfaces";
+
+    container input-power {
+      description
+        "The input optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        the target is expected to just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container output-power {
+      description
+        "The output optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        the target is expected to just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container laser-bias-current {
+      description
+        "The current applied by the system to the transmit laser to
+        achieve the output power. The current is expressed in mA
+        with up to one decimal precision. If avg/min/max statistics
+        are not supported, the target is expected to just supply
+        the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-mA;
+    }
+  }
+
+
+
+  grouping optical-osc-top {
+    description
+      "Top-level grouping for configuration and operational state
+      data for optical supervisory channels (OSC) for amplifiers,
+      WSS/ROADM, nodes, etc.";
+
+    container config {
+      description
+        "Configuration data for OSCs";
+
+      uses optical-osc-config;
+    }
+
+    container state {
+
+      config false;
+
+      description
+        "Operational state data for OSCs";
+
+      uses optical-osc-config;
+      uses optical-osc-state;
+    }
+  }
+
+
+  grouping transport-line-common-port-config {
+    description
+      "Configuration data for optical line ports";
+
+    leaf admin-state {
+      type oc-opt-types:admin-state-type;
+      description
+          "Sets the admin state of the optical-port";
+    }
+  }
+
+  grouping transport-line-common-port-state {
+    description
+      "Operational state data describing optical line ports";
+
+    leaf optical-port-type {
+      type identityref {
+        base OPTICAL_LINE_PORT_TYPE;
+      }
+      description
+        "Indicates the type of transport line port.  This is an
+        informational field that should be made available by the
+        device (e.g., in the openconfig-platform model).";
+    }
+
+    container input-power {
+      description
+        "The total input optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container output-power {
+      description
+        "The total output optical power of this port in units
+        of 0.01dBm. If avg/min/max statistics are not supported,
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping transport-line-common-port-top {
+    description
+      "Top-level grouping ";
+
+    container optical-port {
+      description
+        "Top-level container ";
+
+      container config {
+
+        description
+          "Operational config data for optical line ports";
+
+        uses transport-line-common-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for optical line ports";
+
+        uses transport-line-common-port-config;
+        uses transport-line-common-port-state;
+      }
+    }
+  }
+
+
+
+  // data definition statements
+
+  // uses optical-osc-top;
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component" {
+    description
+      "Adding optical line port data to platform model";
+
+    uses transport-line-common-port-top {
+      when "/oc-platform:components/oc-platform:component/" +
+        "oc-platform:state/oc-platform:type = 'PORT'" {
+        description
+          "Augment is active when component is of type
+          PORT";
+      }
+    }
+  }
+
+  //TODO:this is placeholder until SONET model is added
+  //to interfaces model
+  augment "/oc-if:interfaces/oc-if:interface" {
+    when "oc-if:config/oc-if:type = 'ift:sonet'" {
+      description "Additional interface configuration parameters when
+      the interface type is SONET/SDH";
+    }
+    description "Adds additional SONET/SDH-specific data to
+    osc model";
+
+    container sonet {
+      description
+        "Data related to SONET/SDH interfaces";
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang
new file mode 100644
index 0000000..311b315
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-line-protection.yang
@@ -0,0 +1,511 @@
+module openconfig-transport-line-protection {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/optical-transport-line-protection";
+
+  prefix "oc-line-protect";
+
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-platform { prefix oc-platform; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This model describes configuration and operational state data
+    for optical line protection elements, deployed as part of a
+    transport line system. An Automatic Protection Switch (APS)
+    is typically installed in the same device as the amplifiers
+    and wave-router, however an APS can also be a standalone
+    device. In both scenarios, it serves the same purpose of
+    providing protection using two dark fiber pairs to ensure the
+    amplifiers can still receive a signal if one of the two fiber
+    pairs is broken.";
+
+  //
+  // Automatic Protection Switch (APS) port details and directionality.
+  //                 _________
+  //                 |       |
+  //                 |       | <=== LINE-PRIMARY-IN
+  //                 |       |
+  // COMMON-IN  ===> |       | ===> LINE-PRIMARY-OUT
+  //                 |       |
+  //                 |  APS  |
+  // COMMON-OUT <=== |       |
+  //                 |       | <=== LINE-SECONDARY-IN
+  //                 |       |
+  //                 |       | ===> LINE-SECONDARY-OUT
+  //                 |_______|
+  //
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Support multiple OCMs, add monitor port type
+      and refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-08-05" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity APS_PATHS {
+    description
+      "Base identity for identifying the line paths on an
+      automatic protection switch";
+  }
+
+  identity PRIMARY {
+    base APS_PATHS;
+    description
+      "The primary line path connected to an automatic protection
+      switch port indicating the primary/preferred path";
+  }
+
+  identity SECONDARY {
+    base APS_PATHS;
+    description
+      "The secondary line path connected to an automatic protection
+      switch port indicating the secondary path";
+  }
+
+  // grouping statements
+
+  grouping aps-input-port-config {
+    description
+      "Grouping for config related to unidirectional automatic
+      protection switch input ports";
+
+    leaf enabled {
+      type boolean;
+      default "true";
+      description
+        "This leaf contains the configured, desired state of the
+        port. Disabling the port turns off alarm reporting for
+        the port";
+    }
+
+    leaf target-attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "Target attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB.";
+    }
+  }
+
+  grouping aps-output-port-config {
+    description
+      "Grouping for config related to unidirectional automatic
+      protection switch output ports";
+
+    leaf target-attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "Target attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB";
+    }
+  }
+
+  grouping aps-input-port-state {
+    description
+      "Grouping for state related to unidirectional automatic
+      protection switch input ports";
+
+    leaf attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB.";
+    }
+
+    container optical-power {
+      description
+        "The optical input power of this port in units of
+        0.01dBm. Optical input power represents the signal
+        traversing from an external destination into the module.
+        The power is measured before any attenuation. If avg/min/max
+        statistics are not supported, the target is expected to
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping aps-output-port-state {
+    description
+      "Grouping for state related to unidirectional automatic
+      protection switch output ports";
+
+    leaf attenuation {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The attenuation of the variable optical attenuator
+        associated with the port in increments of 0.01 dB";
+    }
+
+    container optical-power {
+      description
+        "The optical output power of this port in units of
+        0.01dBm. Optical output power represents the signal
+        traversing from the module to an external destination. The
+        power is measured after any attenuation. If avg/min/max
+        statistics are not supported, the target is expected to
+        just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+  }
+
+  grouping aps-ports {
+    description
+      "Top level grouping for automatic protection switch ports";
+
+    container line-primary-in {
+      description
+        "Container for information related to the line primary
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line primary input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line primary input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+
+    }
+
+    container line-primary-out {
+      description
+        "Container for information related to the line primary
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line primary output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line primary output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+
+    container line-secondary-in {
+      description
+        "Container for information related to the line secondary
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line secondary input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line secondary input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+    }
+
+    container line-secondary-out {
+      description
+        "Container for information related to the line secondary
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line secondary output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line secondary output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+
+    container common-in {
+      description
+        "Container for information related to the line common
+        input port";
+
+      container config {
+        description
+          "Configuration data for the line common input port";
+
+        uses aps-input-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line common input port";
+
+        uses aps-input-port-config;
+        uses aps-input-port-state;
+      }
+    }
+
+    container common-output {
+      description
+        "Container for information related to the line common
+        output port";
+
+      container config {
+        description
+          "Configuration data for the line common output port";
+
+        uses aps-output-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "State data for the line common output port";
+
+        uses aps-output-port-config;
+        uses aps-output-port-state;
+      }
+    }
+  }
+
+  grouping aps-config {
+    description
+      "Configuration data for automatic protection switch modules";
+
+    leaf name {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "Reference to the component name (in the platform model)
+        corresponding to this automatic protection switch module
+        in the device";
+    }
+
+    leaf revertive {
+      type boolean;
+      description
+        "Revertive behavior of the module.
+        If True, then automatically revert after protection switch
+        once the fault is restored.";
+    }
+
+    leaf primary-switch-threshold {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The threshold at which the primary line port will switch to
+        the opposite line port in increments of 0.01 dBm. If the
+        hardware supports only one switch threshold for primary and
+        and secondary ports then it is recommended to set both
+        primary-switch-threshold and secondary-switch-threshold to
+        the same value to be explicit";
+    }
+
+    leaf primary-switch-hysteresis {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The delta in 0.01 dB between the primary-switch-threshold
+        and the signal received before initiating a reversion in
+        order to prevent toggling between ports when an input
+        signal is very close to threshold. If the hardware supports
+        only one switch hysteresis for primary and secondary ports
+        then it is recommended to set both primary-switch-threshold
+        and secondary-switch-threshold to the same value to be
+        explicit";
+    }
+
+    leaf secondary-switch-threshold {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The threshold at which the secondary line port will switch to
+        the opposite line port in increments of 0.01 dBm. If the
+        hardware supports only one switch threshold for primary and
+        and secondary ports then it is recommended to set both
+        primary-switch-threshold and secondary-switch-threshold to
+        the same value to be explicit";
+    }
+
+    leaf secondary-switch-hysteresis {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The delta in 0.01 dB between the secondary-switch-threshold
+        and the signal received before initiating a reversion in
+        order to prevent toggling between ports when an input
+        signal is very close to threshold. If the hardware supports
+        only one switch hysteresis for primary and secondary ports
+        then it is recommended to set both primary-switch-threshold
+        and secondary-switch-threshold to the same value to be
+        explicit";
+    }
+  }
+
+  grouping aps-state {
+    description
+      "State data for automatic protection switch modules";
+
+    leaf active-path {
+      type identityref {
+        base APS_PATHS;
+      }
+      description
+        "Indicates which line path on the automatic protection switch
+        is currently the active path connected to the common port";
+    }
+  }
+
+  grouping automatic-protection-switch-top {
+    description
+      "Top level grouping for automatic protection switch data";
+
+    container aps-modules {
+      description
+        "Enclosing container for list of automatic protection
+	       switch modules";
+
+      list aps-module {
+        key "name";
+        description
+          "List of automatic protection switch modules present
+          in the device";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the config name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for an automatic protection
+            switch module";
+
+          uses aps-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for an automatic protection
+            switch module";
+
+          uses aps-config;
+          uses aps-state;
+        }
+
+        container ports {
+          description
+            "Top level grouping for automatic protection switch ports";
+
+          uses aps-ports;
+        }
+      }
+    }
+  }
+
+  grouping transport-line-protection-top {
+    description
+      "Top level grouping for transport line protection data";
+
+    container aps {
+      description
+        "Top level grouping for automatic protection switch data";
+
+      uses automatic-protection-switch-top;
+    }
+  }
+
+  // data definition statements
+
+  uses transport-line-protection-top;
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-transport-types.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-types.yang
new file mode 100644
index 0000000..276f24b
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-transport-types.yang
@@ -0,0 +1,800 @@
+module openconfig-transport-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/transport-types";
+
+  prefix "oc-opt-types";
+
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains general type definitions and identities
+    for optical transport models.";
+
+  oc-ext:openconfig-version "0.5.0";
+
+  revision "2017-08-16" {
+    description
+      "Added ODU Cn protocol type";
+    reference "0.5.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Fixes and additions for terminal optics model";
+    reference "0.4.0";
+  }
+
+  // typedef statements
+
+  typedef frequency-type {
+    type uint64;
+    units "MHz";
+    description
+      "Type for optical spectrum frequency values";
+  }
+
+  typedef admin-state-type {
+    type enumeration {
+      enum ENABLED {
+        description
+        "Sets the channel admin state to enabled";
+      }
+      enum DISABLED {
+        description
+        "Sets the channel admin state to disabled";
+      }
+      enum MAINT {
+        description
+        "Sets the channel to maintenance / diagnostic mode";
+      }
+    }
+    description "Administrative state modes for
+    logical channels in the transponder model.";
+  }
+
+  typedef loopback-mode-type {
+    type enumeration {
+      enum NONE {
+        description
+          "No loopback is applied";
+      }
+      enum FACILITY {
+        description
+          "A loopback which directs traffic normally transmitted
+          on the port back to the device as if received on the same
+          port from an external source.";
+      }
+      enum TERMINAL {
+        description
+          "A loopback which directs traffic received from an external
+          source on the port back out the transmit side of the same
+          port.";
+      }
+    }
+    default NONE;
+    description
+      "Loopback modes for transponder logical channels";
+  }
+
+  // grouping statements
+
+  grouping avg-min-max-instant-stats-precision2-ps-nm {
+    description
+      "Common grouping for recording picosecond per nanometer
+      values with 2 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps-nm;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision2-ps {
+    description
+      "Common grouping for recording picosecond values with
+      2 decimal precision. Values include the instantaneous,
+      average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision2-ps2 {
+    description
+      "Common grouping for recording picosecond^2 values with
+      2 decimal precision. Values include the instantaneous,
+      average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units ps^2;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision18-ber {
+    description
+      "Common grouping for recording bit error rate (BER) values
+      with 18 decimal precision. Note that decimal64 supports
+      values as small as i x 10^-18 where i is an integer. Values
+      smaller than this should be reported as 0 to inidicate error
+      free or near error free performance. Values include the
+      instantaneous, average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 18;
+      }
+      units bit-errors-per-second;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  // identity statements
+
+  identity TRIBUTARY_PROTOCOL_TYPE {
+    description
+      "Base identity for protocol framing used by tributary
+      signals.";
+  }
+
+  identity PROT_1GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "1G Ethernet protocol";
+  }
+
+  identity PROT_OC48 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC48 protocol";
+  }
+
+  identity PROT_STM16 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 16 protocol";
+  }
+
+  identity PROT_10GE_LAN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "10G Ethernet LAN protocol";
+  }
+
+  identity PROT_10GE_WAN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "10G Ethernet WAN protocol";
+  }
+
+  identity PROT_OC192 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC 192 (9.6GB) port protocol";
+  }
+
+  identity PROT_STM64 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 64 protocol";
+  }
+
+  identity PROT_OTU2 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 2 protocol";
+  }
+
+  identity PROT_OTU2E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 2e protocol";
+  }
+
+  identity PROT_OTU1E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 1e protocol";
+  }
+
+  identity PROT_ODU2 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 2 protocol";
+  }
+
+  identity PROT_ODU2E {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 2e protocol";
+  }
+
+  identity PROT_40GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "40G Ethernet port protocol";
+  }
+
+  identity PROT_OC768 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OC 768 protocol";
+  }
+
+  identity PROT_STM256 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "STM 256 protocol";
+  }
+
+  identity PROT_OTU3 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU 3 protocol";
+  }
+
+  identity PROT_ODU3 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 3 protocol";
+  }
+
+  identity PROT_100GE {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "100G Ethernet protocol";
+  }
+
+  identity PROT_100G_MLG {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "100G MLG protocol";
+  }
+
+  identity PROT_OTU4 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU4 signal protocol (112G) for transporting
+    100GE signal";
+  }
+
+  identity PROT_OTUCN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "OTU Cn protocol";
+  }
+
+  identity PROT_ODUCN {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU Cn protocol";
+  }
+
+  identity PROT_ODU4 {
+    base TRIBUTARY_PROTOCOL_TYPE;
+    description "ODU 4 protocol";
+  }
+
+  identity TRANSCEIVER_FORM_FACTOR_TYPE {
+    description
+      "Base identity for identifying the type of pluggable optic
+      transceiver (i.e,. form factor) used in a port.";
+  }
+
+  identity CFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "C form-factor pluggable, that can support up to a
+      100 Gb/s signal with 10x10G or 4x25G physical channels";
+  }
+
+  identity CFP2 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "1/2 C form-factor pluggable, that can support up to a
+      200 Gb/s signal with 10x10G, 4x25G, or 8x25G physical
+      channels";
+  }
+
+  identity CFP2_ACO {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "CFP2 analog coherent optics transceiver, supporting
+      100 Gb, 200Gb, and 250 Gb/s signal.";
+  }
+
+  identity CFP4 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "1/4 C form-factor pluggable, that can support up to a
+      100 Gb/s signal with 10x10G or 4x25G physical channels";
+  }
+
+  identity QSFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "OriginalQuad Small Form-factor Pluggable transceiver that can
+      support 4x1G physical channels.  Not commonly used.";
+  }
+
+  identity QSFP_PLUS {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Quad Small Form-factor Pluggable transceiver that can support
+      up to 4x10G physical channels.";
+  }
+
+  identity QSFP28 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "QSFP pluggable optic with support for up to 4x28G physical
+      channels";
+  }
+
+  identity CPAK {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Cisco CPAK transceiver supporting 100 Gb/s.";
+  }
+
+  identity SFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Small form-factor pluggable transceiver supporting up to
+      10 Gb/s signal";
+  }
+
+  identity SFP_PLUS {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Enhanced small form-factor pluggable transceiver supporting
+      up to 16 Gb/s signals, including 10 GbE and OTU2";
+  }
+
+  identity XFP {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "10 Gigabit small form factor pluggable transceiver supporting
+      10 GbE and OTU2";
+  }
+
+  identity X2 {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "10 Gigabit small form factor pluggable transceiver supporting
+      10 GbE using a XAUI inerface and 4 data channels.";
+  }
+
+  identity NON_PLUGGABLE {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Represents a port that does not require a pluggable optic,
+      e.g., with on-board optics like COBO";
+  }
+
+  identity OTHER {
+    base TRANSCEIVER_FORM_FACTOR_TYPE;
+    description
+      "Represents a transceiver form factor not otherwise listed";
+  }
+
+  identity FIBER_CONNECTOR_TYPE {
+    description
+      "Type of optical fiber connector";
+  }
+
+  identity SC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "SC type fiber connector";
+  }
+
+  identity LC_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "LC type fiber connector";
+  }
+
+  identity MPO_CONNECTOR {
+    base FIBER_CONNECTOR_TYPE;
+    description
+      "MPO (multi-fiber push-on/pull-off) type fiber connector
+      1x12 fibers";
+  }
+
+  identity ETHERNET_PMD_TYPE {
+    description
+      "Ethernet compliance codes (PMD) supported by transceivers";
+  }
+
+  identity ETH_10GBASE_LRM {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_LRM";
+  }
+
+  identity ETH_10GBASE_LR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_LR";
+  }
+
+  identity ETH_10GBASE_ZR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_ZR";
+  }
+
+  identity ETH_10GBASE_ER {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_ER";
+  }
+
+  identity ETH_10GBASE_SR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 10GBASE_SR";
+  }
+
+  identity ETH_40GBASE_CR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_CR4";
+  }
+
+  identity ETH_40GBASE_SR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_SR4";
+  }
+
+  identity ETH_40GBASE_LR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_LR4";
+  }
+
+  identity ETH_40GBASE_ER4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_ER4";
+  }
+
+  identity ETH_40GBASE_PSM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 40GBASE_PSM4";
+  }
+
+  identity ETH_4X10GBASE_LR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 4x10GBASE_LR";
+  }
+
+  identity ETH_4X10GBASE_SR {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 4x10GBASE_SR";
+  }
+
+  identity ETH_100G_AOC {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100G_AOC";
+  }
+
+  identity ETH_100G_ACC {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100G_ACC";
+  }
+
+  identity ETH_100GBASE_SR10 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_SR10";
+  }
+
+  identity ETH_100GBASE_SR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_SR4";
+  }
+
+  identity ETH_100GBASE_LR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_LR4";
+  }
+
+  identity ETH_100GBASE_ER4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_ER4";
+  }
+
+  identity ETH_100GBASE_CWDM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CWDM4";
+  }
+
+  identity ETH_100GBASE_CLR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CLR4";
+  }
+
+  identity ETH_100GBASE_PSM4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_PSM4";
+  }
+
+  identity ETH_100GBASE_CR4 {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: 100GBASE_CR4";
+  }
+
+  identity ETH_UNDEFINED {
+    base ETHERNET_PMD_TYPE;
+    description "Ethernet compliance code: undefined";
+  }
+
+  identity SONET_APPLICATION_CODE {
+    description
+      "Supported SONET/SDH application codes";
+  }
+
+  identity VSR2000_3R2 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R2";
+  }
+
+  identity VSR2000_3R3 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R3";
+  }
+
+  identity VSR2000_3R5 {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: VSR2000_3R5";
+  }
+
+  identity SONET_UNDEFINED {
+    base SONET_APPLICATION_CODE;
+    description
+      "SONET/SDH application code: undefined";
+  }
+
+  identity OTN_APPLICATION_CODE {
+    description
+      "Supported OTN application codes";
+  }
+
+  identity P1L1_2D1 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1L1_2D1";
+  }
+
+  identity P1S1_2D2 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1S1_2D2";
+  }
+
+  identity P1L1_2D2 {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: P1L1_2D2";
+  }
+
+  identity OTN_UNDEFINED {
+    base OTN_APPLICATION_CODE;
+    description
+      "OTN application code: undefined";
+  }
+
+  identity TRIBUTARY_RATE_CLASS_TYPE {
+    description
+      "Rate of tributary signal _- identities will typically reflect
+      rounded bit rate.";
+  }
+
+  identity TRIB_RATE_1G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "1G tributary signal rate";
+  }
+
+  identity TRIB_RATE_2.5G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "2.5G tributary signal rate";
+  }
+
+  identity TRIB_RATE_10G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "10G tributary signal rate";
+  }
+
+  identity TRIB_RATE_40G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "40G tributary signal rate";
+  }
+
+  identity TRIB_RATE_100G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "100G tributary signal rate";
+  }
+
+  identity TRIB_RATE_150G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "150G tributary signal rate";
+  }
+
+  identity TRIB_RATE_200G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "200G tributary signal rate";
+  }
+
+  identity TRIB_RATE_250G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "250G tributary signal rate";
+  }
+
+  identity TRIB_RATE_300G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "300G tributary signal rate";
+  }
+
+  identity TRIB_RATE_400G {
+    base TRIBUTARY_RATE_CLASS_TYPE;
+    description
+      "400G tributary signal rate";
+  }
+
+  identity LOGICAL_ELEMENT_PROTOCOL_TYPE {
+    description
+      "Type of protocol framing used on the logical channel or
+      tributary";
+  }
+
+  identity PROT_ETHERNET {
+    base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+    description
+      "Ethernet protocol framing";
+  }
+
+  identity PROT_OTN {
+    base LOGICAL_ELEMENT_PROTOCOL_TYPE;
+    description
+      "OTN protocol framing";
+  }
+
+  identity OPTICAL_CHANNEL {
+    base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Optical channels act as carriers for transport traffic
+      directed over a line system.  They are represented as
+      physical components in the physical inventory model.";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/optical-transport/openconfig-wavelength-router.yang b/models/openconfig/src/main/yang/optical-transport/openconfig-wavelength-router.yang
new file mode 100644
index 0000000..1141aab
--- /dev/null
+++ b/models/openconfig/src/main/yang/optical-transport/openconfig-wavelength-router.yang
@@ -0,0 +1,345 @@
+module openconfig-wavelength-router {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/wavelength-router";
+
+  prefix "oc-wave-router";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+      www.openconfig.net";
+
+  description
+    "This model describes configuration and operational state data
+    for an optical transport line system node, or ROADM (incl. CDC
+    ROADMs, WSS, Dynamic Gain Equalizer/DGE).
+
+    Nodes are modeled as a configurable switching element with
+    ingress and egress ports, as well as a number of add/drop ports
+    that can be set up to direct portions of the optical spectrum
+    to the appropriate degrees.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Support multiple OCMs, add monitor port type
+      and refs to hw ports, ";
+    reference "0.3.0";
+  }
+
+  revision "2017-03-28" {
+    description
+      "Added min/max/avg stats, status for media channels, OCM, APS";
+    reference "0.2.0";
+  }
+
+  revision "2016-03-31" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+
+  // grouping statements
+
+  grouping media-channel-port-config {
+    description
+      "Configuration data for a media channel source/dest port";
+
+    leaf port-name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the corresponding node interface";
+    }
+  }
+
+  grouping media-channel-port-state {
+    description
+      "Operational state data for a media channel source/dest port";
+  }
+
+  grouping media-channel-source-port-top {
+    description
+      "Top-level grouping for source of the media channel";
+
+    container source {
+      description
+        "Top-level container for media channel source";
+
+      container config {
+        description
+          "Configuration data for the media channel source";
+
+        uses media-channel-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the media channel source";
+
+        uses media-channel-port-config;
+        uses media-channel-port-state;
+      }
+    }
+  }
+
+  grouping media-channel-dest-port-top {
+    description
+      "Top-level grouping for destination of the media channel";
+
+    container dest {
+      description
+        "Top-level container for media channel destination";
+
+      container config {
+        description
+          "Configuration data for the media channel destination";
+
+        uses media-channel-port-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the media channel destination";
+
+        uses media-channel-port-config;
+        uses media-channel-port-state;
+      }
+    }
+  }
+
+  grouping media-channel-psd-config {
+    description
+      "Configuration data for the media channel PSD";
+
+    leaf lower-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "Lower frequency of the specified PSD";
+    }
+
+    leaf upper-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "Upper frequency of the specified PSD";
+    }
+
+    leaf psd {
+      type oc-types:ieeefloat32;
+      units "nW/MHz";
+      description
+        "Power spectral density expressed in nanowatts per
+        megahertz, nW/MHz.  These units allow the value to often
+        be greater than 1.0.  It also avoids dealing with zero values
+        for 0dBm.  For example, a 40GHz wide channel
+        with 0dBm power would be:
+          0dBm = 1mW = 10^6nW
+          40GHz = 40,000MHz
+          0dBm/40GHz = 10^6nW/40,000MHz = 1000/40 = 25";
+    }
+  }
+
+  grouping media-channel-psd-state {
+    description
+      "Operational state data for the media channel PSD";
+  }
+
+  grouping media-channel-psd-top {
+    description
+      "Top-level grouping ";
+
+    container psd-distribution {
+      description
+        "Enclosing container for the list of values describing
+        the power spectral density distribution";
+
+      list psd-value {
+        key "lower-frequency upper-frequency";
+        description
+          "List of tuples describing the PSD distribution";
+
+        leaf lower-frequency {
+          type leafref {
+            path "../config/lower-frequency";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        leaf upper-frequency {
+          type leafref {
+            path "../config/upper-frequency";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container config {
+          description
+            "Configuration data for PSD";
+
+          uses media-channel-psd-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for PSD";
+
+          uses media-channel-psd-config;
+          uses media-channel-psd-state;
+        }
+      }
+    }
+  }
+
+  grouping media-channel-config {
+    description
+      "Configuration data for media channel definitions";
+
+    leaf index {
+      type uint32;
+      description
+        "Identifier for the defined media channel";
+    }
+
+    leaf name {
+      type string;
+      description
+        "The user supplied name of the media channel";
+    }
+
+    leaf lower-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "The lower frequency for the spectrum defined by this media
+        channel";
+    }
+
+    leaf upper-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "The upper frequency for the spectrum defined by this media
+        channel";
+    }
+
+    leaf admin-status {
+      type oc-opt-types:admin-state-type;
+      description
+          "Sets the admin status of the media channel";
+    }
+
+  }
+
+  grouping media-channel-state {
+    description
+      "Operational state data for media channels ";
+
+    leaf oper-status {
+      type enumeration {
+        enum UP {
+          description
+            "Media channel is operationally up";
+        }
+        enum DOWN {
+          description
+            "Media channel is operationally down";
+        }
+      }
+      description
+        "Operational state of the media channel";
+    }
+
+  }
+
+  grouping media-channel-top {
+    description
+      "Top-level grouping for list of defined media channels";
+
+    container media-channels {
+      description
+        "Enclosing container for media channel list";
+
+      list channel {
+        key "index";
+        description
+          "List of media channels";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Reference to index number of the media channel";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses media-channel-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses media-channel-config;
+          uses media-channel-state;
+        }
+
+        uses media-channel-source-port-top;
+        uses media-channel-dest-port-top;
+        uses media-channel-psd-top;
+      }
+    }
+  }
+
+  grouping wavelength-router-top {
+    description
+      "Top level grouping for the wavelength router";
+
+    container wavelength-router {
+      description
+        "Top-level container for wavelength router device";
+
+      uses media-channel-top;
+    }
+  }
+
+  // data definition statements
+
+  uses wavelength-router-top;
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospf-policy.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospf-policy.yang
new file mode 100644
index 0000000..da80fae
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospf-policy.yang
@@ -0,0 +1,176 @@
+module openconfig-ospf-policy {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/ospf-policy";
+
+  prefix "oc-ospf-pol";
+
+  import openconfig-routing-policy { prefix "oc-rpol"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines extensions to the OpenConfig policy
+    model to add extensions for OSPF. This module is intended
+    to be generic for both OSPFv2 and OSPFv3.";
+
+  oc-ext:openconfig-version "0.0.1";
+
+  revision "2016-08-22" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospf-match-config {
+    description
+      "Configuration parameters for OSPF match conditions";
+
+    leaf area-eq {
+      type oc-ospf-types:ospf-area-identifier;
+      description
+        "Match prefixes which are within a particular OSPF area";
+    }
+  }
+
+  grouping ospf-match-conditions {
+    description
+      "Match conditions that are added by OSPF";
+
+    container ospf-conditions {
+      description
+        "Match conditions specific to OSPF";
+
+      container config {
+        description
+          "Configuration parameters relating to OSPF match conditions";
+
+        uses ospf-match-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to OSPF match conditions";
+
+        uses ospf-match-config;
+      }
+    }
+  }
+
+  grouping ospf-actions-config {
+    description
+      "Configuration parameters for OSPF policy actions";
+
+    leaf set-area {
+      type oc-ospf-types:ospf-area-identifier;
+      description
+        "Set the area for the matched route. This action is typically
+        used when importing prefixes into OSPF, such that a route can
+        be imported into a specific area within the instance.";
+    }
+  }
+
+  grouping ospf-actions-set-metric-config { 
+    description
+      "Configuration parameters relating to setting the OSPF metric";
+
+    leaf metric-type {
+      type enumeration {
+        enum EXTERNAL_TYPE_1 {
+          description
+            "Set the external type 1 metric";
+        }
+        enum EXTERNAL_TYPE_2 {
+          description
+            "Set the external type 2 metric";
+        }
+      }
+      default "EXTERNAL_TYPE_2";
+      description
+        "Specify the type of metric which is to be set by the policy";
+    }
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "Set the metric of the routes matching the policy to the value
+        specified by this leaf.";
+    }
+  }
+
+  grouping ospf-actions {
+    description
+      "Actions that are added by OSPF to the action framework";
+
+    container ospf-actions {
+      description
+        "Actions specific to OSPF";
+
+      container config {
+        description
+          "Configuration parameters for OSPF actions";
+
+        uses ospf-actions-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for OSPF actions";
+
+        uses ospf-actions-config;
+      }
+
+      container set-metric {
+        description
+          "Configuration and state parameters relating to manipulating
+          the OSPF metric";
+
+        container config {
+          description
+            "Configuration parameters relating to setting the OSPF metric";
+          uses ospf-actions-set-metric-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to setting the OSPF
+            metric";
+
+          uses ospf-actions-set-metric-config;
+        }
+      }
+    }
+  }
+
+  // augment the groupings into the routing policy model
+
+  // TODO: discuss whether igp-actions should be used or whether this should 
+  // be removed.
+
+  augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+            "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+            "oc-rpol:conditions" {
+    description
+      "Add OSPF specific match conditions to the routing policy model";
+    uses ospf-match-conditions;
+  }
+
+  augment "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+            "oc-rpol:policy-definition/oc-rpol:statements/oc-rpol:statement/" +
+            "oc-rpol:actions" {
+    description
+      "Add OSPF specific actions to the routing policy model";
+    uses ospf-actions;
+  }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospf-types.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospf-types.yang
new file mode 100644
index 0000000..99271522
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospf-types.yang
@@ -0,0 +1,772 @@
+module openconfig-ospf-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/ospf-types";
+
+  prefix "oc-ospf-types";
+
+  // import some basic types
+  import ietf-yang-types { prefix "yang"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Type definitions for OSPF";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  // typedefs
+  typedef ospf-area-identifier {
+    type union {
+      type uint32;
+      type yang:dotted-quad;
+    }
+    description
+      "An identifier for an area with OSPF version 2 or 3. This value
+      is expressed as either a dotted-quad, or a unsigned 32-bit
+      number";
+  }
+
+  typedef ospf-metric {
+    type uint16;
+    description
+      "A common type that can be utilised to express an OSPF metric";
+  }
+
+  typedef sr-sid-type {
+    type enumeration {
+      enum LABEL {
+        description
+          "When the length of the SR/Label Sub-TLV is specified to be 3, then
+          the right-most 20-bits represent a label value within the SR/Label
+          Sub-TLV. When this leaf is set to a value of Label the first-entry
+          leaf should be interpreted to be an MPLS label.";
+      }
+      enum SID {
+        description
+          "When the length of the SR/Label Sub-TLV is specified to be 4, then
+          the value specified in the first-entry leaf should be specified to
+          be a segment identifier.";
+      }
+    }
+    description
+      "A common type used to express the type of segment identifier that is
+      used in LSDB entries relating to segment routing";
+  }
+
+  // identities
+  identity OSPF_LSA_TYPE {
+    description
+      "Base identity for an OSPF LSA type. This identity is intended
+      to be used across both OSPFv2 and OSPFv3. Identity values that
+      correspond to only one OSPF version are marked as such.";
+  }
+
+  identity ROUTER_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 1 - ROUTER_LSA. An LSA originated by each router within
+      the area describing the state and cost of the router's links
+      in the area.";
+    reference "RFC2328";
+  }
+
+  identity NETWORK_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 2 - NETWORK_LSA. An LSA originated for each broadcast and
+      non-broadcast multiple access (NBMA) in the area. This LSA is
+      originated by the designated router.";
+    reference "RFC2328";
+  }
+
+  identity SUMMARY_IP_NETWORK_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 3 - SUMMARY_IP_NETWORK_LSA. An LSA originated by area
+      border routers describing inter-area destinations. This LSA type
+      is used when the destination is an IP network";
+    reference "RFC2328";
+  }
+
+  identity SUMMARY_ASBR_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 4 - SUMMARY_ASBR_LSA. An LSA originated by an area border
+      router describing inter-area destinations. This LSA type is used
+      when the destination is an AS boundary router.";
+    reference "RFC2328";
+  }
+
+  identity AS_EXTERNAL_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 5 - AS_EXTERNAL_LSA. This LSA type is used to describe
+      destinations external to the autonomous system, and is
+      originated by an AS boundary router (ASBR).";
+    reference "RFC2328";
+  }
+
+  identity NSSA_AS_EXTERNAL_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 7 - NSSA_AS_EXTERNAL_LSA. This LSA type is used by
+      systems within a not-so-stubby-area (NSSA) to inject external
+      prefixes into the LSDB. They are translated to Type 5 LSAs
+      at an ABR device.";
+    reference "RFC3101";
+  }
+
+  identity OSPFV2_LINK_SCOPE_OPAQUE_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 9 - OSPFV2_LINK_SCOPE_OPAQUE_LSA. This LSA type is used
+      in OSPFv2 to distribute arbitrary information via the OSPF
+      protocol. The contents is specific to the application defining
+      the Opaque Type specified within the LSDB. LSAs with Type 9 have
+      a scope of the link that they are being transmitted on (and the
+      associated network or subnetwork).";
+    reference "RFC5250";
+  }
+
+  identity OSPFV2_AREA_SCOPE_OPAQUE_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 10 - OSPFV2_AREA_SCOPE_OPAQUE_LSA. This LSA type is used
+      in OSPFv2 to distribute arbitrary information via the OSPF
+      protocol. The contents is specific to the application defining
+      the Opaque Type specified within the LSDB. LSAs with Type 10 have
+      a scope of the area that they are transmitted within.";
+    reference "RFC5250";
+  }
+
+  identity OSPFV2_AS_SCOPE_OPAQUE_LSA {
+    base "OSPF_LSA_TYPE";
+    description
+      "Type 11 - OSPFV2_AS_SCOPE_OPAQUE_LSA. This LSA type is used
+      in OSPFv2 to distribute arbitrary information via the OSPF
+      protocol. The contents is specific to the application defining
+      the Opaque Type specified within the LSDB. LSAs with Type 11
+      have a scope of the autonomous system that they are transmitted
+      within.";
+    reference "RFC5250";
+  }
+
+  identity ROUTER_LSA_TYPES {
+    description
+      "Sub-types of the router LSA";
+  }
+
+  identity ROUTER_LSA_P2P {
+    base "ROUTER_LSA_TYPES";
+    description
+      "The LSA represents a point-to-point connection to another
+      router";
+  }
+
+  identity ROUTER_LSA_TRANSIT_NETWORK {
+    base "ROUTER_LSA_TYPES";
+    description
+      "The LSA represents a connection to a transit network";
+  }
+
+  identity ROUTER_LSA_STUB_NETWORK {
+    base "ROUTER_LSA_TYPES";
+    description
+      "The LSA represents a connection to a stub network";
+  }
+
+  identity ROUTER_LSA_VIRTUAL_LINK {
+    base "ROUTER_LSA_TYPES";
+    description
+      "The LSA represents a virtual link connection";
+  }
+
+  identity OSPF_NEIGHBOR_STATE {
+    description
+      "The state of an adjacency between the local system and a remote
+      device";
+  }
+
+  identity DOWN {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "The initial state of a neighbor, indicating that no recent
+      information has been received from the neighbor.";
+    reference "RFC2328";
+  }
+
+  identity ATTEMPT {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "Utilised for neighbors that are attached to NBMA networks, it
+      indicates that no information has been recently received from
+      the neighbor but that Hello packets should be directly sent
+      to that neighbor.";
+    reference "RFC2328";
+  }
+
+  identity INIT {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "Indicates that a Hello packet has been received from the
+      neighbor but bi-directional communication has not yet been
+      established. That is to say that the local Router ID does
+      not appear in the list of neighbors in the remote system's
+      Hello packet.";
+    reference "RFC2328";
+  }
+
+  identity TWO_WAY {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "Communication between the local and remote system is
+      bi-directional such that the local system's Router ID is listed
+      in the received remote system's Hello packet.";
+    reference "RFC2328";
+  }
+
+  identity EXSTART {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "An adjacency with the remote system is being formed. The local
+      system is currently transmitting empty database description
+      packets in order to establish the master/slave relationship for
+      the adjacency.";
+    reference "RFC2328";
+  }
+
+  identity EXCHANGE {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "The local and remote systems are currently exchanging database
+      description packets in order to determine which elements of
+      their local LSDBs are out of date.";
+    reference "RFC2328";
+  }
+
+  identity LOADING {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "The local system is sending Link State Request packets to the
+      remote system in order to receive the more recently LSAs that
+      were discovered during the Exchange phase of the procedure
+      establishing the adjacency.";
+    reference "RFC2328";
+  }
+
+  identity FULL {
+    base "OSPF_NEIGHBOR_STATE";
+    description
+      "The neighboring routers are fully adjacent such that both
+      LSDBs are synchronized. The adjacency will appear in Router and
+      Network LSAs";
+    reference "RFC2328";
+  }
+
+  identity OSPF_NETWORK_TYPE {
+    description
+      "Types of network that OSPF should consider attached to an
+      interface";
+  }
+
+  identity POINT_TO_POINT_NETWORK {
+    base "OSPF_NETWORK_TYPE";
+    description
+      "A interface that connects two routers.";
+    reference "RFC2328";
+  }
+
+  identity BROADCAST_NETWORK {
+    base "OSPF_NETWORK_TYPE";
+    description
+      "An interface that supports >2 attached routers which has the
+      ability to address all connected systems via a single
+      (broadcast) address.";
+  }
+
+  identity NON_BROADCAST_NETWORK {
+    base "OSPF_NETWORK_TYPE";
+    description
+      "An interface that supports >2 attached rotuers which does not
+      have the ability to address all connected systems with a
+      broadcast address.";
+  }
+
+  // rjs TODO: Maybe need p2mp here.
+
+
+  identity OSPF_OPAQUE_LSA_TYPE {
+    description
+      "This identity is the base used for opaque LSA types. The values
+      that extend this base are those that are described in the IANA
+      OSPF Opaque Link-State Advertisements (LSA) Option Types registry";
+  }
+
+  identity TRAFFIC_ENGINEERING {
+    base "OSPF_OPAQUE_LSA_TYPE";
+    description
+      "The Traffic Engineering LSA. This type is used only with area-scope
+      Opaque LSAs - and is used to describe routers, point-to-point links
+      and connections to multi-access networks for traffic engineering
+      purposes.";
+    reference "RFC3630";
+  }
+
+  identity GRACE_LSA {
+    base "OSPF_OPAQUE_LSA_TYPE";
+    description
+      "Grace LSAs are announced by a system undergoing graceful-restart.
+      A system that is attempting an OSPF graceful restart announces
+      Grace-LSAs with a specified grace period, indicating the intention
+      to have completed an restart within the specified period.";
+    reference "RFC3623";
+  }
+
+  identity ROUTER_INFORMATION {
+    base "OSPF_OPAQUE_LSA_TYPE";
+    description
+      "The Router Information LSA is used by an OSPFv2 system to announce
+      optional capabilities of the local system, over and above those that
+      are included within the OSPF hello message field.  The flooding scope
+      of the LSA can be link-, area-, or AS-wide (i.e., the LSA type can
+      be 9, 10 or 11).";
+    reference "RFC7770";
+  }
+
+  identity OSPFV2_EXTENDED_PREFIX {
+    base "OSPF_OPAQUE_LSA_TYPE";
+    description
+      "The Extended Prefix LSA is used in OSPFv2 to carry a set of attributes
+      that are to be associated with a prefix that is advertised in OSPF. The
+      attributes are carried as one or more TLV tuples. The flooding scope
+      of the LSA can be link-, area-, or AS-wide as specified by the
+      advertising system. The flooding scope of the LSA may exceed the scope
+      of the corresponding prefix.";
+    reference "RFC7684";
+  }
+
+  identity OSPFV2_EXTENDED_LINK {
+    base "OSPF_OPAQUE_LSA_TYPE";
+    description
+      "The Extended Link LSA is used in OSPFv2 to carry a set of attributes
+      that are to be associated with a link that is advertised in OSPF. The
+      link attributes are carried as one or more TLV tuples. The flooding
+      scope of the link LSA is area-local - i.e., it is carried in a Type 10
+      opaque LSA.";
+    reference "RFC7684";
+  }
+
+  identity OSPF_TE_LSA_TLV_TYPE {
+    description
+      "This identity is the base used for the type field of TLVs that are
+      included within the Traffic Engineering Opaque LSA.";
+  }
+
+  identity TE_ROUTER_ADDRESS {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "A stable IP address of the advertising router that is always reachable
+      if the node has connectivity.";
+  }
+
+  identity TE_LINK {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "A single link within a traffic engineering topology. A set of sub-TLVs
+      are carried within this attribute to indicate traffic engineering
+      characteristics of the link.";
+  }
+
+  identity TE_ROUTER_IPV6_ADDRESS {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "A stable IPv6 address of the advertising router that is always
+      reachable if the node has connectivity. This TLV is used only with
+      OSPFv3";
+    reference "RFC5329";
+  }
+
+  identity TE_LINK_LOCAL {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "Attributes associated with the local link by the system.";
+    reference "RFC4203";
+  }
+
+  identity TE_NODE_ATTRIBUTE {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "Attributes associted with the local system";
+    reference "RFC5786";
+  }
+
+  identity TE_OPTICAL_NODE_PROPERTY {
+    base "OSPF_TE_LSA_TLV_TYPE";
+    description
+      "Attributes associated with the local optical node. A set of sub-TLVs
+      are carried within this TLV which are used within the GMPLS control
+      plane when using OSPF";
+  }
+
+  identity OSPF_TE_LINK_TLV_TYPE {
+    description
+      "This identity is the based used for the type field for sub-TLVs of the
+      Link TLV of the OSPF Traffic Engineering Opaque LSA";
+  }
+
+  identity TE_LINK_TYPE {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Link Type sub-TLV appears exactly once per OSPF-TE Link
+      and describes the type of the link";
+  }
+
+  identity TE_LINK_ID {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Link ID sub-TLV appears exactly once per OSPF-TE link and
+      identifies the remote end of the link.";
+  }
+
+  identity TE_LINK_LOCAL_IP {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Local IP specifies a list of the interface addresses of the
+      local system corresponding to the traffic engineering link.";
+  }
+
+  identity TE_LINK_REMOTE_IP {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Remote IP specifies a list of IP addresses of the remote
+      neighbors associated with the traffic engineering link.";
+  }
+
+  identity TE_LINK_METRIC {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Metric specifies the link metric for traffic engineering
+      purposes";
+  }
+
+  identity TE_LINK_MAXIMUM_BANDWIDTH {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Maximum Bandwidth specifies the maximum bandwidth of the
+      link that it is associated with.";
+  }
+
+  identity TE_LINK_MAXIMUM_RESERVABLE_BANDWIDTH {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE Maximum Reservable Bandwidth specifies the maximum
+      bandwidth that may be reserved on the link in bytes per second";
+  }
+
+  identity TE_LINK_UNRESERVED_BANDWIDTH {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE unreserved bandwidth indicates the amount of bandwidth
+      at each priority level that is currently not reserved";
+  }
+
+  identity TE_LINK_ADMIN_GROUP {
+    base "OSPF_TE_LINK_TLV_TYPE";
+    description
+      "The OSPF-TE administrative group indicates the administrative group
+      that the is assigned to the interface";
+  }
+
+  identity TE_NODE_ATTRIBUTE_TLV_TYPE {
+    description
+      "This identity forms the base for sub-TLVs of the Node Attribute TLV
+      of the Traffic Engineering LSA";
+  }
+
+  identity NODE_IPV4_LOCAL_ADDRESS {
+    base "TE_NODE_ATTRIBUTE_TLV_TYPE";
+    description
+      "The Node Attribute Sub-TLV contains a list of the IPv4 addresses of
+      the local system";
+  }
+
+  identity NODE_IPV6_LOCAL_ADDRESS {
+    base "TE_NODE_ATTRIBUTE_TLV_TYPE";
+    description
+      "The Node Attribute Sub-TLV contains a list of the IPv6 addresses of
+      the local system";
+  }
+
+  identity GRACE_LSA_TLV_TYPES {
+    description
+      "This identity is used as the base for TLVs within the Grace LSA";
+  }
+
+  identity GRACE_PERIOD {
+    base "GRACE_LSA_TLV_TYPES";
+    description
+      "This sub-TLV describes the period for which adjacencies should be
+      maintained with the restarting system";
+  }
+
+  identity GRACE_RESTART_REASON {
+    base "GRACE_LSA_TLV_TYPES";
+    description
+      "This sub-TLV describes the reason for the OSPF restart of the system
+      that is restarting";
+  }
+
+  identity GRACE_IP_INTERFACE_ADDRESS {
+    base "GRACE_LSA_TLV_TYPES";
+    description
+      "This sub-TLV specifies the restarting system's IP address on the
+      interface via which it is advertising the Grace LSA";
+  }
+
+  identity RI_LSA_TLV_TYPES {
+    description
+      "This identity is used as the base for the TLVs within the Router
+      Information LSA";
+    reference "RFC7770";
+  }
+
+  identity RI_INFORMATIONAL_CAPABILITIES {
+    base "RI_LSA_TLV_TYPES";
+    description
+      "Informational capabilities of the advertising system";
+    reference "RFC7770";
+  }
+
+  identity RI_FUNCTIONAL_CAPABILITIES {
+    base "RI_LSA_TLV_TYPES";
+    description
+      "Functional capabilities of the advertising system";
+    reference "RFC7770";
+  }
+
+  identity RI_NODE_ADMIN_TAG {
+    base "RI_LSA_TLV_TYPES";
+    description
+      "Operator-defined administrative tags associated with the advertising
+      system";
+    reference "RFC7777";
+  }
+
+  identity RI_SR_SID_LABEL_RANGE {
+    base "RI_LSA_TLV_TYPES";
+    description
+      "SID or Label ranges for use with segment routing when forwarding to
+      the advertising system";
+    reference "draft-ietf-ospf-segment-routing-extensions";
+  }
+
+  identity RI_SR_ALGORITHM {
+    base "RI_LSA_TLV_TYPES";
+    description
+      "The algorithms that are supported for segment routing by the
+      advertising system";
+    reference "draft-ietf-ospf-segment-routing-extensions";
+  }
+
+  // will be shared with IS-IS
+  identity SR_ALGORITHM {
+    description
+      "This identity is used as a base for the algorithms that can be
+      supported for segment routing and are advertised by a system in the RI
+      LSA";
+  }
+
+  identity SPF {
+    base "SR_ALGORITHM";
+    description
+      "The standard shortest path algorithm based on link metric,
+      as used by the OSPF protocol";
+  }
+
+  identity STRICT_SPF {
+    base "SR_ALGORITHM";
+    description
+      "The standard shortest path algorithm based on link metric, with the
+      requirement that all nodes along the path honor the SPF decision. That
+      is to say that the SPF decision cannot be altered by local policy at
+      the node";
+  }
+
+  identity OSPF_RI_SR_SID_LABEL_TLV_TYPES {
+    description
+      "This identity is used as a base for the sub-TLVs of the Segment
+      Routing SID/Label Range TLV";
+  }
+
+  identity SR_SID_LABEL_TLV {
+    base "OSPF_RI_SR_SID_LABEL_TLV_TYPES";
+    description
+      "A range of SID/Label values used by the local system";
+    reference "draft-ietf-ospf-segment-routing-extensions";
+  }
+
+  identity OSPFV2_ROUTER_LINK_TYPE {
+    description
+      "OSPFv2 Router Link Types as per the IANA registry defined in
+      RFC2740";
+  }
+
+  identity POINT_TO_POINT_LINK {
+    base "OSPFV2_ROUTER_LINK_TYPE";
+    description
+      "The link is a point-to-point connection to another router";
+  }
+
+  identity TRANSIT_NETWORK_LINK {
+    base "OSPFV2_ROUTER_LINK_TYPE";
+    description
+      "The link is a connection to a transit network";
+  }
+
+  identity STUB_NETWORK_LINK {
+    base "OSPFV2_ROUTER_LINK_TYPE";
+    description
+      "The link is a connection to a stub network";
+  }
+
+  identity VIRTUAL_LINK {
+    base "OSPFV2_ROUTER_LINK_TYPE";
+    description
+      "The link is a virtual connection to another router";
+  }
+
+  identity OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE {
+    description
+      "Sub-TLVs of the OSPFv2 Extended Prefix LSA as defined by
+      RFC7684";
+  }
+
+  identity EXTENDED_PREFIX_RANGE {
+    base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+    description
+      "The attributes being described relate to a range of prefixes";
+  }
+
+  identity PREFIX_SID {
+    base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+    description
+      "The TLV describes a Segment Routing Prefix Segment Identifier
+      associated with a prefix";
+  }
+
+  identity SID_LABEL_BINDING {
+    base "OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+    description
+      "The TLV describes a binding of a SID to a path to the prefix,
+      which may have associated path characteristics";
+  }
+
+  identity OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE {
+    description
+      "Sub-TLV types carried in the SID/Label Binding Sub-TLV of
+      the Extended Prefix Sub-TLV";
+  }
+
+  identity SID_MPLS_LABEL_BINDING {
+    base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+    description
+      "This sub-TLV indicates a binding between an SR SID and an
+      MPLS label and must be present in the sub-TLV";
+  }
+
+  identity ERO_METRIC {
+    base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+    description
+      "This sub-TLV indicates the cost of the ERO path being
+      advertised in the SID/Label TLV";
+  }
+
+  identity ERO_PATH {
+    base "OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+    description
+      "This sub-TLV indicates the path associated with an ERO
+      being advertised in the SID/Label TLV";
+  }
+
+  identity OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE {
+    description
+      "The types of segment included within an ERO Path described
+      within the SID/Label binding sub-TLV";
+  }
+
+  identity IPV4_SEGMENT {
+    base "OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+    description
+      "The segment is specified as an IPv4 address";
+  }
+
+  identity UNNUMBERED_INTERFACE_SEGMENT {
+    base "OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+    description
+      "The segment is specified as an unnumbered interface of
+      a remote system";
+  }
+
+  identity OSPFV2_EXTENDED_LINK_SUBTLV_TYPE {
+    description
+      "Sub-TLVs of the Extended Link TLV for OSPFv2";
+  }
+
+  identity ADJACENCY_SID {
+    base "OSPFV2_EXTENDED_LINK_SUBTLV_TYPE";
+    description
+      "The extended link sub-TLV indicates an Adjacency SID";
+  }
+
+  identity MAX_METRIC_TRIGGER {
+    description
+      "Triggers which cause the maximum metric to be set for
+      entities advertised in OSPF";
+  }
+
+  identity MAX_METRIC_ON_SYSTEM_BOOT {
+    base "MAX_METRIC_TRIGGER";
+    description
+      "Set the maximum metric when the system boots.";
+  }
+
+  identity MAX_METRIC_INCLUDE {
+    description
+      "Entities that may optionally be included when advertising
+      the maximum metric.";
+  }
+
+  identity MAX_METRIC_INCLUDE_STUB {
+    base "MAX_METRIC_INCLUDE";
+    description
+      "Include stub networks when advertising the maximum metric.";
+  }
+
+  identity MAX_METRIC_INCLUDE_TYPE2_EXTERNAL {
+    base "MAX_METRIC_INCLUDE";
+    description
+      "Include OSPF Type 2 external routes when advertising
+      the maximum metric.";
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area-interface.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area-interface.yang
new file mode 100644
index 0000000..81ce281
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area-interface.yang
@@ -0,0 +1,460 @@
+submodule openconfig-ospfv2-area-interface {
+
+  belongs-to openconfig-ospfv2 {
+    prefix "oc-ospfv2";
+  }
+
+  import ietf-yang-types { prefix "yang"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+  import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+  // include common submodule
+  include openconfig-ospfv2-common;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule provides OSPFv2 configuration and operational
+    state parameters that are specific to the area context";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-area-interface-config {
+    description
+      "Configuration parameters for an OSPF interface";
+
+    leaf id {
+      type string;
+      description
+        "An operator-specified string utilised to uniquely
+        reference this interface";
+    }
+
+    leaf network-type {
+      type identityref {
+        base "oc-ospf-types:OSPF_NETWORK_TYPE";
+      }
+      description
+        "The type of network that OSPFv2 should use for the specified
+        interface.";
+    }
+
+    leaf priority {
+      type uint8;
+      description
+        "The local system's priority to become the designated
+        router";
+    }
+
+    leaf multi-area-adjacency-primary {
+      type boolean;
+      default true;
+      description
+        "When the specified interface is included in more than one
+        area's configuration, this leaf marks whether the area should
+        be considered the primary (when the value is true). In the
+        case that this value is false, the area is considered a
+        secondary area.";
+    }
+
+    leaf authentication-type {
+      type string;
+      // rjs TODO: discuss with bogdanov@ what the approach for auth
+      // links should be.
+      description
+        "The type of authentication that should be used on this
+        interface";
+    }
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "The metric for the interface";
+    }
+
+    leaf passive {
+      type boolean;
+      description
+        "When this leaf is set to true, the interface should be
+        advertised within the OSPF area but OSPF adjacencies should
+        not be established over the interface";
+    }
+
+    leaf hide-network {
+      type boolean;
+      description
+        "When this leaf is set to true, the network connected to
+        the interface should be hidden from OSPFv2 advertisements
+        per the procedure described in RFC6860.";
+      reference
+        "RFC6860 - Hiding Transit-Only Networks in OSFF";
+    }
+  }
+
+  grouping ospfv2-area-interface-timers-config {
+    description
+      "Configuration parameters relating to per-interface OSPFv2
+      timers";
+
+    leaf dead-interval {
+      type uint32;
+      units seconds;
+      description
+        "The number of seconds that the local system should let
+        elapse before declaring a silent router down";
+      reference "RFC2328";
+    }
+
+    leaf hello-interval {
+      type uint32;
+      units seconds;
+      description
+        "The number of seconds the local system waits between the
+        transmission of subsequent Hello packets";
+    }
+
+    leaf retransmission-interval {
+      type uint32;
+      units seconds;
+      description
+        "The number of seconds that the local system waits before
+        retransmitting an unacknowledged LSA.";
+    }
+  }
+
+  grouping ospfv2-area-interface-mpls-config {
+    description
+      "Configuration parameters relating to MPLS extensions for OSPF";
+
+    leaf traffic-engineering-metric {
+      type uint32;
+      description
+        "A link metric that should only be considered for traffic
+        engineering purposes.";
+      reference "RFC3630, §2.5.5";
+    }
+  }
+
+  grouping ospfv2-area-interface-neighbor-config {
+    description
+      "Configuration parameters relating to an individual neighbor
+      system on an interface within an OSPF area";
+
+    leaf router-id {
+      type yang:dotted-quad;
+      description
+        "The router ID of the remote system.";
+    }
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "The metric that should be considered to the remote neighbor
+        over this interface. This configuration is only applicable
+        for multiple-access networks";
+    }
+  }
+
+  grouping ospfv2-area-interface-neighbor-state {
+    description
+      "Operational state parameters relating an individual neighbor
+      system on an interface within an OSPF area";
+
+    leaf priority {
+      type uint8;
+      description
+        "The remote system's priority to become the designated
+        router";
+    }
+
+    leaf dead-time {
+      // rjs TODO: discussion with aashaikh@ + hines@ around how this
+      // value should be represented, usually is a timer that
+      // continually counts down but this sounds challenging for
+      // telemetry.
+      type oc-types:timeticks64;
+      description
+        "The time at which this neighbor's adjacency will be
+        considered dead. This value is expressed as a number of
+        seconds since the Unix Epoch";
+    }
+
+    leaf designated-router {
+      type yang:dotted-quad;
+      description
+        "The designated router for the adjacency. This device
+        advertises the Network LSA for broadcast and NBMA networks.";
+    }
+
+    leaf backup-designated-router {
+      type yang:dotted-quad;
+      description
+        "The backup designated router for the adjacency.";
+    }
+
+    leaf optional-capabilities {
+      // rjs TODO: should this be anything more than the hex-string
+      // this is currently what is shown in IOS/JUNOS
+      type yang:hex-string;
+      description
+        "The optional capabilities field received in the Hello
+        message from the neighbor";
+    }
+
+    leaf last-established-time {
+      type oc-types:timeticks64;
+      units seconds;
+      // rjs TODO: check implementations - is FULL considered 'up'
+      // since the adjacency is probably up since ExStart
+      description
+        "The time at which the adjacency was last established with
+        the neighbor. That is to say the time at which the
+        adjacency last transitioned into the FULL state.
+
+        This value is expressed as the number of seconds, relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf adjacency-state {
+      type identityref {
+        base "oc-ospf-types:OSPF_NEIGHBOR_STATE";
+      }
+      description
+        "The state of the adjacency with the neighbor.";
+    }
+
+    leaf state-changes {
+      type uint32;
+      description
+        "The number of transitions out of the FULL state that this
+        neighbor has been through";
+    }
+
+    leaf retranmission-queue-length {
+      type uint32;
+      description
+        "The number of LSAs that are currently in the queue to be
+        retransmitted to the neighbor";
+    }
+  }
+
+  grouping ospfv2-area-interface-lsa-filter-config {
+    description
+      "Configuration options relating to filtering LSAs
+      on an interface.";
+
+    leaf all {
+      type boolean;
+      description
+        "When this leaf is set to true, all LSAs should be
+        filtered to the neighbours with whom adjacencies are
+        formed on the interface.";
+    }
+
+    // NB: this container can be augmented to add additional
+    // filtering options which exist in some implementations.
+  }
+
+  grouping ospfv2-area-interface-mpls-igp-ldp-sync-state {
+    description
+      "Operational state parameters relating to MPLS LDP/IGP
+      synchronization on a per-neighbor basis";
+
+    leaf synchronized {
+      type boolean;
+      description
+        "When the value of this leaf is set to true, the
+        LDP neighbors reachable via this interface are considered
+        to be synchronized, and hence the link is considered
+        usable by the IGP.";
+    }
+  }
+
+  grouping ospfv2-area-interfaces-structure {
+    description
+      "Structural grouping for configuration and operational state
+      parameters that relate to an interface";
+
+    container interfaces {
+      description
+        "Enclosing container for a list of interfaces enabled within
+        this area";
+
+      list interface {
+        key "id";
+
+        description
+          "List of interfaces which are enabled within this area";
+
+        leaf id {
+          type leafref {
+            path "../config/id";
+          }
+          description
+            "A pointer to the identifier for the interface.";
+        }
+
+        container config {
+          description
+            "Configuration parameters for the interface on which
+            OSPFv2 is enabled";
+
+          uses ospfv2-area-interface-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters for the interface on which
+            OSPFv2 is enabled";
+          uses ospfv2-area-interface-config;
+        }
+
+        uses oc-if:interface-ref;
+
+        container timers {
+          description
+            "Timers relating to OSPFv2 on the interface";
+
+          container config {
+            description
+              "Configuration parameters for OSPFv2 timers on the
+              interface";
+            uses ospfv2-area-interface-timers-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters for OSPFv2 timers on
+              the interface";
+
+            uses ospfv2-area-interface-timers-config;
+          }
+        }
+
+        container mpls {
+          description
+            "Configuration and operational state parameters for
+            OSPFv2 extensions related to MPLS on the interface.";
+
+          container config {
+            description
+              "Configuration parameters for OSPFv2 extensions relating
+              to MPLS for the interface";
+            uses ospfv2-area-interface-mpls-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state for OSPFv2 extensions relating to
+              MPLS for the interface";
+            uses ospfv2-area-interface-mpls-config;
+          }
+
+          container igp-ldp-sync {
+            description
+              "OSPFv2 parameters relating to LDP/IGP synchronization";
+
+            container config {
+              description
+                "Configuration parameters relating to LDP/IG
+                synchronization.";
+              uses ospfv2-common-mpls-igp-ldp-sync-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state variables relating to LDP/IGP
+                synchronization";
+              uses ospfv2-common-mpls-igp-ldp-sync-config;
+              uses ospfv2-area-interface-mpls-igp-ldp-sync-state;
+            }
+          }
+        }
+
+        container lsa-filter {
+          description
+            "OSPFv2 parameters relating to filtering of LSAs to
+            neighbors the specified interface.";
+
+          container config {
+            description
+              "Configuration parameters relating to filtering LSAs
+              on the specified interface.";
+            uses ospfv2-area-interface-lsa-filter-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to filtering
+              LSAs on the specified interface";
+            uses ospfv2-area-interface-lsa-filter-config;
+          }
+        }
+
+        container neighbors {
+          description
+            "Enclosing container for the list of neighbors that
+            an adjacency has been established with on the interface";
+
+          list neighbor {
+            key "router-id";
+
+            description
+              "A neighbor with which an OSPFv2 adjacency has been
+              established within this area";
+
+            leaf router-id {
+              type leafref {
+                path "../config/router-id";
+              }
+              description
+                "Reference to the router ID of the adjacent system";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the adjacent
+                system";
+              uses ospfv2-area-interface-neighbor-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the adjacent
+                system";
+              uses ospfv2-area-interface-neighbor-config;
+              uses ospfv2-area-interface-neighbor-state;
+            }
+          }
+        }
+
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area.yang
new file mode 100644
index 0000000..5624a49
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-area.yang
@@ -0,0 +1,157 @@
+submodule openconfig-ospfv2-area {
+
+  belongs-to openconfig-ospfv2 {
+    prefix "oc-ospfv2";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-ospf-types { prefix "oc-ospf-types"; }
+  import ietf-inet-types { prefix "inet"; }
+
+  // include other required submodules
+  include openconfig-ospfv2-area-interface;
+  include openconfig-ospfv2-lsdb;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule provides OSPFv2 configuration and operational
+    state parameters that are specific to the area context";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-area-config {
+    description
+      "Configuration parameters relating to an OSPF area";
+
+    leaf identifier {
+      type oc-ospf-types:ospf-area-identifier;
+      description
+        "An identifier for the OSPFv2 area - described as either a
+        32-bit unsigned integer, or a dotted-quad";
+    }
+  }
+
+  grouping ospfv2-area-mpls-config {
+    description
+      "Configuration parameters relating to OSPFv2 extensions for
+      MPLS";
+
+    leaf traffic-engineering-enabled {
+      type boolean;
+      description
+        "Specifies whether traffic engineering extensions should be
+        advertised within the area";
+    }
+  }
+
+  grouping ospfv2-area-virtual-link-config {
+    description
+      "Configuration parameters relating to a virtual-link within
+      the OSPF area";
+
+    leaf remote-router-id {
+      type inet:ipv4-address-no-zone;
+      description
+        "The router ID of the device which terminates the remote end
+        of the virtual link";
+    }
+  }
+
+  grouping ospfv2-area-structure {
+    description
+      "Structural grouping for configuration and operational state
+      parameters that relate to an individual area";
+
+    container config {
+      description
+        "Configuration parameters relating to an OSPFv2 area";
+
+      uses ospfv2-area-config;
+    }
+
+    container state {
+      config false;
+      description
+        "Operational state parameters relating to an OSPFv2 area";
+      uses ospfv2-area-config;
+    }
+
+    container mpls {
+      description
+        "Configuration and operational state parameters for OSPFv2
+        extensions relating to MPLS";
+
+      container config {
+        description
+          "Configuration parameters relating to MPLS extensions for
+          OSPFv2";
+        uses ospfv2-area-mpls-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to MPLS extensions
+          for OSPFv2";
+        uses ospfv2-area-mpls-config;
+      }
+    }
+
+    uses ospfv2-lsdb-structure;
+    uses ospfv2-area-interfaces-structure;
+
+    container virtual-links {
+      description
+        "Configuration and state parameters relating to virtual
+        links from the source area to a remote router";
+
+      list virtual-link {
+        key "remote-router-id";
+
+        description
+          "Configuration and state parameters relating to a
+          virtual link";
+
+        leaf remote-router-id {
+          type leafref {
+            path "../config/remote-router-id";
+          }
+          description
+            "Reference to the remote router ID";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the OSPF virtual link";
+          uses ospfv2-area-virtual-link-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters relating to the OSPF virtual link";
+          uses ospfv2-area-virtual-link-config;
+          uses ospfv2-area-interface-neighbor-state;
+        }
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-common.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-common.yang
new file mode 100644
index 0000000..6510816
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-common.yang
@@ -0,0 +1,79 @@
+submodule openconfig-ospfv2-common {
+
+  belongs-to openconfig-ospfv2 {
+    prefix "oc-ospfv2";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule provides OSPFv2 configuration and operational
+    state parameters that are shared across multiple contexts";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-common-mpls-igp-ldp-sync-config {
+    description
+      "Configuration parameters used for OSPFv2 MPLS/IGP
+      synchronization";
+
+    leaf enabled {
+      type boolean;
+      description
+        "When this leaf is set to true, do not utilise this link for
+        forwarding via the IGP until such time as LDP adjacencies to
+        the neighbor(s) over the link are established.";
+    }
+
+    leaf post-session-up-delay {
+      type uint32;
+      units milliseconds;
+      description
+        "This leaf specifies a delay, expressed in units of milliseconds,
+        between the LDP session to the IGP neighbor being established, and
+        it being considered synchronized by the IGP.";
+    }
+  }
+
+  grouping ospfv2-common-timers {
+    description
+      "Common definition of the type of timers that the OSPFv2 implementation
+      uses";
+
+    leaf timer-type {
+      type enumeration {
+        enum LINEAR_BACKOFF {
+          description
+            "The backoff used by the OSPFv2 implementation is linear, such that
+            a common delay is added following each event.";
+        }
+        enum EXPONENTIAL_BACKOFF {
+          description
+            "The backoff used by the OSPFv2 implementation is exponential, such
+            that the delay added following each event increases.";
+        }
+      }
+      description
+        "The timer mode that is utilised by the implementation.";
+    }
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-global.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-global.yang
new file mode 100644
index 0000000..05f46c0
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-global.yang
@@ -0,0 +1,497 @@
+submodule openconfig-ospfv2-global {
+
+  belongs-to openconfig-ospfv2 {
+    prefix "oc-ospfv2";
+  }
+
+  import ietf-yang-types { prefix "yang"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-routing-policy { prefix "oc-rpol"; }
+  import openconfig-ospf-types { prefix "oc-ospft"; }
+
+  // Include common submodule
+  include openconfig-ospfv2-common;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule provides OSPFv2 configuration and operational
+    state parameters that are global to a particular OSPF instance";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-global-config {
+    description
+      "Global configuration for OSPFv2";
+
+    leaf router-id {
+      type yang:dotted-quad;
+      description
+        "A 32-bit number represented as a dotted quad assigned to
+        each router running the OSPFv2 protocol. This number should
+        be unique within the autonomous system";
+      reference "rfc2828";
+    }
+
+    leaf summary-route-cost-mode {
+      type enumeration {
+        enum RFC1583_COMPATIBLE {
+          description
+            "Specify that summary routes should assume the cost of
+            the lowest-cost more-specific route as per the behaviour
+            specified in RFC1583";
+        }
+        enum RFC2328_COMPATIBLE {
+          description
+            "Specify that summary routes should assume the cost of the
+            highest-cost more-specific route as per the revised
+            behaviour specified in RFC2328";
+        }
+      }
+      default "RFC2328_COMPATIBLE";
+      description
+        "Specify how costs for the summary routes should be specified
+        as per the behaviour in the original OSPF specification
+        RFC1583, or alternatively whether the revised behaviour
+        described in RFC2328 should be utilised";
+    }
+
+    leaf igp-shortcuts {
+      type boolean;
+      description
+        "When this leaf is set to true, OSPFv2 will route traffic to
+        a remote system via any LSP to the system that is marked as
+        shortcut eligible.";
+    }
+
+    leaf log-adjacency-changes {
+      type boolean;
+      description
+        "When this leaf is set to true, a log message will be
+        generated when the state of an OSPFv2 neighbour changes.";
+    }
+
+    leaf hide-transit-only-networks {
+      type boolean;
+      description
+        "When this leaf is set to true, do not advertise prefixes
+        into OSPFv2 that correspond to transit interfaces, as per
+        the behaviour discussed in RFC6860.";
+      reference
+        "RFC6860 - Hiding Transit-Only Networks in OSPF";
+    }
+  }
+
+  grouping ospfv2-global-spf-timers-config {
+    description
+      "Configuration parameters relating to global SPF timer
+      parameters for OSPFv2";
+
+    leaf initial-delay {
+      // rjs TODO: IS-IS model has this as decimal64 - should it be
+      // that or uint32 msec?
+      type uint32;
+      units msec;
+      description
+        "The value of this leaf specifies the time between a change
+        in topology being detected and the first run of the SPF
+        algorithm.";
+    }
+
+    leaf maximum-delay {
+      // rjs TODO: same question as above
+      type uint32;
+      units msec;
+      description
+        "The value of this leaf specifies the maximum delay between
+        a topology change being detected and the SPF algorithm
+        running. This value is used for implementations that support
+        increasing the wait time between SPF runs.";
+    }
+
+    // rjs TODO: some questions here around what we should specify:
+    // JUNOS has rapid-runs and holddown
+    // Cisco has maximum time between runs, and then a doubling of
+    // the wait interval up to that maximum.
+    // ALU has first-wait, second-wait, max-wait
+  }
+
+  grouping ospfv2-global-lsa-generation-timers-config {
+    description
+      "Configuration parameters relating to global LSA generation
+      parameters for OSPFv2";
+
+    leaf initial-delay {
+      type uint32;
+      units msec;
+      description
+        "The value of this leaf specifies the time between the first
+        time an LSA is generated and advertised and the subsequent
+        generation of that LSA.";
+    }
+
+    leaf maximum-delay {
+      type uint32;
+      units msec;
+      description
+        "The value of this leaf specifies the maximum time between the
+        generation of an LSA and the subsequent re-generation of that
+        LSA. This value is used in implementations that support
+        increasing delay between generation of an LSA";
+    }
+  }
+
+  grouping ospfv2-global-spf-timers-state {
+    description
+      "Operational state parameters relating to OSPFv2 global
+      timers";
+
+    uses ospfv2-common-timers;
+  }
+
+  grouping ospfv2-global-lsa-generation-timers-state {
+    description
+      "Operational state parameters relating to OSPFv2 global
+      timers";
+
+    uses ospfv2-common-timers;
+  }
+
+  grouping ospfv2-global-graceful-restart-config {
+    description
+      "Configuration parameters relating to graceful restart for
+      OSPFv2";
+
+    leaf enabled {
+      type boolean;
+      description
+        "When the value of this leaf is set to true, graceful restart
+        is enabled on the local system. In this case, the system will
+        use Grace-LSAs to signal that it is restarting to its
+        neighbors.";
+    }
+
+    leaf helper-only {
+      type boolean;
+      description
+        "Operate graceful-restart only in helper mode. When this leaf
+        is set to true, the local system does not use Grace-LSAs to
+        indicate that it is restarting, but will accept Grace-LSAs
+        from remote systems, and suppress withdrawl of adjacencies
+        of the system for the grace period specified";
+    }
+  }
+
+  grouping ospfv2-global-mpls-config {
+    description
+      "Configuration parameters for OSPFv2 options which
+      relate to MPLS";
+
+    leaf traffic-engineering-extensions {
+      type boolean;
+      description
+        "When this leaf is set to true, use traffic engineering
+        extensions for OSPF to advertise TE parameters via type 10
+        Opaque LSAs";
+    }
+  }
+
+  grouping ospfv2-global-inter-areapp-config { 
+    description
+      "Configuration parameters for OSPFv2 policies which propagate
+      prefixes between areas";
+
+    leaf src-area {
+      type leafref {
+        // we are at ospf/global/inter-area-propagation-policies/...
+        // inter-area-propagation-policy/config/src-area
+        path "../../../../../areas/area/identifier";
+      }
+      description
+        "The area from which prefixes are to be exported.";
+    }
+
+    leaf dst-area { 
+      type leafref {
+        // we are at ospf/global/inter-area-propagation-policies/...
+        // inter-area-propagation-policy/config/src-area
+        path "../../../../../areas/area/identifier";
+      }
+      description
+        "The destination area to which prefixes are to be imported";
+    }
+
+    uses oc-rpol:apply-policy-import-config;
+  }
+
+  grouping ospfv2-global-max-metric-config {
+    description
+      "Configuration paramters relating to setting the OSPFv2
+      maximum metric.";
+
+    leaf set {
+      type boolean;
+      description
+        "When this leaf is set to true, all non-stub interfaces of
+        the local system are advertised with the maximum metric,
+        such that the router does not act as a transit system,
+        (similarly to the IS-IS overload functionality).";
+      reference
+        "RFC3137 - OSPF Stub Router Advertisement";
+    }
+
+    leaf timeout {
+      type uint64;
+      units "seconds";
+      description
+        "The delay, in seconds, after which the advertisement of
+        entities with the maximum metric should be cleared, and
+        the system reverts to the default, or configured, metrics.";
+    }
+
+    leaf-list include {
+      type identityref {
+        base "oc-ospft:MAX_METRIC_INCLUDE";
+      }
+      description
+        "By default, the maximum metric is advertised for all
+        non-stub interfaces of a device. When identities are
+        specified within this leaf-list, additional entities
+        are also advertised with the maximum metric according
+        to the values within the list.";
+    }
+
+    leaf-list trigger {
+      type identityref {
+        base "oc-ospft:MAX_METRIC_TRIGGER";
+      }
+      description
+        "By default, the maximum metric is only advertised
+        when the max-metric/set leaf is specified as true.
+        In the case that identities are specified within this
+        list, they provide additional triggers (e.g., system
+        boot) that may cause the max-metric to be set. In this
+        case, the system should still honour the timeout specified
+        by the max-metric/timeout leaf, and clear the max-metric
+        advertisements after the expiration of this timer.";
+    }
+  }
+
+  grouping ospfv2-global-structural {
+    description
+      "Top level structural grouping for OSPFv2 global parameters";
+
+    container global {
+      description
+        "Configuration and operational state parameters for settings
+        that are global to the OSPFv2 instance";
+
+      container config {
+        description
+          "Global configuration parameters for OSPFv2";
+        uses ospfv2-global-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters for OSPFv2";
+        uses ospfv2-global-config;
+      }
+
+      container timers {
+        description
+          "Configuration and operational state parameters for OSPFv2
+          timers";
+
+        container spf {
+          description
+            "Configuration and operational state parameters relating
+            to timers governing the operation of SPF runs";
+
+          container config {
+            description
+              "Configuration parameters relating to global OSPFv2
+              SPF timers";
+            uses ospfv2-global-spf-timers-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to the global
+              OSPFv2 SPF timers";
+            uses ospfv2-global-spf-timers-config;
+            uses ospfv2-global-spf-timers-state;
+          }
+        }
+
+        container max-metric {
+          description
+            "Configuration and operational state parameters relating
+            to setting the OSPFv2 maximum metric.";
+
+          container config {
+            description
+              "Configuration parameters relating to setting the OSPFv2
+              maximum metric for a set of advertised entities.";
+            uses ospfv2-global-max-metric-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to setting the
+              OSPFv2 maximum metric for a set of advertised entities.";
+            uses ospfv2-global-max-metric-config;
+          }
+        }
+
+        container lsa-generation {
+          description
+            "Configuration and operational state parameters relating
+            to timers governing the generation of LSAs by the local
+            system";
+
+          container config {
+            description
+              "Configuration parameters relating to the generation of
+              LSAs by the local system";
+            uses ospfv2-global-lsa-generation-timers-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to the generation
+              of LSAs by the local system";
+            uses ospfv2-global-lsa-generation-timers-config;
+            uses ospfv2-global-lsa-generation-timers-state;
+          }
+        }
+      }
+
+      container graceful-restart {
+        description
+          "Configuration and operational state parameters for OSPFv2
+          graceful restart";
+
+        container config {
+          description
+            "Configuration parameters relating to OSPFv2 graceful
+            restart";
+          uses ospfv2-global-graceful-restart-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to OSPFv2 graceful
+            restart";
+          uses ospfv2-global-graceful-restart-config;
+        }
+      }
+
+      container mpls {
+        description
+          "OSPFv2 parameters relating to MPLS";
+
+        container config {
+          description
+            "Configuration parameters relating to MPLS for OSPFv2";
+          uses ospfv2-global-mpls-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to MPLS for
+            OSPFv2";
+          uses ospfv2-global-mpls-config;
+        }
+
+        container igp-ldp-sync {
+          description
+            "OSPFv2 parameters relating to LDP/IGP synchronization";
+
+          container config {
+            description
+              "Configuration parameters relating to LDP/IG
+              synchronization.";
+            uses ospfv2-common-mpls-igp-ldp-sync-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state variables relating to LDP/IGP
+              synchronization";
+            uses ospfv2-common-mpls-igp-ldp-sync-config;
+          }
+        }
+      }
+
+      container inter-area-propagation-policies {
+        description
+          "Policies defining how inter-area propagation should be performed
+          by the OSPF instance";
+
+        list inter-area-propagation-policy {
+          key "src-area dst-area";
+          description
+            "A list of connections between pairs of areas - routes are
+            propagated from the source (src) area to the destination (dst)
+            area according to the policy specified";
+
+          leaf src-area {
+            type leafref {
+              path "../config/src-area";
+            }
+            description
+              "Reference to the source area";
+          }
+
+          leaf dst-area {
+            type leafref {
+              path "../config/dst-area";
+            }
+            description
+              "Reference to the destination area";
+          }
+
+          container config {
+            description
+              "Configuration parameters relating to the inter-area
+              propagation policy";
+            uses ospfv2-global-inter-areapp-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to the inter-area
+              propagation policy";
+            uses ospfv2-global-inter-areapp-config;
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-lsdb.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-lsdb.yang
new file mode 100644
index 0000000..9964191
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2-lsdb.yang
@@ -0,0 +1,2343 @@
+submodule openconfig-ospfv2-lsdb {
+
+  belongs-to openconfig-ospfv2 {
+    prefix "oc-ospfv2";
+  }
+
+  // import some basic types
+  import ietf-yang-types { prefix "yang"; }
+  import ietf-inet-types { prefix "inet"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-ospf-types { prefix "oc-ospf-types"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "An OpenConfig model for the Open Shortest Path First (OSPF)
+    version 2 link-state database (LSDB)";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-lsdb-common-prefix-properties {
+    description
+      "Common properties used in the LSDB that relate to IPv4 prefixes";
+
+    leaf prefix-length {
+      type uint8 {
+        range "0..32";
+      }
+      description
+        "The length of the IPv4 prefix contained in the Extended Prefix LSA";
+    }
+
+    leaf address-family {
+      // TODO: should this be an identity?
+      type enumeration {
+        enum IPV4_UNICAST {
+          value 0;
+          description
+            "The prefix contained within the Extended Prefix LSA is an IPv4
+            unicast prefix";
+        }
+      }
+      description
+        "The address family of the prefix contained in the Extended Prefix
+        LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-common-link-specification {
+    description
+      "Generic attributes used to identify links within OSPFv2";
+
+    leaf link-id {
+      type yang:dotted-quad;
+      description
+        "The identifier for the link specified. The value of the link
+        identifier is dependent upon the type of the LSA. The value is
+        specified to be, per sub-type:
+          1) Neighbouring router's router ID.
+          2) IP address of DR.
+          3) IP network address.
+          4) Neighbouring router router's ID.";
+    }
+
+    leaf link-data {
+      type union {
+        type yang:dotted-quad;
+        type uint32;
+      }
+      description
+        "The data associated with the link type. The value is
+        dependent upon the subtype of the LSA. When the connection is
+        to a stub network it represents the mask; for p2p connections
+        that are unnumbered it represents the ifIndex value of the
+        router's interface; for all other connections it represents
+        the local system's IP address";
+    }
+
+  }
+
+  grouping ospfv2-lsdb-common-unknown-tlv {
+    description
+      "A generic specification of a TLV to be used when the
+      value cannot be decoded by the local system";
+
+    leaf type {
+      type uint16;
+      description
+        "The type value of the unknown TLV";
+    }
+
+    leaf length {
+      type uint16;
+      description
+        "The length value of the unknown TLV";
+    }
+
+    leaf value {
+      type binary;
+      description
+        "The value portion of the unknwon TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-common-unknown-tlv-structure {
+    description
+      "A generic specification of an unknown TLV";
+
+    container unknown-tlv {
+      description
+        "An unknown TLV within the context. Unknown TLVs are
+        defined to be the set of TLVs that are not modelled
+        within the OpenConfig model, or are unknown to the
+        local system such that it cannot decode their value.";
+
+      container state {
+        description
+          "Contents of an unknown TLV within the LSA";
+        uses ospfv2-lsdb-common-unknown-tlv;
+      }
+    }
+  }
+
+  grouping ospfv2-lsdb-common-unknown-subtlv-structure {
+    description
+      "A generic specification of an unknown TLV";
+
+    container unknown-subtlv {
+      description
+        "An unknown SubTLV within the context. Unknown Sub-TLV
+        are defined to be the set of SubTLVs that are not modelled
+        by the OpenConfig schema, or are unknown to the local system
+        such that it cannot decode their value.";
+
+      container state {
+        description
+          "Contents of an unknown TLV within the LSA";
+        uses ospfv2-lsdb-common-unknown-tlv;
+      }
+    }
+  }
+
+  grouping ospfv2-lsdb-common-tos-metric {
+    description
+      "Common LSDB LSA parameters for type of service and metric";
+
+    leaf tos {
+      type uint8;
+      description
+        "OSPF encoding of the type of service referred to by this
+        LSA. Encoding for OSPF TOS are described in RFC2328.";
+    }
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "The metric value to be used for the TOS specified. This value
+        represents the cost of use of the link for the specific type
+        of service.";
+    }
+  }
+
+  grouping ospfv2-lsdb-common-sr-sid-spec {
+    description
+      "Re-usable specification of a segment routing SID";
+
+    leaf sid-type {
+      type oc-ospf-types:sr-sid-type;
+      description
+        "The type of the value contained within the sub-TLV";
+    }
+
+    leaf sid-value {
+      type uint32;
+      description
+        "The value of the binding included within the sub-TLV. The type of
+        this binding is indicated by the type leaf.";
+    }
+  }
+
+  grouping ospfv2-lsdb-area-state {
+    description
+      "Per-area operational state parameters for an OSPFv2 area";
+
+    leaf identifier {
+      type oc-ospf-types:ospf-area-identifier;
+      description
+        "An identifier for the area, expressed as a dotted quad or
+        an unsigned 32-bit integer";
+    }
+  }
+
+  grouping ospfv2-lsdb-area-lsa-type-state {
+    description
+      "Per-LSA type operational state parameters for an OSPFv2 area";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPF_LSA_TYPE";
+      }
+      description
+        "The type of LSA being described. The type of the LSA is
+        expressed as a canonical name.";
+    }
+  }
+
+  grouping ospfv2-lsdb-area-lsa-state {
+    description
+      "Generic parameters of an OSPFv2 LSA";
+
+    leaf link-state-id {
+      type yang:dotted-quad;
+      description
+        "The Link State ID for the specified LSA type. The exact
+        defined value of the Link State ID is dependent on the LSA
+        type.";
+    }
+
+    leaf advertising-router {
+      type yang:dotted-quad;
+      description
+        "The router ID of the router that originated the LSA";
+    }
+
+    leaf sequence-number {
+      type int32;
+      description
+        "A signed 32-bit integer used to detect old and duplicate
+        LSAs. The greater the sequence number the more recent the
+        LSA.";
+    }
+
+    leaf checksum {
+      type uint16;
+      description
+        "The checksum of the complete contents of the LSA excluding
+        the age field.";
+    }
+
+    leaf age {
+      type uint16;
+      units seconds;
+      description
+        "The time since the LSA's generation in seconds";
+    }
+  }
+
+  grouping ospfv2-lsdb-router-lsa-structure {
+    description
+      "Structural grouping for Router LSA contents within the LSDB";
+
+    container router-lsa {
+      description
+        "Contents of the router LSA";
+
+      container state {
+        description
+          "State parameters of the router LSA";
+        uses ospfv2-lsdb-router-lsa-state;
+      }
+
+      uses ospfv2-lsdb-generic-lsa-tos-metric-structure;
+    }
+  }
+
+  grouping ospfv2-lsdb-generic-lsa-tos-metric-structure {
+    description
+      "Grouping including a generic TOS/metric structure for an
+      LSA";
+
+    container types-of-service {
+      description
+        "Breakdown of LSA contents specifying multiple
+        TOS values";
+
+      list type-of-service {
+        key "tos";
+        description
+          "Per-type of service parameters for the LSA";
+
+        leaf tos {
+          type leafref {
+            path "../state/tos";
+          }
+          description
+            "Reference to the type of service identifier which is
+            specified in the LSA";
+        }
+
+        container state {
+          description
+            "Per-TOS parameters for the LSA";
+
+          uses ospfv2-lsdb-generic-lsa-tos-metric-state;
+        }
+      }
+    }
+  }
+
+  grouping ospfv2-lsdb-network-lsa-structure {
+    description
+      "Structural grouping for Network LSA contents within the LSDB";
+
+    container network-lsa {
+      description
+        "Contents of the network LSA";
+
+      container state {
+        description
+          "State parameters of the network LSA";
+        uses ospfv2-lsdb-network-lsa-state;
+      }
+    }
+  }
+
+  grouping ospfv2-lsdb-summary-lsa-structure {
+    description
+      "Structural grouping for the Summary LSA contents within the
+      LSDB";
+
+    container summary-lsa {
+      description
+        "Contents of the summary LSA";
+
+      container state {
+        description
+          "State parameters of the summary LSA";
+        uses ospfv2-lsdb-summary-lsa-state;
+      }
+
+      uses ospfv2-lsdb-generic-lsa-tos-metric-structure;
+    }
+  }
+
+  grouping ospfv2-lsdb-asexternal-lsa-structure {
+    description
+      "Structural grouping for the AS External LSA contents within
+      the LSDB";
+
+    container as-external-lsa {
+      description
+        "Contents of the AS External LSA";
+
+      container state {
+        description
+          "State parameters for the AS external LSA";
+        uses ospfv2-lsdb-asexternal-lsa-state;
+      }
+
+      container types-of-service {
+        description
+          "Breakdown of External LSA contents specifying multiple
+          TOS values";
+
+        list type-of-service {
+          key "tos";
+          description
+            "Per-type of service parameters for the AS External LSA";
+
+          leaf tos {
+            type leafref {
+              path "../state/tos";
+            }
+            description
+              "Reference to the type of service identifier which is
+              specified in the AS External LSA";
+          }
+
+          container state {
+            description
+              "Per-TOS parameters for the LSA";
+
+            uses ospfv2-lsdb-asexternal-tos-state;
+          }
+        }
+      }
+
+    }
+  }
+
+  grouping ospfv2-lsdb-nssa-external-lsa-structure {
+    description
+      "Structural grouping for the NSSA External LSA contents within
+      the LSDB";
+
+    container nssa-external-lsa {
+      description
+        "Contents of the NSSA External LSA";
+
+      container state {
+        description
+          "State parameters for the AS external LSA";
+        // Type 7 LSAs are are a super-set of Type 5 LSAs so we simply
+        // include the Type 5
+        uses ospfv2-lsdb-asexternal-lsa-state;
+        uses ospfv2-lsdb-nssa-external-lsa-state;
+      }
+
+      container types-of-service {
+        description
+          "Breakdown of the NSSA External LSA contents specifying multiple
+          TOS values";
+
+        list type-of-service {
+          key "tos";
+          description
+            "Per-type of service parameters for the NSSA external LSA";
+
+          leaf tos {
+            type leafref {
+              path "../state/tos";
+            }
+            description
+              "Reference to the type of services identifier which is specified
+              in the NSSA External LSA";
+          }
+
+          container state {
+            description
+              "Per-TOS parameters for the LSA";
+            uses ospfv2-lsdb-asexternal-tos-state;
+          }
+        }
+      }
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-lsa-structure {
+    description
+      "Structural grouping for Opaque LSA contents within the LSDB";
+
+    container opaque-lsa {
+      description
+        "Contents of the opaque LSA";
+
+      container state {
+        description
+          "State parameters for the opaque LSA";
+        uses ospfv2-lsdb-opaque-lsa-state;
+      }
+
+      container traffic-engineering {
+        when "../state/type = 'TRAFFIC_ENGINEERING'" {
+          description
+            "Include the traffic-engineering information when
+            the Opaque LSA being described is a Traffic Engineering
+            LSA";
+        }
+        description
+          "Contents of the Traffic Engineering Opaque LSA";
+
+        container tlvs {
+          description
+            "The TLVs contained in the TE Opaque LSA";
+          list tlv {
+            // this is an unkeyed list
+            description
+              "The Type-Length-Value tuples included in the TE LSA";
+
+            container state {
+              description
+                "The contents of the TLV tuple within the TE LSA";
+              uses ospfv2-lsdb-opaque-lsa-te-tlv-state;
+            }
+
+            uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+            container router-address {
+              when "../state/type = 'TE_ROUTER_ADDRESS'" {
+                description
+                  "Include the router address container only when the type
+                  of the TLV is Router Address";
+              }
+
+              description
+                "Parameters included in the Router Address TLV";
+
+              container state {
+                description
+                  "State parameters of the router address TLV";
+                uses ospfv2-lsdb-opaque-te-router-address-state;
+              }
+            }
+
+            container link {
+              when "../state/type = 'TE_ROUTER_LINK'" {
+                description
+                  "Include the link container only when the type of the
+                  TLV describes a traffic engineering link";
+              }
+
+              description
+                "Parameters included in the Link TLV";
+              container sub-tlvs {
+                description
+                  "Sub-TLVs included in the Link TLV";
+
+                list sub-tlv {
+                  // unkeyed list
+                  description
+                    "The Sub-TLVs included within the Traffic Engineering
+                    LSA's sub-TLV";
+
+                  container state {
+                    description
+                      "State parameters of the Link Sub-TLV";
+
+                    uses ospfv2-lsdb-opaque-te-link-state;
+                  }
+
+                  uses ospfv2-lsdb-common-unknown-subtlv-structure;
+
+                  container unreserved-bandwidths {
+                    description
+                      "The unreserved link bandwidths for the Traffic
+                      Engineering LSA - utilised when the sub-TLV type
+                      indicates that the sub-TLV describes unreserved
+                      bandwidth";
+
+                    list unreserved-bandwidth {
+                      key "priority";
+
+                      description
+                        "The unreserved bandwidth at each priority level";
+
+                      leaf priority {
+                        type leafref {
+                          path "../state/priority";
+                        }
+                        description
+                          "A reference to the priority level being described";
+                      }
+
+                      container state {
+                        description
+                          "State parameters relating to the unreserved
+                          bandwidth of the link being described";
+                        uses ospfv2-lsdb-opaque-te-link-unreserved-bw-state;
+                      }
+                    }
+                  }
+
+                  container administrative-groups {
+                    description
+                      "The administrative groups that are set for the
+                      Traffic Engineering LSA - utilised when the sub-TLV type
+                      indicates that the sub-TLV describes administrative
+                      groups";
+
+                    list admin-group {
+                      key "bit-index";
+
+                      description
+                        "The administrative group described within the
+                        sub-TLV";
+
+                      leaf bit-index {
+                        type leafref {
+                          path "../state/bit-index";
+                        }
+                        description
+                          "A reference to the bit index being described";
+                      }
+
+                      container state {
+                        description
+                          "State parameters relating to the administrative
+                          groups being described for the link";
+                        uses ospfv2-lsdb-opaque-te-link-admin-group-state;
+                      }
+                    }
+                  }
+                }
+              }
+            }
+
+            container node-attribute {
+              when "../state/type = 'TE_NODE_ATTRIBUTE'" {
+                description
+                  "Include the node-attribute container only when the type of
+                  the TLV describes a node attribute";
+              }
+
+              description
+                "Parameters included in the Node Attribute TLV";
+
+              container sub-tlvs {
+                description
+                  "Sub-TLVs of the Node Attribute TLV of the Traffic
+                  Engineering LSA";
+
+                list sub-tlv {
+                  // unkeyed list
+                  description
+                    "List of the Sub-TLVs contained within the Node Attribute
+                    TLV";
+
+                  container state {
+                    description
+                      "State parameters of the Node Attribute TLV sub-TLV";
+                    uses ospfv2-lsdb-opaque-te-node-attribute-state;
+                  }
+
+                  uses ospfv2-lsdb-common-unknown-subtlv-structure;
+                }
+              }
+            }
+
+            // A set of TLVs are omitted here - based on operational
+            // requirements, these are:
+            // * link-local
+            // * ipv6-address (OSPFv3 only)
+            // * optical-node-property
+          }
+        }
+      } // traffic-engineering
+
+      container grace-lsa {
+        when "../state/type = 'GRACE_LSA'" {
+          description
+            "Include the grace-lsa container when the opaque LSA is specified
+            to be of that type.";
+        }
+
+        description
+          "The Grace LSA is utilised when a remote system is undergoing
+          graceful restart";
+
+        container tlvs {
+          description
+            "TLVs of the Grace LSA";
+
+          list tlv {
+            description
+              "TLV entry in the Grace LSA, advertised by a system undergoing
+              graceful restart";
+
+            // unkeyed list
+            container state {
+              description
+                "Per-TLV state parameters of the Grace LSA";
+              uses ospfv2-lsdb-opaque-grace-state;
+            }
+            uses ospfv2-lsdb-common-unknown-tlv-structure;
+          }
+        }
+      } // grace LSA
+
+      container router-information {
+        when "../state/type = 'ROUTER_INFORMATION_LSA'" {
+          description
+            "Include the router-information container when the opaque LSA
+            type is specified to be an RI LSA";
+        }
+
+        description
+          "The router information LSA is utilised to advertise capabilities
+          of a system to other systems who receive the LSA";
+
+        container tlvs {
+          description
+            "The TLVs included within the Router Information LSA.";
+
+          list tlv {
+            description
+              "TLV entry in the Router Information LSA";
+
+            // unkeyed list
+            container state {
+              description
+                "Per-TLV state parameters of the RI LSA";
+              uses ospfv2-lsdb-opaque-ri-state;
+            }
+
+            uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+            container informational-capabilities {
+              when "../state/type = 'RI_INFORMATIONAL_CAPABILITIES'" {
+                description
+                  "Include the informational capabilities specification when
+                  the TLV of the RI LSA is specified to be of this type";
+              }
+
+              description
+                "Information related to the capabilities of the advertising
+                router within the scope that the opaque RI LSA is being
+                advertised";
+
+              container state {
+                description
+                  "State parameters of the informational capabilitis of the
+                  RI LSA";
+                uses ospfv2-lsdb-opaque-ri-informational-state;
+              }
+            }
+
+            container node-administrative-tags {
+              when "../state/type = 'RI_NODE_ADMIN_TAG'" {
+                description
+                  "Include the node administrative tags specification when
+                  the TLV of the RI LSA is specified to be of this type";
+              }
+
+              description
+                "Per-node administrative tags associated with the local system
+                specified by the operator";
+
+              container state {
+                description
+                  "State parameters of the node administrative tags advertised
+                  in the RI LSA";
+                uses ospfv2-lsdb-opaque-ri-admintag-state;
+              }
+            }
+
+            container segment-routing-algorithm {
+              when "../state/type = 'RI_SR_ALGORITHM'" {
+                description
+                  "Include the segment routing algorithm specific parameters when
+                  the TLV of the RI LSA is specified to be of this type";
+              }
+
+              description
+                "The algorithms supported for Segment Routing by the local system";
+
+              container state {
+                description
+                  "State parameters of the Segment Routing algorithm advertised in
+                  the RI LSA";
+                uses ospfv2-lsdb-opaque-ri-sralgo-state;
+              }
+            }
+
+            container segment-routing-sid-label-range {
+              when "../state/type = 'RI_SR_SID_LABEL_RANGE'" {
+                description
+                  "Include the segment routing SID/Label range TLV specific state when
+                  the TLV of the RI LSA is specified to be of this type";
+              }
+
+              description
+                "The Segment Identifier (SID) or label ranges that are supported by
+                the local system for Segment Routing";
+
+              container tlvs {
+                description
+                  "Sub-TLVs of the SID/Label range TLV of the RI LSA";
+
+                list tlv {
+                  // unkeyed list
+                  description
+                    "Sub-TLVs of the SID/Label range TLV";
+
+                  uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+                  container state {
+                    description
+                      "State parameters of the sub-TLVs of the SR/Label range TLV";
+                    uses ospfv2-lsdb-opaque-ri-srrange-tlv-state;
+                  }
+
+                  container sid-label {
+                    description
+                      "Sub-TLV used to advertise the SID or label associated with the
+                      subset of the SRGB being advertised";
+
+                    container state {
+                      description
+                        "State parameters of the SID/Label sub-TLV of the SR/Label
+                        range TLV of the RI LSA";
+                      uses ospfv2-lsdb-opaque-ri-srrange-sid-label-tlv-state;
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      } // router-information
+
+      container extended-prefix {
+        when "../state/type = 'OSPFV2_EXTENDED_PREFIX'" {
+          description
+            "Include the extended-prefix container when the opaque LSA
+            type is specified to be an extended prefix LSA";
+        }
+
+        description
+          "An OSPFv2 Extended Prefix Opaque LSA, used to encapsulate
+          TLV attributes associated with a prefix advertised in OSPF.";
+
+        reference "RFC7684 - OSPFv2 Prefix/Link Attribute Advertisement";
+
+        container state {
+          description
+            "State parameters of the Extended Prefix LSA";
+          uses ospfv2-lsdb-extended-prefix-state;
+        }
+
+        container tlvs {
+          description
+            "TLVs contained within the Extended Prefix LSA";
+
+          list tlv {
+            // unkeyed list
+            description
+              "A TLV contained within the extended prefix LSA";
+
+            container state {
+              description
+                "State parameters relating to the sub-TLV of the extended
+                prefix LSA";
+              uses ospfv2-lsdb-extended-prefix-tlv-state;
+            }
+
+            container extended-prefix-range {
+              when "../state/type = 'EXTENDED_PREFIX_RANGE'" {
+                description
+                  "Include the prefix range sub-TLV when the type of the
+                  sub-TLV is specified as such";
+              }
+
+              description
+                "State parameters relating to the extended prefix range
+                sub-TLV of the extended prefix LSA";
+
+              container state {
+                description
+                  "State parameters relating to the Extended Prefix Range
+                  sub-TLV of the Extended Prefix LSA";
+                uses ospfv2-lsdb-extended-prefix-range-state;
+              }
+            }
+
+            container prefix-sid {
+              when "../state/type = 'PREFIX_SID'" {
+                description
+                  "Include parameters relating to the Prefix SID when the type
+                  of the sub-TLV is indicated as such";
+              }
+
+              description
+                "State parameters relating to the Prefix SID sub-TLV of the
+                extended prefix LSA";
+
+              container state {
+                description
+                  "State parameters relating to the Prefix SID sub-TLV of the
+                  extended prefix LSA";
+                uses ospfv2-lsdb-extended-prefix-prefix-sid-state;
+              }
+            } // prefix-sid
+
+            container sid-label-binding {
+              when "../state/type = 'SID_LABEL_BINDING'" {
+                description
+                  "Include parameters relating to the SID/Label binding sub-TLV
+                  only when the type is indicated as such";
+              }
+
+              description
+                "State parameters relating to the SID/Label binding sub-TLV
+                of the extended prefix LSA";
+
+              container state {
+                description
+                  "State parameters relating to the SID/Label binding sub-TLV
+                  of the extended prefix LSA";
+                uses ospfv2-lsdb-extended-prefix-sid-label-binding-state;
+              }
+
+              container tlvs {
+                description
+                  "TLVs contained within the SID/Label Binding sub-TLV of the
+                  SID/Label Binding TLV";
+
+                list tlv {
+                  description
+                    "A TLV contained within the SID/Label Binding sub-TLV";
+
+                  container state {
+                    description
+                      "State parameters relating to the SID/Label Binding
+                      sub-TLV";
+                    uses ospfv2-lsdb-extended-prefix-sid-label-binding-tlv-state;
+                  }
+
+                  container sid-label-binding {
+                    when "../state/type = 'SID_LABEL_BINDING'" {
+                      description
+                        "Include the SID/Label Binding sub-TLV parameters only
+                        when the type is indicated as such";
+                    }
+
+                    description
+                      "Parameters for the SID/Label Binding sub-TLV of the
+                      SID/Label binding TLV";
+
+                    container state {
+                      description
+                        "State parameteres relating to the SID/Label Binding
+                        sub-TLV";
+                      uses ospfv2-lsdb-extprefix-sid-label-binding-state;
+                    }
+                  } // sid-label-binding
+
+                  container ero-metric {
+                    when "../state/type = 'ERO_METRIC'" {
+                      description
+                        "Include the ERO Metric sub-TLV parameters only when
+                        the type is indicated as such";
+                    }
+
+                    description
+                      "Parameters for the ERO Metric Sub-TLV of the SID/Label
+                      binding TLV";
+
+                    container state {
+                      description
+                        "State parameters relating to the ERO Metric Sub-TLV of
+                        the SID/Label binding TLV";
+                      uses ospfv2-lsdb-extprefix-sid-label-ero-metric-state;
+                    }
+                  } // ero-metric
+
+                  container ero-path {
+                    when "../state/type = 'ERO_PATH'" {
+                      description
+                        "Include the ERO Path sub-TLV parameters only when the
+                        type is indicated as such";
+                    }
+
+                    description
+                      "Parameters for the ERO Path Sub-TLV of the SID/Label
+                      binding TLV";
+
+                    container segments {
+                      description
+                        "Segments of the path described within the SID/Label
+                        Binding sub-TLV";
+
+                      list segment {
+                        description
+                          "A segment of the path described within the sub-TLV";
+
+                        container state {
+                          description
+                            "State parameters relating to the path segment
+                            contained within the sub-TLV";
+                          uses ospfv2-lsdb-extprefix-sid-lbl-ero-path-seg-state;
+                        }
+
+                        container ipv4-segment {
+                          when "../state/type = 'IPV4_SEGMENT'" {
+                            description
+                              "Include the IPv4 segment only when the type is
+                              indicated as such";
+                          }
+
+                          description
+                            "Details of the IPv4 segment interface of the ERO";
+
+                          container state {
+                            description
+                              "State parameters of the IPv4 segment of the ERO";
+                            uses ospfv2-lsdb-extprefix-sid-lbl-ero-ipv4-state;
+                          }
+                        } // ipv4-segment
+
+                        container unnumbered-hop {
+                          when "../state/type = 'UNNUMBERED_INTERFACE_SEGMENT'" {
+                            description
+                              "Include the unnumbered segment only when the
+                              type is indicated as such";
+                          }
+
+                          description
+                            "Details of the unnumbered interface segment of the
+                            ERO";
+
+                          container state {
+                            description
+                              "State parameters of the unnumbered interface
+                              segment of the ERO";
+                            uses ospfv2-lsdb-extprefix-sid-lbl-ero-unnum-state;
+                          }
+                        } // unnumbered-hop
+                      } // tlv
+                    } // tlvs
+                  }
+                }
+              }
+            } // sid-label-binding
+
+            uses ospfv2-lsdb-common-unknown-tlv-structure;
+          }
+        }
+      } // extended-prefix
+
+      container extended-link {
+        description
+          "The OSPFv2 Extended Link Opaque LSA, used to encapsulate TLV
+          attributes associated with a link advertised in OSPF.";
+
+        reference "RFC7684 - OSPFv2 Prefix/Link Attribute Advertisement";
+
+        container state {
+          description
+            "State parameters of the Extended Link LSA";
+          uses ospfv2-lsdb-extended-link-state;
+        }
+
+        container tlvs {
+          description
+            "TLVs contained within the Extended Link LSA";
+
+          list tlv {
+            description
+              "List of TLVs within the Extended Link LSA";
+
+            container state {
+              description
+                "State parameters relating to the sub-TLV of the extended link
+                LSA";
+              uses ospfv2-lsdb-extended-link-tlv-state;
+            }
+
+            uses ospfv2-lsdb-common-unknown-tlv-structure;
+
+            container adjacency-sid {
+              when "../state/type = 'ADJACENCY_SID'" {
+                description
+                  "Include the Adjacency SID parameters only when the type of
+                  the sub-TLV is indicated as such";
+              }
+
+              description
+                "Parameters relating to an Adjacency SID sub-TLV of the
+                extended link LSA";
+
+              container state {
+                description
+                  "State parameters relating to an Adjacency SID";
+
+                uses ospfv2-lsdb-extended-link-adj-sid-state;
+              }
+            }
+          }
+        }
+
+      } // extended-link
+
+      uses ospfv2-lsdb-common-unknown-tlv-structure;
+    }
+  }
+
+  grouping ospfv2-lsdb-generic-lsa-tos-metric-state {
+    description
+      "Per-TOS state parameters for the Router LSA";
+
+    uses ospfv2-lsdb-common-tos-metric;
+  }
+
+  grouping ospfv2-lsdb-router-lsa-state {
+    description
+      "Parameters of the router LSA";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:ROUTER_LSA_TYPES";
+      }
+      description
+        "The sub-type of the Router LSA.";
+    }
+
+    uses ospfv2-lsdb-common-link-specification;
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "The cost of utilising the link specified independent of TOS";
+    }
+
+    leaf number-links {
+      type uint16;
+      description
+        "The number of links that are described within the LSA";
+    }
+
+    leaf number-tos-metrics {
+      type uint16;
+      description
+        "The number of different TOS metrics given for this link, not
+        including the link metric (which is referred to as TOS 0).";
+    }
+  }
+
+  grouping ospfv2-lsdb-network-lsa-state {
+    description
+      "Parameters of the Network LSA";
+
+    leaf network-mask {
+      type uint8 {
+        range "0..32";
+      }
+      description
+        "The mask of the network described by the Network LSA
+        represented as a CIDR mask.";
+    }
+
+    leaf-list attached-router {
+      type yang:dotted-quad;
+      description
+        "A list of the router ID of the routers that are attached to
+        the network described by the Network LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-summary-lsa-state {
+    description
+      "Parameters of the Summary LSA";
+
+    leaf network-mask {
+      type uint8 {
+        range "0..32";
+      }
+      description
+        "The mask of the network described by the Summary LSA
+        represented as a CIDR mask.";
+    }
+  }
+
+  grouping ospfv2-lsdb-asexternal-lsa-common-parameters {
+    description
+      "Common parameters that are used for OSPFv2 AS External LSAs";
+
+    leaf forwarding-address {
+      type inet:ipv4-address-no-zone;
+      description
+        "The destination to which traffic for the external prefix
+        should be advertised. When this value is set to 0.0.0.0 then
+        traffic should be forwarded to the LSA's originator";
+    }
+
+    leaf external-route-tag {
+      type uint32;
+      description
+        "An opaque tag that set by the LSA originator to carry
+        information relating to the external route";
+    }
+  }
+
+  grouping ospfv2-lsdb-asexternal-lsa-state {
+    description
+      "Parameters for the AS External LSA";
+
+    leaf mask {
+      type uint8 {
+        range "0..32";
+      }
+      description
+        "The subnet mask for the advertised destination";
+    }
+
+    leaf metric-type {
+      type enumeration {
+        enum "TYPE_1" {
+          description
+            "When the metric of a prefix is specified as Type 1
+            then it is considered to be expressed in the same units as
+            the link-state metrics carried in OSPF. That is to say
+            that the metric advertised is directly compared to the
+            internal cost";
+        }
+        enum "TYPE_2" {
+          description
+            "When the metric of a prefix is specified as Type 2 then
+            it is considered to be expressed as a cost in addition to
+            that of the link-state metric to the advertising router.
+            That is to say that the metric is considered to be the
+            cost to the advertising router plus the advertised metric
+            for the external entity";
+        }
+      }
+      description
+        "The type of metric included within the AS External LSA.";
+    }
+
+    leaf metric {
+      type oc-ospf-types:ospf-metric;
+      description
+        "The cost to reach the external network specified. The exact
+        interpretation of this cost is dependent on the type of
+        metric specified";
+    }
+
+    uses ospfv2-lsdb-asexternal-lsa-common-parameters;
+  }
+
+  grouping ospfv2-lsdb-asexternal-tos-state {
+    description
+      "Per-TOS parameters for the AS External LSA";
+
+    uses ospfv2-lsdb-asexternal-lsa-common-parameters;
+    uses ospfv2-lsdb-common-tos-metric;
+  }
+
+  grouping ospfv2-lsdb-nssa-external-lsa-state {
+    description
+      "Operational state parameters specific to the NSSA External
+      LSA";
+
+    leaf propagate {
+      type boolean;
+      description
+        "When this bit is set to true, an NSSA border router will
+        translate a Type 7 LSA (NSSA External) to a Type 5 LSA
+        (AS External).";
+      reference "RFC3101, Section 2.3";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-lsa-state {
+    description
+      "Operational state parameters specific to an Opaque LSA";
+
+    leaf scope {
+      type enumeration {
+        enum LINK {
+          description
+            "The scope of the LSA is the current link. The LSA
+            is not flooded beyond the local network. This
+            enumeration denotes a Type 9 LSA.";
+        }
+        enum AREA {
+          description
+            "The scope of the LSA is the local area. The LSA
+            is not flooded beyond the area of origin. This
+            enumeration denotes a Type 10 LSA.";
+        }
+        enum AS {
+          description
+            "The scope of the LSA is the local autonomous
+            system (AS). The flooding domain is the same
+            as a Type 5 LSA - it is not flooded into
+            stub areas or NSSAs. This enumeration denotes a
+            Type 11 LSA.";
+        }
+      }
+      description
+        "The scope of the opaque LSA. The type of the LSA
+        indicates its scope - the value of this leaf
+        determines both the flooding domain, and the type
+        of the LSA.";
+    }
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPF_OPAQUE_LSA_TYPE";
+      }
+      description
+        "The Opaque Type of the LSA. This value is used to
+        indicate the type of data carried by the opaque LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-lsa-te-tlv-state {
+    description
+      "The contents of the Traffic Engineering LSA";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPF_TE_LSA_TLV_TYPE";
+      }
+      description
+        "The type of TLV within the Traffic Engineering LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-te-unknown-state {
+    description
+      "The contents of the unknown TLV within the Traffic Engineering LSA";
+
+    uses ospfv2-lsdb-common-unknown-tlv;
+  }
+
+  grouping ospfv2-lsdb-opaque-te-link-state {
+    description
+      "The contents of the sub-TLVs of a Traffic Engineering LSA Link TLV";
+
+    leaf type {
+      type union {
+        type identityref {
+          base "oc-ospf-types:OSPF_TE_LINK_TLV_TYPE";
+        }
+        type enumeration {
+          enum UNKNOWN {
+            description
+              "The sub-TLV received in the LSA is unknown to the local
+              system";
+          }
+        }
+      }
+      description
+        "The sub-TLV type specified in the Link TLV. When the value is
+        known by the local system, a canonical name of the sub-TLV is utilised
+        - the special UNKNOWN value indicates that the system did not
+        support the sub-TLV type received in the LSA.";
+    }
+
+    leaf unknown-type {
+      when "../type = 'UNKNOWN'" {
+        description
+          "Include the unknown type field only when the sub-TLV was not
+          known to the local system";
+      }
+
+      type uint16;
+      description
+        "The value of the type field of an unknown sub-TLV";
+    }
+
+    leaf unknown-value {
+      when "../type = 'UNKNOWN'" {
+        description
+          "Include the unknown value field only when the sub-TLV was not
+          known to the local system";
+      }
+
+      type binary;
+      description
+        "The binary contents of the unknown TLV";
+    }
+
+    leaf link-type {
+      when "../type = 'TE_LINK_TYPE'" {
+        description
+          "Include the link-type field only when the sub-TLV type was a TE
+          link type";
+      }
+
+      type enumeration {
+        enum POINT_TO_POINT {
+          description
+            "The link being described by the TE LSA Link sub-TLV is a
+            point-to-point link to exactly one other system";
+        }
+        enum MULTI_ACCESS {
+          description
+            "The link being described by the TE LSA Link sub-TLV is a
+            multi-access link that supports connectivity to multiple remote
+            systems";
+        }
+        enum UNKNOWN {
+          description
+            "The link type received was unknown to the local system";
+        }
+      }
+      description
+        "The type of the link that is being described by the TE LSA Link
+        sub-TLV";
+    }
+
+    leaf link-id {
+      when "../type = 'TE_LINK_ID'" {
+        description
+          "Include the link ID field only when the sub-TLV type was a TE
+          Link identifier";
+      }
+
+      type yang:dotted-quad;
+      description
+        "The ID of the remote system. For point-to-point links, this is the
+        router ID of the neighbor. For multi-access links it is the address
+        of the designated router.";
+    }
+
+    leaf-list local-ip-address {
+      when "../type = 'TE_LINK_LOCAL_IP'" {
+        description
+          "Include the local IP address field only when the sub-TLV type was
+          a local IP address";
+      }
+
+      type inet:ipv4-address-no-zone;
+      description
+        "The IP address(es) of the local system that correspond to the
+        specified TE link";
+    }
+
+    leaf-list remote-ip-address {
+      when "../type = 'TE_LINK_REMOTE_IP'" {
+        description
+          "Include the remote IP address field only when the sub-TLV type was
+          a remote IP address";
+      }
+
+      type inet:ipv4-address-no-zone;
+      description
+        "The IP address(es) of the remote systems that are attached to the
+        specified TE link";
+    }
+
+    leaf metric {
+      when "../type = 'TE_LINK_METRIC'" {
+        description
+          "Include the traffic engineering metric only when the sub-TLV type
+          is a TE metric";
+      }
+
+      type uint32;
+      description
+        "The metric of the link that should be used for traffic engineering
+        purposes. This link may be different than the standard OSPF link
+        metric.";
+    }
+
+    leaf maximum-bandwidth {
+      when "../type = 'TE_LINK_MAXIMUM_BANDWIDTH'" {
+        description
+          "Include the traffic engineering metric only when the sub-TLV type
+          is the maximum bandwidth";
+      }
+
+      type oc-types:ieeefloat32;
+      units "bytes per second";
+      description
+        "The maximum bandwidth of the link. This value reflects the actual
+        bandwidth of the link expressed asn IEEE 32-bit floating point
+        number";
+    }
+
+    leaf maximum-reservable-bandwidth {
+      when "../type = 'TE_LINK_MAXIUMUM_RESERVABLE_BANDWIDTH'" {
+        description
+          "Include the maximum reservable bandwidth field only when the
+          sub-TLV type is the maximum reservable bandwidth";
+      }
+
+      type oc-types:ieeefloat32;
+      units "bytes per second";
+      description
+        "The maximum reservable bandwidth for the link. This value represents
+        the total bandwidth which may be used for traffic engineering
+        purposes. The value may exceed the maximum-bandwidth value
+        in cases where the link is oversubscribed. The value is reflected as
+        a 32-bit IEEE floating-point number";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-te-link-unreserved-bw-state {
+    description
+      "The per-priority unreserved bandwidth described within the unreserved
+      bandwidth sub-TLV of the Link TLV of the Traffic Engineering LSA";
+
+    leaf priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "The priority level being described";
+    }
+
+    leaf unreserved-bandwidth {
+      type oc-types:ieeefloat32;
+      description
+        "The unreserved bandwidth for at priority level P, where P is
+        equal to the priority of the current list entry. The reservable
+        bandwidth at priority P is equal to the sum of the reservable
+        bandwidth at all levels 0..P.";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-te-link-admin-group-state {
+    description
+      "Per bit administrative group status";
+
+    leaf bit-index {
+      type uint8 {
+        range "0..31";
+      }
+      description
+        "The index of the bit within the 32-bit administrative group field
+        of the Administrative Group sub-TLV of the Traffic Engineering LSA";
+    }
+
+    leaf set {
+      type boolean;
+      default false;
+      description
+        "Whether the bit is set within the administrative group field";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-te-node-attribute-state {
+    description
+      "State parameters relating to the Traffic Engineering Node Attribute
+      TLV of the Traffic Engineering LSA";
+
+    leaf type {
+      type union {
+        type identityref {
+          base "oc-ospf-types:TE_NODE_ATTRIBUTE_TLV_TYPE";
+        }
+        type enumeration {
+          enum UNKNOWN {
+            description
+              "The sub-TLV type received within the TE LSA Node Attribute TLV
+              was unknown the the local system";
+          }
+        }
+      }
+      description
+        "The type of the sub-TLV of the Node Attribute TLV contained within
+        the TE LSA. If the local system can interpret the value received the
+        canonical name of the type is utilised, otherwise the special UNKNOWN
+        value is used";
+    }
+
+    leaf-list local-ipv4-addresses {
+      when "../type = 'NODE_IPV4_LOCAL_ADDRESS'" {
+        description
+          "Include the local IPv4 addresses when the type of the sub-TLV
+          indicates that this is the contained data";
+      }
+
+      type inet:ipv4-prefix;
+      description
+        "The local IPv4 addresses of the node expressed in CIDR notation";
+    }
+
+    leaf-list local-ipv6-addresses {
+      when "../type = 'NODE_LOCAL_IPV6_ADDRESS'" {
+        description
+          "Include the local IPv6 addresses when the type of the sub-TLV
+          indicfates that this is the contained data";
+      }
+
+      type inet:ipv6-prefix;
+      description
+        "The local IPv6 addreses of the node";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-te-router-address-state {
+    description
+      "The contents of the value field of the Router Address TLV of the
+      Traffic Engineering LSA.";
+
+    leaf address {
+      type inet:ipv4-address-no-zone;
+      description
+        "A stable IP address of the advertising router, that is always
+        reachable when the router is connected to the network. Typically this
+        is a loopback address.";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-grace-state {
+    description
+      "State parameters on a per-TLV basis of the Grace LSA";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:GRACE_LSA_TLV_TYPES";
+      }
+      description
+        "The type of the sub-TLV received within the Grace LSA";
+    }
+
+    leaf period {
+      when "../type = 'GRACE_PERIOD'" {
+        description
+          "Include the period specification when the sub-TLV type is indicated
+          to be of this type";
+      }
+
+      type uint32;
+      units seconds;
+      description
+        "The number of seconds that the router's neighbors should advertise
+        the local system as fully adjacent regardless of database
+        synchronization state";
+      reference "RFC3623";
+    }
+
+    leaf reason {
+      when "../type = 'GRACE_RESTART_REASON'" {
+        description
+          "Include the restart reason when the sub-TLV type specifies this
+          is included";
+      }
+
+      type enumeration {
+        enum UNKNOWN {
+          value 0;
+          description
+            "The reason for the graceful restart is unknown";
+        }
+        enum SOFTWARE_RESTART {
+          value 1;
+          description
+            "The local system is restarting due to a software component
+            restart";
+        }
+        enum SOFTWARE_RELOAD_UPGRADE {
+          value 2;
+          description
+            "The local system is restarting due to a software reload or
+            upgrade";
+        }
+        enum CONTROL_PROCESSOR_SWITCH {
+          value 3;
+          description
+            "The local system is restarting due to a switch to a redundant
+            control plane element";
+        }
+      }
+      description
+        "The reason for the graceful restart event occurring, as advertised
+        by the restarting system";
+      reference "RFC3623";
+    }
+
+    leaf ip-interface-address {
+      when "../type = 'GRACE_IP_INTERFACE_ADDRESS'" {
+        description
+          "Include the interface address when the sub-TLV type specifies that
+          it is included";
+      }
+
+      type inet:ipv4-address-no-zone;
+      description
+        "The restarting system's IP address on the interface via which the
+        Grace LSA is being advertised.";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-state {
+    description
+      "State parameters of the Router Information Opaque LSA";
+
+    leaf type {
+      type union {
+        type identityref {
+          base "oc-ospf-types:RI_LSA_TLV_TYPES";
+        }
+        type enumeration {
+          enum UNKNOWN {
+            description
+              "The TLV received within the RI LSA is unknown";
+          }
+        }
+      }
+      description
+        "The type of sub-TLV of the Router Information opaque LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-informational-state {
+    description
+      "State parmaeters of the Router Information Informational Capabilities
+      sub-TLV";
+
+    leaf graceful-restart-capable {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the advertising system is capable of
+        OSPF graceful restart.";
+    }
+
+    leaf graceful-restart-helper {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the advertising system is capable of
+        being a helper for OSPF graceful restart";
+    }
+
+    leaf stub-router {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the advertising system is able to
+        advertise its status as a stub router";
+      reference "RFC6987";
+    }
+
+    leaf traffic-engineering {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the advertising system supports OSPFv2
+        traffic engineering capabilities";
+    }
+
+    leaf point-to-point-over-lan {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the advertising system supports treating
+        LAN adjacencies as though they were point to point";
+      reference "RFC5309";
+    }
+
+    leaf experimental-te {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to ture, the advertising system supports the
+        experimental extensions to OSPF for TE described in RFC4973";
+      reference "RFC4973";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-admintag-state {
+    description
+      "State parameters relating to the administrative tags specified for
+      a node within the RI LSA";
+
+    leaf-list administrative-tags {
+      type uint32;
+      description
+        "The set of administrative tags assigned to the local system by
+        the network operator. The meaning of these tags is opaque to OSPF
+        - and their interpretation is per-domain specific";
+      reference "RFC7777";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-unknown-state {
+    description
+      "State parameters relating to an unknown TLV within the RI LSA";
+    uses ospfv2-lsdb-common-unknown-tlv;
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-sralgo-state {
+    description
+      "State parameters relating to the SR Algorithms TLV of the RI LSA";
+
+    leaf-list supported-algorithms {
+      type identityref {
+        base "oc-ospf-types:SR_ALGORITHM";
+      }
+      description
+        "A list of the algorithms that are supported for segment routing
+        by the advertising system";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-srrange-tlv-state {
+    description
+      "State parameters relating to the SR SID/Label range TLV of the
+      RI LSA";
+
+    leaf type {
+      type union {
+        type identityref {
+          base "oc-ospf-types:OSPF_RI_SR_SID_LABEL_TLV_TYPES";
+        }
+        type enumeration {
+          enum UNKNOWN {
+            description
+              "The type of the sub-TLV advertised with the SID/Label range
+              TLV of the RI LSA is unknown to the receiving system";
+          }
+        }
+      }
+      description
+        "The type of the sub-TLV received by the local system within the
+        SR SID/Label Range TLV of the RI LSA";
+    }
+
+    leaf range-size {
+      type uint32 {
+        range "0..16777216";
+      }
+      description
+        "The number of entries within the range being described within the
+        SID/Label range TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-opaque-ri-srrange-sid-label-tlv-state {
+    description
+      "State parameters relating to the SR SID/Label sub-TLV of the SR SID/Label
+      range TLV of the RI LSA";
+
+    leaf entry-type {
+      type oc-ospf-types:sr-sid-type;
+      description
+        "The type of entry that is contained within the sub-TLV. The range may
+        be represented as either a range of MPLS labels, or numeric segment
+        identifiers";
+    }
+
+    leaf first-value {
+      type uint32;
+      description
+        "The first value within the SRGB range being specified. The type of the
+        entry is determined based on the value of the entry type as this value
+        may represent either a segment identifier or an MPLS label.";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-state {
+    description
+      "State parameters relating to an Extended Prefix LSA";
+
+    leaf route-type {
+      type enumeration {
+        enum UNSPECIFIED {
+          value 0;
+          description
+            "The prefix described in the extended prefix LSA is of an
+            unspecified type";
+        }
+        enum INTRA_AREA {
+          value 1;
+          description
+            "The prefix described in the extended prefix LSA is an intra-area
+            prefix for the advertising system";
+        }
+        enum INTER_AREA {
+          value 3;
+          description
+            "The prefix described in the extended prefix LSA is an inter-area
+            prefix for the advertising system";
+        }
+        enum AS_EXTERNAL {
+          value 5;
+          description
+            "The prefix described in the extended prefix LSA is external to the
+            autonomous system of the advertising system";
+        }
+        enum NSSA_EXTERNAL {
+          value 7;
+          description
+            "The prefix described in the extended prefix LSA externally
+            advertised from an NSSA area visibile to the advertising system";
+        }
+      }
+      description
+        "The type of prefix that is contained within the Extended Prefix LSA.
+        The information contained in sub-TLVs of the attribute is applicable
+        regardless of this value.";
+    }
+
+    uses ospfv2-lsdb-common-prefix-properties;
+
+    leaf attached {
+      type boolean;
+      default false;
+      description
+        "If this value is set to true, the prefix being advertised was
+        generated by an ABR for an inter-area prefix. The value corresponds
+        to the A-flag of the flags field of the Extended Prefix LSA";
+    }
+
+    leaf node {
+      type boolean;
+      default false;
+      description
+        "If this value is set to true, the prefix being advertised represents
+        the advertising router. Typically, the prefix within the LSA is
+        expected to be globally-reachable prefix associated with a loopback
+        interface";
+    }
+
+    leaf prefix {
+      type inet:ipv4-address-no-zone;
+      description
+        "The IPv4 prefix contained within the extended prefix LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-link-state {
+    description
+      "State parameters related to an extended link LSA";
+
+    leaf link-type {
+      type identityref {
+        base "oc-ospf-types:OSPFV2_ROUTER_LINK_TYPE";
+      }
+      description
+        "The type of link with which extended attributes are associated";
+    }
+
+    uses ospfv2-lsdb-common-link-specification;
+
+  }
+
+  grouping ospfv2-lsdb-extended-link-tlv-state {
+    description
+      "State parameters relating to a sub-TLV of the extended link LSA";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPFV2_EXTENDED_LINK_SUBTLV_TYPE";
+      }
+      description
+        "The type of the sub-TLV contained within the extended link TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-tlv-state {
+    description
+      "State parameters related to a sub-TLV of an Extended Prefix LSA";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPFV2_EXTENDED_PREFIX_SUBTLV_TYPE";
+      }
+      description
+        "The type of sub-TLV as indicated by the Extended Prefix LSA";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-range-state {
+    description
+      "Parameters of the Extended Prefix Range SubTLV";
+
+    uses ospfv2-lsdb-common-prefix-properties;
+
+    leaf range-size {
+      type uint16;
+      description
+        "The number of prefixes that are covered by the advertisement.";
+    }
+
+    leaf inter-area {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, then the prefix range is inter-area -
+        the flag is set by the ABR that advertises the Extended Prefix Range
+        TLV";
+    }
+
+    leaf prefix {
+      type inet:ipv4-prefix;
+      description
+        "The first prefix in the range of prefixes being described by the
+        extended prefix range sub-TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-prefix-sid-state {
+    description
+      "Parameters of the Prefix-SID sub-TLV";
+
+    leaf no-php {
+      type boolean;
+      default false;
+      description
+        "If this leaf is set the advertising system has indicated that the
+        prefix SID must not be popped before delivering packets to it";
+    }
+
+    leaf mapping-server {
+      type boolean;
+      default false;
+      description
+        "If this leaf is set the SID was advertised by a Segment Routing
+        mapping server";
+    }
+
+    leaf explicit-null {
+      type boolean;
+      default false;
+      description
+        "If this leaf is set, the advertising system has requested that the
+        prefix SID value should be replaced with the explicit null label
+        value";
+    }
+
+    leaf sid-value-type {
+      type enumeration {
+        enum ABSOLUTE {
+          description
+            "The SID contained in the Prefix-SID sub-TLV is an absolute
+            value";
+        }
+        enum INDEX {
+          description
+            "The SID contained in the Prefix-SID sub-TLV is an index to the
+            SRGB";
+        }
+      }
+      description
+        "Specifies the type of the value specified within the Prefix SID
+        sub-TLV - in particular, whether the value is an index or an
+        absolute value. This value corresponds with the V-flag of the Prefix
+        SID sub-TLV";
+    }
+
+    leaf sid-scope {
+      type enumeration {
+        enum LOCAL {
+          description
+            "The value of the SID is
+            significant only to the advertising system";
+        }
+        enum GLOBAL {
+          description
+            "The value of the SID is globally significant";
+        }
+      }
+      description
+        "Specifies the scope of the SID advertisement within the Prefix SID
+        sub-TLV. The scope of the SID is independent of whether the SID
+        contained is an index, or an absolute value";
+    }
+
+    leaf multi-topology-identifier {
+      type uint8;
+      description
+        "The identifier for the topology to which the Prefix SID relates. The
+        value of this leaf is a MT-ID as defined in RFC4915";
+    }
+
+    leaf algorithm {
+      type uint8;
+      description
+        "The algorithm that computes the path associated with the Prefix SID";
+    }
+
+    leaf sid-value {
+      type uint32;
+      description
+        "The value of the Prefix SID. The meaning of this value is dependent
+        upon the type of SID, and its scope. The value contained is either a
+        32-bit value indicating the index of the SID, or a 24-bit label where
+        the 20 right-most bits are used for encoding the label value";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-sid-label-binding-state {
+    description
+      "State parameters relating to the extended prefix SID SID/Label binding
+      sub-TLV";
+
+    leaf mirroring {
+      type boolean;
+      default false;
+      description
+        "When set to true, this indicates that the SID/Label Binding sub-TLV
+        entries contained within this TLV are indicative of a mirroring
+        context";
+    }
+
+    leaf multi-topology-identifier {
+      type uint8;
+      description
+        "The identifier for the topology to which the SID/Label Binding
+        sub-TLV is associated. The value of this leaf is a MT-ID as defined
+        in RFC4915";
+    }
+
+    leaf weight {
+      type uint8;
+      description
+        "The weight of the advertised binding when used for load-balancing
+        purposes";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-prefix-sid-label-binding-tlv-state {
+    description
+      "State parameters directly relating to the SID/Label Binding TLV";
+
+    leaf type {
+      type identityref {
+        base
+         "oc-ospf-types:OSPFV2_EXTENDED_PREFIX_SID_LABEL_BINDING_SUBTLV_TYPE";
+      }
+      description
+        "The type of sub-TLV that is being contained within the SID/Label
+        sub-TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-extprefix-sid-label-binding-state {
+    description
+      "State parameters relating to the SID/Label binding sub-TLV of the
+      SID/Label/Binding TLV";
+
+    uses ospfv2-lsdb-common-sr-sid-spec;
+  }
+
+  grouping ospfv2-lsdb-extprefix-sid-label-ero-metric-state {
+    description
+      "State parameters relating to the ERO Metric Sub-TLV of the SID/Label
+      Binding TLV";
+
+    leaf metric {
+      type uint32;
+      description
+        "The metric representing the aggregate IGP or TE path cost for the
+        binding included within the SID/Label Binding TLV";
+    }
+  }
+
+  grouping ospfv2-lsdb-extprefix-sid-lbl-ero-path-seg-state {
+    description
+      "State parameters relating to the a segment included within the
+      ERO Path Sub-TLV of the SID/Label Binding TLV";
+
+    leaf type {
+      type identityref {
+        base "oc-ospf-types:OSPFV2_EXTPREFIX_BINDING_ERO_PATH_SEGMENT_TYPE";
+      }
+      description
+        "The type of the segment being specified as part of the ERO";
+    }
+
+    leaf loose {
+      type boolean;
+      default false;
+      description
+        "If this leaf is set the segment is identifier as a loose path
+        segment, otherwise the path strictly follows the path specified";
+    }
+  }
+
+  grouping ospfv2-lsdb-extprefix-sid-lbl-ero-ipv4-state {
+    description
+      "State parameters relating to an IPv4 address segment included within
+      the ERO path";
+
+    leaf address {
+      type inet:ipv4-address-no-zone;
+      description
+        "The IPv4 address of the hop within the ERO";
+    }
+  }
+
+  grouping ospfv2-lsdb-extprefix-sid-lbl-ero-unnum-state {
+    description
+      "State parameters relating to an unnumbered hop within the ERO path";
+
+    leaf router-id {
+      type inet:ipv4-address-no-zone;
+      description
+        "The IPv4 router identtifier of the remote system";
+    }
+
+    leaf interface-id {
+      type uint32;
+      description
+        "The identifier assigned to the link by the remote system";
+    }
+  }
+
+  grouping ospfv2-lsdb-extended-link-adj-sid-state {
+    description
+      "State parameters relating to the Adjacency SID sub-TLV of the
+      Extended Link LSA";
+
+    leaf backup {
+      type boolean;
+      default false;
+      description
+        "When this flag is set, it indicates that the adjacency SID refers to
+        an adjacency which is eligible for protection";
+    }
+
+    leaf group {
+      type boolean;
+      default false;
+      description
+        "When this flag is set it indicates that the adjacency SID refers to
+        a group of adjacencies that have a common value";
+    }
+
+    uses ospfv2-lsdb-common-sr-sid-spec;
+
+    leaf weight {
+      type uint8;
+      description
+        "The weight of the Adjacency SID when used for load-balancing";
+    }
+
+    leaf multi-topology-identifier {
+      type uint8;
+      description
+        "The multi-topology identifier with which the adjacency SID is
+        associated";
+    }
+  }
+
+  grouping ospfv2-lsdb-structure {
+    description
+      "Structural grouping for per-area LSDB contents";
+
+    container lsdb {
+      // Top-level RO, if this were ever to become writeable then
+      // the state containers lower down need config false added
+      config false;
+      description
+        "The link-state database for the OSPFv2 area";
+
+      container state {
+        description
+          "Operational state parameters relating to the OSPFv2
+          area";
+
+        uses ospfv2-lsdb-area-state;
+      }
+
+      container lsa-types {
+        description
+          "Enclosing container for a list of LSA types that are
+          in the LSDB for the specified area";
+
+        list lsa-type {
+          key "type";
+
+          description
+            "List of LSA types in the LSDB for the specified
+            area";
+
+          leaf type {
+            type leafref {
+              path "../state/type";
+            }
+            description
+              "A reference for the LSA type being described within
+              the LSDB";
+          }
+
+          container state {
+            description
+              "Top-level operational state parameters relating to
+              an LSA within the area";
+            uses ospfv2-lsdb-area-lsa-type-state;
+          }
+
+          container lsas {
+            description
+              "Enclosing container for a list of the LSAs of
+              the specified type received by the system";
+
+            list lsa {
+              key "link-state-id";
+
+              description
+                "List of the LSAs of a specified type in the
+                LSDB for the specified area";
+
+              leaf link-state-id {
+                type leafref {
+                  path "../state/link-state-id";
+                }
+                description
+                  "Reference to the Link State ID of the LSA";
+              }
+
+              container state {
+                description
+                  "Operational state parameters relating to all
+                  LSA types";
+                uses ospfv2-lsdb-area-lsa-state;
+              }
+
+              uses ospfv2-lsdb-router-lsa-structure {
+                when "../../../state/type = 'ROUTER_LSA'" {
+                  description
+                    "Include the router LSA hierarchy solely when
+                    that LSA type is being described";
+                }
+              }
+
+              uses ospfv2-lsdb-network-lsa-structure {
+                when "../../../state/type = 'NETWORK_LSA'" {
+                  description
+                    "Include the network LSA hierarchy solely when
+                    that LSA type is being described";
+                }
+              }
+
+              uses ospfv2-lsdb-summary-lsa-structure {
+                // rjs TODO: check this syntax
+                when "../../../state/type = " +
+                  "'SUMMARY_IP_NETWORK_LSA' or " +
+                  "../../../state/type = 'SUMMARY_ASBR_LSA'" {
+                  description
+                    "Include the summary LSA hierarchy solely when
+                    that LSA type is being described";
+                }
+              }
+
+              uses ospfv2-lsdb-asexternal-lsa-structure {
+                when "../../../state/type = 'AS_EXTERNAL_LSA'" {
+                  description
+                    "Include the AS external LSA hierarchy solely when
+                    that LSA type is being described";
+                }
+              }
+
+              uses ospfv2-lsdb-nssa-external-lsa-structure {
+                when "../../../state/type = 'NSSA_AS_EXTERNAL_LSA'" {
+                  description
+                    "Include the NSSA External LSA hierarchy solely
+                    when that LSA type is being described";
+                }
+              }
+
+              uses ospfv2-lsdb-opaque-lsa-structure {
+                when "../../../state/type = 'OSPFV2_LINK_SCOPE_OPAQUE_LSA'
+                  or ../../../state/type = 'OSPFV2_AREA_SCOPE_OPAQUE_LSA'
+                  or ../../../state/type = 'OSPFV2_AS_SCOPE_OPAQUE_LSA'" {
+                  description
+                    "Include the Opaque LSA structure when type of entry
+                    being described in an opaque LSA";
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/ospf/openconfig-ospfv2.yang b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2.yang
new file mode 100644
index 0000000..afe163e
--- /dev/null
+++ b/models/openconfig/src/main/yang/ospf/openconfig-ospfv2.yang
@@ -0,0 +1,86 @@
+module openconfig-ospfv2 {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/ospfv2";
+
+  prefix "oc-ospfv2";
+
+  // import some basic types
+  //import ietf-inet-types { prefix inet; }
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // Include submodules
+  // Global:  All global context groupings;
+  include openconfig-ospfv2-global;
+  // Area:    Config/opstate for an area
+  include openconfig-ospfv2-area;
+  // Area Interface:  Config/opstate for an Interface
+  include openconfig-ospfv2-area-interface;
+  // LSDB: Operational state model covering the LSDB
+  include openconfig-ospfv2-lsdb;
+  // Common:  Content included in >1 context
+  include openconfig-ospfv2-common;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "An OpenConfig model for Open Shortest Path First (OSPF)
+    version 2";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-02-28"{
+    description
+      "Initial public release of OSPFv2";
+    reference "0.1.0";
+  }
+
+  revision "2016-06-24" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping ospfv2-top {
+    description
+      "Top-level OSPF configuration and operational state";
+
+    container ospfv2 {
+      description
+        "Top-level configuration and operational state for
+        Open Shortest Path First (OSPF) v2";
+
+      uses ospfv2-global-structural;
+
+      container areas {
+        description
+          "Configuration and operational state relating to an
+	  OSPFv2 area.";
+
+        list area {
+          key "identifier";
+
+          description
+            "The OSPFv2 areas within which the local system exists";
+
+          leaf identifier {
+            type leafref {
+              path "../config/identifier";
+            }
+            description
+              "A reference to the identifier for the area.";
+          }
+
+          uses ospfv2-area-structure;
+        }
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/platform/openconfig-platform-linecard.yang b/models/openconfig/src/main/yang/platform/openconfig-platform-linecard.yang
new file mode 100644
index 0000000..939341d
--- /dev/null
+++ b/models/openconfig/src/main/yang/platform/openconfig-platform-linecard.yang
@@ -0,0 +1,117 @@
+module openconfig-platform-linecard {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform/linecard";
+
+  prefix "oc-linecard";
+
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data related to LINECARD components in the openconfig-platform model";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2017-08-03" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping linecard-config {
+    description
+      "Configuration data for linecard components";
+
+    leaf power {
+      type oc-platform-types:component-power-type;
+      default POWER_ENABLED;
+      description
+        "Enable or disable power to the linecard";
+    }
+  }
+
+  grouping linecard-state {
+    description
+      "Operational state data for linecard components";
+
+    leaf slot-id {
+      type string;
+      description
+        "Identifier for the slot or chassis position in which the
+        linecard is installed";
+    }
+  }
+
+  grouping linecard-top {
+    description
+      "Top-level grouping for linecard data";
+
+    container linecard {
+      description
+        "Top-level container for linecard data";
+
+      container config {
+        description
+          "Configuration data for linecards";
+
+        uses linecard-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for linecards";
+
+        uses linecard-config;
+        uses linecard-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component" {
+    description
+      "Adding linecard data to physical inventory";
+
+    uses linecard-top {
+      when "current()/oc-platform:state/" +
+        "oc-platform:type = 'LINECARD'" {
+        description
+          "Augment is active when component is of type LINECARD";
+      }
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
+
diff --git a/models/openconfig/src/main/yang/platform/openconfig-platform-port.yang b/models/openconfig/src/main/yang/platform/openconfig-platform-port.yang
new file mode 100644
index 0000000..8964637
--- /dev/null
+++ b/models/openconfig/src/main/yang/platform/openconfig-platform-port.yang
@@ -0,0 +1,119 @@
+module openconfig-platform-port {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform/port";
+
+  prefix "oc-port";
+
+  // import some basic types
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data related to PORT components in the openconfig-platform model";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2016-10-24" {
+    description
+      "Initial revision";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping port-breakout-config {
+    description
+      "Configuration data for the port breakout mode";
+
+    leaf num-channels {
+      type uint8;
+      description
+        "Sets the number of channels to 'breakout' on a port
+        capable of channelization";
+    }
+
+    leaf channel-speed {
+      type identityref {
+        base oc-eth:ETHERNET_SPEED;
+      }
+      description
+        "Sets the channel speed on each channel -- the
+        supported values are defined by the
+        ETHERNET_SPEED identity";
+    }
+  }
+
+  grouping port-breakout-state {
+    description
+      "Operational state data for the port breakout mode ";
+  }
+
+  grouping port-breakout-top {
+    description
+      "Top-level grouping for port breakout data";
+
+    container breakout-mode {
+      description
+        "Top-level container for port breakout data";
+
+      container config {
+        description
+          "Configuration data for port breakout";
+
+        uses port-breakout-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for port breakout";
+
+        uses port-breakout-config;
+        uses port-breakout-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component" {
+    description
+      "Adding port breakout data to physical platform data";
+
+    uses port-breakout-top {
+      when "./state/type = 'PORT'" {
+        description
+          "This data is valid only for PORT components";
+      }
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/platform/openconfig-platform-transceiver.yang b/models/openconfig/src/main/yang/platform/openconfig-platform-transceiver.yang
new file mode 100644
index 0000000..849b534
--- /dev/null
+++ b/models/openconfig/src/main/yang/platform/openconfig-platform-transceiver.yang
@@ -0,0 +1,484 @@
+module openconfig-platform-transceiver {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform/transceiver";
+
+  prefix "oc-transceiver";
+
+  // import some basic types
+  import openconfig-platform { prefix oc-platform; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-transport-types { prefix oc-opt-types; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import ietf-yang-types { prefix yang; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    for transceivers (i.e., pluggable optics).  The module should be
+    used in conjunction with the platform model where other
+    physical entity data are represented.
+
+    In the platform model, a component of type=TRANSCEIVER is
+    expected to be a subcomponent of a PORT component.  This
+    module defines a concrete schema for the associated data for
+    components with type=TRANSCEIVER.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2017-07-08" {
+    description
+      "Adds clarification on aggregate power measurement data";
+    reference "0.3.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Adds preconfiguration data and clarified units";
+    reference "0.2.0";
+  }
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping optical-power-state {
+    description
+      "Reusable leaves related to optical power state -- these
+      are read-only state values. If avg/min/max statistics are
+      not supported, the target is expected to just supply the
+      instant value";
+
+    container output-power {
+      description
+        "The output optical power of a physical channel in units
+        of 0.01dBm, which may be associated with individual
+        physical channels, or an aggregate of multiple physical
+        channels (i.e., for the overall transceiver). For an
+        aggregate, this may be a measurement from a photodetector
+        or a a calculation performed on the device by summing up
+        all of the related individual physical channels.
+        Values include the instantaneous, average, minimum, and
+        maximum statistics. If avg/min/max statistics are not
+        supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container input-power {
+      description
+        "The input optical power of a physical channel in units
+        of 0.01dBm, which may be associated with individual
+        physical channels, or an aggregate of multiple physical
+        channels (i.e., for the overall transceiver). For an
+        aggregate, this may be a measurement from a photodetector
+        or a a calculation performed on the device by summing up
+        all of the related individual physical channels.
+        Values include the instantaneous, average, minimum, and
+        maximum statistics. If avg/min/max statistics are not
+        supported, the target is expected to just supply the
+        instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-dBm;
+    }
+
+    container laser-bias-current {
+      description
+        "The current applied by the system to the transmit laser to
+        achieve the output power. The current is expressed in mA
+        with up to two decimal precision. Values include the
+        instantaneous, average, minimum, and maximum statistics.
+        If avg/min/max statistics are not supported, the target is
+        expected to just supply the instant value";
+
+      uses oc-types:avg-min-max-instant-stats-precision2-mA;
+    }
+  }
+
+  grouping output-optical-frequency {
+    description
+      "Reusable leaves related to optical output power -- this is
+      typically configurable on line side and read-only on the
+      client-side";
+
+    leaf output-frequency {
+      type oc-opt-types:frequency-type;
+      description
+        "The frequency in MHz of the individual physical channel
+        (e.g. ITU C50 - 195.0THz and would be reported as
+        195,000,000 MHz in this model). This attribute is not
+        configurable on most client ports.";
+    }
+  }
+
+
+  grouping physical-channel-config {
+    description
+      "Configuration data for physical client channels";
+
+    leaf index {
+      type uint16 {
+        range 0..max;
+      }
+      description
+        "Index of the physical channnel or lane within a physical
+        client port";
+    }
+
+    leaf description {
+      type string;
+      description
+        "Text description for the client physical channel";
+    }
+
+    leaf tx-laser {
+      type boolean;
+      description
+        "Enable (true) or disable (false) the transmit label for the
+        channel";
+    }
+
+    leaf target-output-power {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "Target output optical power level of the optical channel,
+        expressed in increments of 0.01 dBm (decibel-milliwats)";
+    }
+  }
+
+  grouping physical-channel-state {
+    description
+      "Operational state data for client channels.";
+
+    uses output-optical-frequency;
+    uses optical-power-state;
+  }
+
+  grouping physical-channel-top {
+    description
+      "Top-level grouping for physical client channels";
+
+    container physical-channels {
+      description
+        "Enclosing container for client channels";
+
+      list channel {
+        key "index";
+        description
+          "List of client channels, keyed by index within a physical
+          client port.  A physical port with a single channel would
+          have a single zero-indexed element";
+
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Reference to the index number of the channel";
+        }
+
+        container config {
+          description
+            "Configuration data for physical channels";
+
+          uses physical-channel-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for channels";
+
+          uses physical-channel-config;
+          uses physical-channel-state;
+        }
+      }
+    }
+  }
+
+
+  grouping port-transceiver-config {
+    description
+      "Configuration data for client port transceivers";
+
+    leaf enabled {
+      type boolean;
+      description
+        "Turns power on / off to the transceiver -- provides a means
+        to power on/off the transceiver (in the case of SFP, SFP+,
+        QSFP,...) or enable high-power mode (in the case of CFP,
+        CFP2, CFP4) and is optionally supported (device can choose to
+        always enable).  True = power on / high power, False =
+        powered off";
+    }
+
+    leaf form-factor-preconf {
+      type identityref {
+        base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
+      }
+      description
+        "Indicates the type of optical transceiver used on this
+        port.  If the client port is built into the device and not
+        pluggable, then non-pluggable is the corresponding state. If
+        a device port supports multiple form factors (e.g. QSFP28
+        and QSFP+, then the value of the transceiver installed shall
+        be reported. If no transceiver is present, then the value of
+        the highest rate form factor shall be reported
+        (QSFP28, for example).
+
+        The form factor is included in configuration data to allow
+        pre-configuring a device with the expected type of
+        transceiver ahead of deployment.  The corresponding state
+        leaf should reflect the actual transceiver type plugged into
+        the system.";
+    }
+
+    leaf ethernet-pmd-preconf {
+      type identityref {
+        base oc-opt-types:ETHERNET_PMD_TYPE;
+      }
+      description
+        "The Ethernet PMD is a property of the optical transceiver
+        used on the port, indicating the type of physical connection.
+        It is included in configuration data to allow pre-configuring
+        a port/transceiver with the expected PMD.  The actual PMD is
+        indicated by the ethernet-pmd state leaf.";
+    }
+  }
+
+  grouping port-transceiver-state {
+    description
+      "Operational state data for client port transceivers";
+
+    leaf present {
+      type enumeration {
+        enum PRESENT {
+          description
+            "Transceiver is present on the port";
+        }
+        enum NOT_PRESENT {
+          description
+            "Transceiver is not present on the port";
+        }
+      }
+      description
+        "Indicates whether a transceiver is present in
+        the specified client port.";
+    }
+
+    leaf form-factor {
+      type identityref {
+        base oc-opt-types:TRANSCEIVER_FORM_FACTOR_TYPE;
+      }
+      description
+        "Indicates the type of optical transceiver used on this
+        port.  If the client port is built into the device and not
+        pluggable, then non-pluggable is the corresponding state. If
+        a device port supports multiple form factors (e.g. QSFP28
+        and QSFP+, then the value of the transceiver installed shall
+        be reported. If no transceiver is present, then the value of
+        the highest rate form factor shall be reported
+        (QSFP28, for example).";
+    }
+
+    leaf connector-type {
+      type identityref {
+        base oc-opt-types:FIBER_CONNECTOR_TYPE;
+      }
+      description
+        "Connector type used on this port";
+    }
+
+    leaf internal-temp {
+    // TODO: this should probably be removed if we add temperature
+    // as a top-level component property, i.e., transceiver temp
+    // should be reported there.
+      type int16 {
+        range -40..125;
+      }
+      description
+        "Internally measured temperature in degrees Celsius. MSA
+        valid range is between -40 and +125C. Accuracy shall be
+        better than +/- 3 degC over the whole temperature range.";
+    }
+
+    leaf vendor {
+      type string {
+        length 1..16;
+      }
+      description
+        "Full name of transceiver vendor. 16-octet field that
+        contains ASCII characters, left-aligned and padded on the
+        right with ASCII spaces (20h)";
+    }
+
+    leaf vendor-part {
+      type string {
+        length 1..16;
+      }
+      description
+        "Transceiver vendor's part number. 16-octet field that
+        contains ASCII characters, left-aligned and padded on the
+        right with ASCII spaces (20h). If part number is undefined,
+        all 16 octets = 0h";
+    }
+
+    leaf vendor-rev {
+      type string {
+        length 1..2;
+      }
+      description
+        "Transceiver vendor's revision number. 2-octet field that
+        contains ASCII characters, left-aligned and padded on the
+        right with ASCII spaces (20h)";
+    }
+
+    //TODO: these compliance code leaves should be active based on
+    //the type of port
+    leaf ethernet-pmd {
+      type identityref {
+        base oc-opt-types:ETHERNET_PMD_TYPE;
+      }
+      description
+        "Ethernet PMD (physical medium dependent sublayer) that the
+        transceiver supports. The SFF/QSFP MSAs have registers for
+        this and CFP MSA has similar.";
+    }
+
+    leaf sonet-sdh-compliance-code {
+      type identityref {
+        base oc-opt-types:SONET_APPLICATION_CODE;
+      }
+      description
+        "SONET/SDH application code supported by the port";
+    }
+
+    leaf otn-compliance-code {
+      type identityref {
+        base oc-opt-types:OTN_APPLICATION_CODE;
+      }
+      description
+        "OTN application code supported by the port";
+    }
+
+    leaf serial-no {
+      type string {
+        length 1..16;
+      }
+      description
+        "Transceiver serial number. 16-octet field that contains
+        ASCII characters, left-aligned and padded on the right with
+        ASCII spaces (20h). If part serial number is undefined, all
+        16 octets = 0h";
+    }
+
+    leaf date-code {
+      type yang:date-and-time;
+      description
+        "Representation of the transceiver date code, typically
+        stored as YYMMDD.  The time portion of the value is
+        undefined and not intended to be read.";
+    }
+
+    leaf fault-condition {
+      type boolean;
+      description
+        "Indicates if a fault condition exists in the transceiver";
+    }
+
+    uses optical-power-state;
+
+  }
+
+  grouping port-transceiver-top {
+    description
+      "Top-level grouping for client port transceiver data";
+
+    container transceiver {
+      description
+        "Top-level container for client port transceiver data";
+
+      container config {
+        description
+          "Configuration data for client port transceivers";
+
+        uses port-transceiver-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for client port transceivers";
+
+        uses port-transceiver-config;
+        uses port-transceiver-state;
+      }
+      // physical channels are associated with a transceiver
+      // component
+      uses physical-channel-top;
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-platform:components/oc-platform:component" {
+    description
+      "Adding transceiver data to physical inventory";
+
+    uses port-transceiver-top {
+      when "current()/oc-platform:state/" +
+        "oc-platform:type = 'TRANSCEIVER'" {
+        description
+          "Augment is active when component is of type TRANSCEIVER";
+      }
+    }
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    //TODO: add 'when' or other condition to make sure this
+    //leafref points to a component of type TRANSCEIVER.
+    description
+      "Adds a reference from the base interface to its corresponding
+      physical channels.";
+
+    leaf-list physical-channel {
+      type leafref {
+        path "/oc-platform:components/" +
+          "oc-platform:component[oc-platform:name=current()/../oc-platform:hardware-port]/" +
+          "oc-transceiver:transceiver/" +
+          "oc-transceiver:physical-channels/oc-transceiver:channel/" +
+          "oc-transceiver:index";
+      }
+      description
+        "For a channelized interface, list of references to the
+        physical channels (lanes) corresponding to the interface.";
+    }
+  }
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/platform/openconfig-platform-types.yang b/models/openconfig/src/main/yang/platform/openconfig-platform-types.yang
new file mode 100644
index 0000000..b73a039
--- /dev/null
+++ b/models/openconfig/src/main/yang/platform/openconfig-platform-types.yang
@@ -0,0 +1,192 @@
+module openconfig-platform-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform-types";
+
+  prefix "oc-platform-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines data types (e.g., YANG identities)
+    to support the OpenConfig component inventory model.";
+
+  oc-ext:openconfig-version "0.6.0";
+
+  revision "2017-08-16" {
+    description
+      "Added power state enumerated type";
+    reference "0.6.0";
+  }
+
+  revision "2016-12-22" {
+    description
+      "Added temperature state variable to component";
+    reference "0.5.0";
+  }
+
+  // grouping statements
+
+  grouping avg-min-max-instant-stats-precision1-celsius {
+    description
+      "Common grouping for recording temperature values in
+      Celsius with 1 decimal precision. Values include the
+      instantaneous, average, minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      units celsius;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  // identity statements
+
+  identity OPENCONFIG_HARDWARE_COMPONENT {
+    description
+      "Base identity for hardware related components in a managed
+      device.  Derived identities are partially based on contents
+      of the IANA Entity MIB.";
+    reference
+      "IANA Entity MIB and RFC 6933";
+  }
+
+
+  identity OPENCONFIG_SOFTWARE_COMPONENT {
+    description
+      "Base identity for software-related components in a managed
+      device";
+  }
+
+  // hardware types
+
+  identity CHASSIS {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Chassis component, typically with multiple slots / shelves";
+  }
+
+  identity BACKPLANE {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Backplane component for aggregating traffic, typically
+      contained in a chassis component";
+  }
+
+  identity POWER_SUPPLY {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Component that is supplying power to the device";
+  }
+
+  identity FAN {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Cooling fan, or could be some other heat-reduction component";
+  }
+
+  identity SENSOR {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Physical sensor, e.g., a temperature sensor in a chassis";
+  }
+
+  identity MODULE {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Replaceable hardware module, e.g., a daughtercard";
+  }
+
+  identity LINECARD {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Linecard component, typically inserted into a chassis slot";
+  }
+
+  identity PORT {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Physical port, e.g., for attaching pluggables and networking
+      cables";
+  }
+
+  identity TRANSCEIVER {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Pluggable module present in a port";
+  }
+
+  identity CPU {
+    base OPENCONFIG_HARDWARE_COMPONENT;
+    description
+      "Processing unit, e.g., a management processor";
+  }
+
+  identity OPERATING_SYSTEM {
+    base OPENCONFIG_SOFTWARE_COMPONENT;
+    description
+      "Operating system running on a component";
+  }
+
+  // typedef statements
+
+  typedef component-power-type {
+    type enumeration {
+      enum POWER_ENABLED {
+        description
+          "Enable power on the component";
+      }
+      enum POWER_DISABLED {
+        description
+          "Disable power on the component";
+      }
+    }
+    description
+      "A generic type reflecting whether a hardware component
+      is powered on or off";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/platform/openconfig-platform.yang b/models/openconfig/src/main/yang/platform/openconfig-platform.yang
new file mode 100644
index 0000000..377a640
--- /dev/null
+++ b/models/openconfig/src/main/yang/platform/openconfig-platform.yang
@@ -0,0 +1,376 @@
+module openconfig-platform {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/platform";
+
+  prefix "oc-platform";
+
+  import openconfig-platform-types { prefix oc-platform-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines a data model for representing a system
+    component inventory, which can include hardware or software
+    elements arranged in an arbitrary structure. The primary
+    relationship supported by the model is containment, e.g.,
+    components containing subcomponents.
+
+    It is expected that this model reflects every field replacable
+    unit on the device at a minimum (i.e., additional information
+    may be supplied about non-replacable components).
+
+    Every element in the inventory is termed a 'component' with each
+    component expected to have a unique name and type, and optionally
+    a unique system-assigned identifier and FRU number.  The
+    uniqueness is guaranteed by the system within the device.
+
+    Components may have properties defined by the system that are
+    modeled as a list of key-value pairs. These may or may not be
+    user-configurable.  The model provides a flag for the system
+    to optionally indicate which properties are user configurable.
+
+    Each component also has a list of 'subcomponents' which are
+    references to other components. Appearance in a list of
+    subcomponents indicates a containment relationship as described
+    above.  For example, a linecard component may have a list of
+    references to port components that reside on the linecard.
+
+    This schema is generic to allow devices to express their own
+    platform-specific structure.  It may be augmented by additional
+    component type-specific schemas that provide a common structure
+    for well-known component types.  In these cases, the system is
+    expected to populate the common component schema, and may
+    optionally also represent the component and its properties in the
+    generic structure.
+
+    The properties for each component may include dynamic values,
+    e.g., in the 'state' part of the schema.  For example, a CPU
+    component may report its utilization, temperature, or other
+    physical properties.  The intent is to capture all platform-
+    specific physical data in one location, including inventory
+    (presence or absence of a component) and state (physical
+    attributes or status).";
+
+  oc-ext:openconfig-version "0.5.0";
+
+  revision "2016-12-22" {
+    description
+      "Added temperature state variable to component";
+    reference "0.5.0";
+  }
+
+  // grouping statements
+
+
+  grouping platform-component-properties-config {
+    description
+      "System-defined configuration data for component properties";
+
+    leaf name {
+      type string;
+      description
+        "System-supplied name of the property -- this is typically
+        non-configurable";
+    }
+
+    leaf value {
+      type union {
+        type string;
+        type boolean;
+        type int64;
+        type uint64;
+        type decimal64 {
+          fraction-digits 2;
+        }
+      }
+      description
+        "Property values can take on a variety of types.  Signed and
+        unsigned integer types may be provided in smaller sizes,
+        e.g., int8, uint16, etc.";
+    }
+  }
+
+  grouping platform-component-properties-state {
+    description
+      "Operational state data for component properties";
+
+    leaf configurable {
+      type boolean;
+      description
+        "Indication whether the property is user-configurable";
+    }
+  }
+
+  grouping platform-component-properties-top {
+    description
+      "Top-level grouping ";
+
+    container properties {
+      description
+        "Enclosing container ";
+
+      list property {
+        key "name";
+        description
+          "List of system properties for the component";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the property name.";
+        }
+
+        container config {
+          description
+            "Configuration data for each property";
+
+          uses platform-component-properties-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each property";
+
+          uses platform-component-properties-config;
+          uses platform-component-properties-state;
+        }
+      }
+    }
+  }
+
+  grouping platform-subcomponent-ref-config {
+    description
+      "Configuration data for subcomponent references";
+
+    leaf name {
+      type leafref {
+        path "../../../../../component/config/name";
+      }
+      description
+        "Reference to the name of the subcomponent";
+    }
+  }
+
+  grouping platform-subcomponent-ref-state {
+    description
+      "Operational state data for subcomponent references";
+
+  }
+
+  grouping platform-subcomponent-ref-top {
+    description
+      "Top-level grouping for list of subcomponent references";
+
+    container subcomponents {
+      description
+        "Enclosing container for subcomponent references";
+
+      list subcomponent {
+        key "name";
+        description
+          "List of subcomponent references";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the name list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses platform-subcomponent-ref-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses platform-subcomponent-ref-config;
+          uses platform-subcomponent-ref-state;
+        }
+      }
+    }
+  }
+
+  grouping platform-component-config {
+    description
+      "Configuration data for components";
+
+    leaf name {
+      type string;
+      description
+        "Device name for the component -- this will not be a
+        configurable parameter on many implementations";
+    }
+  }
+
+  grouping platform-component-state {
+    description
+      "Operational state data for device components.";
+
+    leaf type {
+      type union {
+        type identityref {
+          base oc-platform-types:OPENCONFIG_HARDWARE_COMPONENT;
+        }
+        type identityref {
+          base oc-platform-types:OPENCONFIG_SOFTWARE_COMPONENT;
+        }
+      }
+      description
+        "Type of component as identified by the system";
+    }
+
+    leaf id {
+      type string;
+      description
+        "Unique identifier assigned by the system for the
+        component";
+    }
+
+    leaf description {
+      type string;
+      description
+        "System-supplied description of the component";
+    }
+
+    leaf mfg-name {
+      type string;
+      description
+        "System-supplied identifier for the manufacturer of the
+        component.  This data is particularly useful when a
+        component manufacturer is different than the overall
+        device vendor.";
+    }
+
+    leaf version {
+      type string;
+      description
+        "System-defined version string for a hardware, firmware,
+        or software component.";
+    }
+
+    leaf serial-no {
+      type string;
+      description
+        "System-assigned serial number of the component.";
+    }
+
+    leaf part-no {
+      type string;
+      description
+        "System-assigned part number for the component.  This should
+        be present in particular if the component is also an FRU
+        (field replacable unit)";
+    }
+  }
+
+  grouping platform-component-temp-state {
+    description
+      "Temperature state data for device components";
+
+    container temperature {
+      description
+        "Temperature in degrees Celsius of the component. Values include
+        the instantaneous, average, minimum, and maximum statistics. If
+        avg/min/max statistics are not supported, the target is expected
+        to just supply the instant value";
+
+      uses oc-platform-types:avg-min-max-instant-stats-precision1-celsius;
+    }
+  }
+
+  grouping platform-component-top {
+    description
+      "Top-level grouping for components in the device inventory";
+
+    container components {
+      description
+        "Enclosing container for the components in the system.";
+
+      list component {
+        key "name";
+        description
+          "List of components, keyed by component name.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "References the component name";
+        }
+
+        container config {
+          description
+            "Configuration data for each component";
+
+          uses platform-component-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each component";
+
+          uses platform-component-config;
+          uses platform-component-state;
+          uses platform-component-temp-state;
+        }
+
+        uses platform-component-properties-top;
+        uses platform-subcomponent-ref-top;
+      }
+    }
+  }
+
+  // data definition statements
+
+  uses platform-component-top;
+
+
+  // augments
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    //TODO: add 'when' or other condition to make sure this
+    //leafref points to a component of type PORT.
+    description
+      "Adds a reference from the base interface to the corresponding
+      port component in the device inventory.";
+
+    leaf hardware-port {
+      type leafref {
+        path "/oc-platform:components/oc-platform:component/" +
+          "oc-platform:name";
+      }
+      description
+        "References the hardware port in the device inventory";
+    }
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-forwarding-policies.yang b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-forwarding-policies.yang
new file mode 100644
index 0000000..48e9b19
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-forwarding-policies.yang
@@ -0,0 +1,264 @@
+submodule openconfig-pf-forwarding-policies {
+  belongs-to openconfig-policy-forwarding {
+    prefix "oc-pf";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-packet-match { prefix "oc-pmatch"; }
+  import ietf-yang-types { prefix "yang"; }
+  import ietf-inet-types { prefix "inet"; }
+
+  include openconfig-pf-path-groups;
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains configuration and operational state
+    relating to the definition of policy-forwarding policies.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-06-21" {
+    description
+      "Amend policy forwarding model based on ACL changes.";
+    reference "0.2.0";
+  }
+
+  revision "2017-02-28" {
+    description
+      "Initial public release of policy forwarding.";
+    reference "0.1.0";
+  }
+
+  revision "2016-11-08" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping pf-forwarding-policy-structural {
+    description
+      "Structural grouping defining forwarding policies under the
+      policy- forwarding module.";
+
+    container policies {
+      description
+        "Forwarding policies defined to enact policy-based forwarding
+        on the local system.";
+
+      list policy {
+        key "policy-id";
+
+        description
+          "A forwarding policy is defined to have a set of match
+          criteria, allowing particular fields of a packet's header to
+          be matched, and a set of forwarding actions which determines
+          how the local system should forward the packet.";
+
+        leaf policy-id {
+          type leafref {
+            path "../config/policy-id";
+          }
+          description
+            "Reference to the identifier for the forwarding-policy.";
+        }
+
+        container config {
+          description
+            "Configuration options relating to the forwarding
+            policy.";
+          uses pf-forwarding-policy-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the forwarding
+            policy.";
+          uses pf-forwarding-policy-config;
+        }
+
+        container rules {
+          description
+            "The criteria that should be matched for a packet to be
+            forwarded according to the policy action.";
+
+          list rule {
+            key "sequence-id";
+
+            description
+              "A match rule for the policy. In the case that multiple
+              criteria are specified within a single ";
+
+            leaf sequence-id {
+              type leafref {
+                path "../config/sequence-id";
+              }
+              description
+                "A unique sequence identifier for the match rule.";
+            }
+
+            container config {
+              description
+                "Configuration parameters relating to the match
+                rule.";
+              uses pf-forwarding-policy-rule-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the match
+                rule.";
+              uses pf-forwarding-policy-rule-config;
+              uses pf-forwarding-policy-rule-state;
+            }
+
+            uses oc-pmatch:ethernet-header-top;
+            uses oc-pmatch:ipv4-protocol-fields-top;
+            uses oc-pmatch:ipv6-protocol-fields-top;
+            uses oc-pmatch:transport-fields-top;
+
+            container action {
+              description
+                "The forwarding policy action to be applied for
+                packets matching the rule.";
+
+              container config {
+                description
+                  "Configuration parameters relating to the forwarding
+                  rule's action.";
+                uses pf-forwarding-policy-action-config;
+              }
+
+              container state {
+                config false;
+                description
+                  "Operational state parameters relating to the
+                  forwarding rule's action.";
+                uses pf-forwarding-policy-action-config;
+              }
+
+            }
+          }
+        }
+      }
+    }
+  }
+
+  grouping pf-forwarding-policy-config {
+    description
+      "Configuration parameters relating to the forwarding policy.";
+
+    leaf policy-id {
+      type string;
+      description
+        "A unique name identifying the forwarding policy. This name is
+        used when applying the policy to a particular interface.";
+    }
+  }
+
+  grouping pf-forwarding-policy-rule-config {
+    description
+      "Configuration parameters relating to a policy rule.";
+
+    leaf sequence-id {
+      type uint32;
+      description
+        "Unique sequence number for the policy rule.";
+    }
+  }
+
+  grouping pf-forwarding-policy-rule-state {
+    description
+      "Operational state parameters relating to a policy rule.";
+
+    leaf matched-pkts {
+      type yang:counter64;
+      description
+        "Number of packets matched by the rule.";
+    }
+
+    leaf matched-octets {
+      type yang:counter64;
+      description
+        "Bytes matched by the rule.";
+    }
+  }
+
+  grouping pf-forwarding-policy-action-config {
+    description
+      "Forwarding policy action configuration parameters.";
+
+    leaf discard {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the local system should drop
+        packets that match the rule.";
+    }
+
+    leaf decapsulate-gre {
+      type boolean;
+      default false;
+      description
+        "When this leaf is set to true, the local system should remove
+        the GRE header from the packet matching the rule. Following
+        the decapsulation it should subsequently forward the
+        encapsulated packet according to the relevant lookup (e.g., if
+        the encapsulated packet is IP, the packet should be routed
+        according to the IP destination).";
+    }
+
+    leaf network-instance {
+      type leafref {
+
+        // We are at:
+        // $NIROOT/policy-forwarding/policies/
+        // policy/rules/rule/action/config/
+        // network-instance
+        path "../../../../../../../../config/name";
+      }
+      description
+        "When this leaf is set, packets matching the match criteria
+        for the forwarding rule should be looked up in the
+        network-instance that is referenced rather than the
+        network-instance with which the interface is associated.
+        Such configuration allows policy-routing into multiple
+        sub-topologies from a single ingress access interface, or
+        different send and receive contexts for a particular
+        interface (sometimes referred to as half-duplex VRF).";
+    }
+
+    leaf path-selection-group {
+      type leafref {
+        // We are at:
+        // $NIROOT/policy-forwarding/policies/
+        // policy/rules/rule/action/config/to-path-group
+        path "../../../../../../../path-selection-groups/" +
+             "path-selection-group/config/group-id";
+      }
+      description
+        "When path-selection-group is set, packets matching the
+        match criteria for the forwarding rule should be forwarded
+        only via one of the paths that is specified within the
+        referenced path-selection-group. The next-hop of the packet
+        within the routing context should be used to determine between
+        multiple paths that are specified within the group.";
+    }
+
+    leaf next-hop {
+      type inet:ip-address-no-zone;
+      description
+        "When an IP next-hop is specified in the next-hop field,
+        packets matching the match criteria for the forwarding rule
+        should be forwarded to the next-hop IP address, bypassing any
+        lookup on the local system.";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-interfaces.yang b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-interfaces.yang
new file mode 100644
index 0000000..41ba545
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-interfaces.yang
@@ -0,0 +1,121 @@
+submodule openconfig-pf-interfaces {
+  belongs-to openconfig-policy-forwarding {
+    prefix "oc-pf";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+
+  include openconfig-pf-forwarding-policies;
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains groupings related to the association
+    between interfaces and policy forwarding rules.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-06-21" {
+    description
+      "Amend policy forwarding model based on ACL changes.";
+    reference "0.2.0";
+  }
+
+  revision "2017-02-28" {
+    description
+      "Initial public release of policy forwarding.";
+    reference "0.1.0";
+  }
+
+  revision "2016-11-08" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+
+  grouping pf-interfaces-structural {
+    description
+      "Structural grouping for interface to forwarding policy bindings
+      within the policy-forwarding model.";
+
+    container interfaces {
+      description
+        "Configuration and operational state relating policy
+        forwarding on interfaces.";
+
+      list interface {
+        key "interface-id";
+
+        description
+          "Configuration and operationals state relating to the
+          relationship between interfaces and policy-based forwarding
+          rules.";
+
+        leaf interface-id {
+          type leafref {
+            path "../config/interface-id";
+          }
+          description
+            "A reference to the unique identifier for the interface
+            being referenced by the policy.";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to an interface to
+            policy forwarding rule binding.";
+
+          uses pf-interface-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to an interface to
+            policy forwarding rule binding.";
+
+          uses pf-interface-config;
+        }
+
+        uses oc-if:interface-ref;
+      }
+    }
+  }
+
+  grouping pf-interface-config {
+    description
+      "Configuration parameters relating to an interface to policy
+      forwarding rule binding.";
+
+    leaf interface-id {
+      type oc-if:interface-id;
+      description
+        "A unique identifier for the interface.";
+    }
+
+    leaf apply-forwarding-policy {
+      type leafref {
+        // We are at /network-instances/network-instance/
+        // policy-forwarding/interfaces/interface/config/
+        // apply-forwarding-policy
+        path "../../../../policies/policy/" +
+             "config/policy-id";
+      }
+      description
+        "The policy to be applied on the interface. Packets ingress on
+        the referenced interface should be compared to the match
+        criteria within the specified policy, and in the case that
+        these criteria are met, the forwarding actions specified
+        applied. These policies should be applied following quality of
+        service classification, and ACL actions if such entities are
+        referenced by the corresponding interface.";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-path-groups.yang b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-path-groups.yang
new file mode 100644
index 0000000..d97e8df
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy-forwarding/openconfig-pf-path-groups.yang
@@ -0,0 +1,122 @@
+submodule openconfig-pf-path-groups {
+  belongs-to openconfig-policy-forwarding {
+    prefix "oc-pf";
+  }
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains configuration and operational state
+    relating to path-selection-groups which are used to group
+    forwarding entities together to be used as policy forwarding
+    targets.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-06-21" {
+    description
+      "Amend policy forwarding model based on ACL changes.";
+    reference "0.2.0";
+  }
+
+  revision "2017-02-28" {
+    description
+      "Initial public release of policy forwarding.";
+    reference "0.1.0";
+  }
+
+  revision "2016-11-08" {
+    description
+      "Initial revision";
+    reference "0.0.1";
+  }
+
+  grouping pf-path-groups-structural {
+    description
+      "Structural grouping containing the definition of path groups
+      within the context of policy-based forwarding.";
+
+    container path-selection-groups {
+      description
+        "Surrounding container for the path selection groups defined
+        within the policy forwarding model.";
+
+      list path-selection-group {
+        key "group-id";
+
+        leaf group-id {
+          type leafref {
+            path "../config/group-id";
+          }
+          description
+            "Reference to a unique identifier for the path selection
+            group";
+
+        }
+
+        description
+          "A path selection group is a set of forwarding resources,
+          which are grouped as eligible paths for a particular
+          policy-based forwarding rule. A policy rule may select a
+          path-selection-group as the egress for a particular type of
+          traffic (e.g., DSCP value). The system then utilises its
+          standard forwarding lookup mechanism to select from the
+          paths that are specified within the group - for IP packets,
+          the destination IP address is used such that the packet is
+          routed to the entity within the path-selection-group that
+          corresponds to the next-hop for the destination IP address
+          of the packet; for L2 packets, the selection is based on the
+          destination MAC address.";
+
+        container config {
+          description
+            "Configuration parameters relating to the path selection
+            group.";
+          uses pf-path-selection-group-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters relating to the path
+            selection group.";
+          uses pf-path-selection-group-config;
+        }
+      }
+    }
+  }
+
+  grouping pf-path-selection-group-config {
+    description
+      "Configuration parameters relating to a path selection group.";
+
+    leaf group-id {
+      type string;
+      description
+        "A unique name for the path-selection-group";
+    }
+
+    leaf-list mpls-lsp {
+      type leafref {
+        // We are at /network-instances/network-instance/
+        // policy-forwarding/path-selection-groups/
+        // path-selection-group/config/mpls-lsp
+        path "../../../../../mpls/lsps/constrained-path/tunnels/" +
+             "tunnel/config/name";
+      }
+      description
+        "A set of MPLS constrained-path LSPs which should be
+        considered for the policy forwarding next-hop. In order to
+        select between the LSPs within the path-selection-group, the
+        system should determine which LSP provides the best path to
+        the next-hop for the routed packet.";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/policy-forwarding/openconfig-policy-forwarding.yang b/models/openconfig/src/main/yang/policy-forwarding/openconfig-policy-forwarding.yang
new file mode 100644
index 0000000..63dbf78
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy-forwarding/openconfig-policy-forwarding.yang
@@ -0,0 +1,119 @@
+module openconfig-policy-forwarding {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/policy-forwarding";
+
+  prefix "oc-pf";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  // Include submodules.
+  include openconfig-pf-forwarding-policies;
+  include openconfig-pf-path-groups;
+  include openconfig-pf-interfaces;
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    relating to policy-based forwarding. Policy-based forwarding is
+    utilised when a system chooses how to forward packets (including
+    applying data-plane operations such as encapsulation or
+    decapsulation) based on policies other than destination L2 or L3
+    header. Typically, systems may implement:
+
+     - IP policy-based routing, where routing may be done based on the
+       source plus destination of an IP packet; information within the
+       L4 header; or some combination of both.
+     - Encapsulation or decapsulation based on certain policy
+       information - for example, matching particular IP destinations
+       and decapsulating GRE headers.
+     - Class-based selection of egress routes - such as class-based
+       selection of an egress MPLS path.
+
+    The policies that are defined in this model are applied to a
+    particular ingress context of a network element (e.g., interface)
+    and are defined to apply following other interface policy such as
+    QoS classification and access control lists.
+
+    This module defines:
+
+     - policy-forwarding
+    |
+    |--- policies
+    |    |-- policy
+    |        |-- [match criteria]    How packets are defined to
+    |        |                       match policy.
+    |        |-- [forwarding-action] How packets matching should
+    |                                 be forwarded.
+    |--- interfaces
+    |    |-- interfaces
+    |        | -- apply-forwarding-policy  Forwarding policy to
+    |                                      used on the interface.
+    |--- path-selection-groups
+         |-- path-selection-group     A group of forwarding resources
+                                      that are grouped for purposes
+                                      of next-hop selection.
+
+    A forwarding-policy specifies the match criteria that it intends
+    to use to determine the packets that it reroutes - this may
+    consist of a number of criteria, such as DSCP. The action of the
+    policy results in a forwarding action being applied to matching
+    packets. For example, decapsulating the packet from a GRE header.
+    In order to enact the policy based on particular interfaces - the
+    forwarding-policy is applied to an interface via referencing it
+    within an 'apply-forwarding-policy' statement associated with an
+    interface.
+
+    In some cases (e.g., Class-Based Tunnel Selection) the forwarding
+    action does not resolve to a single egress action, and rather
+    normal forwarding rules are to be applied but considering a subset
+    of forwarding resources. In these cases, a path-selection-group
+    can be created, referencing the subset of forwarding paths that
+    should be used for the egress selection. In the case that a subset
+    of MPLS LSPs are eligible for, say, DSCP 46 marked packets, a
+    path-selection-group is created, referencing the subset of LSPs.
+    The forwarding action of the corresponding policy is set to
+    PATH_GROUP and references the configured group of LSPs.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-06-21" {
+    description
+      "Amend policy forwarding model based on ACL changes.";
+    reference "0.2.0";
+  }
+
+  revision "2017-02-28" {
+    description
+      "Initial public release of policy forwarding.";
+    reference "0.1.0";
+  }
+
+  revision "2016-11-08" {
+    description
+      "Initial revision.";
+    reference "0.0.1";
+  }
+
+
+  grouping policy-forwarding-top {
+    description
+      "Top-level grouping for Policy Forwarding";
+
+    container policy-forwarding {
+      description
+        "Configuration and operational state relating to policy-forwarding within
+        a network instance.";
+
+      uses pf-forwarding-policy-structural;
+      uses pf-interfaces-structural;
+      uses pf-path-groups-structural;
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/policy/openconfig-policy-types.yang b/models/openconfig/src/main/yang/policy/openconfig-policy-types.yang
new file mode 100644
index 0000000..03270f3
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy/openconfig-policy-types.yang
@@ -0,0 +1,187 @@
+module openconfig-policy-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/policy-types";
+
+  prefix "oc-pol-types";
+
+  // import some basic types
+  import ietf-yang-types { prefix yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains general data definitions for use in routing
+    policy.  It can be imported by modules that contain protocol-
+    specific policy conditions and actions.";
+
+  oc-ext:openconfig-version "3.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Replace policy choice node/type with policy-result
+      enumeration;simplified defined set naming;removed generic
+      IGP actions; migrate to OpenConfig types; added mode for
+      prefix sets";
+    reference "3.0.0";
+  }
+
+  revision "2016-05-12" {
+    description
+      "OpenConfig public release";
+    reference "2.0.1";
+  }
+
+  // identity statements
+
+  identity ATTRIBUTE_COMPARISON {
+    description
+      "base type for supported comparison operators on route
+      attributes";
+  }
+
+  identity ATTRIBUTE_EQ {
+    base ATTRIBUTE_COMPARISON;
+    description "== comparison";
+  }
+
+  identity ATTRIBUTE_GE {
+    base ATTRIBUTE_COMPARISON;
+    description ">= comparison";
+  }
+
+  identity ATTRIBUTE_LE {
+    base ATTRIBUTE_COMPARISON;
+    description "<= comparison";
+  }
+
+  typedef match-set-options-type {
+    type enumeration {
+      enum ANY {
+        description "match is true if given value matches any member
+        of the defined set";
+      }
+      enum ALL {
+        description "match is true if given value matches all
+        members of the defined set";
+      }
+      enum INVERT {
+        description "match is true if given value does not match any
+        member of the defined set";
+      }
+    }
+    default ANY;
+    description
+      "Options that govern the behavior of a match statement.  The
+      default behavior is ANY, i.e., the given value matches any
+      of the members of the defined set";
+  }
+
+  typedef match-set-options-restricted-type {
+    type enumeration {
+      enum ANY {
+        description "match is true if given value matches any member
+        of the defined set";
+      }
+      enum INVERT {
+        description "match is true if given value does not match any
+        member of the defined set";
+      }
+    }
+    default ANY;
+    description
+      "Options that govern the behavior of a match statement.  The
+      default behavior is ANY, i.e., the given value matches any
+      of the members of the defined set.  Note this type is a
+      restricted version of the match-set-options-type.";
+      //TODO: restriction on enumerated types is only allowed in
+      //YANG 1.1.  Until then, we will require this additional type
+  }
+
+  grouping attribute-compare-operators {
+    description "common definitions for comparison operations in
+    condition statements";
+
+    leaf operator {
+        type identityref {
+          base ATTRIBUTE_COMPARISON;
+        }
+        description
+          "type of comparison to be performed";
+      }
+
+    leaf value {
+      type uint32;
+      description
+        "value to compare with the community count";
+    }
+  }
+
+  typedef tag-type {
+    type union {
+      type uint32;
+      type yang:hex-string;
+    }
+    description "type for expressing route tags on a local system,
+    including IS-IS and OSPF; may be expressed as either decimal or
+    hexidecimal integer";
+    reference
+      "RFC 2178 OSPF Version 2
+      RFC 5130 A Policy Control Mechanism in IS-IS Using
+      Administrative Tags";
+  }
+
+  identity INSTALL_PROTOCOL_TYPE {
+    description
+      "Base type for protocols which can install prefixes into the
+      RIB";
+  }
+
+  identity BGP {
+    base INSTALL_PROTOCOL_TYPE;
+    description "BGP";
+    reference "RFC 4271";
+  }
+
+  identity ISIS {
+    base INSTALL_PROTOCOL_TYPE;
+    description "IS-IS";
+    reference "ISO/IEC 10589";
+  }
+
+  identity OSPF {
+    base INSTALL_PROTOCOL_TYPE;
+    description "OSPFv2";
+    reference "RFC 2328";
+  }
+
+  identity OSPF3 {
+    base INSTALL_PROTOCOL_TYPE;
+    description "OSPFv3";
+    reference "RFC 5340";
+  }
+
+  identity STATIC {
+    base INSTALL_PROTOCOL_TYPE;
+    description "Locally-installed static route";
+  }
+
+  identity DIRECTLY_CONNECTED {
+    base INSTALL_PROTOCOL_TYPE;
+    description "A directly connected route";
+  }
+
+  identity LOCAL_AGGREGATE {
+    base INSTALL_PROTOCOL_TYPE;
+    description "Locally defined aggregate route";
+  }
+}
diff --git a/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang b/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang
new file mode 100644
index 0000000..9e2a08a
--- /dev/null
+++ b/models/openconfig/src/main/yang/policy/openconfig-routing-policy.yang
@@ -0,0 +1,1091 @@
+module openconfig-routing-policy {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/routing-policy";
+
+  prefix "oc-rpol";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-policy-types { prefix oc-pol-types; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module describes a YANG model for routing policy
+    configuration. It is a limited subset of all of the policy
+    configuration parameters available in the variety of vendor
+    implementations, but supports widely used constructs for managing
+    how routes are imported, exported, and modified across different
+    routing protocols.  This module is intended to be used in
+    conjunction with routing protocol configuration models (e.g.,
+    BGP) defined in other modules.
+
+    Route policy expression:
+
+    Policies are expressed as a set of top-level policy definitions,
+    each of which consists of a sequence of policy statements. Policy
+    statements consist of simple condition-action tuples. Conditions
+    may include mutiple match or comparison operations, and similarly
+    actions may be multitude of changes to route attributes or a
+    final disposition of accepting or rejecting the route.
+
+    Route policy evaluation:
+
+    Policy definitions are referenced in routing protocol
+    configurations using import and export configuration statements.
+    The arguments are members of an ordered list of named policy
+    definitions which comprise a policy chain, and optionally, an
+    explicit default policy action (i.e., reject or accept).
+
+    Evaluation of each policy definition proceeds by evaluating its
+    corresponding individual policy statements in order.  When a
+    condition statement in a policy statement is satisfied, the
+    corresponding action statement is executed.  If the action
+    statement has either accept-route or reject-route actions, policy
+    evaluation of the current policy definition stops, and no further
+    policy definitions in the chain are evaluated.
+
+    If the condition is not satisfied, then evaluation proceeds to
+    the next policy statement.  If none of the policy statement
+    conditions are satisfied, then evaluation of the current policy
+    definition stops, and the next policy definition in the chain is
+    evaluated.  When the end of the policy chain is reached, the
+    default route disposition action is performed (i.e., reject-route
+    unless an an alternate default action is specified for the
+    chain).
+
+    Policy 'subroutines' (or nested policies) are supported by
+    allowing policy statement conditions to reference another policy
+    definition which applies conditions and actions from the
+    referenced policy before returning to the calling policy
+    statement and resuming evaluation.  If the called policy
+    results in an accept-route (either explicit or by default), then
+    the subroutine returns an effective true value to the calling
+    policy.  Similarly, a reject-route action returns false.  If the
+    subroutine returns true, the calling policy continues to evaluate
+    the remaining conditions (using a modified route if the
+    subroutine performed any changes to the route).";
+
+  oc-ext:openconfig-version "3.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Replace policy choice node/type with policy-result
+      enumeration;simplified defined set naming;removed generic
+      IGP actions; migrate to OpenConfig types; added mode for
+      prefix sets";
+    reference "3.0.0";
+  }
+
+  revision "2016-05-12" {
+    description
+      "OpenConfig public release";
+    reference "2.0.1";
+  }
+
+
+  // typedef statements
+
+  typedef default-policy-type {
+    // this typedef retained for name compatibiity with default
+    // import and export policy
+    type enumeration {
+      enum ACCEPT_ROUTE {
+        description
+          "Default policy to accept the route";
+      }
+      enum REJECT_ROUTE {
+        description
+          "Default policy to reject the route";
+      }
+    }
+    description
+      "Type used to specify route disposition in
+      a policy chain";
+  }
+
+  typedef policy-result-type {
+    type enumeration {
+      enum ACCEPT_ROUTE {
+        description "Policy accepts the route";
+      }
+      enum REJECT_ROUTE {
+        description "Policy rejects the route";
+      }
+    }
+    description
+      "Type used to specify route disposition in
+      a policy chain";
+  }
+
+
+  // grouping statements
+
+  grouping prefix-set-config {
+    description
+      "Configuration data for prefix sets used in policy
+      definitions.";
+
+    leaf name {
+      type string;
+      description
+        "name / label of the prefix set -- this is used to
+        reference the set in match conditions";
+    }
+
+    leaf mode {
+      type enumeration {
+        enum IPV4 {
+          description
+            "Prefix set contains IPv4 prefixes only";
+        }
+        enum IPV6 {
+          description
+            "Prefix set contains IPv6 prefixes only";
+        }
+        enum MIXED {
+          description
+            "Prefix set contains mixed IPv4 and IPv6 prefixes";
+        }
+      }
+      description
+        "Indicates the mode of the prefix set, in terms of which
+        address families (IPv4, IPv6, or both) are present.  The
+        mode provides a hint, but the device must validate that all
+        prefixes are of the indicated type, and is expected to
+        reject the configuration if there is a discrepancy.  The
+        MIXED mode may not be supported on devices that require
+        prefix sets to be of only one address family.";
+    }
+
+  }
+
+  grouping prefix-set-state {
+    description
+      "Operational state data for prefix sets";
+  }
+
+  grouping prefix-set-top {
+    description
+      "Top-level data definitions for a list of IPv4 or IPv6
+      prefixes which are matched as part of a policy";
+
+    container prefix-sets {
+      description
+        "Enclosing container ";
+
+      list prefix-set {
+        key "name";
+        description
+          "List of the defined prefix sets";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to prefix name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for prefix sets";
+
+          uses prefix-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses prefix-set-config;
+          uses prefix-set-state;
+        }
+
+        uses prefix-top;
+      }
+    }
+  }
+
+  grouping prefix-config {
+    description
+      "Configuration data for a prefix definition";
+
+    leaf ip-prefix {
+      type oc-inet:ip-prefix;
+      mandatory true;
+      description
+        "The prefix member in CIDR notation -- while the
+        prefix may be either IPv4 or IPv6, most
+        implementations require all members of the prefix set
+        to be the same address family.  Mixing address types in
+        the same prefix set is likely to cause an error.";
+    }
+
+    leaf masklength-range {
+      type string {
+        pattern '^([0-9]+\.\.[0-9]+)|exact$';
+      }
+      description
+        "Defines a range for the masklength, or 'exact' if
+        the prefix has an exact length.
+
+        Example: 10.3.192.0/21 through 10.3.192.0/24 would be
+        expressed as prefix: 10.3.192.0/21,
+        masklength-range: 21..24.
+
+        Example: 10.3.192.0/21 would be expressed as
+        prefix: 10.3.192.0/21,
+        masklength-range: exact";
+    }
+  }
+
+  grouping prefix-state {
+    description
+      "Operational state data for prefix definitions";
+  }
+
+  grouping prefix-top {
+    description
+      "Top-level grouping for prefixes in a prefix list";
+
+    container prefixes {
+      description
+        "Enclosing container for the list of prefixes in a policy
+        prefix list";
+
+      list prefix {
+        key "ip-prefix masklength-range";
+        description
+          "List of prefixes in the prefix set";
+
+        leaf ip-prefix {
+          type leafref {
+            path "../config/ip-prefix";
+          }
+          description
+            "Reference to the ip-prefix list key.";
+        }
+
+        leaf masklength-range {
+          type leafref {
+            path "../config/masklength-range";
+          }
+          description
+            "Reference to the masklength-range list key";
+        }
+
+        container config {
+          description
+            "Configuration data for prefix definition";
+
+          uses prefix-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for prefix definition";
+
+          uses prefix-config;
+          uses prefix-state;
+        }
+      }
+    }
+  }
+
+  grouping neighbor-set-config {
+    description
+      "Configuration data for neighbor set definitions";
+
+    leaf name {
+      type string;
+      description
+          "name / label of the neighbor set -- this is used to
+          reference the set in match conditions";
+    }
+
+    leaf-list address {
+      type oc-inet:ip-address;
+      description
+        "List of IP addresses in the neighbor set";
+    }
+  }
+
+  grouping neighbor-set-state {
+    description
+      "Operational state data for neighbor set definitions";
+  }
+
+  grouping neighbor-set-top {
+    description
+      "Top-level data definition for a list of IPv4 or IPv6
+      neighbors which can be matched in a routing policy";
+
+    container neighbor-sets {
+      description
+        "Enclosing container for the list of neighbor set
+        definitions";
+
+      list neighbor-set {
+        key "name";
+        description
+          "List of defined neighbor sets for use in policies.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the neighbor set name list key.";
+        }
+
+        container config {
+          description
+            "Configuration data for neighbor sets.";
+
+          uses neighbor-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for neighbor sets.";
+
+          uses neighbor-set-config;
+          uses neighbor-set-state;
+        }
+      }
+    }
+  }
+
+  grouping tag-set-config {
+    description
+      "Configuration data for tag set definitions.";
+
+    leaf name {
+      type string;
+      description
+        "name / label of the tag set -- this is used to reference
+        the set in match conditions";
+    }
+
+    leaf-list tag-value {
+      type oc-pol-types:tag-type;
+      description
+        "Value of the tag set member";
+    }
+  }
+
+  grouping tag-set-state {
+    description
+      "Operational state data for tag set definitions.";
+  }
+
+  grouping tag-set-top {
+    description
+      "Top-level data definitions for a list of tags which can
+      be matched in policies";
+
+    container tag-sets {
+      description
+        "Enclosing container for the list of tag sets.";
+
+      list tag-set {
+        key "name";
+        description
+          "List of tag set definitions.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the tag set name list key";
+        }
+
+        container config {
+          description
+            "Configuration data for tag sets";
+
+          uses tag-set-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for tag sets";
+
+          uses tag-set-config;
+          uses tag-set-state;
+        }
+      }
+    }
+  }
+
+  grouping generic-defined-sets {
+    description
+      "Data definitions for pre-defined sets of attributes used in
+      policy match conditions.  These sets are generic and can
+      be used in matching conditions in different routing
+      protocols.";
+
+    uses prefix-set-top;
+    uses neighbor-set-top;
+    uses tag-set-top;
+  }
+
+  grouping match-set-options-group {
+    description
+      "Grouping containing options relating to how a particular set
+      should be matched";
+
+    leaf match-set-options {
+      type oc-pol-types:match-set-options-type;
+      description
+        "Optional parameter that governs the behaviour of the
+        match operation";
+    }
+  }
+
+  grouping match-set-options-restricted-group {
+    description
+      "Grouping for a restricted set of match operation modifiers";
+
+    leaf match-set-options {
+      type oc-pol-types:match-set-options-restricted-type;
+      description
+        "Optional parameter that governs the behaviour of the
+        match operation.  This leaf only supports matching on ANY
+        member of the set or inverting the match.  Matching on ALL is
+        not supported";
+    }
+  }
+
+  grouping match-interface-condition-config {
+    description
+      "Configuration data for interface match condition";
+
+    uses oc-if:interface-ref-common;
+  }
+
+  grouping match-interface-condition-state {
+    description
+      "Operational state data for interface match condition";
+  }
+
+  grouping match-interface-condition-top {
+    description
+      "Top-level grouping for the interface match condition";
+
+    container match-interface {
+      description
+        "Top-level container for interface match conditions";
+
+      container config {
+        description
+          "Configuration data for interface match conditions";
+
+        uses match-interface-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for interface match conditions";
+
+        uses match-interface-condition-config;
+        uses match-interface-condition-state;
+      }
+
+    }
+  }
+
+  grouping prefix-set-condition-config {
+    description
+      "Configuration data for prefix-set conditions";
+
+    leaf prefix-set {
+        type leafref {
+          path "../../../../../../../../defined-sets/" +
+            "prefix-sets/prefix-set/config/name";
+        }
+        description "References a defined prefix set";
+      }
+      uses match-set-options-restricted-group;
+  }
+
+
+  grouping prefix-set-condition-state {
+    description
+      "Operational state data for prefix-set conditions";
+  }
+
+  grouping prefix-set-condition-top {
+    description
+      "Top-level grouping for prefix-set conditions";
+
+    container match-prefix-set {
+      description
+        "Match a referenced prefix-set according to the logic
+        defined in the match-set-options leaf";
+
+      container config {
+        description
+          "Configuration data for a prefix-set condition";
+
+        uses prefix-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for a prefix-set condition";
+
+        uses prefix-set-condition-config;
+        uses prefix-set-condition-state;
+      }
+    }
+  }
+
+  grouping neighbor-set-condition-config {
+    description
+      "Configuration data for neighbor-set conditions";
+
+    leaf neighbor-set {
+      type leafref {
+        path "../../../../../../../../defined-sets/neighbor-sets/" +
+        "neighbor-set/name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      description "References a defined neighbor set";
+    }
+
+    uses match-set-options-restricted-group;
+  }
+
+  grouping neighbor-set-condition-state {
+    description
+      "Operational state data for neighbor-set conditions";
+  }
+
+  grouping neighbor-set-condition-top {
+    description
+      "Top-level grouping for neighbor-set conditions";
+
+    container match-neighbor-set {
+      description
+        "Match a referenced neighbor set according to the logic
+        defined in the match-set-options-leaf";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses neighbor-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses neighbor-set-condition-config;
+        uses neighbor-set-condition-state;
+      }
+    }
+  }
+
+  grouping tag-set-condition-config {
+    description
+      "Configuration data for tag-set condition statements";
+
+    leaf tag-set {
+      type leafref {
+        path "../../../../../../../../defined-sets/tag-sets/tag-set" +
+        "/name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      description "References a defined tag set";
+    }
+    uses match-set-options-restricted-group;
+  }
+
+  grouping tag-set-condition-state {
+    description
+      "Operational state data for tag-set condition statements";
+  }
+
+  grouping tag-set-condition-top {
+    description
+      "Top-level grouping for tag-set conditions";
+
+    container match-tag-set {
+      description
+        "Match a referenced tag set according to the logic defined
+        in the match-options-set leaf";
+
+      container config {
+        description
+          "Configuration data for tag-set conditions";
+
+        uses tag-set-condition-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data tag-set conditions";
+
+        uses tag-set-condition-config;
+        uses tag-set-condition-state;
+      }
+    }
+  }
+
+  grouping generic-conditions {
+    description "Condition statement definitions for checking
+    membership in a generic defined set";
+
+    uses match-interface-condition-top;
+    uses prefix-set-condition-top;
+    uses neighbor-set-condition-top;
+    uses tag-set-condition-top;
+
+  }
+
+  grouping generic-actions {
+    description
+      "Definitions for common set of policy action statements that
+      manage the disposition or control flow of the policy";
+
+    leaf policy-result {
+      type policy-result-type;
+      description
+        "Select the final disposition for the route, either
+        accept or reject.";
+    }
+  }
+
+
+  grouping policy-conditions-config {
+    description
+      "Configuration data for general policy conditions, i.e., those
+      not related to match-sets";
+
+      leaf call-policy {
+        type leafref {
+          path "../../../../../../../" +
+            "oc-rpol:policy-definitions/" +
+            "oc-rpol:policy-definition/oc-rpol:name";
+          //TODO: require-instance should be added when
+          //it is supported in YANG 1.1
+          //require-instance true;
+        }
+        description
+          "Applies the statements from the specified policy
+          definition and then returns control the current
+          policy statement. Note that the called policy may
+          itself call other policies (subject to
+          implementation limitations). This is intended to
+          provide a policy 'subroutine' capability.  The
+          called policy should contain an explicit or a
+          default route disposition that returns an
+          effective true (accept-route) or false
+          (reject-route), otherwise the behavior may be
+          ambiguous and implementation dependent";
+      }
+
+      leaf install-protocol-eq {
+        type identityref {
+          base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+        }
+        description
+          "Condition to check the protocol / method used to install
+          the route into the local routing table";
+      }
+  }
+
+  grouping policy-conditions-state {
+    description
+      "Operational state data for policy conditions";
+  }
+
+  grouping policy-conditions-top {
+    description
+      "Top-level grouping for policy conditions";
+
+    container conditions {
+      description
+        "Condition statements for the current policy statement";
+
+      container config {
+        description
+          "Configuration data for policy conditions";
+
+        uses policy-conditions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for policy conditions";
+
+        uses policy-conditions-config;
+        uses policy-conditions-state;
+      }
+      uses generic-conditions;
+    }
+  }
+
+  grouping policy-statements-config {
+    description
+      "Configuration data for policy statements";
+
+    leaf name {
+      type string;
+      description
+        "name of the policy statement";
+    }
+  }
+
+  grouping policy-statements-state {
+    description
+      "Operational state data for policy statements";
+  }
+
+
+
+  grouping policy-actions-config {
+    description
+      "Configuration data for policy actions";
+
+    uses generic-actions;
+  }
+
+  grouping policy-actions-state {
+    description
+      "Operational state data for policy actions";
+  }
+
+  grouping policy-actions-top {
+    description
+      "Top-level grouping for policy actions";
+
+    container actions {
+      description
+        "Top-level container for policy action statements";
+
+      container config {
+        description
+          "Configuration data for policy actions";
+
+        uses policy-actions-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for policy actions";
+
+        uses policy-actions-config;
+        uses policy-actions-state;
+      }
+    }
+  }
+
+  grouping policy-statements-top {
+    description
+      "Top-level grouping for the policy statements list";
+
+    container statements {
+      description
+        "Enclosing container for policy statements";
+
+      list statement {
+        key "name";
+        // TODO: names of policy statements within a policy
+        // definition should probably be optional, however, YANG
+        // requires a unique id for lists
+        ordered-by user;
+        description
+          "Policy statements group conditions and actions
+          within a policy definition.  They are evaluated in
+          the order specified (see the description of policy
+          evaluation at the top of this module.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container config {
+          description
+            "Configuration data for policy statements";
+
+          uses policy-statements-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for policy statements";
+
+          uses policy-statements-config;
+          uses policy-statements-state;
+        }
+
+        uses policy-conditions-top;
+        uses policy-actions-top;
+      }
+    }
+  }
+
+  grouping defined-sets-top {
+    description
+      "Top-level grouping for defined set definitions";
+
+    container defined-sets {
+      description
+        "Predefined sets of attributes used in policy match
+        statements";
+
+      uses generic-defined-sets;
+    }
+  }
+
+  grouping policy-definitions-config {
+    description
+      "Configuration data for policy definitions";
+
+    leaf name {
+      type string;
+      description
+        "Name of the top-level policy definition -- this name
+        is used in references to the current policy";
+    }
+  }
+
+  grouping policy-definitions-state {
+    description
+      "Operational state data for policy definitions";
+  }
+
+  grouping policy-definitions-top {
+    description
+      "Top-level grouping for the policy definition list";
+
+    container policy-definitions {
+      description
+        "Enclosing container for the list of top-level policy
+          definitions";
+
+      list policy-definition {
+        key "name";
+        description
+          "List of top-level policy definitions, keyed by unique
+          name.  These policy definitions are expected to be
+          referenced (by name) in policy chains specified in import
+          or export configuration statements.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container config {
+          description
+            "Configuration data for policy defintions";
+
+          uses policy-definitions-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for policy definitions";
+
+          uses policy-definitions-config;
+          uses policy-definitions-state;
+        }
+
+        uses policy-statements-top;
+      }
+    }
+  }
+
+  grouping routing-policy-top {
+    description
+      "Top level container for OpenConfig routing policy";
+
+    container routing-policy {
+      description
+        "Top-level container for all routing policy configuration";
+
+
+      uses defined-sets-top;
+
+      uses policy-definitions-top;
+    }
+  }
+
+  grouping apply-policy-import-config {
+    description
+      "Configuration data for applying import policies";
+
+    leaf-list import-policy {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+          "oc-rpol:policy-definition/oc-rpol:name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      ordered-by user;
+      description
+        "list of policy names in sequence to be applied on
+        receiving a routing update in the current context, e.g.,
+        for the current peer group, neighbor, address family,
+        etc.";
+    }
+
+    leaf default-import-policy {
+      type default-policy-type;
+      default REJECT_ROUTE;
+      description
+        "explicitly set a default policy if no policy definition
+        in the import policy chain is satisfied.";
+    }
+
+  }
+
+  grouping apply-policy-export-config {
+    description
+      "Configuration data for applying export policies";
+
+    leaf-list export-policy {
+      type leafref {
+        path "/oc-rpol:routing-policy/oc-rpol:policy-definitions/" +
+          "oc-rpol:policy-definition/oc-rpol:name";
+        //TODO: require-instance should be added when it's
+        //supported in YANG 1.1
+        //require-instance true;
+      }
+      ordered-by user;
+      description
+        "list of policy names in sequence to be applied on
+        sending a routing update in the current context, e.g.,
+        for the current peer group, neighbor, address family,
+        etc.";
+    }
+
+    leaf default-export-policy {
+      type default-policy-type;
+      default REJECT_ROUTE;
+      description
+        "explicitly set a default policy if no policy definition
+        in the export policy chain is satisfied.";
+    }
+  }
+
+
+  grouping apply-policy-config {
+    description
+      "Configuration data for routing policies";
+
+    uses apply-policy-import-config;
+    uses apply-policy-export-config;
+
+  }
+
+
+
+  grouping apply-policy-state {
+    description
+      "Operational state associated with routing policy";
+
+    //TODO: identify additional state data beyond the intended
+    //policy configuration.
+  }
+
+  grouping apply-policy-group {
+    description
+      "Top level container for routing policy applications. This
+      grouping is intended to be used in routing models where
+      needed.";
+
+    container apply-policy {
+      description
+        "Anchor point for routing policies in the model.
+        Import and export policies are with respect to the local
+        routing table, i.e., export (send) and import (receive),
+        depending on the context.";
+
+      container config {
+        description
+          "Policy configuration data.";
+
+        uses apply-policy-config;
+      }
+
+      container state {
+
+        config false;
+        description
+          "Operational state for routing policy";
+
+        uses apply-policy-config;
+        uses apply-policy-state;
+      }
+    }
+  }
+
+  uses routing-policy-top;
+
+}
diff --git a/models/openconfig/src/main/yang/relay-agent/openconfig-relay-agent.yang b/models/openconfig/src/main/yang/relay-agent/openconfig-relay-agent.yang
new file mode 100644
index 0000000..c0a2637
--- /dev/null
+++ b/models/openconfig/src/main/yang/relay-agent/openconfig-relay-agent.yang
@@ -0,0 +1,815 @@
+module openconfig-relay-agent {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/relay-agent";
+
+  prefix "oc-relay";
+
+  // import some basic types
+  import ietf-inet-types { prefix inet; }
+  import ietf-yang-types { prefix yang; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module describes a model for configuration and operational
+    state related to relay agents typically used for DHCP and BOOTP
+    packets.  The supports both DHCP and DHCPv6 and device-wide and
+    per-interface settings.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision "2016-05-16" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // grouping statements
+
+  grouping agent-information-ipv4-common-config {
+    description
+      "Common configuration data for DHCP relay option";
+
+    leaf enable {
+      type boolean;
+      default false;
+      description
+        "Enable sending the DHCP option for Relay Agent information
+        -- option 82.";
+      reference
+        "RFC 3046 - DHCP Relay Agent Information Option";
+    }
+  }
+
+  grouping agent-information-ipv4-common-state {
+    description
+      "Common operational state data for DHCP relay option";
+
+  }
+
+  grouping agent-information-ipv4-global-top {
+    description
+      "Top-level grouping for agent information data at global level";
+
+    container agent-information-option {
+      description
+        "Top-level container for relay agent information option
+        data";
+
+      container config {
+        description
+          "Configuration data for the relay agent information
+          option";
+
+        uses agent-information-ipv4-common-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for agent information at global
+          level";
+
+        uses agent-information-ipv4-common-config;
+        uses agent-information-ipv4-common-state;
+      }
+    }
+  }
+
+  grouping agent-information-ipv4-interface-config {
+    description
+      "Configuration data for DCHP relay option on interfaces";
+
+    leaf circuit-id {
+      type string;
+      description
+        "Encodes an agent-local identifier of the circuit from which
+        a DHCP client-to-server packet was received.  It is intended
+        for use by agents in relaying DHCP responses back to the
+        proper circuit.  The circuit id is an opaque value";
+      reference
+        "RFC 3046 - DHCP Relay Agent Information Option";
+    }
+
+    leaf remote-id {
+      type string;
+      description
+        "Provides a mechanism to identify the remote host end of
+        the circuit.  The remote-id should be thought of as an
+        opaque value, but must be globally unique.";
+      reference
+        "RFC 3046 - DHCP Relay Agent Information Option";
+    }
+  }
+
+  grouping agent-information-ipv4-interface-state {
+    description
+      "Operational state data for DHCP relay option on interfaces";
+
+    leaf sent-circuit-id {
+      type string;
+      description
+        "Reports the circuit-id sent by the system to the DHCP
+        server.";
+    }
+
+    leaf sent-remote-id {
+      type string;
+      description
+        "Reports the remote-id value sent by the system to the DHCP
+        server";
+    }
+  }
+
+  grouping agent-information-ipv4-interface-top {
+    description
+      "Top-level grouping for relay agent information option data";
+
+    container agent-information-option {
+      description
+        "Top-level container for relay agent information option
+        data";
+
+      container config {
+        description
+          "Configuration data for the relay agent information
+          option";
+
+        uses agent-information-ipv4-common-config;
+        uses agent-information-ipv4-interface-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses agent-information-ipv4-common-config;
+        uses agent-information-ipv4-interface-config;
+        uses agent-information-ipv4-common-state;
+        uses agent-information-ipv4-interface-state;
+      }
+    }
+  }
+
+  grouping agent-options-ipv6-common-config {
+    description
+      "Configuration data for DHCPv6 options";
+
+    leaf enable-interface-id {
+      type boolean;
+      default false;
+      description
+        "Enables DHCPv6 OPTION_INTERFACE_ID (18) to identify the
+        interface on which the client message was received.";
+      reference
+        "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6)";
+    }
+
+    leaf enable-remote-id {
+      type boolean;
+      default false;
+      description
+        "Sets DHCPv6 OPTION_REMOTE_ID (37).  This option is the
+        DHCPv6 equivalent for the IPv4 (DHCPv4) Relay Agent Option's
+        Remote-ID suboption as specified in RFC 3046. The remote-id
+        field may be used to encode a user name, remote IP address,
+        interface/port identifier, etc.";
+      reference
+        "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+    }
+  }
+
+  grouping agent-options-ipv6-common-state {
+    description
+      "Operational state data for DHCPv6 options";
+  }
+
+  grouping agent-options-ipv6-interface-config {
+    description
+      "Configuration data for DHCPv6 options";
+
+    leaf interface-id {
+      type string;
+      description
+        "Sets DHCPv6 OPTION_INTERFACE_ID (18) to identify the
+        interface on which the client message was received.";
+      reference
+        "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6)";
+    }
+
+    leaf remote-id {
+      type string;
+      description
+        "Sets DHCPv6 OPTION_REMOTE_ID (37).  This option is the
+        DHCPv6 equivalent for the IPv4 (DHCPv4) Relay Agent Option's
+        Remote-ID suboption as specified in RFC 3046. The remote-id
+        field may be used to encode a user name, remote IP address,
+        interface/port identifier, etc.";
+      reference
+        "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+    }
+  }
+
+  grouping agent-options-ipv6-interface-state {
+    description
+      "Operational state data for DHCPv6 options";
+
+    leaf sent-interface-id {
+      type string;
+      description
+        "Reflects the DHCPv6 OPTION_INTERFACE_ID (18) sent to the
+        server by the system.";
+      reference
+        "IETF RFC 3315 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6)";
+    }
+
+    leaf sent-remote-id {
+      type string;
+      description
+        "Reflects the DHCPv6 OPTION_REMOTE_ID (37) sent to the
+        server by the system.";
+      reference
+        "IETF RFC 4649 - Dynamic Host Configuration Protocol for
+        IPv6 (DHCPv6) Relay Agent Remote-ID Option";
+    }
+  }
+
+  grouping agent-options-ipv6-global-top {
+    description
+      "Top-level grouping for DHCPv6 options on interfaces";
+
+    container options {
+      description
+        "Top-level container for DHCPv6 agent options on interfaces";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses agent-options-ipv6-common-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for DHCPv6 agent option on an
+          interface";
+
+        uses agent-options-ipv6-common-config;
+        uses agent-options-ipv6-common-state;
+      }
+    }
+  }
+
+  grouping agent-options-ipv6-interface-top {
+    description
+      "Top-level grouping for DHCPv6 options on interfaces";
+
+    container options {
+      description
+        "Top-level container for DHCPv6 agent options on interfaces";
+
+      container config {
+        description
+          "Configuration data ";
+
+        uses agent-options-ipv6-common-config;
+        uses agent-options-ipv6-interface-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for DHCPv6 agent option on an
+          interface";
+
+        uses agent-options-ipv6-common-config;
+        uses agent-options-ipv6-interface-config;
+        uses agent-options-ipv6-common-state;
+        uses agent-options-ipv6-interface-state;
+      }
+    }
+  }
+
+  grouping relay-agent-common-config {
+    description
+      "Configuration data for global level relay agent options,
+      common across address families";
+
+      leaf enable-relay-agent {
+        type boolean;
+        default false;
+        description
+          "Enables DHCP/BOOTP relay agent on all interfaces";
+      }
+  }
+
+  grouping relay-agent-common-state {
+    description
+      "Operational state data for global level relay agent, common
+      across address families";
+  }
+
+  grouping relay-agent-ipv4-config {
+    description
+      "Configuration data for DHCPv4 relay agents";
+
+    uses relay-agent-common-config;
+  }
+
+  grouping relay-agent-ipv4-state {
+    description
+      "Configuration data for DHCPv4 relay agents";
+
+    uses relay-agent-common-state;
+  }
+
+
+  grouping relay-agent-ipv4-top {
+    description
+      "Top-level grouping for global relay agent data";
+
+    container dhcp {
+      description
+        "Top-level container for global relay agent data";
+
+      container config {
+        description
+          "Configuration data for global DHCPv4";
+
+        uses relay-agent-ipv4-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data global DHCPv4";
+
+        uses relay-agent-ipv4-config;
+        uses relay-agent-ipv4-state;
+      }
+
+      uses agent-information-ipv4-global-top;
+      uses relay-agent-ipv4-interfaces-top;
+    }
+  }
+
+  grouping relay-agent-ipv6-config {
+    description
+      "Configuration data for DHCPv6 relay agents";
+
+    uses relay-agent-common-config;
+  }
+
+  grouping relay-agent-ipv6-state {
+    description
+      "Configuration data for DHCPv6 relay agents";
+
+    uses relay-agent-common-state;
+  }
+
+  grouping relay-agent-ipv6-top {
+    description
+      "Top-level grouping for global relay agent data";
+
+    container dhcpv6 {
+      description
+        "Top-level container for global relay agent data";
+
+      container config {
+        description
+          "Configuration data for global DHCPv6";
+
+        uses relay-agent-ipv6-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data global DHCPv6";
+
+        uses relay-agent-ipv6-config;
+        uses relay-agent-ipv6-state;
+      }
+
+      uses agent-options-ipv6-global-top;
+      uses relay-agent-ipv6-interfaces-top;
+    }
+  }
+
+
+  grouping relay-agent-common-stats {
+    description
+      "Common DHCP / BOOTP message statistics for
+      DHCPv4 and DHCPv6";
+
+
+    leaf total-dropped {
+      type yang:counter64;
+      description
+        "Total number of DHCP packets dropped by the relay agent";
+    }
+
+    leaf invalid-opcode {
+      type yang:counter64;
+      description
+        "Number of DHCP packets dropped due to an invalid opcode";
+    }
+
+    leaf invalid-options {
+      type yang:counter64;
+      description
+        "Number of DHCP packets dropped due to an invalid option";
+    }
+  }
+
+  grouping relay-agent-ipv4-stats {
+    description
+      "DHCPv4 relay agent message statistics";
+
+    leaf bootrequest-received {
+      type yang:counter64;
+      description
+        "BOOTREQUEST messages received by the relay agent";
+    }
+
+    leaf dhcp-decline-received {
+      type yang:counter64;
+      description
+        "DHCP DECLINE messages received by the relay agent";
+    }
+
+    leaf dhcp-discover-received {
+      type yang:counter64;
+      description
+        "DHCP DISCOVER messages received by the relay agent";
+    }
+
+    leaf dhcp-inform-received {
+      type yang:counter64;
+      description
+        "DHCP INFORM messages received by the relay agent";
+    }
+
+    leaf dhcp-release-received {
+      type yang:counter64;
+      description
+        "DHCP RELEASE messages received by the relay agent";
+    }
+
+    leaf dhcp-request-received {
+      type yang:counter64;
+      description
+        "DHCP REQUEST messages received by the relay agent";
+    }
+
+    leaf bootrequest-sent {
+      type yang:counter64;
+      description
+        "BOOTREQUEST messages forwarded by the relay agent";
+    }
+
+    leaf bootreply-sent {
+      type yang:counter64;
+      description
+        "BOOTREPLY messages forwarded by the relay agent";
+    }
+
+    leaf dhcp-offer-sent {
+      type yang:counter64;
+      description
+        "DHCP OFFER messages sent by the relay agent";
+    }
+
+    leaf dhcp-ack-sent {
+      type yang:counter64;
+      description
+        "DHCP ACK messages sent by the relay agent";
+    }
+
+    leaf dhcp-nack-sent {
+      type yang:counter64;
+      description
+        "DHCP NACK messages sent by the relay agent";
+    }
+  }
+
+  grouping relay-agent-ipv6-stats {
+    description
+      "DHCPv4 relay agent message statistics";
+
+    leaf dhcpv6-solicit-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 SOLICIT messages received from clients
+        by the relay agent";
+    }
+
+    leaf dhcpv6-decline-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 DECLINE messages received from
+        clients by the relay agent";
+    }
+
+    leaf dhcpv6-request-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 request messages received from clients
+        by the relay agent";
+    }
+
+    leaf dhcpv6-release-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 release messages received from clients
+        by the relay agent";
+    }
+
+    leaf dhcpv6-confirm-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 confirm messages received from clients
+        by the relay agent";
+    }
+
+    leaf dhcpv6-rebind-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 rebind messages received from clients
+        by the relay agent";
+    }
+
+    leaf dhcpv6-info-request-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 information requests messages received from
+        clients by the relay agent";
+    }
+
+    leaf dhcpv6-relay-reply-received {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 relay reply messages received from servers
+        by the relay agent";
+    }
+
+    leaf dhcpv6-adverstise-sent {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 adverstise messages sent to clients by
+        the relay agent";
+    }
+
+    leaf dhcpv6-reply-sent {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 reply messages sent to clients by
+        the relay agent";
+    }
+
+    leaf dhcpv6-reconfigure-sent {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 reconfigure messages sent to clients by
+        the relay agent";
+    }
+
+    leaf dhcpv6-relay-forw-sent {
+      type yang:counter64;
+      description
+        "Number of DHCPv6 relay-forward messages sent to servers
+        by the relay agent";
+    }
+
+  }
+
+  grouping relay-agent-ipv4-interfaces-config {
+    description
+      "Configuration data for interfaces enabled for relaying";
+
+    leaf id {
+      type oc-if:interface-id;
+      description
+        "Name of the interface on which relay agent is active";
+    }
+
+    leaf enable {
+      type boolean;
+      description
+        "Enables the relay agent on the referenced interface.
+        At least one helper address should also be configured
+        for forwarding requested.";
+    }
+
+    leaf-list helper-address {
+      type inet:ip-address;
+      description
+        "List of IPv4 or IPv6 addresses of DHCP servers to which the
+        relay agent should forward DHCPv4 requests.  The relay agent is
+        expected to forward DHCPv4/BOOTP requests to all listed
+        server addresses when DHCPv4 relaying is enabled globally, or
+        on the interface.";
+    }
+  }
+
+  grouping relay-agent-ipv4-interfaces-state {
+    description
+      "Operational state data for interfaces enabled for relaying";
+
+    container counters {
+      description
+        "Counters and statistics for relay agent operation.";
+
+      uses relay-agent-common-stats;
+      uses relay-agent-ipv4-stats;
+    }
+  }
+
+  grouping relay-agent-ipv4-interfaces-top {
+    description
+      "Top-level grouping for DHCPv4 relays on interfaces";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interface references.";
+
+      list interface {
+        key "id";
+        description
+          "List of interfaces on which the relay agent is
+          configured.";
+
+        leaf id {
+          type leafref {
+            path "../config/id";
+          }
+          description
+            "Reference to the interface list key";
+        }
+
+        container config {
+          description
+            "Configuration data for relay agent interfaces.";
+
+          uses relay-agent-ipv4-interfaces-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for relay agent interfaces.";
+
+          uses relay-agent-ipv4-interfaces-config;
+          uses relay-agent-ipv4-interfaces-state;
+        }
+
+        uses oc-if:interface-ref;
+        uses agent-information-ipv4-interface-top;
+      }
+    }
+  }
+
+  grouping relay-agent-ipv6-interfaces-config {
+    description
+      "Configuration data for interfaces enabled for relaying";
+
+    leaf id {
+      type oc-if:interface-id;
+      description
+        "Name of the interface on which relay agent is active";
+    }
+
+    leaf enable {
+      type boolean;
+      description
+        "Enables the relay agent on the referenced interface.
+        At least one helper address should also be configured
+        for forwarding requested.";
+    }
+
+    leaf-list helper-address {
+      type inet:ipv6-address;
+      description
+        "List of IPv6 addresses of DHCP servers to which the
+        relay agent should forward DHCPv6 requests.  The relay agent
+        is expected to forward DHCPv4/BOOTP requests to all listed
+        server addresses when DHCPv6 relaying is enabled globally, or
+        on the interface.";
+    }
+  }
+
+  grouping relay-agent-ipv6-interfaces-state {
+    description
+      "Operational state data for interfaces enabled for relaying";
+
+    container counters {
+      description
+        "Counters and statistics for relay agent operation.";
+
+      uses relay-agent-common-stats;
+      uses relay-agent-ipv6-stats;
+    }
+  }
+
+  grouping relay-agent-ipv6-interfaces-top {
+    description
+      "Top-level grouping for DHCPv4 relays on interfaces";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interface references.";
+
+      list interface {
+        key "id";
+        description
+          "List of interfaces on which the relay agent is
+          configured.";
+
+        leaf id {
+          type leafref {
+            path "../config/id";
+          }
+          description
+            "Reference to the interface list key";
+        }
+
+        container config {
+          description
+            "Configuration data for relay agent interfaces.";
+
+          uses relay-agent-ipv6-interfaces-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for relay agent interfaces.";
+
+          uses relay-agent-ipv6-interfaces-config;
+          uses relay-agent-ipv6-interfaces-state;
+        }
+
+        uses oc-if:interface-ref;
+        uses agent-options-ipv6-interface-top;
+      }
+    }
+  }
+
+  grouping relay-agent-top {
+    description
+      "Top-level container for relay agent configuration and opstate
+      data.";
+
+    container relay-agent {
+      description
+        "Top level container for relay-agent configuration and
+        operational state data";
+
+      uses relay-agent-ipv4-top;
+      uses relay-agent-ipv6-top;
+    }
+  }
+
+  // data definition statements
+
+  uses relay-agent-top;
+
+  // augment statements
+
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-attributes.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-attributes.yang
new file mode 100644
index 0000000..75eb155
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-attributes.yang
@@ -0,0 +1,430 @@
+submodule openconfig-rib-bgp-attributes {
+
+  belongs-to openconfig-rib-bgp {
+    prefix "oc-rib-bgp";
+  }
+
+
+  // import some basic types
+  import ietf-inet-types { prefix inet; }
+  import openconfig-bgp-types { prefix oc-bgpt; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains common data definitions for BGP
+    attributes for use in BGP RIB tables.";
+
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+
+  grouping bgp-as-path-attr-state {
+    description
+      "Data for representing BGP AS-PATH attribute";
+
+    leaf type {
+      type oc-bgpt:as-path-segment-type;
+      description
+        "The type of AS-PATH segment";
+    }
+
+    leaf-list member {
+      type inet:as-number;
+      description
+        "List of the AS numbers in the AS-PATH segment";
+    }
+  }
+
+  grouping bgp-as-path-attr-top {
+    description
+      "Top-level grouping for AS-PATH attribute data";
+
+    container as-path {
+      description
+        "Enclosing container for the list of AS path segments.
+
+        In the Adj-RIB-In or Adj-RIB-Out, this list should show
+        the received or sent AS_PATH, respectively.  For
+        example, if the local router is not 4-byte capable, this
+        value should consist of 2-octet ASNs or the AS_TRANS
+        (AS 23456) values received or sent in route updates.
+
+        In the Loc-RIB, this list should reflect the effective
+        AS path for the route, e.g., a 4-octet value if the
+        local router is 4-octet capable.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)
+        RFC 6793 - BGP Support for Four-octet AS Number Space
+        RFC 5065 - Autonomous System Confederations for BGP";
+
+      list segment {
+        description
+          "Unkeyed list of AS PATH segments";
+
+        container state {
+          config false;
+          description
+            "Opstate data for AS-PATH segments";
+
+          uses bgp-as-path-attr-state;
+        }
+      }
+    }
+  }
+
+  grouping bgp-as4-path-attr-top {
+    description
+      "Top-level grouping for AS4-PATH attribute data";
+
+    container as4-path {
+      description
+        "This is the path encoded with 4-octet
+        AS numbers in the optional transitive AS4_PATH attribute.
+        This value is populated with the received or sent attribute
+        in Adj-RIB-In or Adj-RIB-Out, respectively.  It should not
+        be populated in Loc-RIB since the Loc-RIB is expected to
+        store the effective AS-Path in the as-path leaf regardless
+        of being 4-octet or 2-octet.";
+      reference
+          "RFC 6793 - BGP Support for Four-octet AS Number Space";
+
+      list segment {
+        description
+          "Unkeyed list of AS PATH segments";
+
+        container state {
+          config false;
+          description
+            "Opstate data for AS-PATH segments";
+
+          uses bgp-as-path-attr-state;
+        }
+      }
+    }
+  }
+
+  grouping bgp-community-attr-state {
+    description
+      "Common definition of BGP community attributes";
+
+    leaf-list community {
+      type union {
+        type oc-bgpt:bgp-well-known-community-type;
+        type oc-bgpt:bgp-std-community-type;
+      }
+      description
+        "List of standard or well-known BGP community
+        attributes.";
+    }
+  }
+
+  grouping bgp-extended-community-attr-state {
+    description
+      "Common definition of BGP extended community attribute";
+
+    leaf-list ext-community {
+      type oc-bgpt:bgp-ext-community-recv-type;
+      description
+        "List of BGP extended community attributes.  The received
+        extended community may be an explicitly modeled
+        type or unknown, represented by an 8-octet value
+        formatted according to RFC 4360.";
+      reference
+        "RFC 4360 - BGP Extended Communities Attribute";
+    }
+
+  }
+
+  grouping bgp-aggregator-attr-state {
+    description
+      "Operational state data for the BGP aggregator
+      attribute";
+
+    leaf as {
+      type inet:as-number;
+      description
+          "AS number of the autnonomous system that performed the
+          aggregation.";
+    }
+
+    leaf as4 {
+      type inet:as-number;
+      description
+        "AS number of the autnonomous system that performed the
+        aggregation (4-octet representation).  This value is
+        populated if an upstream router is not 4-octet capable.
+        Its semantics are similar to the AS4_PATH optional
+        transitive attribute";
+      reference
+        "RFC 6793 - BGP Support for Four-octet AS Number Space";
+    }
+
+    leaf address {
+      type inet:ipv4-address;
+      description
+        "IP address of the router that performed the
+        aggregation.";
+    }
+  }
+
+
+  grouping bgp-aggregator-attr-top {
+    description
+      "Common definition of the BGP aggregator attribute";
+
+    container aggregator {
+      description
+        "BGP attribute indicating the prefix has been aggregated by
+        the specified AS and router.";
+
+      container state {
+        config false;
+        description
+          "Operational state data for BGP aggregator attribute";
+
+        uses bgp-aggregator-attr-state;
+      }
+    }
+  }
+
+  grouping bgp-shared-common-attr-state {
+    description
+      "Route attributes shared across route table entries,
+      common to both LOC-Rib and Adj-RIB";
+
+
+    leaf origin {
+      type oc-bgpt:bgp-origin-attr-type;
+      description
+        "BGP attribute defining the origin of the path information.";
+    }
+
+    leaf atomic-aggregate {
+      type boolean;
+      description
+        "BGP attribute indicating that the prefix is an atomic
+        aggregate, i.e., the peer selected a less specific
+        route without selecting a more specific route that is
+        included in it.";
+    }
+
+    leaf next-hop {
+      type inet:ip-address;
+      description
+        "BGP next hop attribute defining the IP address of the router
+        that should be used as the next hop to the destination";
+    }
+
+    leaf med {
+      type uint32;
+      description
+        "BGP multi-exit discriminator attribute used in BGP route
+        selection process";
+    }
+
+    leaf local-pref {
+      type uint32;
+      description
+        "BGP local preference attribute sent to internal peers to
+        indicate the degree of preference for externally learned
+        routes.  The route with the highest local preference value
+        is preferred.";
+    }
+
+    leaf originator-id {
+      type inet:ipv4-address;
+      description
+        "BGP attribute that provides the id as an IPv4 address
+        of the originator of the announcement.";
+      reference
+        "RFC 4456 - BGP Route Reflection: An Alternative to Full
+        Mesh Internal BGP (IBGP)";
+    }
+
+    leaf-list cluster-list {
+      type inet:ipv4-address;
+      description
+        "Represents the reflection path that the route has passed.";
+      reference
+        "RFC 4456 - BGP Route Reflection: An Alternative to Full
+        Mesh Internal BGP (IBGP)";
+    }
+
+    leaf aigp {
+      type uint64;
+      description
+        "BGP path attribute representing the accumulated IGP metric
+        for the path";
+      reference
+        "RFC 7311 - The Accumulated IGP Metric Attribute for BGP";
+    }
+  }
+
+  grouping bgp-unknown-attr-flags-state {
+    description
+      "Operational state data for path attribute flags";
+
+    leaf optional {
+      type boolean;
+      description
+        "Defines whether the attribute is optional (if
+         set to true) or well-known (if set to false).
+         Set in the high-order bit of the BGP attribute
+         flags octet.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+
+    leaf transitive {
+      type boolean;
+      description
+        "Defines whether an optional attribute is transitive
+        (if set to true) or non-transitive (if set to false).  For
+        well-known attributes, the transitive flag MUST be set to
+        true.  Set in the second high-order bit of the BGP attribute
+        flags octet.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+
+    leaf partial {
+      type boolean;
+      description
+        "Defines whether the information contained in the optional
+        transitive attribute is partial (if set to true) or complete
+        (if set to false).  For well-known attributes and for
+        optional non-transitive attributes, the partial flag
+        must be set to false.  Set in the third high-order bit of
+        the BGP attribute flags octet.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+
+    leaf extended {
+      type boolean;
+      description
+        "Defines whether the attribute length is one octet
+        (if set to false) or two octets (if set to true).  Set in
+        the fourth high-order bit of the BGP attribute flags
+        octet.";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+  }
+
+  grouping bgp-unknown-attr-state {
+    description
+      "Operational state data for path attributes not shared
+      across route entries, common to LOC-RIB and Adj-RIB";
+
+    leaf attr-type {
+      type uint8;
+      description
+        "1-octet value encoding the attribute type code";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+
+    leaf attr-len {
+      type uint16;
+      description
+        "One or two octet attribute length field indicating the
+        length of the attribute data in octets.  If the Extended
+        Length attribute flag is set, the length field is 2 octets,
+        otherwise it is 1 octet";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+
+    leaf attr-value {
+      type binary {
+        length 1..65535;
+      }
+      description
+        "Raw attribute value, not including the attribute
+        flags, type, or length.  The maximum length
+        of the attribute value data is 2^16-1 per the max value
+        of the attr-len field (2 octets).";
+      reference
+        "RFC 4271 - A Border Gateway Protocol 4 (BGP-4)";
+    }
+  }
+
+  grouping bgp-unknown-attr-top {
+    description
+      "Unknown path attributes that are not expected to be shared
+      across route entries, common to LOC-RIB and Adj-RIB";
+
+    container unknown-attributes {
+      description
+        "Unknown path attributes that were received in the UPDATE
+        message which contained the prefix.";
+
+      list unknown-attribute {
+        key "attr-type";
+        description
+          "This list contains received attributes that are unrecognized
+          or unsupported by the local router.  The list may be empty.";
+
+        leaf attr-type {
+          type leafref {
+            path "../state/attr-type";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container state {
+          description
+            "Operational state for unknown route attributes";
+
+          uses bgp-unknown-attr-flags-state;
+          uses bgp-unknown-attr-state;
+        }
+      }
+    }
+  }
+
+  grouping bgp-loc-rib-attr-state {
+    description
+      "Path attributes that are not expected to be shared across
+      route entries, specific to LOC-RIB";
+
+  }
+
+  grouping bgp-adj-rib-attr-state {
+    description
+      "Path attributes that are not expected to be shared across
+      route entries, specific to Adj-RIB";
+
+    leaf path-id {
+      type uint32;
+      description
+        "When the BGP speaker supports advertisement of multiple
+        paths for a prefix, the path identifier is used to
+        uniquely identify a route based on the combination of the
+        prefix and path id.  In the Adj-RIB-In, the path-id value is
+        the value received in the update message.   In the Loc-RIB,
+        if used, it should represent a locally generated path-id
+        value for the corresponding route.  In Adj-RIB-Out, it
+        should be the value sent to a neighbor when add-paths is
+        used, i.e., the capability has been negotiated.";
+      reference
+        "draft-ietf-idr-add-paths - Advertisement of Multiple Paths
+        in BGP";
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-ext.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-ext.yang
new file mode 100644
index 0000000..3c7cf35
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-ext.yang
@@ -0,0 +1,166 @@
+module openconfig-rib-bgp-ext {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/rib/bgp-ext";
+
+  prefix "oc-bgprib-ext";
+
+  import openconfig-rib-bgp { prefix oc-bgprib; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-rib-bgp-types { prefix oc-bgpribt; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Defines additional data nodes for the OpenConfig BGP RIB model.
+    These items reflect extensions that are desirable features but
+    are not currently supported in a majority of BGP
+    implementations.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+  revision "2016-04-11" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+
+  grouping rib-ext-route-annotations {
+    description
+      "Extended annotations for routes in the routing tables";
+
+    leaf reject-reason {
+      type union {
+        type identityref {
+          base oc-bgpribt:BGP_NOT_SELECTED_BESTPATH;
+        }
+        type identityref {
+          base oc-bgpribt:BGP_NOT_SELECTED_POLICY;
+        }
+      }
+      description
+        "Indicates the reason the route is not used, either due to
+        policy filtering or bestpath selection";
+    }
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/oc-bgprib:loc-rib/" +
+    "oc-bgprib:routes/oc-bgprib:route/oc-bgprib:state" {
+      description
+        "Add extended annotations to the Loc-RIB for IPv4";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/oc-bgprib:loc-rib/" +
+    "oc-bgprib:routes/oc-bgprib:route/oc-bgprib:state" {
+      description
+        "Add extended annotations to the Loc-RIB for IPv6";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-in-pre/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state" {
+      description
+        "Add extended annotations to Adj-RIB for IPv4";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-in-post/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv4";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-out-pre/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv4";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv4-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-out-post/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv4";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-in-pre/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv6";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-in-post/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv6";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-out-pre/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv6";
+
+      uses rib-ext-route-annotations;
+  }
+
+  augment "/oc-bgprib:bgp-rib/oc-bgprib:afi-safis/" +
+    "oc-bgprib:afi-safi/oc-bgprib:ipv6-unicast/" +
+    "oc-bgprib:neighbors/oc-bgprib:neighbor/" +
+    "oc-bgprib:adj-rib-out-post/oc-bgprib:routes/oc-bgprib:route" +
+    "/oc-bgprib:state"{
+      description
+        "Add extended annotations to Adj-RIB for IPv6";
+
+      uses rib-ext-route-annotations;
+  }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-shared-attributes.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-shared-attributes.yang
new file mode 100644
index 0000000..3a03b40
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-shared-attributes.yang
@@ -0,0 +1,170 @@
+submodule openconfig-rib-bgp-shared-attributes {
+
+  belongs-to openconfig-rib-bgp {
+    prefix "oc-rib-bgp";
+  }
+
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  include openconfig-rib-bgp-attributes;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains structural data definitions for
+    attribute sets shared across routes.";
+
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+
+  grouping attribute-sets-top {
+    description
+      "Top level grouping for list of common attribute sets";
+
+    container attr-sets {
+      description
+        "Enclosing container for the list of path attribute sets";
+
+      list attr-set {
+        key "index";
+
+        description
+          "List of path attributes that may be in use by multiple
+          routes in the table";
+
+        leaf index {
+          type leafref {
+            path "../state/index";
+          }
+          description
+            "Reference to list key";
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state for common path attributes";
+
+          leaf index {
+            type uint64;
+            description
+              "System generated index for each attribute set.  The
+              index is used to reference an attribute set from a
+              specific path.  Multiple paths may reference the same
+              attribute set.";
+          }
+
+          uses bgp-shared-common-attr-state;
+        }
+        uses bgp-aggregator-attr-top;
+        uses bgp-as-path-attr-top;
+        uses bgp-as4-path-attr-top;
+      }
+    }
+  }
+
+  grouping community-sets-top {
+    description
+      "Top level grouping for list of shared community attribute
+      sets";
+
+    container communities {
+      description
+        "Enclosing container for the list of community attribute
+        sets";
+
+      list community {
+        key "index";
+
+        description
+          "List of path attributes that may be in use by multiple
+          routes in the table";
+
+        leaf index {
+          type leafref {
+            path "../state/index";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state for shared BGP community attribute";
+
+          leaf index {
+            type uint64;
+            description
+              "System generated index for each attribute set.  The
+              index is used to reference an attribute set from a
+              specific path.  Multiple paths may reference the same
+              attribute set.";
+          }
+
+          uses bgp-community-attr-state;
+        }
+      }
+    }
+  }
+
+  grouping ext-community-sets-top {
+    description
+      "Top level grouping for list of extended community attribute
+      sets";
+
+    container ext-communities {
+      description
+        "Enclosing container for the list of extended community
+        attribute sets";
+
+      list ext-community {
+        key "index";
+
+        description
+          "List of path attributes that may be in use by multiple
+          routes in the table";
+
+        leaf index {
+          type leafref {
+            path "../state/index";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state for shared BGP extended community
+            attribute";
+
+          leaf index {
+            type uint64;
+            description
+              "System generated index for each attribute set.  The
+              index is used to reference an attribute set from a
+              specific path.  Multiple paths may reference the same
+              attribute set.";
+          }
+
+          uses bgp-extended-community-attr-state;
+        }
+      }
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-table-attributes.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-table-attributes.yang
new file mode 100644
index 0000000..285f0a9
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-table-attributes.yang
@@ -0,0 +1,113 @@
+submodule openconfig-rib-bgp-table-attributes {
+
+  belongs-to openconfig-rib-bgp {
+    prefix "oc-rib-bgp";
+  }
+
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-rib-bgp-types { prefix oc-bgpribt; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains common data definitions for data
+    related to a RIB entry, or RIB table.";
+
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+
+
+  grouping bgp-common-route-annotations-state {
+    description
+      "Data definitions for flags and other information attached
+      to routes in both LOC-RIB and Adj-RIB";
+
+    leaf last-modified {
+      type oc-types:timeticks64;
+      description
+        "Timestamp when this path was last modified.
+
+        The value is the timestamp in seconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+    leaf valid-route {
+      type boolean;
+      description
+        "Indicates that the route is considered valid by the
+        local router";
+    }
+
+    leaf invalid-reason {
+      type identityref {
+        base oc-bgpribt:INVALID_ROUTE_REASON;
+      }
+      description
+        "If the route is rejected as invalid, this indicates the
+        reason.";
+    }
+
+  }
+
+  grouping bgp-loc-rib-route-annotations-state {
+    description
+      "Data definitions for information attached to routes in the
+      LOC-RIB";
+
+    // placeholder for route metadata specific to the LOC-RIB
+
+  }
+
+  grouping bgp-adj-rib-in-post-route-annotations-state {
+    description
+      "Data definitions for information attached to routes in the
+      Adj-RIB-in post-policy table";
+
+    leaf best-path {
+      type boolean;
+      description
+        "Current path was selected as the best path.";
+    }
+  }
+
+  grouping bgp-common-table-attrs-state {
+    description
+      "Common attributes attached to all routing tables";
+
+    // placeholder for metadata associated with all tables
+  }
+
+  grouping bgp-common-table-attrs-top {
+    description
+      "Operational state data for common attributes attached to
+      all routing tables";
+    // no enclosing container as this data will fit under an
+    // existing LOC-RIB container
+
+    container state {
+      config false;
+      description
+        "Operational state data for data related to the entire
+        LOC-RIB";
+
+      uses bgp-common-table-attrs-state;
+    }
+  }
+
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-tables.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-tables.yang
new file mode 100644
index 0000000..6ca14b4
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-tables.yang
@@ -0,0 +1,646 @@
+submodule openconfig-rib-bgp-tables {
+
+  belongs-to openconfig-rib-bgp {
+    prefix "oc-rib-bgp";
+  }
+
+
+  // import some basic types
+  import ietf-inet-types { prefix inet; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-policy-types { prefix oc-pol-types; }
+
+  include openconfig-rib-bgp-attributes;
+  include openconfig-rib-bgp-shared-attributes;
+  include openconfig-rib-bgp-table-attributes;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This submodule contains structural data definitions for
+    BGP routing tables.";
+
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+
+  grouping bgp-adj-rib-common-attr-refs {
+    description
+      "Definitions of common references to attribute sets for
+      multiple AFI-SAFIs for Adj-RIB tables";
+
+    leaf attr-index {
+      type leafref {
+        path "../../../../../../../../../../attr-sets/attr-set/" +
+          "state/index";
+      }
+      description
+        "Reference to the common attribute group for the
+        route";
+    }
+
+    leaf community-index {
+      type leafref {
+        path "../../../../../../../../../../communities/community/" +
+          "state/index";
+      }
+      description
+        "Reference to the community attribute for the route";
+    }
+
+    leaf ext-community-index {
+      type leafref {
+        path "../../../../../../../../../../ext-communities/" +
+          "ext-community/state/index";
+      }
+      description
+        "Reference to the extended community attribute for the
+        route";
+    }
+  }
+
+  grouping bgp-loc-rib-common-attr-refs {
+    description
+      "Definitions of common references to attribute sets for
+      multiple AFI-SAFIs for LOC-RIB tables";
+
+    leaf attr-index {
+      type leafref {
+        path "../../../../../../../../attr-sets/attr-set/" +
+          "state/index";
+      }
+      description
+        "Reference to the common attribute group for the
+        route";
+    }
+
+    leaf community-index {
+      type leafref {
+        path "../../../../../../../../communities/community/" +
+          "state/index";
+      }
+      description
+        "Reference to the community attribute for the route";
+    }
+
+    leaf ext-community-index {
+      type leafref {
+        path "../../../../../../../../ext-communities/" +
+          "ext-community/state/index";
+      }
+      description
+        "Reference to the extended community attribute for the
+        route";
+    }
+  }
+
+  grouping bgp-loc-rib-common-keys {
+    description
+      "Common references used in keys for IPv4 and IPv6
+      LOC-RIB entries";
+
+    leaf origin {
+      type union {
+        type inet:ip-address-no-zone;
+        type identityref {
+          base oc-pol-types:INSTALL_PROTOCOL_TYPE;
+        }
+      }
+      description
+        "Indicates the origin of the route.  If the route is learned
+        from a neighbor, this value is the neighbor address.  If
+        the route was injected or redistributed from another
+        protocol, the origin indicates the source protocol for the
+        route.";
+    }
+
+    leaf path-id {
+      type uint32;
+      default 0;
+      description
+        "If the route is learned from a neighbor, the path-id
+        corresponds to the path-id for the route in the
+        corresponding adj-rib-in-post table.  If the route is
+        injected from another protocol, or the neighbor does not
+        support BGP add-paths, the path-id should be set
+        to zero, also the default value.";
+    }
+  }
+
+  grouping bgp-loc-rib-key-refs {
+    description
+      "Key references to support operational state structure for
+      the BGP LOC-RIB table";
+
+    leaf prefix {
+      type leafref {
+        path "../state/prefix";
+      }
+      description
+        "Reference to the prefix list key";
+    }
+
+    leaf origin {
+      type leafref {
+        path "../state/origin";
+      }
+      description
+        "Reference to the origin list key";
+    }
+
+    leaf path-id {
+      type leafref {
+        path "../state/path-id";
+      }
+      description
+        "Reference to the path-id list key";
+    }
+  }
+
+  grouping ipv4-loc-rib-top {
+    description
+      "Top-level grouping for IPv4 routing tables";
+
+    container loc-rib {
+      config false;
+      description
+        "Container for the IPv4 BGP LOC-RIB data";
+
+      uses bgp-common-table-attrs-top;
+
+      container routes {
+        description
+          "Enclosing container for list of routes in the routing
+          table.";
+
+        list route {
+          key "prefix origin path-id";
+
+          description
+            "List of routes in the table, keyed by the route
+            prefix, the route origin, and path-id.  The route
+            origin can be either the neighbor address from which
+            the route was learned, or the source protocol that
+            injected the route.  The path-id distinguishes routes
+            for the same prefix received from a neighbor (e.g.,
+            if add-paths is eanbled).";
+
+          uses bgp-loc-rib-key-refs;
+
+          container state {
+            description
+              "Operational state data for route entries in the
+              BGP LOC-RIB";
+
+            leaf prefix {
+              type inet:ipv4-prefix;
+              description
+                "The IPv4 prefix corresponding to the route";
+            }
+
+            uses bgp-loc-rib-common-keys;
+
+            uses bgp-loc-rib-common-attr-refs;
+
+            uses bgp-loc-rib-attr-state;
+
+            uses bgp-common-route-annotations-state;
+            uses bgp-loc-rib-route-annotations-state;
+
+           }
+
+           uses bgp-unknown-attr-top;
+
+        }
+      }
+    }
+  }
+
+
+  grouping ipv6-loc-rib-top {
+    description
+      "Top-level grouping for IPv6 routing tables";
+
+    container loc-rib {
+      config false;
+      description
+        "Container for the IPv6 BGP LOC-RIB data";
+
+      uses bgp-common-table-attrs-top;
+
+
+      container routes {
+        description
+          "Enclosing container for list of routes in the routing
+          table.";
+
+        list route {
+          key "prefix origin path-id";
+
+          description
+            "List of routes in the table, keyed by the route
+            prefix, the route origin, and path-id.  The route
+            origin can be either the neighbor address from which
+            the route was learned, or the source protocol that
+            injected the route.  The path-id distinguishes routes
+            for the same prefix received from a neighbor (e.g.,
+            if add-paths is eanbled).";
+
+          uses bgp-loc-rib-key-refs;
+
+          container state {
+            description
+              "Operational state data for route entries in the
+              BGP LOC-RIB";
+
+            leaf prefix {
+              type inet:ipv6-prefix;
+              description
+                "The IPv6 prefix corresponding to the route";
+            }
+
+            uses bgp-loc-rib-common-keys;
+
+            uses bgp-loc-rib-common-attr-refs;
+
+            uses bgp-loc-rib-attr-state;
+
+            uses bgp-common-route-annotations-state;
+            uses bgp-loc-rib-route-annotations-state;
+
+          }
+
+          uses bgp-unknown-attr-top;
+        }
+      }
+    }
+  }
+
+  grouping bgp-adj-rib-key-refs {
+    description
+      "Key references to support operational state structure for
+      the BGP Adj-RIB tables";
+
+    leaf prefix {
+      type leafref {
+        path "../state/prefix";
+      }
+      description
+        "Reference to the prefix list key";
+    }
+
+    leaf path-id {
+      type leafref {
+        path "../state/path-id";
+      }
+      description
+        "Reference to the path-id list key";
+    }
+  }
+
+  grouping ipv4-adj-rib-common {
+    description
+      "Common structural grouping for each IPv4 adj-RIB table";
+
+    uses bgp-common-table-attrs-top;
+
+    container routes {
+      config false;
+      description
+        "Enclosing container for list of routes in the routing
+        table.";
+
+      list route {
+        key "prefix path-id";
+
+        description
+          "List of routes in the table, keyed by a combination of
+          the route prefix and path-id to distinguish multiple
+          routes received from a neighbor for the same prefix,
+          e.g., when BGP add-paths is enabled.";
+
+        uses bgp-adj-rib-key-refs;
+
+        container state {
+          description
+            "Operational state data for BGP Adj-RIB entries";
+
+          leaf prefix {
+            type inet:ipv4-prefix;
+            description
+              "Prefix for the route";
+          }
+
+          uses bgp-adj-rib-attr-state;
+
+          uses bgp-adj-rib-common-attr-refs;
+
+          uses bgp-common-route-annotations-state;
+        }
+
+        uses bgp-unknown-attr-top;
+
+      }
+    }
+  }
+
+  grouping ipv4-adj-rib-in-post {
+    description
+      "Common structural grouping for the IPv4 adj-rib-in
+      post-policy table";
+
+    uses bgp-common-table-attrs-top;
+
+    container routes {
+      config false;
+      description
+        "Enclosing container for list of routes in the routing
+        table.";
+
+      list route {
+        key "prefix path-id";
+
+        description
+          "List of routes in the table, keyed by a combination of
+          the route prefix and path-id to distinguish multiple
+          routes received from a neighbor for the same prefix,
+          e.g., when BGP add-paths is enabled.";
+
+        uses bgp-adj-rib-key-refs;
+
+        container state {
+          description
+            "Operational state data for BGP Adj-RIB entries";
+
+          leaf prefix {
+            type inet:ipv4-prefix;
+            description
+              "Prefix for the route";
+          }
+
+          uses bgp-adj-rib-attr-state;
+
+          uses bgp-adj-rib-common-attr-refs;
+
+          uses bgp-common-route-annotations-state;
+
+          uses bgp-adj-rib-in-post-route-annotations-state;
+        }
+
+        uses bgp-unknown-attr-top;
+      }
+    }
+  }
+
+
+  grouping ipv4-adj-rib-top {
+    description
+      "Top-level grouping for Adj-RIB table";
+
+    container neighbors {
+      config false;
+      description
+        "Enclosing container for neighbor list";
+
+      list neighbor {
+        key "neighbor-address";
+        description
+          "List of neighbors (peers) of the local BGP speaker";
+
+        leaf neighbor-address {
+          type leafref {
+            path "../state/neighbor-address";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container state {
+          description
+            "Operational state for each neighbor BGP Adj-RIB";
+
+          leaf neighbor-address {
+            type inet:ip-address-no-zone;
+            description
+              "IP address of the BGP neighbor or peer";
+          }
+        }
+
+        container adj-rib-in-pre {
+          description
+            "Per-neighbor table containing the NLRI updates
+            received from the neighbor before any local input
+            policy rules or filters have been applied.  This can
+            be considered the 'raw' updates from the neighbor.";
+
+          uses ipv4-adj-rib-common;
+
+        }
+
+        container adj-rib-in-post {
+          description
+            "Per-neighbor table containing the paths received from
+            the neighbor that are eligible for best-path selection
+            after local input policy rules have been applied.";
+
+          uses ipv4-adj-rib-in-post;
+        }
+
+        container adj-rib-out-pre {
+          description
+            "Per-neighbor table containing paths eligble for
+            sending (advertising) to the neighbor before output
+            policy rules have been applied";
+
+          uses ipv4-adj-rib-common;
+
+        }
+
+        container adj-rib-out-post {
+          description
+            "Per-neighbor table containing paths eligble for
+            sending (advertising) to the neighbor after output
+            policy rules have been applied";
+
+          uses ipv4-adj-rib-common;
+
+        }
+      }
+    }
+  }
+
+  grouping ipv6-adj-rib-common {
+    description
+      "Common structural grouping for each IPv6 adj-RIB table";
+
+    uses bgp-common-table-attrs-state;
+
+    container routes {
+      config false;
+      description
+        "Enclosing container for list of routes in the routing
+        table.";
+
+      list route {
+        key "prefix path-id";
+
+        description
+          "List of routes in the table";
+
+        uses bgp-adj-rib-key-refs;
+
+        container state {
+          description
+            "Operational state data for BGP Adj-RIB entries";
+
+          leaf prefix {
+            type inet:ipv6-prefix;
+            description
+              "Prefix for the route";
+          }
+
+          uses bgp-adj-rib-attr-state;
+
+          uses bgp-adj-rib-common-attr-refs;
+
+          uses bgp-common-route-annotations-state;
+        }
+
+        uses bgp-unknown-attr-top;
+      }
+    }
+  }
+
+  grouping ipv6-adj-rib-in-post {
+    description
+      "Common structural grouping for the IPv6 adj-rib-in
+      post-policy table";
+
+    uses bgp-common-table-attrs-state;
+
+    container routes {
+      config false;
+      description
+        "Enclosing container for list of routes in the routing
+        table.";
+
+      list route {
+        key "prefix path-id";
+
+        description
+          "List of routes in the table";
+
+        uses bgp-adj-rib-key-refs;
+
+        container state {
+          description
+            "Operational state data for BGP Adj-RIB entries";
+
+          leaf prefix {
+            type inet:ipv6-prefix;
+            description
+              "Prefix for the route";
+          }
+
+          uses bgp-adj-rib-attr-state;
+
+          uses bgp-adj-rib-common-attr-refs;
+
+          uses bgp-common-route-annotations-state;
+
+          uses bgp-adj-rib-in-post-route-annotations-state;
+        }
+
+        uses bgp-unknown-attr-top;
+      }
+    }
+  }
+
+  grouping ipv6-adj-rib-top {
+    description
+      "Top-level grouping for Adj-RIB table";
+
+    container neighbors {
+      config false;
+      description
+        "Enclosing container for neighbor list";
+
+      list neighbor {
+        key "neighbor-address";
+        description
+          "List of neighbors (peers) of the local BGP speaker";
+
+        leaf neighbor-address {
+          type leafref {
+            path "../state/neighbor-address";
+          }
+          description
+            "Reference to the list key";
+        }
+
+        container state {
+          description
+            "Operational state for each neighbor BGP Adj-RIB";
+
+          leaf neighbor-address {
+            type inet:ip-address-no-zone;
+            description
+              "IP address of the BGP neighbor or peer";
+          }
+        }
+
+        container adj-rib-in-pre {
+          description
+            "Per-neighbor table containing the NLRI updates
+            received from the neighbor before any local input
+            policy rules or filters have been applied.  This can
+            be considered the 'raw' updates from the neighbor.";
+
+          uses ipv6-adj-rib-common;
+
+        }
+
+        container adj-rib-in-post {
+          description
+            "Per-neighbor table containing the paths received from
+            the neighbor that are eligible for best-path selection
+            after local input policy rules have been applied.";
+
+          uses ipv6-adj-rib-in-post;
+        }
+
+        container adj-rib-out-pre {
+          description
+            "Per-neighbor table containing paths eligble for
+            sending (advertising) to the neighbor before output
+            policy rules have been applied";
+
+          uses ipv6-adj-rib-common;
+
+        }
+
+        container adj-rib-out-post {
+          description
+            "Per-neighbor table containing paths eligble for
+            sending (advertising) to the neighbor after output
+            policy rules have been applied";
+
+          uses ipv6-adj-rib-common;
+
+        }
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-types.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-types.yang
new file mode 100644
index 0000000..8758cea
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp-types.yang
@@ -0,0 +1,155 @@
+module openconfig-rib-bgp-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/rib/bgp-types";
+
+  prefix "oc-bgprib-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Defines identity and type defintions associated with
+    the OpenConfig BGP RIB modules";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+  revision "2016-04-11" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  identity INVALID_ROUTE_REASON {
+    description
+      "Base identity for reason code for routes that are rejected as
+      invalid.  Some derived entities are based on BMP v3";
+    reference "BGP Monitoring Protocol (draft-ietf-grow-bmp-07)";
+  }
+
+  identity INVALID_CLUSTER_LOOP {
+    base INVALID_ROUTE_REASON;
+    description
+      "Route was invalid due to CLUSTER_LIST loop";
+  }
+
+  identity INVALID_AS_LOOP {
+    base INVALID_ROUTE_REASON;
+    description
+      "Route was invalid due to AS_PATH loop";
+  }
+
+  identity INVALID_ORIGINATOR {
+    base INVALID_ROUTE_REASON;
+    description
+      "Route was invalid due to ORIGINATOR_ID, e.g., update has
+      local router as originator";
+  }
+
+  identity INVALID_CONFED {
+    base INVALID_ROUTE_REASON;
+    description
+      "Route was invalid due to a loop in the AS_CONFED_SEQUENCE or
+      AS_CONFED_SET attributes";
+  }
+
+  identity BGP_NOT_SELECTED_BESTPATH {
+    description
+      "Base identity for indicating reason a route was was not
+      selected by BGP route selection algorithm";
+    reference
+      "RFC 4271 - Section 9.1";
+  }
+
+  identity LOCAL_PREF_LOWER {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route has a lower localpref attribute than current best path";
+    reference
+      "RFC 4271 - Section 9.1.2";
+  }
+
+  identity AS_PATH_LONGER {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route has a longer AS path attribute than current best path";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (a)";
+  }
+
+  identity ORIGIN_TYPE_HIGHER {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route has a higher origin type, i.e., IGP origin is preferred
+      over EGP or incomplete";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (b)";
+  }
+
+  identity MED_HIGHER {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route has a higher MED, or metric, attribute than the current
+      best path";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (c)";
+  }
+
+  identity PREFER_EXTERNAL {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route source is via IGP, rather than EGP.";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (d)";
+  }
+
+  identity NEXTHOP_COST_HIGHER {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route has a higher interior cost to the next hop.";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (e)";
+  }
+
+  identity HIGHER_ROUTER_ID {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route was sent by a peer with a higher BGP Identifier value,
+      or router id";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (f)";
+  }
+
+  identity HIGHER_PEER_ADDRESS {
+    base BGP_NOT_SELECTED_BESTPATH;
+    description
+      "Route was sent by a peer with a higher IP address";
+    reference
+      "RFC 4271 - Section 9.1.2.2 (g)";
+  }
+
+  identity BGP_NOT_SELECTED_POLICY {
+    description
+      "Base identity for reason code for routes that are rejected
+      due to policy";
+  }
+
+  identity REJECTED_IMPORT_POLICY {
+    base BGP_NOT_SELECTED_POLICY;
+    description
+      "Route was rejected after apply import policies";
+  }
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/rib/openconfig-rib-bgp.yang b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp.yang
new file mode 100644
index 0000000..1af876b
--- /dev/null
+++ b/models/openconfig/src/main/yang/rib/openconfig-rib-bgp.yang
@@ -0,0 +1,183 @@
+module openconfig-rib-bgp {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/rib/bgp";
+
+  prefix "oc-rib-bgp";
+
+  // import some basic types
+  import openconfig-bgp-types { prefix oc-bgpt; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // include RIB submodules
+
+  // structure for LOC-RIB and Adj-RIB tables
+  include openconfig-rib-bgp-tables;
+
+  // structure of shared attribute groups
+  include openconfig-rib-bgp-shared-attributes;
+
+  // groupings of attributes in three categories:
+  //  - shared across multiple routes
+  //  - common to LOC-RIB and Adj-RIB, but not shared across routes
+  //  - specific to LOC-RIB or Adj-RIB
+  include openconfig-rib-bgp-attributes;
+
+  // groupings of annotations for each route or table
+  include openconfig-rib-bgp-table-attributes;
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "Defines a data model for representing BGP routing table (RIB)
+    contents.  The model supports 5 logical RIBs per address family:
+
+    loc-rib: This is the main BGP routing table for the local routing
+    instance, containing best-path selections for each prefix. The
+    loc-rib table may contain multiple routes for a given prefix,
+    with an attribute to indicate which was selected as the best
+    path.  Note that multiple paths may be used or advertised even if
+    only one path is marked as best, e.g., when using BGP
+    add-paths.  An implementation may choose to mark multiple
+    paths in the RIB as best path by setting the flag to true for
+    multiple entries.
+
+    adj-rib-in-pre: This is a per-neighbor table containing the NLRI
+    updates received from the neighbor before any local input policy
+    rules or filters have been applied.  This can be considered the
+    'raw' updates from a given neighbor.
+
+    adj-rib-in-post: This is a per-neighbor table containing the
+    routes received from the neighbor that are eligible for
+    best-path selection after local input policy rules have been
+    applied.
+
+    adj-rib-out-pre: This is a per-neighbor table containing routes
+    eligible for sending (advertising) to the neighbor before output
+    policy rules have been applied.
+
+    adj-rib-out-post: This is a per-neighbor table containing routes
+    eligible for sending (advertising) to the neighbor after output
+    policy rules have been applied.";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision "2016-10-17" {
+    description
+      "OpenConfig BGP RIB refactor";
+    reference "0.3.0";
+  }
+
+  revision "2016-04-11" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+
+
+  // grouping statements
+
+
+
+  grouping bgp-rib-state {
+    description
+      "Operational state data for the top level BGP RIB";
+
+    leaf afi-safi-name {
+      type identityref {
+        base oc-bgpt:AFI_SAFI_TYPE;
+      }
+      description "AFI,SAFI";
+    }
+  }
+
+  grouping bgp-rib-top {
+    description
+      "Top-level grouping for the BGP RIB";
+
+    container bgp-rib {
+      config false;
+      description
+        "Top level container for BGP RIBs";
+
+      uses attribute-sets-top;
+      uses community-sets-top;
+      uses ext-community-sets-top;
+
+      container afi-safis {
+        config false;
+        description
+          "Enclosing container for address family list";
+
+        list afi-safi {
+          key "afi-safi-name";
+          description
+            "list of afi-safi types";
+
+          leaf afi-safi-name {
+            type leafref {
+              path "../state/afi-safi-name";
+            }
+            description
+              "Reference to the list key";
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state data for the BGP list";
+
+            uses bgp-rib-state;
+          }
+
+          container ipv4-unicast {
+            when "../afi-safi-name = 'oc-bgpt:IPV4_UNICAST'" {
+              description
+                "Include this container for IPv4 unicast RIB";
+            }
+            description
+              "Routing tables for IPv4 unicast -- active when the
+              afi-safi name is ipv4-unicast";
+
+            uses ipv4-loc-rib-top;
+            uses ipv4-adj-rib-top;
+          }
+
+          container ipv6-unicast {
+            when "../afi-safi-name = 'oc-bgpt:IPV6_UNICAST'" {
+              description
+                "Include this container for IPv6 unicast RIB";
+            }
+            description
+              "Routing tables for IPv6 unicast -- active when the
+              afi-safi name is ipv6-unicast";
+
+            uses ipv6-loc-rib-top;
+            uses ipv6-adj-rib-top;
+          }
+        }
+      }
+    }
+  }
+
+
+  // data definition statements
+
+  uses bgp-rib-top;
+
+  // augment statements
+
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/segment-routing/openconfig-rsvp-sr-ext.yang b/models/openconfig/src/main/yang/segment-routing/openconfig-rsvp-sr-ext.yang
new file mode 100644
index 0000000..6b3ddc1
--- /dev/null
+++ b/models/openconfig/src/main/yang/segment-routing/openconfig-rsvp-sr-ext.yang
@@ -0,0 +1,389 @@
+module openconfig-rsvp-sr-ext {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/rsvp-sr-ext";
+  prefix "oc-sr-rsvp-ext";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-types { prefix "oc-types"; }
+  import openconfig-network-instance { prefix "oc-ni"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module adds extensions to the OpenConfig MPLS models to
+    provide extensions which allow the coexistence of RSVP-TE and
+    Segment Routing (SR) within the same network. It augments the
+    existing OpenConfig segment routing (SR) and RSVP-TE models
+    where required.";
+
+  oc-ext:openconfig-version "0.1.0";
+
+  revision 2017-03-06 {
+    description
+      "Initial revision.";
+    reference "0.1.0";
+  }
+
+  grouping bandwidth-measurement-global-state {
+    description
+      "Operational state parameters for bandwidth measurement which
+      apply globally to the device.";
+
+    leaf effective-adjustment-interval {
+      type uint32;
+      units "seconds";
+      description
+        "The effective adjustment interval that is being used by
+        the system. In the case that the adjustment-interval leaf
+        is set to a non-integer multiple of the collection-interval,
+        and the system does not support this, the value of this leaf
+        should reflect the effective value of the adjustment interval
+        that it has selected. In the case where no rounding of the
+        adjustment interval has occurred, this value should have the
+        same value as the adjustment-inerval leaf.";
+    }
+  }
+
+  grouping bandwidth-measurement-global-config {
+    description
+      "Configuration parameters for bandwidth measurement which apply
+      globally to the device.";
+
+    leaf measure-sr-traffic {
+      type boolean;
+      description
+        "When this leaf is set to true, the local system should
+        measure the bandwidth utilisation of SR traffic on interfaces
+        for which TED entries are being generated.
+
+        In the case that this functionality is enabled, traffic
+        forwarded using LFIB entries that correspond to MPLS
+        labels which correspond to SR SIDs should be accounted
+        for.";
+      reference
+        "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+    }
+
+    // TODO(robjs): For future extension, traffic accounting for
+    // non-SR, non-RSVP traffic could be added here. e.g., LDP,
+    // BGP-LU etc.
+
+    leaf collection-interval {
+      type uint32;
+      units "seconds";
+      description
+        "The interval at which the collection of interface
+        statistics relating to non-RSVP-TE traffic should be
+        performed";
+      reference
+        "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+    }
+
+    leaf adjustment-interval {
+      type uint32;
+      units "seconds";
+      description
+        "The interval after which an adjustment to the utilised
+        bandwidth on the interface is made. This value must be
+        greater than, or equal to, the collection interval for
+        statistics.  This value is referred to as N in
+        draft-sitaraman-sr-rsvp-coexistence-rec-01.
+
+        After N seconds have expired, the
+        arithmetic mean of the samples is taken, and this is
+        considered as the non-RSVP-TE utilisation of the
+        interface. In the case that the adjustment interval is
+        an integer >1 multiple of the collection interval, this
+        serves to provide smoothing of the collected bandwidth
+        statistics.";
+      reference
+        "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+    }
+
+    leaf bandwidth-multiplier {
+      type decimal64 {
+        fraction-digits 4;
+      }
+      default 1.0000;
+      description
+        "A multiplier applied to the sampled bandwidth which
+        determines the value that is propagated to the IGP TED.
+        By default this value is 1.0000, and hence the actual
+        sampled value is flooded.";
+    }
+  }
+
+  grouping bandwidth-measurement-update-config {
+    description
+      "Configuration parameters related to when the bandwidth
+      measurement information is used to update the IGP TED.";
+
+    leaf update-trigger {
+      type enumeration {
+        enum ADJUSTED_MAX_RESERVABLE_PCT {
+          description
+            "Update of a new maximum reservable bandwidth IGP
+            TLV is based on the value changing >= X% of
+            the currently flooded adjusted-absolute-subscription-bw.
+            The percentage of this value that is used is specified
+            by the adjusted-max-reservable-bw-pct leaf.";
+        }
+        enum SR_TRAFFIC_PCT {
+          description
+            "Update of the new maximum reservable bandwidth IGP
+            TLV is based on the value changing >= X% of the last
+            calculated segment routing traffic utilisation for the
+            interface. The percentage delta of this value is
+            specified by the sr-traffic-pct leaf.";
+        }
+      }
+      description
+        "The trigger that should be used to determine when the IGP
+        TED is updated with new information as to the effective
+        maximum reservable bandwidth
+        (adjusted-absolute-subscription-bw)";
+    }
+
+    leaf adjusted-max-reservable-bw-pct {
+      when "../update-trigger = 'ADJUSTED_MAX_RESERVABLE_PCT'" {
+        description
+          "Only allow the adjusted-max-reservable-bw update trigger
+          to be specified when the update-trigger mode is specified
+          to be a percentage of the currently flooded value.";
+      }
+      type oc-types:percentage;
+      description
+        "The delta in the adjusted-max-reservable-bandwidth that
+        should trigger an update in the value which is flooded
+        through the IGP TED.
+        The delta is measured as a percentage of the
+        current adjusted value of the maximum reservable bandwidth
+        of the interface, as specified by the
+        adjusted-absolute-subscription-bw RSVP-TE leaf.";
+      reference
+        "draft-sitaraman-sr-rsvp-coexistence-rec-01";
+    }
+
+    leaf sr-traffic-pct {
+      when "../update-trigger = 'SR_TRAFFIC_PCT'" {
+        description
+          "Only allow the SR traffic percentage trigger to be
+          specified when the update trigger is defined to be a
+          percentage of the last calculated SR traffic value.";
+      }
+      type oc-types:percentage;
+      description
+        "The change in the calculated SR traffic on the interface
+        that should trigger an update in the value of the
+        maximum reservable bandwidth flooded through the IGP TED.
+        The value is specified as a percentage of the
+        last-calculated-sr-traffic state leaf.";
+    }
+  }
+
+  grouping bandwidth-measurement-global-structural {
+    description
+      "Structural grouping for the measurement of segment routing
+      traffic, and its advertisement into the IGP TED.";
+
+    container bandwidth-measurement {
+      description
+        "Configuration and operational state parameters related to
+        how bandwidth utilisation is measured and flooded into the
+        IGP.";
+
+      container config {
+        description
+          "Configuration parameters relating to bandwidth
+          measurement.";
+
+        uses bandwidth-measurement-global-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to bandwidth
+          measurement";
+
+        uses bandwidth-measurement-global-config;
+        uses bandwidth-measurement-global-state;
+      }
+
+      container update-trigger {
+        description
+          "Configuration and operational state parameters related
+          to the update trigger for flooding new bandwidth
+          information into the IGP.";
+
+        container config {
+          description
+            "Configuration parameters related to the bandwidth
+            measurement update trigger.";
+
+          uses bandwidth-measurement-update-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parameters related to the bandwidth
+            measurement update trigger.";
+
+          uses bandwidth-measurement-update-config;
+        }
+      }
+    }
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+          "oc-ni:mpls/oc-ni:te-global-attributes" {
+    description
+      "Add the bandwidth measurement parameters to MPLS global
+      traffic engineering hierarchy.";
+
+    uses bandwidth-measurement-global-structural;
+  }
+
+  grouping bandwidth-measurement-rsvp-te-adjusted-state {
+    description
+      "Logical grouping augmented into the RSVP-TE hierarchy to
+      provide an operational state value which reflects the
+      adjusted RSVP-TE available bandwidth.";
+
+    leaf adjusted-absolute-subscription-bw {
+      type uint64;
+      units "kbps";
+      description
+        "The adjusted absolute value (in kbps) of the
+        bandwidth which is reservable to RSVP-TE on the
+        local system. In the case that the bandwidth-measurement
+        configuration does not account for non-RSVP-TE traffic
+        then this value is equal to the
+        calculated-absolute-subscription-bw, in the case that
+        non-RSVP-TE traffic is being accounted for, it is lower
+        such that calculated-absolute-subscription-bw -
+        adjusted-absolute-subscription-bw = the current calculated
+        non-RSVP-TE traffic.
+
+        This value reflects the last flooded value of the maximum
+        reservable bandwidth, or subscription.";
+    }
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/" +
+    "oc-ni:mpls/oc-ni:signaling-protocols/oc-ni:rsvp-te/" +
+    "oc-ni:interface-attributes/oc-ni:interface/" +
+    "oc-ni:subscription/oc-ni:state" {
+
+    description
+      "Augmentation to add the adjusted RSVP-TE available bandwidth
+      state to the RSVP-TE signaling protocol.";
+
+    uses bandwidth-measurement-rsvp-te-adjusted-state;
+  }
+
+  grouping bandwidth-measurement-intf-structural {
+    description
+      "Structural grouping containing interface bandwidth
+      measurement configuration and operational state
+      parameters.";
+
+    container bandwidth-measurement {
+      description
+        "Configuration and operational state parameters relating to
+        per-interface bandwidth measurement. These parameters are
+        used in the case that RSVP-TE coexists with other MPLS
+        signaling protocols on an interface.";
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to the containing
+          interface's bandwidth measurement.";
+
+        uses bandwidth-measurement-intf-state;
+      }
+    }
+  }
+
+  grouping bandwidth-measurement-intf-state {
+    description
+      "Operational state parameters per-interface for the measured
+      bandwidth on an interface";
+
+    leaf last-sample-time {
+      type oc-types:timeticks64;
+      description
+        "The time at which the last sample of bandwidth utilisation
+        for both RSVP-TE and non-RSVP-TE traffic was taken. This value
+        is represented in nanoseconds since the Unix epoch.";
+    }
+
+    leaf last-sample-measured-rsvp-util {
+      type uint64;
+      units "kbps";
+      description
+        "The measured RSVP-TE bandwidth utilisation at the last sample
+        (whose time is indicated in last-sample-time). This value is
+        expressed as a 64-bit unsigned integer representing the number
+        of kilobits per second that RSVP-TE traffic is consuming on
+        the interface.";
+    }
+
+    leaf last-sample-measured-sr-util {
+      type uint64;
+      units "kbps";
+      description
+        "The measured Segment Routing bandwidth utilisation at the
+        last sample (whose time is indicated in last-sample-time).
+        This value is expressed as a 64-bit unsigned integer
+        representing the number of kilobits per second that Segment
+        Routing traffic is consuming on the interface.";
+    }
+
+    leaf last-calculated-time {
+      type oc-types:timeticks64;
+      description
+        "The time at which the last calculated value for bandwidth
+        utilisation was performed.";
+    }
+
+    leaf last-calculated-sr-utilisation {
+      type uint64;
+      description
+        "The last calculated value of the Segment Routing  utilisation
+        (taken post any averaging or adjustment that occurs). This
+        value is updated regardless of whether the value was flooded
+        or not.";
+    }
+
+    leaf last-flooded-time {
+      type oc-types:timeticks64;
+      description
+        "The time, expressed in nanoseconds since the epoch, at which
+        the bandwidth utilisation of non-RSVP-TE traffic resulted in
+        the value being flooded in the IGP. If the configuration of the
+        local system specifies a 0% change requires flooding, this leaf
+        will always reflect the value of the last-calculated-time. In
+        systems that have suppression due to a >0% delta being required
+        then it indicates the last time that the percentage threshold
+        was exceeded.";
+    }
+  }
+
+  augment "/oc-ni:network-instances/oc-ni:network-instance/oc-ni:mpls" +
+          "/oc-ni:te-interface-attributes/oc-ni:interface" {
+    description
+      "Augment the per-interface bandwidth measurement parameters into the
+      MPLS hierarchy of network instance.";
+
+    uses bandwidth-measurement-intf-structural;
+  }
+}
diff --git a/models/openconfig/src/main/yang/segment-routing/openconfig-segment-routing.yang b/models/openconfig/src/main/yang/segment-routing/openconfig-segment-routing.yang
new file mode 100644
index 0000000..f19b2d8
--- /dev/null
+++ b/models/openconfig/src/main/yang/segment-routing/openconfig-segment-routing.yang
@@ -0,0 +1,780 @@
+module openconfig-segment-routing {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/sr";
+  prefix "oc-sr";
+
+  // import some basic types
+  import openconfig-extensions { prefix "oc-ext"; }
+  import openconfig-mpls-types { prefix "oc-mpls-t"; }
+  import openconfig-interfaces { prefix "oc-if"; }
+  import ietf-inet-types { prefix "inet"; }
+  import ietf-yang-types { prefix "yang"; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Configuration and operational state parameters relating to the
+    segment routing. This module defines a number of elements which are
+    instantiated in multiple places throughout the OpenConfig collection
+    of models.
+
+    Particularly:
+      - SRGB+LB dataplane instances - directly instantied by SR.
+      - SRGB+LB dataplane reservations - instantiated within MPLS and future SR
+                                      dataplanes.
+      - SR SID advertisements - instantiated within the relevant IGP.
+      - SR-specific counters - instantied within the relevant dataplane.";
+
+  oc-ext:openconfig-version "0.0.3";
+
+  revision "2017-01-12" {
+    description
+      "Minor compliance fixes.";
+    reference "0.0.3";
+  }
+
+  revision "2016-12-15" {
+    description
+      "Updated revision of SR module.";
+    reference "0.0.2";
+  }
+
+  revision "2016-07-28" {
+    description
+      "Initial revision of SR module.";
+    reference "0.0.1";
+  }
+
+  typedef sr-dataplane-type {
+    type enumeration {
+      enum MPLS {
+        description
+          "The entity uses MPLS labels as Segment Identifiers.";
+      }
+      enum IPV6 {
+        description
+          "The entity uses IPv6 prefixes as Segment Identifiers.";
+      }
+    }
+    description
+      "Types of data plane that can be used to instantiate a Segment
+      Routing block of SIDs.";
+  }
+
+  typedef sr-sid-type {
+    type union {
+      type oc-mpls-t:mpls-label;
+      type inet:ipv6-address-no-zone;
+    }
+    description
+      "The defined value of a segment identifier.";
+  }
+
+  grouping srgb-config {
+    description
+      "Configuration parameters relating to the SRGB.";
+
+    leaf local-id {
+      type string;
+      description
+        "Unique identifier for the segment routing global block on
+        the local system.";
+    }
+
+    leaf dataplane-type {
+      type sr-dataplane-type;
+      description
+        "The dataplane being used to instantiate the SRGB. When MPLS is specified
+        the set of MPLS label blocks that are defined in the mpls-label-blocks
+        list are used to make up the SRGB. When IPv6 is specified, the set of IPv6
+        prefixes specified in the ipv6-prefixes list are used.";
+    }
+
+    leaf-list mpls-label-blocks {
+      when "../dataplane-type = 'MPLS'" {
+        description
+          "Allow the MPLS label block to be specified only for SRGBs that are
+          using the MPLS dataplane.";
+      }
+      type leafref {
+        // We are at /network-instances/network-instance/segment-routing/
+        // srgbs/srgb/config/mpls-label-blocks
+        path "../../../../../mpls/global/reserved-label-blocks/" +
+             "reserved-label-block/config/local-id";
+      }
+      description
+        "A list of refences to the label blocks that are used to make
+        up the SRGB.";
+    }
+
+    leaf-list ipv6-prefixes {
+      when "../dataplane-type = 'IPV6'" {
+        description
+          "Allow IPv6 prefixes to be specified only when the dataplane
+          realisation of the SRGB is IPv6.";
+      }
+      type inet:ipv6-prefix;
+      description
+        "A list of IPv6 prefixes which are to be used for segment routing using
+        the IPv6 dataplane.";
+    }
+  }
+
+  grouping srgb-state {
+    description
+      "Operational state parameters relating to the SRGB.";
+
+    leaf size {
+      type uint32;
+      description
+        "The total number of SRGB entries that are available within the SRGB.";
+    }
+
+    leaf used {
+      type uint32;
+      description
+        "The total number of SRGB entries that have already been alocated by
+        protocols referencing the SRGB.";
+    }
+  }
+
+  grouping srlb-config {
+    description
+      "Configuration parameters relating to an SRLB.";
+
+    leaf local-id {
+      type string;
+      description
+        "A unique local identifier used for the Segment Routing Local Block.
+        The identifier is used when referencing the SRLB within other
+        contexts.";
+    }
+
+    leaf dataplane-type {
+      type sr-dataplane-type;
+      description
+        "The dataplane that is to be used for the Segment Routing Local Block.
+        When MPLS is specified, the local block corresponds to a block of MPLS
+        labels; when IPv6 is specified it corresponds to an IPv6 prefix.";
+    }
+
+    leaf mpls-label-block {
+      when "../dataplane-type = 'MPLS'" {
+        description
+          "Allow the MPLS label block to be specified only for SRLBs that are
+          using the MPLS dataplane.";
+      }
+      type leafref {
+        path "../../../../../mpls/global/reserved-label-blocks/" +
+             "reserved-label-block/config/local-id";
+      }
+      description
+        "A reference to the MPLS label block that is used to contain the
+        SIDs of the SRLB.";
+    }
+
+    leaf ipv6-prefix {
+      when "../dataplane-type = 'IPV6'" {
+        description
+          "Allow IPv6 prefixes to be specified only when the dataplane
+          realisation of the SRGB is IPv6.";
+      }
+      type inet:ipv6-prefix;
+      description
+        "The IPv6 prefix that is used for the SRLB.";
+    }
+  }
+
+  grouping sr-structural {
+    description
+      "Top-level structural grouping defining Segment Routing Global Blocks.";
+
+    container srgbs {
+      description
+        "Configuration and operational state parameters relating to the
+        SRGBs defined for the system.";
+
+      list srgb {
+        key "local-id";
+
+        description
+          "A single definition of an SRGB which may comprise of multiple
+          sets of dataplane addresses (IPv6 addresses, or MPLS labels).";
+
+        leaf local-id {
+          type leafref {
+            path "../config/local-id";
+          }
+          description
+            "A reference to the identifier for the SRGB.";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the SRGB.";
+          uses srgb-config;
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters relating to the SRGB.";
+          uses srgb-config;
+          uses srgb-state;
+        }
+      }
+    }
+
+    container srlbs {
+      description
+        "Configuration and operational state parameters relating to the
+        Segment Routing Local Blocks (SRLBs) defined for the system.";
+
+      list srlb {
+        key "local-id";
+
+        description
+          "A definition of a Segment Routing Local Block, defined to be
+          a set of Segment Identifiers (specified as MPLS labels or
+          IPv6 addreses) that are defined for local allocation by the
+          system. A block may optionally be advertised into an IGP.";
+
+        leaf local-id {
+          type leafref {
+            path "../config/local-id";
+          }
+          description
+            "Reference to the local identifier used for the SRLB.";
+        }
+
+        container config {
+          description
+            "Configuration parameters relating to the SRLB.";
+          uses srlb-config;
+        }
+
+        container state {
+          config false;
+          description
+            "Operational state parmeters relating to the SRLB.";
+          uses srlb-config;
+        }
+      }
+    }
+  }
+
+  grouping sr-mpls-top {
+    description
+      "Structural grouping defining SR definition within MPLS.";
+
+    container segment-routing {
+      description
+        "MPLS-specific Segment Routing configuration and operational state
+        parameters";
+
+      container aggregate-sid-counters {
+        description
+          "Per-SID counters aggregated across all interfaces on the local system";
+
+        list aggregate-sid-counter {
+          key "mpls-label";
+          config false;
+
+          description
+            "Counters aggregated across all of the interfaces of the local
+            system corresponding to traffic received or forwarded with a
+            particular SID";
+
+          leaf mpls-label {
+            type leafref {
+              path "../state/mpls-label";
+            }
+            description
+              "The MPLS label representing the segment identifier";
+          }
+
+          container state {
+            config false;
+            description
+              "State parameters for per-SID statistics";
+            uses sr-mpls-sid-counters-state;
+            uses sr-mpls-common-counters;
+          }
+        }
+      }
+
+      container interfaces {
+        description
+          "Interface related Segment Routing parameters.";
+
+        list interface {
+          key "interface-id";
+
+          description
+            "Parameters and MPLS-specific configuration relating to Segment
+            Routing on an interface.";
+
+          leaf interface-id {
+            type leafref {
+              path "../config/interface-id";
+            }
+            description
+              "A reference to the ID for the interface for which SR is
+              configured";
+          }
+
+          container config {
+            description
+              "MPLS-specific Segment Routing configuration parameters
+              related to an interface.";
+            uses sr-mpls-interface-config;
+          }
+
+          container state {
+            config false;
+            description
+              "MPLS-specific Segment Routing operational state parameters
+              related to an interface.";
+            uses sr-mpls-interface-config;
+            uses sr-mpls-interface-state;
+          }
+
+          container sid-counters {
+            description
+              "Per-SID statistics for MPLS";
+
+            list sid-counter {
+              key "mpls-label";
+              config false;
+
+              description
+                "Per segment identifier counters for the MPLS dataplane.";
+
+              leaf mpls-label {
+                type leafref {
+                  path "../state/mpls-label";
+                }
+                description
+                  "The MPLS label representing the segment identifier";
+              }
+
+              container state {
+                config false;
+                description
+                  "State parameters for per-SID statistics";
+                uses sr-mpls-sid-counters-state;
+                uses sr-mpls-common-counters;
+              }
+
+              container forwarding-classes {
+                description
+                  "Per-SID per-forwarding class counters for Segment Routing.";
+
+                list forwarding-class {
+                  key "exp";
+                  config false;
+
+                  description
+                    "SID entries for the forwarding class associated with the
+                    referenced MPLS EXP.";
+
+                  leaf exp {
+                    type leafref {
+                      path "../state/exp";
+                    }
+                    description
+                      "Reference to the value of the EXP bits of the segment
+                      identifier.";
+                  }
+
+                  container state {
+                    config false;
+                    description
+                      "Per-SID, per forwarding class counters for Segment Routing
+                      with the MPLS dataplane";
+
+                    uses sr-mpls-interface-sid-fc-state;
+                    uses sr-mpls-common-counters;
+                  }
+                }
+              }
+            }
+          }
+          uses oc-if:interface-ref;
+        }
+      }
+    }
+  }
+
+  grouping sr-mpls-interface-config {
+    description
+      "MPLS-specific Segment Routing configuration for an interface";
+
+    leaf interface-id {
+      type string;
+      description
+        "A unique identifier for the interface.";
+    }
+  }
+
+  grouping sr-mpls-interface-state {
+    description
+      "MPLS-specific Segment Routing operational state parameters for an
+      interface";
+
+    uses sr-mpls-common-counters;
+  }
+
+  grouping sr-mpls-interface-sid-fc-state {
+    description
+      "Per-SID per forwarding class statistics for SR with the MPLS dataplane";
+
+    leaf exp {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "The value of the MPLS EXP (experimental) or Traffic Class bits that the
+        SID statistics relate to. Packets received with a MPLS label value
+        equal to the SID's MPLS label and EXP bits equal to the this value
+        should be counted towards the associated ingress statistics. Packets
+        that are forwarded to the destination MPLS label corresponding to the
+        SID should be counted towards this value. In the egress direction, where
+        forwarding follows a SID value that requires PHP at the local node,
+        packets should still be counted towards the egress counters.";
+    }
+  }
+
+  grouping sr-mpls-sid-counters-state {
+    description
+      "Per-SID statistics leaves";
+
+    leaf mpls-label {
+      type oc-mpls-t:mpls-label;
+      description
+        "The MPLS label used for the segment identifier";
+    }
+  }
+
+  grouping sr-mpls-common-counters {
+    description
+      "Per segment identifier counters used in the model";
+
+      leaf in-pkts {
+        type yang:counter64;
+        description
+          "A cumulative counter of the packets received within the context
+          which have matched a label corresponding to an SR Segment Identifier.";
+      }
+
+      leaf in-octets {
+        type yang:counter64;
+        description
+          "The cumulative counter of the total bytes received within the context
+          which have matched a label corresponding to an SR Segment Identifier";
+      }
+
+      leaf out-pkts {
+        type yang:counter64;
+        description
+          "A cumulative counter of the total number of packets transmitted by
+          the local system within the context which have a label imposed that
+          corresponds to an Segment Identifier.";
+      }
+
+      leaf out-octets {
+        type yang:counter64;
+        description
+          "A cumulative counter of the total bytes transmitted by the local
+          system within the context which have a label imported that
+          corresponds to an SR Segment Identifier.";
+      }
+  }
+
+  grouping sr-igp-config {
+    description
+      "Configuration parameters relating to segment routing within an
+      IGP.";
+
+    leaf enabled {
+      type boolean;
+      description
+        "When this leaf is set to true, the segment routing extensions are
+        utilised within the IGP.";
+    }
+
+    leaf srgb {
+      type leafref {
+        path "../../../../../../../segment-routing/srgbs/srgb/config/local-id";
+      }
+      description
+        "A reference to the Segment Routing Global Block (SRGB) that is
+        to be used by this IGP instance.";
+    }
+
+    leaf srlb {
+      // Leaf is defined at
+      // /network-instances/network-instance/protocols/protocol/<igp>/global/
+      // segment-routing/config
+      type leafref {
+        path "../../../../../../../segment-routing/srlbs/srlb/config/local-id";
+      }
+      description
+        "A reference to the Segment Routing Local Block (SRLB) that is to
+        be advertised by the IGP instance.";
+    }
+  }
+
+  grouping sr-igp-top {
+    description
+      "Per-instance configuration and state parameters for Segment Routing
+      in an IGP.";
+
+    container segment-routing {
+      description
+        "Configuration and operational state relating to segment routing.";
+
+      container config {
+        description
+          "Configuration parameters relating to the configuration of segment
+          routing for the IGP instance.";
+        uses sr-igp-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational state parameters relating to segment routing for the
+          IGP instance.";
+        uses sr-igp-config;
+      }
+    }
+  }
+
+  grouping sr-igp-interface-prefix-sid-config {
+    description
+      "Configuration parameters relating to an IGP prefix SID advertisement";
+
+    leaf prefix {
+      type inet:ip-prefix;
+      description
+        "The IP prefix for which the IGP prefix SID should be advertised. The
+        value specified is a local prefix on the interface which is advertised
+        into the IGP.";
+    }
+
+    leaf sid-id {
+      type sr-sid-type;
+      description
+        "The Segment Identifier to be used when advertising the IGP Prefix SID.";
+    }
+
+    leaf label-options {
+      type enumeration {
+        enum NO_PHP {
+          description
+            "When this value is specified, the penultimate hop must not pop
+            the Prefix-SID label before forwarding it to the local system.";
+        }
+        enum EXPLICIT_NULL {
+          description
+            "When set, the penultimate hop must swap the prefix SID for the
+            relevant explicit null label before forwarding the packet.";
+        }
+      }
+      description
+        "The options associated with the IGP prefix SID for MPLS. The value
+        of this leaf specifies the option that the SID should be advertised
+        into the IGP with.";
+    }
+  }
+
+  grouping sr-igp-interface-adjsid-config {
+    description
+      "Configuration parameters relating to an Adj-SID on an interface";
+
+    leaf sid-id {
+      type union {
+        type sr-sid-type;
+        type enumeration {
+            enum DYNAMIC {
+              description
+                "The SID chosen for the Adjacency SID should be dynamically
+                allocated from the system's dynamic range of Segment
+                Identifiers. For MPLS, this range should be considered to be
+                those labels that do not fall within a reserved label block.";
+            }
+        }
+      }
+      description
+        "The value of the Adj-SID to be advertised. Where a static SID
+        identifier is specified, this should be advertised directly by the
+        system. Where the DYNAMIC value is specified, this should be treated
+        as a dynamically allocated value. When the MPLS data plane is in use
+        the dynamic value should not fall within a reserved-label-block.";
+    }
+
+    leaf protection-eligible {
+      type boolean;
+      default true;
+      description
+        "Whether the Adj-SID should be considered to be eligible for protection
+        using IP or MPLS FRR during a network failure. When this value is set to
+        true, the B-flag of the Adj-SID is set to 1, and the local system should
+        provide FRR paths for the associated label forwarding entry. When it is
+        set to false, the local system must not provide FRR for the specified
+        LFIB entry.";
+    }
+
+    leaf group {
+      type boolean;
+      default false;
+      description
+        "When set to true, the Adj-SID is indicated to be part of a group, and
+        the G flag is set to 1 in the corresponding advertisement in the IGP.";
+    }
+
+    leaf neighbor {
+      type inet:ip-address;
+      description
+        "The remote system on the interface with which the Adj-SID is
+        associated.";
+    }
+  }
+
+  grouping sr-igp-interface-adjsid-state {
+    description
+      "Operational state parameters relating to the adjacency SID for an
+      interface";
+
+    leaf allocated-dynamic-local {
+      type sr-sid-type;
+      description
+        "Where an Adjacency SID with a dynamic value is to be allocated by
+        the system, this leaf reports to the value of the Adj-SID allocated
+        to this interface.";
+    }
+  }
+
+  grouping sr-igp-interface-top {
+    description
+      "Per-interface configuration and operational state relating to an
+      interface within the IGP.";
+
+    container segment-routing {
+      description
+        "Configuration and operatioanl state parameters relating to segment
+        routing for an interface within the IGP.";
+
+      container prefix-sids {
+        description
+          "Configuration and operational state parameters relating to
+          the advertisement of a segment routing IGP-Prefix SID for this
+          interface.";
+
+        list prefix-sid {
+          key "prefix";
+
+          description
+            "An IGP prefix that should have a segment routing IGP-Prefix SID
+            allocated to it. The value of the SID is specified by the SID ID,
+            as an absolute value. If the absolute value falls within the SRGB,
+            the Global flag should be advertised by the system.";
+
+          leaf prefix {
+            type leafref {
+              path "../config/prefix";
+            }
+            description
+              "Reference to the prefix for which the IGP-Prefix SID is to be
+              advertised";
+          }
+
+          container config {
+            description
+              "Configuration parameters for the IGP Prefix SID.";
+            uses sr-igp-interface-prefix-sid-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters for the IGP-Prefix SID.";
+            uses sr-igp-interface-prefix-sid-config;
+          }
+        }
+      }
+
+      container adjacency-sids {
+        description
+          "Configuration and operational state parameters relating to
+          the advertisement of a segment routing adjacency SID for this
+          interface.";
+
+        list adjacency-sid {
+          key "neighbor sid-id";
+
+          description
+            "An Adjacency SID to be advertised for the specified interface.
+            The Adj-SID's identifier (the SID ID) must be unique, with flags
+            specified indicating the parameters that should be set for the SID.
+            Where a SID value is specified that is allocated from the SRGB, the
+            global flag must be set by the system.";
+
+          leaf sid-id {
+            type leafref {
+              path "../config/sid-id";
+            }
+            description
+              "Reference to the segment identifier to be used by the local
+              system.";
+          }
+
+          leaf neighbor {
+            type leafref {
+              path "../config/neighbor";
+            }
+            description
+              "Reference to the neighbor with which the Adjacency SID is
+              associated.";
+          }
+
+          container config {
+            description
+              "Configuraton parameters relating to the AdjSID.";
+            uses sr-igp-interface-adjsid-config;
+          }
+
+          container state {
+            config false;
+            description
+              "Operational state parameters relating to the AdjSID.";
+            uses sr-igp-interface-adjsid-config;
+            uses sr-igp-interface-adjsid-state;
+          }
+        }
+      }
+    }
+  }
+
+  grouping sr-top {
+    description
+      "Top level grouping for Segment Routing";
+
+    container segment-routing {
+      description
+        "Configuration and operational state parameters relating to
+        segment routing.";
+
+      uses sr-structural;
+    }
+  }
+}
diff --git a/models/openconfig/src/main/yang/stp/openconfig-spanning-tree-types.yang b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree-types.yang
new file mode 100644
index 0000000..0ca9571
--- /dev/null
+++ b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree-types.yang
@@ -0,0 +1,225 @@
+module openconfig-spanning-tree-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/spanning-tree/types";
+
+  prefix "oc-stp-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines types related to the
+    spanning-tree protocol model.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-14" {
+    description
+      "Migrated to OpenConfig types; fixed missing applied state
+      in rapid-pvst";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-03" {
+    description
+      "Initial public revision";
+    reference "0.1.0";
+  }
+
+  // identity statements
+
+  identity STP_PROTOCOL {
+    description
+      "base identity for support spanning tree protocol";
+  }
+
+  identity RSTP {
+    base STP_PROTOCOL;
+    description
+      "Rapid Spanning Tree Protocol";
+    reference "IEEE 802.1D 17";
+  }
+
+  identity MSTP {
+    base STP_PROTOCOL;
+    description
+      "Multiple Spanning Tree Protocol";
+    reference "IEEE 802.1Q 13";
+  }
+
+  identity RAPID_PVST {
+    base STP_PROTOCOL;
+    description
+      "Rapid Per Vlan Spanning Tree Protocol";
+  }
+
+  identity STP_PORT_STATE {
+    description
+      "base identity for the different Spanning Tree Protocol port
+      states";
+    reference
+      "IEEE 802.1D 7.4 Port States and the active topology";
+  }
+
+  identity DISABLED {
+    base STP_PORT_STATE;
+    description
+      "A port that is manually isolated from the network";
+  }
+
+  identity LISTENING {
+    base STP_PORT_STATE;
+    description
+      "Processing BPDUs and building active toplogy";
+  }
+
+  identity LEARNING {
+    base STP_PORT_STATE;
+    description
+      "Building bridging tables; no forwarding of data";
+  }
+
+  identity BLOCKING {
+    base STP_PORT_STATE;
+    description
+      "A port that would cause a loop if it were sending data,
+      so it is only receiving BPDUs, untill a topology change
+      removes the possibliity of a loop";
+  }
+
+  identity FORWARDING {
+    base STP_PORT_STATE;
+    description
+      "Sending and receiving data, normal operation";
+  }
+
+  identity STP_EDGE_PORT {
+    description
+      "base identity for the different edge port modes";
+    reference
+      "IEEE 802.1D 17.13.1";
+  }
+
+  identity EDGE_ENABLE {
+    base STP_EDGE_PORT;
+    description
+      "Enable edge port for the bridge port";
+  }
+
+  identity EDGE_DISABLE {
+    base STP_EDGE_PORT;
+    description
+      "Disable edge port for the bridge port";
+  }
+
+  identity EDGE_AUTO {
+    base STP_EDGE_PORT;
+    description
+      "Enable edge port autodetction for the bridge port";
+  }
+
+  identity STP_PORT_ROLE {
+    description
+      "Base identity for the different Spanning Tree Protocol port
+      roles";
+    reference
+      "IEEE 802.1D 17.7 Port Role assignments";
+  }
+
+  identity ROOT {
+    base STP_PORT_ROLE;
+    description
+      "The port that receives the best BPDU on a bridge is the
+      root port";
+  }
+
+  identity DESIGNATED {
+    base STP_PORT_ROLE;
+    description
+      "A port is designated if it can send the best BPDU on the
+      segment to which it is connected.";
+  }
+
+  identity ALTERNATE {
+    base STP_PORT_ROLE;
+    description
+      "An alternate port receives more useful BPDUs from another
+      bridge and is a port blocked";
+  }
+
+  identity BACKUP {
+    base STP_PORT_ROLE;
+    description
+      "A backup port receives more useful BPDUs from the same
+      bridge it is on and is a port blocked";
+  }
+
+  // typedef statements
+
+  typedef stp-bridge-priority-type {
+    type uint32 {
+      range 1..611440;
+    }
+    description
+      "The manageable component of the Bridge Identifier";
+    reference "IEEE 802.1D 17.13.7 Bridge Identifier Priority";
+  }
+
+  typedef stp-port-priority-type {
+    type uint8 {
+      range 1..240;
+    }
+    description
+      "The manageable component of the Port Identifier,
+      also known as the Port Priority";
+    reference
+      "IEEE 802.1D 17.13.10 Port Identifier Priority";
+  }
+
+  typedef stp-guard-type {
+    type enumeration {
+      enum ROOT {
+      	description
+      	  "Enable root guard";
+      }
+      enum LOOP {
+      	description
+      	  "Enable loop guard";
+      }
+      enum NONE {
+      	description
+      	  "disable guard";
+      }
+    }
+    description
+      "Type definition for the different STP guard for the switch port";
+    reference "IEEE 802.1D 17.2";
+  }
+
+  typedef stp-link-type {
+    type enumeration {
+      enum P2P {
+      	description
+      	  "Point-to-Point link";
+      }
+      enum SHARED {
+      	description
+      	  "Shared link";
+      }
+    }
+    description
+      "Type definition for the different link types";
+    reference "IEEE 802.1D 17.2";
+  }
+}
diff --git a/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang
new file mode 100644
index 0000000..3a70d5e
--- /dev/null
+++ b/models/openconfig/src/main/yang/stp/openconfig-spanning-tree.yang
@@ -0,0 +1,823 @@
+module openconfig-spanning-tree {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/spanning-tree";
+
+  prefix "oc-stp";
+
+  import openconfig-spanning-tree-types { prefix oc-stp-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-vlan-types { prefix oc-vlan-types; }
+  import openconfig-yang-types { prefix oc-yang; }
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    for the spanning tree protocol.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-14" {
+    description
+      "Migrated to OpenConfig types; fixed missing applied state
+      in rapid-pvst";
+    reference "0.2.0";
+  }
+
+  revision "2016-10-03" {
+    description
+      "Initial public revision";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+
+  // grouping statements
+
+  grouping stp-interfaces-state {
+    description
+      "Grouping of STP operational data for bridge port";
+
+    leaf port-num {
+      type uint16;
+      description
+        "The port number of the bridge port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPort";
+    }
+
+    leaf role {
+      type identityref {
+        base oc-stp-types:STP_PORT_ROLE;
+      }
+      description
+        "The current role of the bridge port";
+      reference
+        "IEEE8021-MSTP-MIB ieee8021MstpPortRole";
+    }
+
+    leaf port-state {
+      type identityref {
+        base oc-stp-types:STP_PORT_STATE;
+      }
+      description
+        "The current state of the bridge port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortState";
+    }
+
+    leaf designated-root-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the bridge recorded as the
+        root in the configuration BPDUs transmitted by the designated
+        bridge for the segment to which the port is attached";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+    }
+
+    leaf designated-root-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the bridge recorded as the
+        root in the configuration BPDUs transmitted by the designated
+        bridge for the segment to which the port is attached";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedRoot";
+    }
+
+    leaf designated-cost {
+      type uint32;
+      description
+        "The path cost of the Designated Port of the
+        segment connected to this port";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedCost";
+    }
+
+    leaf designated-bridge-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the bridge that this port considers
+        to be the designated bridge for this port's segment.";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+    }
+
+    leaf designated-bridge-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the bridge that this port considers
+        to be the designated bridge for this port's segment.";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedBridge";
+    }
+
+    leaf designated-port-priority {
+      type oc-stp-types:stp-port-priority-type;
+      description
+        "The Port priority of the port on the Designated
+        Bridge for this port's segment, two octet string";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+    }
+
+    leaf designated-port-num {
+      type uint16;
+      description
+        "The Port number of the port on the Designated
+        Bridge for this port's segment, two octet string";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortDesignatedPort";
+    }
+
+    leaf forward-transisitions {
+      type oc-yang:counter64;
+      description
+        "The number of times this port has transitioned
+        from the Learning state to the Forwarding state";
+      reference "RFC4188 BRIDGE-MIB dot1dStpPortForwardTransitions";
+    }
+
+    container counters {
+      description
+        "The BPDU packet transmition statistics";
+
+      leaf bpdu-sent {
+        type oc-yang:counter64;
+        description
+          "The number of BPDU packet sent";
+      }
+
+      leaf bpdu-received {
+        type oc-yang:counter64;
+        description
+          "The number of BPDU packet received";
+      }
+    }
+  }
+
+  grouping stp-interfaces-config {
+    description
+      "Grouping of STP configuration for bridge port";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the STP ethernet interface";
+    }
+
+    leaf cost {
+      type uint32 {
+        range 1..200000000;
+      }
+      description
+        "The port's contribution, when it is the Root Port,
+        to the Root Path Cost for the Bridge";
+      reference
+        "IEEE 802.1D 17.13.11 PortPathCost";
+    }
+
+    leaf port-priority {
+      type oc-stp-types:stp-port-priority-type;
+      description
+        "The manageable component of the Port Identifier,
+        also known as the Port Priority";
+      reference
+        "IEEE 802.1D 17.13.10 Port Identifier Priority";
+    }
+  }
+
+  grouping stp-interfaces-top {
+    description
+      "Grouping of STP configuration and operation data for
+      bridge port";
+
+    container interfaces {
+      description
+        "Enclosing container for the list of interface references";
+
+      list interface {
+        key "name";
+        description
+          "List of interfaces on which STP is enable";
+
+      	leaf name {
+      	  type leafref {
+      	    path "../config/name";
+      	  }
+      	  description
+      	    "Reference to the list key";
+      	}
+
+      	container config {
+      	  description
+      	    "Configuration data for STP on each interface";
+
+      	  uses stp-interfaces-config;
+      	}
+
+      	container state {
+
+      	  config false;
+
+      	  description
+      	    "Operational state data for STP on each interface";
+
+      	  uses stp-interfaces-config;
+      	  uses stp-interfaces-state;
+      	}
+      }
+    }
+  }
+
+  grouping bridge-priority-config {
+    description
+      "Grouping for bridge priority";
+
+    leaf bridge-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The manageable component of the Bridge Identifier";
+      reference
+        "IEEE 802.1D 17.13.7 Bridge Identifier Priority";
+    }
+  }
+
+  grouping stp-common-state {
+    description
+      "Grouping for common STP operation data";
+
+    leaf bridge-address {
+      type oc-yang:mac-address;
+      description
+        "A unique 48-bit Universally Administered MAC Address
+        assigned to the bridge";
+      reference
+        "IEEE 802.1D 7.12.5 Unique identification of a bridge";
+    }
+
+    leaf designated-root-priority {
+      type oc-stp-types:stp-bridge-priority-type;
+      description
+        "The bridge priority of the root of the spanning
+        tree, as determined by the Spanning Tree Protocol,
+        as executed by this node";
+	    reference
+        "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+    }
+
+    leaf designated-root-address {
+      type oc-yang:mac-address;
+      description
+        "The bridge address of the root of the spanning
+        tree, as determined by the Spanning Tree Protocol,
+        as executed by this node";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpDesignatedRoot";
+    }
+
+    leaf root-port {
+      type uint16;
+      description
+        "The port number of the port which offers the lowest
+        cost path from this bridge to the root bridge";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpRootPort";
+    }
+
+    leaf root-cost {
+      type uint32;
+      description
+        "The cost of the path to the root as seen from this bridge";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpRootCost";
+    }
+
+    leaf hold-time {
+      type uint8;
+      description
+        "This time value determines the interval length
+        during which no more than two Configuration bridge
+        PDUs shall be transmitted by this node";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpHoldTime";
+    }
+
+    leaf topology-changes {
+      type oc-yang:counter64;
+      description
+        "The total number of topology changes detected by
+        this bridge since the management entity was last
+        reset or initialized";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpTopChanges";
+    }
+
+    leaf time-since-topology-change {
+      type oc-types:timeticks64;
+      description
+        "The time (in hundredths of a second) since the
+        last time a topology change was detected by the
+        bridge entity
+
+        The value is the timestamp in seconds relative to
+        the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+      reference
+        "RFC4188 BRIDGE-MIB dot1dStpTimeSinceTopologyChange";
+    }
+  }
+
+  grouping stp-timer-config {
+    description
+      "Grouping for common STP parameters";
+
+    leaf hello-time {
+      type uint8 {
+        range 1..10;
+      }
+      units "seconds";
+      description
+        "The interval between periodic transmissions of
+        configuration messages by designated ports";
+      reference
+        "IEEE 802.1D 17.13.6 Bridge Hello Time";
+    }
+
+    leaf max-age {
+      type uint8 {
+        range 6..40;
+      }
+      units "seconds";
+      description
+        "The maximum age of the information transmitted by the
+        bridge when it is the root bridge";
+      reference
+        "IEEE 802.1D 17.13.8 Bridge Max Age";
+    }
+
+    leaf forwarding-delay {
+      type uint8 {
+        range 4..30;
+      }
+      units "seconds";
+      description
+        "The delay used by STP bridges to transition root and
+        designated ports to forwarding";
+      reference
+        "IEEE 802.1D 17.13.5 Bridge Forward Delay";
+    }
+
+    leaf hold-count {
+      type uint8 {
+        range 1..10;
+      }
+      default 6;
+      description
+        "the maximum number of BPDUs per second that the
+         switch can send from an interface";
+      reference
+        "IEEE 802.1D 17.13.12 Transmit Hold Count";
+    }
+  }
+
+  grouping stp-rapid-pvst-config {
+    description
+      "Configuration parameters relating to rapid PVST";
+
+    leaf vlan-id {
+      type oc-vlan-types:vlan-id;
+      description
+        "Interface VLAN ID";
+    }
+  }
+
+  grouping stp-rapid-pvst-top {
+    description
+      "Top grouping for rapid per vlan spanning tree configuration
+      and operation data";
+
+    list vlan {
+      key "vlan-id";
+      description
+        "List of the vlans";
+
+      leaf vlan-id {
+        type leafref {
+          path "../config/vlan-id";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+      	description
+      	  "Configuration data for each vlan";
+
+        uses stp-rapid-pvst-config;
+        uses stp-timer-config;
+        uses bridge-priority-config;
+      }
+
+      container state {
+        config false;
+        description
+          "Operational data for each vlan";
+
+        uses stp-rapid-pvst-config;
+        uses stp-timer-config;
+        uses bridge-priority-config;
+        uses stp-common-state;
+      }
+
+      uses stp-interfaces-top;
+    }
+  }
+
+  grouping mst-instance-config {
+    description
+      "Grouping for mstp instance configuration";
+
+    leaf mst-id {
+      type uint16 {
+        range "1..4094";
+      }
+      description
+        "In an MSTP Bridge, an MSTID, i.e., a value used to identify
+        a spanning tree (or MST) instance.";
+      reference
+        "IEEE8021-TC-MIB IEEE8021MstIdentifier";
+    }
+
+    leaf-list vlan {
+      type union {
+        type oc-vlan-types:vlan-id;
+        type oc-vlan-types:vlan-range;
+      }
+      description
+        "list of vlans mapped to the MST instance";
+    }
+  }
+
+  grouping mst-instance-top {
+    description
+      "Top level grouping for mstp instances";
+
+    list mst-instance {
+      key "mst-id";
+      description
+        "List of the mstp instances";
+
+      leaf mst-id {
+        type leafref {
+          path "../config/mst-id";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+        description
+          "Configuration data for MSTP instance";
+
+        uses mst-instance-config;
+        uses bridge-priority-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational data for MSTP instance";
+
+        uses mst-instance-config;
+        uses bridge-priority-config;
+        uses stp-common-state;
+      }
+
+      uses stp-interfaces-top;
+    }
+  }
+
+  grouping mstp-config {
+    description
+      "Grouping for MSTP configuration data";
+
+    leaf name {
+      type string {
+        length "1..32";
+      }
+      description
+        "The Configuration Name in the MST Configuration Identifier";
+      reference
+        "IEEE 802.1Q 13.8 MST Configuration Identifier (MCID)";
+    }
+
+    leaf revision {
+      type uint32;
+      description
+        "The Revision Level in the MST Configuration Identifier";
+      reference
+        "IEEE 802.1Q 13.8 MST Configuration Identifier";
+    }
+
+    leaf max-hop {
+      type uint8 {
+        range 1..255;
+      }
+      description
+        "The max hop determines the number of bridges in an MST
+        region that a BPDU can traverse before it is discarded";
+      reference
+        "IEEE 802.1Q 13.26.4 BridgeTimes";
+    }
+
+    uses stp-timer-config;
+  }
+
+  grouping mstp-state {
+    description
+      "Operational state data for MSTP";
+  }
+
+  grouping stp-mstp-top {
+    description
+      "Top grouping for MSTP configuration and operation data";
+
+    container config {
+      description
+        "Configuration data for MSTP";
+
+      uses mstp-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Operational data for MSTP";
+
+      uses mstp-config;
+      uses mstp-state;
+    }
+
+    container mst-instances {
+      description
+        "Configuration and operation data for MSTP instances";
+
+      uses mst-instance-top;
+    }
+  }
+
+  grouping stp-rstp-top {
+    description
+      "Top grouping for RSTP configuration and operation data";
+
+    container config {
+      description
+        "Configuration data for RSTP";
+
+      uses stp-timer-config;
+      uses bridge-priority-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Operational state data for RSTP";
+
+      uses stp-timer-config;
+      uses bridge-priority-config;
+      uses stp-common-state;
+    }
+
+    uses stp-interfaces-top;
+  }
+
+  grouping stp-interface-common-config {
+    description
+      "Configuration data for interface specific STP features";
+
+    leaf name {
+      type oc-if:base-interface-ref;
+      description
+        "Reference to the STP Ethernet interface";
+    }
+
+    leaf edge-port {
+      type identityref {
+        base oc-stp-types:STP_EDGE_PORT;
+      }
+      description
+        "Configure the edge port state";
+    }
+
+    leaf link-type {
+      type oc-stp-types:stp-link-type;
+      description
+        "specifies the interface's link type";
+    }
+
+    leaf guard {
+      type oc-stp-types:stp-guard-type;
+      description
+        "Enable root guard or loop guard";
+    }
+
+    uses stp-bpdu-config;
+
+  }
+
+  grouping stp-interface-common-state {
+    description
+      "Operational state data for STP on interfaces";
+  }
+
+  grouping stp-interface-common-top {
+    description
+      "Top-level grouping for interface specific STP features";
+
+    list interface {
+      key "name";
+      description
+        "List of interfaces on which STP is enable";
+
+      leaf name {
+        type leafref {
+          path "../config/name";
+        }
+        description
+          "Reference to the list key";
+      }
+
+      container config {
+        description
+          "Configuration data for STP on each bridge port";
+
+        uses stp-interface-common-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for STP on each bridge port";
+
+        uses stp-interface-common-config;
+        uses stp-interface-common-state;
+      }
+    }
+  }
+
+  grouping stp-bpdu-config {
+    description
+      "Grouping for STP BPDU configuration";
+
+    leaf bpdu-guard {
+      type boolean;
+      description
+        "Enable edge port BPDU guard";
+    }
+
+    leaf bpdu-filter {
+      type boolean;
+      description
+        "Enable edge port BPDU filter";
+    }
+  }
+
+  grouping stp-global-config {
+    description
+      "Global spanning tree configuration";
+
+    leaf-list enabled-protocol {
+      type identityref {
+        base oc-stp-types:STP_PROTOCOL;
+      }
+      description
+        "List of the spanning tree protocols enabled on the
+        device";
+    }
+
+    leaf bridge-assurance {
+      type boolean;
+      description
+        "Enable bridge assurance to protect against unidirectional
+        link failure";
+    }
+
+    leaf etherchannel-misconfig-guard {
+      type boolean;
+      description
+        "EtherChannel guard detects a misconfigured EtherChannel
+        when interfaces on the switch are configured as an
+        EtherChannel while interfaces on the other device are not
+        or when not all the interfaces on the other device are in
+        the same EtherChannel.";
+    }
+
+    leaf bpduguard-timeout-recovery {
+      type uint8;
+      units "seconds";
+      description
+        "Amount of time, in seconds, the interface receiving BPDUs
+        is disabled. Once the timeout expires, the interface is
+        brought back into service.";
+    }
+
+    leaf loop-guard {
+      type boolean;
+      description
+        "The loop guard default setting for the bridge";
+    }
+
+    uses stp-bpdu-config;
+
+  }
+
+  grouping stp-global-state {
+    description
+      "Global operational state for STP";
+  }
+
+  grouping stp-global-base {
+    description
+      "Grouping for global spanning tree data";
+
+    container config {
+      description
+        "Global spanning tree configuration";
+      uses stp-global-config;
+    }
+
+    container state {
+      config false;
+
+      description
+        "Global spanning tree state";
+      uses stp-global-config;
+      uses stp-global-state;
+    }
+  }
+
+  grouping stp-top {
+    description
+      "Top-level grouping for spanning-tree model";
+
+    container stp {
+      description
+        "Top-level container for spanning tree configuration and
+        state data";
+
+      container global {
+        description
+          "Global configuration and state data";
+
+        uses stp-global-base;
+      }
+
+      container rstp {
+
+        description
+          "Rapid Spanning-tree protocol configuration and operation
+          data";
+
+        uses stp-rstp-top;
+      }
+
+      container mstp {
+        description
+          "Multi Spanning-tree protocol configuration and operation
+          data";
+
+        uses stp-mstp-top;
+      }
+
+      container rapid-pvst {
+      	description
+      	  "Rapid per vlan Spanning-tree protocol configuration and
+          operational data";
+
+      	uses stp-rapid-pvst-top;
+      }
+
+      container interfaces {
+        description
+          "Enclosing container for the list of interface references";
+
+        uses stp-interface-common-top;
+      }
+    }
+  }
+
+  // data definition statements
+
+  uses stp-top;
+
+}
diff --git a/models/openconfig/src/main/yang/system/openconfig-aaa-radius.yang b/models/openconfig/src/main/yang/system/openconfig-aaa-radius.yang
new file mode 100644
index 0000000..e0ad1dd
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-aaa-radius.yang
@@ -0,0 +1,174 @@
+submodule openconfig-aaa-radius {
+
+  yang-version "1";
+
+  belongs-to "openconfig-aaa" {
+    prefix "oc-aaa";
+  }
+
+  // import some basic types
+  import ietf-inet-types { prefix inet; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-aaa-types { prefix oc-aaa-types; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-yang-types { prefix oc-yang; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    related to the RADIUS protocol for authentication,
+    authorization, and accounting.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity RADIUS {
+    base oc-aaa-types:AAA_SERVER_TYPE;
+    description
+      "Remote Authentication Dial In User Service (RADIUS) AAA
+      server";
+    reference
+      "RFC 2865 - Remote Authentication Dial In User Service
+      (RADIUS)";
+  }
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping aaa-radius-server-config {
+    description
+      "Configuration data for a RADIUS server";
+
+    leaf auth-port {
+      type inet:port-number;
+      default 1812;
+      description
+        "Port number for authentication requests";
+    }
+
+    leaf acct-port {
+      type inet:port-number;
+      default 1813;
+      description
+        "Port number for accounting requests";
+    }
+
+    leaf secret-key {
+      type oc-types:routing-password;
+      description
+        "The unencrypted shared key used between the authentication
+        server and the device.";
+    }
+
+    leaf source-address {
+      type inet:ip-address;
+      description
+        "Source IP address to use in messages to the RADIUS server";
+    }
+
+    leaf retransmit-attempts {
+      type uint8;
+      description
+        "Number of times the system may resend a request to the
+        RADIUS server when it is unresponsive";
+    }
+  }
+
+  grouping aaa-radius-server-state {
+    description
+      "Operational state data for a RADIUS server";
+
+    container counters {
+      description
+        "A collection of RADIUS related state objects.";
+
+      leaf retried-access-requests {
+        type oc-yang:counter64;
+        description
+          "Retransmitted Access-Request messages.";
+      }
+
+      leaf access-accepts {
+        type oc-yang:counter64;
+        description
+          "Received Access-Accept messages.";
+      }
+
+      leaf access-rejects {
+        type oc-yang:counter64;
+        description
+          "Received Access-Reject messages.";
+      }
+
+      leaf timeout-access-requests {
+        type oc-yang:counter64;
+        description
+          "Access-Request messages that have timed-out,
+          requiring retransmission.";
+      }
+    }
+  }
+
+  grouping aaa-radius-server-top {
+    description
+      "Top-level grouping for RADIUS server data";
+
+    container radius {
+      description
+        "Top-level container for RADIUS server data";
+
+      container config {
+        description
+          "Configuration data for RADIUS servers";
+
+        uses aaa-radius-server-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for RADIUS servers";
+
+        uses aaa-radius-server-config;
+        uses aaa-radius-server-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/system/openconfig-aaa-tacacs.yang b/models/openconfig/src/main/yang/system/openconfig-aaa-tacacs.yang
new file mode 100644
index 0000000..b1f6472
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-aaa-tacacs.yang
@@ -0,0 +1,130 @@
+submodule openconfig-aaa-tacacs {
+
+  yang-version "1";
+
+  belongs-to "openconfig-aaa" {
+    prefix "oc-aaa";
+  }
+
+  // import some basic types
+  import ietf-inet-types { prefix inet; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-aaa-types { prefix oc-aaa-types; }
+  import openconfig-types { prefix oc-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    related to the TACACS+ protocol for authentication,
+    authorization, and accounting.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity TACACS {
+    base oc-aaa-types:AAA_SERVER_TYPE;
+    description
+      "Terminal Access Controller Access Control System (TACACS+)
+      AAA server";
+    reference
+      "The TACACS+ Protocol (draft-ietf-opsawg-tacacs-05)
+      RFC 1492 - An Access Control Protocol, Sometimes Called
+      TACACS";
+  }
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping aaa-tacacs-server-config {
+    description
+      "Configuration data for a TACACS+ server";
+
+    leaf port {
+      type inet:port-number;
+      default 49;
+      description
+        "The port number on which to contact the TACACS server";
+    }
+
+    leaf secret-key {
+      type oc-types:routing-password;
+      description
+        "The unencrypted shared key used between the authentication
+        server and the device.";
+    }
+
+    leaf source-address {
+      type inet:ip-address;
+      description
+        "Source IP address to use in messages to the TACACS server";
+    }
+  }
+
+  grouping aaa-tacacs-server-state {
+    description
+      "Operational state data for a TACACS+ server";
+  }
+
+  grouping aaa-tacacs-server-top {
+    description
+      "Top-level grouping for TACACS+ sever data";
+
+    container tacacs {
+      description
+        "Top-level container for TACACS+ server data";
+
+      container config {
+        description
+          "Configuration data for TACACS+ server";
+
+        uses aaa-tacacs-server-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for TACACS+ server";
+
+        uses aaa-tacacs-server-config;
+        uses aaa-tacacs-server-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/system/openconfig-aaa-types.yang b/models/openconfig/src/main/yang/system/openconfig-aaa-types.yang
new file mode 100644
index 0000000..a42802f
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-aaa-types.yang
@@ -0,0 +1,150 @@
+module openconfig-aaa-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/aaa/types";
+
+  prefix "oc-aaa-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines shared types for data related to AAA
+    (authentication, authorization, accounting).";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+  identity AAA_SERVER_TYPE {
+    description
+      "Base identity for types of AAA servers";
+  }
+
+
+  identity SYSTEM_DEFINED_ROLES {
+    description
+      "Base identity for system_defined roles that can be assigned
+      to users.";
+  }
+
+  identity SYSTEM_ROLE_ADMIN {
+    base SYSTEM_DEFINED_ROLES;
+    description
+      "Built-in role that allows the equivalent of superuser
+      permission for all configuration and operational commands
+      on the device.";
+  }
+
+  identity AAA_ACCOUNTING_EVENT_TYPE {
+    description
+      "Base identity for specifying events types that should be
+      sent to AAA server for accounting";
+  }
+
+  identity AAA_ACCOUNTING_EVENT_COMMAND {
+    base AAA_ACCOUNTING_EVENT_TYPE;
+    description
+      "Specifies interactive command events for AAA accounting";
+  }
+
+  identity AAA_ACCOUNTING_EVENT_LOGIN {
+    base AAA_ACCOUNTING_EVENT_TYPE;
+    description
+      "Specifies login events for AAA accounting";
+  }
+
+  identity AAA_AUTHORIZATION_EVENT_TYPE {
+    description
+      "Base identity for specifying activities that should be
+      sent to AAA server for authorization";
+  }
+
+  identity AAA_AUTHORIZATION_EVENT_COMMAND {
+    base AAA_ACCOUNTING_EVENT_TYPE;
+    description
+      "Specifies interactive command events for AAA authorization";
+  }
+
+  identity AAA_AUTHORIZATION_EVENT_CONFIG {
+    base AAA_ACCOUNTING_EVENT_TYPE;
+    description
+      "Specifies configuration (e.g., EXEC) events for AAA
+      authorization";
+  }
+
+  identity AAA_METHOD_TYPE {
+    description
+      "Base identity to define well-known methods for AAA
+      operations";
+  }
+
+  identity TACACS_ALL {
+    base AAA_METHOD_TYPE;
+    description
+      "The group of all TACACS+ servers.";
+  }
+
+  identity RADIUS_ALL {
+    base AAA_METHOD_TYPE;
+    description
+      "The group of all RADIUS servers.";
+  }
+
+  identity LOCAL {
+    base AAA_METHOD_TYPE;
+    description
+      "Locally configured method for AAA operations.";
+  }
+
+
+  // typedef statements
+
+  typedef crypt-password-type {
+    type string;
+    description
+      "A password that is hashed based on the hash algorithm
+      indicated by the prefix in the string.  The string
+      takes the following form, based on the Unix crypt function:
+
+      $<id>[$<param>=<value>(,<param>=<value>)*][$<salt>[$<hash>]]
+
+      Common hash functions include:
+
+      id  | hash function
+       ---+---------------
+        1 | MD5
+        2a| Blowfish
+        2y| Blowfish (correct handling of 8-bit chars)
+        5 | SHA-256
+        6 | SHA-512
+
+      These may not all be supported by a target device.";
+  }
+
+
+}
diff --git a/models/openconfig/src/main/yang/system/openconfig-aaa.yang b/models/openconfig/src/main/yang/system/openconfig-aaa.yang
new file mode 100644
index 0000000..5a68c47
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-aaa.yang
@@ -0,0 +1,791 @@
+module openconfig-aaa {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/aaa";
+
+  prefix "oc-aaa";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import ietf-inet-types { prefix inet; }
+  import ietf-yang-types { prefix yang; }
+  import openconfig-aaa-types { prefix oc-aaa-types; }
+
+  include openconfig-aaa-tacacs;
+  include openconfig-aaa-radius;
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    related to authorization, authentication, and accounting (AAA)
+    management.
+
+    Portions of this model reuse data definitions or structure from
+    RFC 7317 - A YANG Data Model for System Management";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // identity statements
+
+  // grouping statements
+  grouping aaa-servergroup-common-config {
+    description
+      "Configuration data for AAA server groups";
+
+    leaf name {
+      type string;
+      description
+        "Name for the server group";
+    }
+
+    leaf type {
+      type identityref {
+        base oc-aaa-types:AAA_SERVER_TYPE;
+      }
+      description
+        "AAA server type -- all servers in the group must be of this
+        type";
+    }
+  }
+
+  grouping aaa-servergroup-common-state {
+    description
+      "Operational state data for AAA server groups";
+
+    //TODO: add list of group members as opstate
+  }
+
+  grouping aaa-servergroup-common-top {
+    description
+      "Top-level grouping for AAA server groups";
+
+    container server-groups {
+      description
+        "Enclosing container for AAA server groups";
+
+      list server-group {
+        key "name";
+        description
+          "List of AAA server groups.  All servers in a group
+          must have the same type as indicated by the server
+          type.";
+
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description
+            "Reference to configured name of the server group";
+        }
+
+        container config {
+          description
+            "Configuration data for each server group";
+
+          uses aaa-servergroup-common-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Operational state data for each server group";
+
+          uses aaa-servergroup-common-config;
+          uses aaa-servergroup-common-state;
+        }
+
+        uses aaa-server-top;
+      }
+    }
+  }
+
+  grouping aaa-server-config {
+    description
+      "Common configuration data for AAA servers";
+
+    leaf name {
+      type string;
+      description
+        "Name assigned to the server";
+    }
+
+
+    leaf address {
+      type inet:ip-address;
+      description "Address of the authentication server";
+    }
+
+    leaf timeout {
+      type uint16;
+      units seconds;
+      description
+        "Set the timeout in seconds on responses from the AAA
+        server";
+    }
+  }
+
+  grouping aaa-server-state {
+    description
+      "Common operational state data for AAA servers";
+
+    leaf connection-opens {
+      type yang:counter64;
+      description
+        "Number of new connection requests sent to the server, e.g.
+        socket open";
+    }
+
+    leaf connection-closes {
+      type yang:counter64;
+      description
+        "Number of connection close requests sent to the server, e.g.
+        socket close";
+    }
+
+    leaf connection-aborts {
+      type yang:counter64;
+      description
+        "Number of aborted connections to the server.  These do
+        not include connections that are close gracefully.";
+    }
+
+    leaf connection-failures {
+      type yang:counter64;
+      description
+        "Number of connection failures to the server";
+    }
+
+    leaf connection-timeouts {
+      type yang:counter64;
+      description
+        "Number of connection timeouts to the server";
+    }
+
+    leaf messages-sent {
+      type yang:counter64;
+      description
+        "Number of messages sent to the server";
+    }
+
+    leaf messages-received {
+      type yang:counter64;
+      description
+        "Number of messages received by the server";
+    }
+
+    leaf errors-received {
+      type yang:counter64;
+      description
+        "Number of error messages received from the server";
+    }
+
+  }
+
+  grouping aaa-server-top {
+    description
+      "Top-level grouping for list of AAA servers";
+
+    container servers {
+      description
+        "Enclosing container the list of servers";
+
+      list server {
+        key "address";
+        description
+          "List of AAA servers";
+
+        leaf address {
+          type leafref {
+            path "../config/address";
+          }
+          description
+            "Reference to the configured address of the AAA server";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses aaa-server-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses aaa-server-config;
+          uses aaa-server-state;
+        }
+        uses aaa-tacacs-server-top;
+        uses aaa-radius-server-top;
+      }
+    }
+  }
+
+  grouping aaa-admin-config {
+    description
+      "Configuration data for the system built-in
+      administrator / root user account";
+
+    leaf admin-password {
+      type string;
+      oc-ext:openconfig-hashed-value;
+      description
+        "The admin/root password, supplied as a cleartext string.
+        The system should hash and only store the password as a
+        hashed value.";
+    }
+
+    leaf admin-password-hashed {
+      type oc-aaa-types:crypt-password-type;
+      description
+        "The admin/root password, supplied as a hashed value
+        using the notation described in the definition of the
+        crypt-password-type.";
+    }
+  }
+
+  grouping aaa-admin-state {
+    description
+      "Operational state data for the root user";
+
+    leaf admin-username {
+      type string;
+      description
+        "Name of the administrator user account, e.g., admin, root,
+        etc.";
+    }
+  }
+
+  grouping aaa-authentication-admin-top {
+    description
+      "Top-level grouping for root user configuration and state
+      data";
+
+    container admin-user {
+      description
+        "Top-level container for the system root or admin user
+        configuration and operational state";
+
+      container config {
+        description
+          "Configuration data for the root user account";
+
+        uses aaa-admin-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for the root user account";
+
+        uses aaa-admin-config;
+        uses aaa-admin-state;
+      }
+    }
+  }
+  grouping aaa-authentication-user-config {
+    description
+      "Configuration data for local users";
+
+    leaf username {
+      type string;
+      description
+        "Assigned username for this user";
+    }
+
+    leaf password {
+      type string;
+      oc-ext:openconfig-hashed-value;
+      description
+        "The user password, supplied as cleartext.  The system
+        must hash the value and only store the hashed value.";
+    }
+
+    leaf password-hashed {
+      type oc-aaa-types:crypt-password-type;
+      description
+        "The user password, supplied as a hashed value
+        using the notation described in the definition of the
+        crypt-password-type.";
+    }
+
+    leaf ssh-key {
+      type string;
+      description
+        "SSH public key for the user (RSA or DSA)";
+    }
+
+    leaf role {
+      type union {
+        type string;
+        type identityref {
+          base oc-aaa-types:SYSTEM_DEFINED_ROLES;
+        }
+      }
+      description
+        "Role assigned to the user.  The role may be supplied
+        as a string or a role defined by the SYSTEM_DEFINED_ROLES
+        identity.";
+    }
+  }
+
+  grouping aaa-authentication-user-state {
+    description
+      "Operational state data for local users";
+  }
+
+  grouping aaa-authentication-user-top {
+    description
+      "Top-level grouping for local users";
+
+    container users {
+      description
+        "Enclosing container list of local users";
+
+      list user {
+        key "username";
+        description
+          "List of local users on the system";
+
+        leaf username {
+          type leafref {
+            path "../config/username";
+          }
+          description
+            "References the configured username for the user";
+        }
+
+        container config {
+          description
+            "Configuration data for local users";
+
+          uses aaa-authentication-user-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Operational state data for local users";
+
+          uses aaa-authentication-user-config;
+          uses aaa-authentication-user-state;
+        }
+      }
+
+    }
+  }
+
+  grouping aaa-accounting-methods-common {
+    description
+      "Common definitions for accounting methods";
+
+    leaf-list accounting-method {
+      type union {
+        type identityref {
+          base oc-aaa-types:AAA_METHOD_TYPE;
+        }
+        type string;
+        //TODO:  in YANG 1.1 this should be converted to a leafref to
+        //point to the server group name.
+      }
+      description
+        "The method used for AAA accounting for this event
+        type.  The method is defined by the destination for
+        accounting data, which may be specified as the group of
+        all TACACS+/RADIUS servers, a defined server group, or
+        the local system.";
+    }
+  }
+
+
+  grouping aaa-accounting-events-config {
+    description
+      "Configuration data for AAA accounting events";
+
+    leaf event-type {
+      type identityref {
+        base oc-aaa-types:AAA_ACCOUNTING_EVENT_TYPE;
+      }
+      description
+        "The type of activity to record at the AAA accounting
+        server";
+    }
+
+    leaf record {
+      type enumeration {
+        enum START_STOP {
+          description
+            "Send START record to the accounting server at the
+            beginning of the activity, and STOP record at the
+            end of the activity.";
+        }
+        enum STOP {
+          description
+            "Send STOP record to the accounting server when the
+            user activity completes";
+        }
+      }
+      description
+        "Type of record to send to the accounting server for this
+        activity type";
+    }
+  }
+
+  grouping aaa-accounting-events-state {
+    description
+      "Operational state data for accounting events";
+  }
+
+  grouping aaa-accounting-events-top {
+    description
+      "Top-level grouping for accounting events";
+
+    container events {
+      description
+        "Enclosing container for defining handling of events
+        for accounting";
+
+      list event {
+        key "event-type";
+        description
+          "List of events subject to accounting";
+
+        leaf event-type {
+          type leafref {
+            path "../config/event-type";
+          }
+          description
+            "Reference to the event-type being logged at the
+            accounting server";
+        }
+
+        container config {
+          description
+            "Configuration data for accounting events";
+
+          uses aaa-accounting-events-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Operational state data for accounting events";
+
+          uses aaa-accounting-events-config;
+          uses aaa-accounting-events-state;
+        }
+      }
+    }
+  }
+
+  grouping aaa-accounting-config {
+    description
+      "Configuration data for event accounting";
+
+    uses aaa-accounting-methods-common;
+
+  }
+
+  grouping aaa-accounting-state {
+    description
+      "Operational state data for event accounting services";
+  }
+
+  grouping aaa-accounting-top {
+    description
+      "Top-level grouping for user activity accounting";
+
+    container accounting {
+      description
+        "Top-level container for AAA accounting";
+
+      container config {
+        description
+          "Configuration data for user activity accounting.";
+
+        uses aaa-accounting-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for user accounting.";
+
+        uses aaa-accounting-config;
+        uses aaa-accounting-state;
+      }
+
+      uses aaa-accounting-events-top;
+
+    }
+  }
+
+  grouping aaa-authorization-methods-config {
+    description
+      "Common definitions for authorization methods for global
+      and per-event type";
+
+    leaf-list authorization-method {
+      type union {
+        type identityref {
+          base oc-aaa-types:AAA_METHOD_TYPE;
+        }
+        type string;
+      }
+      description
+        "Ordered list of methods for authorizing commands.  The first
+        method that provides a response (positive or negative) should
+        be used.  The list may contain a well-defined method such
+        as the set of all TACACS or RADIUS servers, or the name of
+        a defined AAA server group.  The system must validate
+        that the named server group exists.";
+    }
+  }
+
+  grouping aaa-authorization-events-config {
+    description
+      "Configuration data for AAA authorization events";
+
+    leaf event-type {
+      type identityref {
+        base oc-aaa-types:AAA_AUTHORIZATION_EVENT_TYPE;
+      }
+      description
+        "The type of event to record at the AAA authorization
+        server";
+    }
+  }
+
+  grouping aaa-authorization-events-state {
+    description
+      "Operational state data for AAA authorization events";
+  }
+
+  grouping aaa-authorization-events-top {
+    description
+      "Top-level grouping for authorization events";
+
+    container events {
+      description
+        "Enclosing container for the set of events subject
+        to authorization";
+
+      list event {
+        key "event-type";
+        description
+          "List of events subject to AAA authorization";
+
+        leaf event-type {
+          type leafref {
+            path "../config/event-type";
+          }
+          description
+            "Reference to the event-type list key";
+        }
+
+        container config {
+          description
+            "Configuration data for each authorized event";
+
+          uses aaa-authorization-events-config;
+        }
+
+        container state {
+          config false;
+
+          description
+            "Operational state data for each authorized activity";
+
+          uses aaa-authorization-events-config;
+          uses aaa-authorization-events-state;
+        }
+      }
+    }
+  }
+
+  grouping aaa-authorization-config {
+    description
+      "Configuration data for AAA authorization";
+
+    uses aaa-authorization-methods-config;
+  }
+
+  grouping aaa-authorization-state {
+    description
+      "Operational state data for AAA authorization";
+  }
+
+  grouping aaa-authorization-top {
+    description
+      "Top-level grouping for AAA authorization";
+
+    container authorization {
+      description
+        "Top-level container for AAA authorization configuration
+        and operational state data";
+
+      container config {
+        description
+          "Configuration data for authorization based on AAA
+          methods";
+
+        uses aaa-authorization-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for authorization based on AAA";
+
+        uses aaa-authorization-config;
+        uses aaa-authorization-state;
+      }
+
+      uses aaa-authorization-events-top;
+
+    }
+  }
+
+  grouping aaa-authentication-config {
+    description
+      "Configuration data for global authentication";
+
+    leaf-list authentication-method {
+      type union {
+        type identityref {
+          base oc-aaa-types:AAA_METHOD_TYPE;
+        }
+        type string;
+        //TODO: string should be a leafref to a defined
+        //server group.  this will be possible in YANG 1.1
+        //type leafref {
+          //path "/aaa/server-groups/server-group/config/name";
+        //}
+      }
+      ordered-by user;
+      description
+        "Ordered list of authentication methods for users.  This
+        can be either a reference to a server group, or a well-
+        defined designation in the AAA_METHOD_TYPE identity.  If
+        authentication fails with one method, the next defined
+        method is tried -- failure of all methods results in the
+        user being denied access.";
+    }
+  }
+
+  grouping aaa-authentication-state {
+    description
+      "Operational state data for global authentication";
+  }
+
+  grouping aaa-authentication-top {
+    description
+      "Top-level grouping for top-level authentication";
+
+    container authentication {
+      description
+        "Top-level container for global authentication data";
+
+      container config {
+        description
+          "Configuration data for global authentication services";
+
+        uses aaa-authentication-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for global authentication
+          services";
+
+        uses aaa-authentication-config;
+        uses aaa-authentication-state;
+      }
+
+      uses aaa-authentication-admin-top;
+      uses aaa-authentication-user-top;
+    }
+  }
+
+  grouping aaa-config {
+    description
+      "Configuration data for top level AAA";
+  }
+
+  grouping aaa-state {
+    description
+      "Operational state data for top level AAA";
+  }
+
+  grouping aaa-top {
+    description
+      "Top-level grouping for AAA services";
+
+    container aaa {
+      description
+        "Top-level container for AAA services";
+
+      container config {
+        description
+          "Configuration data for top level AAA services";
+
+        uses aaa-config;
+      }
+
+      container state {
+        config false;
+
+        description
+          "Operational state data for top level AAA services ";
+
+        uses aaa-config;
+        uses aaa-state;
+      }
+
+      uses aaa-authentication-top;
+      uses aaa-authorization-top;
+      uses aaa-accounting-top;
+      uses aaa-servergroup-common-top;
+
+    }
+  }
+
+
+
+  // data definition statements
+
+
+}
diff --git a/models/openconfig/src/main/yang/system/openconfig-procmon.yang b/models/openconfig/src/main/yang/system/openconfig-procmon.yang
new file mode 100644
index 0000000..6422541
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-procmon.yang
@@ -0,0 +1,159 @@
+module openconfig-procmon {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/system/procmon";
+
+  prefix "oc-proc";
+
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-types { prefix oc-types; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module provides data definitions for process health
+    monitoring of one or more processes running on the system.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // grouping statements
+
+  grouping procmon-processes-top {
+    description
+      "Top level grouping for attributes for processes.";
+
+    container processes {
+      description
+        "Parameters related to all monitored processes";
+
+      list process {
+        key "pid";
+        config false;
+        description
+          "List of monitored processes";
+
+        leaf pid {
+          type leafref {
+            path "../state/pid";
+          }
+          description
+            "Reference to the process pid key";
+        }
+
+        container state {
+          config false;
+          description
+            "State parameters related to monitored processes";
+
+          uses procmon-process-attributes-state;
+        }
+      }
+    }
+  }
+
+  grouping procmon-process-attributes-state {
+    description
+      "Attributes state definitions for a process";
+
+    leaf pid {
+      type uint64;
+      description
+        "The process pid";
+    }
+
+    leaf name {
+      type string;
+      description
+        "The process name";
+    }
+
+    leaf-list args {
+      type string;
+      description
+        "Current process command line arguments.  Arguments with
+        a parameter (e.g., --option 10  or -option=10) should be
+        represented as a single element of the list with the
+        argument name and parameter together.  Flag arguments, i.e.,
+        those without a parameter should also be in their own list
+        element.";
+    }
+
+    leaf start-time {
+      type uint64;
+      units "ns";
+      description
+        "The time at which this process started,
+        reported as nanoseconds since the UNIX epoch.  The
+        system must be synchronized such that the start-time
+        can be reported accurately, otherwise it should not be
+        reported.";
+     }
+
+    leaf uptime {
+      type oc-types:timeticks64;
+      description
+        "Amount of time elapsed since this process started.";
+    }
+
+    leaf cpu-usage-user {
+      type oc-types:timeticks64;
+      description
+        "CPU time consumed by this process in user mode.";
+    }
+
+    leaf cpu-usage-system {
+      type oc-types:timeticks64;
+      description
+        "CPU time consumed by this process in kernel mode.";
+    }
+
+    leaf cpu-utilization {
+      type oc-types:percentage;
+      description
+        "The percentage of CPU that is being used by the process.";
+    }
+
+    leaf memory-usage {
+      type uint64;
+      units "bytes";
+      description
+        "Bytes allocated and still in use by the process";
+    }
+
+    leaf memory-utilization {
+      type oc-types:percentage;
+      description
+        "The percentage of RAM that is being used by the process.";
+    }
+  }
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+}
diff --git a/models/openconfig/src/main/yang/system/openconfig-system-logging.yang b/models/openconfig/src/main/yang/system/openconfig-system-logging.yang
new file mode 100644
index 0000000..aee367d
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-system-logging.yang
@@ -0,0 +1,486 @@
+module openconfig-system-logging {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/system/logging";
+
+  prefix "oc-log";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+  import ietf-inet-types { prefix inet; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    for common logging facilities on network systems.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity SYSLOG_FACILITY {
+    description
+      "Base identity for Syslog message facilities.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity ALL {
+    base SYSLOG_FACILITY;
+    description
+      "All supported facilities";
+  }
+
+  identity KERNEL {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for kernel messages";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity USER {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for user-level messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity MAIL {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for the mail system.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity SYSTEM_DAEMON {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for the system daemons.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+   }
+
+  identity AUTH {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for security/authorization messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity SYSLOG {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for messages generated internally by syslogd
+       facility.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity AUTHPRIV {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for privileged security/authorization messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+
+  identity NTP {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for the NTP subsystem.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity AUDIT {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for log audit messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity CONSOLE {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for log alert messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL0 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 0 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL1 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 1 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL2 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 2 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL3 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 3 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL4 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 4 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL5 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 5 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL6 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 6 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOCAL7 {
+    base SYSLOG_FACILITY;
+    description
+      "The facility for local use 7 messages.";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  identity LOG_DESTINATION_TYPE {
+    description
+      "Base identity for destination for logging messages";
+  }
+
+  identity DEST_CONSOLE {
+    base LOG_DESTINATION_TYPE;
+    description
+      "Directs log messages to the console";
+  }
+
+  identity DEST_BUFFER {
+    base LOG_DESTINATION_TYPE;
+    description
+      "Directs log messages to and in-memory circular buffer";
+  }
+
+  identity DEST_FILE {
+    base LOG_DESTINATION_TYPE;
+    description
+      "Directs log messages to a local file";
+  }
+
+  identity DEST_REMOTE {
+    base LOG_DESTINATION_TYPE;
+    description
+      "Directs log messages to a remote syslog server";
+  }
+
+  // typedef statements
+
+    typedef syslog-severity {
+      type enumeration {
+        enum EMERGENCY {
+          description
+            "Emergency: system is unusable (0)";
+        }
+        enum ALERT {
+          description
+          "Alert: action must be taken immediately (1)";
+      }
+      enum CRITICAL {
+        description
+          "Critical: critical conditions (2)";
+      }
+      enum ERROR {
+        description
+          "Error: error conditions (3)";
+      }
+      enum WARNING {
+        description
+          "Warning: warning conditions (4)";
+      }
+      enum NOTICE {
+        description
+          "Notice: normal but significant  condition(5)";
+      }
+      enum INFORMATIONAL {
+        description
+          "Informational: informational messages (6)";
+      }
+      enum DEBUG {
+        description
+          "Debug: debug-level messages (7)";
+      }
+    }
+    description
+      "Syslog message severities";
+    reference
+      "IETF RFC 5424 - The Syslog Protocol";
+  }
+
+  // grouping statements
+
+  grouping logging-selectors-config {
+    description
+      "Configuration data for logging selectors";
+
+    leaf facility {
+      type identityref {
+        base SYSLOG_FACILITY;
+      }
+      description
+        "Specifies the facility, or class of messages to log";
+    }
+
+    leaf severity {
+      type syslog-severity;
+      description
+        "Specifies that only messages of the given severity (or
+        greater severity) for the corresonding facility are logged";
+    }
+  }
+
+  grouping logging-selectors-state {
+    description
+      "Operational state data for logging selectors";
+  }
+
+  grouping logging-selectors-top {
+    description
+      "Top-level grouping for the logging selector list";
+
+    container selectors {
+      description
+        "Enclosing container ";
+
+      list selector {
+        key "facility severity";
+        description
+          "List of selectors for log messages";
+
+        leaf facility {
+          type leafref {
+            path "../config/facility";
+          }
+          description
+            "Reference to facility list key";
+        }
+
+        leaf severity {
+          type leafref {
+            path "../config/severity";
+          }
+          description
+            "Reference to severity list key";
+        }
+
+        container config {
+          description
+            "Configuration data ";
+
+          uses logging-selectors-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data ";
+
+          uses logging-selectors-config;
+          uses logging-selectors-state;
+        }
+      }
+    }
+  }
+
+  grouping logging-console-config {
+    description
+      "Configuration data for console logging";
+  }
+
+  grouping logging-console-state {
+    description
+      "Operational state data for console logging";
+  }
+
+  grouping logging-console-top {
+    description
+      "Top-level grouping for console logging data";
+
+    container console {
+      description
+        "Top-level container for data related to console-based
+        logging";
+
+      container config {
+        description
+          "Configuration data for console logging";
+
+        uses logging-console-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for console logging";
+
+        uses logging-console-config;
+        uses logging-console-state;
+      }
+
+      uses logging-selectors-top;
+    }
+  }
+
+  grouping logging-remote-config {
+    description
+      "Configuration data for remote log servers";
+
+    leaf host {
+      type inet:host;
+      description
+        "IP address or hostname of the remote log server";
+    }
+
+    leaf source-address {
+      type inet:ip-address;
+      description
+        "Source IP address for packets to the log server";
+    }
+
+    leaf remote-port {
+      type inet:port-number;
+      default 514;
+      description
+        "Sets the destination port number for syslog UDP messages to
+        the server.  The default for syslog is 514.";
+    }
+  }
+
+  grouping logging-remote-state {
+    description
+      "Operational state data for remote log servers";
+  }
+
+  grouping logging-remote-top {
+    description
+      "Top-level grouping for remote log servers";
+
+    container remote-servers {
+      description
+        "Enclosing container for the list of remote log servers";
+
+      list remote-server {
+        key "host";
+        description
+          "List of remote log servers";
+
+        leaf host {
+          type leafref {
+            path "../config/host";
+          }
+          description
+            "Reference to the host list key";
+        }
+
+        container config {
+          description
+            "Configuration data for remote log servers";
+
+          uses logging-remote-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for remote log servers";
+
+          uses logging-remote-config;
+          uses logging-remote-state;
+        }
+        uses logging-selectors-top;
+      }
+    }
+  }
+
+  grouping logging-top {
+    description
+      "Top-level grouping for logging data";
+
+    container logging {
+      description
+        "Top-level container for data related to logging / syslog";
+
+      uses logging-console-top;
+      uses logging-remote-top;
+    }
+  }
+  // data definition statements
+
+  // augment statements
+
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/system/openconfig-system-terminal.yang b/models/openconfig/src/main/yang/system/openconfig-system-terminal.yang
new file mode 100644
index 0000000..f835e35
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-system-terminal.yang
@@ -0,0 +1,233 @@
+module openconfig-system-terminal {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/system/terminal";
+
+  prefix "oc-sys-term";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines configuration and operational state data
+    related to remote terminal services such as ssh and telnet.";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping system-terminal-common-config {
+    description
+      "Common configuration data for terminal services";
+
+    leaf timeout {
+      type uint16;
+      units seconds;
+      description
+        "Set the idle timeout in seconds on terminal connections to
+        the system for the protocol.";
+    }
+
+    leaf rate-limit {
+      type uint16;
+      units "conn/min";
+      description
+        "Set a limit on the number of connection attempts per
+        minute to the system for the protocol.";
+    }
+
+    leaf session-limit {
+      type uint16;
+      description
+        "Set a limit on the number of simultaneous active terminal
+        sessions to the system for the protocol (e.g., ssh,
+        telnet, ...) ";
+    }
+  }
+
+  grouping system-terminal-common-state {
+    description
+      "Common operational state data for terminal services";
+  }
+
+  grouping system-terminal-common-top {
+    description
+      "Top-level grouping for common terminal service data";
+
+    container terminal-servers {
+      description
+        "Top-level container for terminal services";
+
+      container config {
+        description
+          "Configuration data for terminal services";
+
+        uses system-terminal-common-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses system-terminal-common-config;
+        uses system-terminal-common-state;
+      }
+    }
+  }
+
+  grouping system-ssh-server-config {
+    description
+      "Configuration data for system ssh configuration";
+
+    leaf enable {
+      type boolean;
+      default true;
+      description
+        "Enables the ssh server.  The ssh server is enabled by
+        default.";
+    }
+
+    leaf protocol-version {
+      type enumeration {
+        enum V2 {
+          description
+            "Use SSH v2 only";
+        }
+        enum V1 {
+          description
+            "Use SSH v1 only";
+        }
+        enum V1_V2 {
+          description
+            "Use either SSH v1 or v2";
+        }
+      }
+      default V2;
+      description
+        "Set the protocol version for SSH connections to the system";
+    }
+
+    uses system-terminal-common-config;
+  }
+
+  grouping system-ssh-server-state {
+    description
+      "Operational state data for ssh server";
+  }
+
+  grouping system-ssh-server-top {
+    description
+      "Top-level grouping for ssh server data";
+
+    container ssh-server {
+      description
+        "Top-level container for ssh server";
+
+      container config {
+        description
+          "Configuration data for the system ssh server";
+
+        uses system-ssh-server-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the system ssh server";
+
+        uses system-ssh-server-config;
+        uses system-ssh-server-state;
+      }
+    }
+  }
+
+  grouping system-telnet-server-config {
+    description
+      "Configuration data for telnet server";
+
+      leaf enable {
+        type boolean;
+        default false;
+        description
+          "Enables the telnet server.  Telnet is disabled by
+          default";
+      }
+      uses system-terminal-common-config;
+
+  }
+
+  grouping system-telnet-server-state {
+    description
+      "Operational state data for telnet server";
+  }
+
+  grouping system-telnet-server-top {
+    description
+      "Top-level grouping for telnet server ";
+
+    container telnet-server {
+      description
+        "Top-level container for telnet terminal servers";
+
+      container config {
+        description
+          "Configuration data for telnet";
+
+        uses system-telnet-server-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for telnet";
+
+        uses system-telnet-server-config;
+        uses system-telnet-server-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
\ No newline at end of file
diff --git a/models/openconfig/src/main/yang/system/openconfig-system.yang b/models/openconfig/src/main/yang/system/openconfig-system.yang
new file mode 100644
index 0000000..d784b11
--- /dev/null
+++ b/models/openconfig/src/main/yang/system/openconfig-system.yang
@@ -0,0 +1,843 @@
+module openconfig-system {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/system";
+
+  prefix "oc-sys";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import ietf-yang-types { prefix yang; }
+  import openconfig-types { prefix oc-types; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-aaa { prefix oc-aaa; }
+  import openconfig-system-logging { prefix oc-log; }
+  import openconfig-system-terminal { prefix oc-sys-term; }
+  import openconfig-procmon { prefix oc-proc; }
+
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "Model for managing system-wide services and functions on
+    network devices.
+
+    Portions of this code were derived from IETF RFC 7317.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "0.2.0";
+
+  revision "2017-07-06" {
+    description
+      "Move to oc-inet types, add IETF attribution, add RADIUS
+      counters, changed password leaf names to indicate hashed";
+    reference "0.2.0";
+  }
+
+  revision "2017-01-29" {
+    description
+      "Initial public release";
+    reference "0.1.0";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity NTP_AUTH_TYPE {
+    description
+      "Base identity for encryption schemes supported for NTP
+      authentication keys";
+  }
+
+  identity NTP_AUTH_MD5 {
+    base NTP_AUTH_TYPE;
+    description
+      "MD5 encryption method";
+  }
+
+  // typedef statements
+
+  typedef timezone-name-type {
+    type string;
+    description
+      "A time zone name as used by the Time Zone Database,
+       sometimes referred to as the 'Olson Database'.
+
+       The exact set of valid values is an implementation-specific
+       matter.  Client discovery of the exact set of time zone names
+       for a particular server is out of scope.";
+    reference
+      "BCP 175: Procedures for Maintaining the Time Zone Database";
+   }
+
+  // grouping statements
+
+  grouping system-clock-config {
+    description
+      "Configuration data for system-wide clock configuration";
+
+    leaf timezone-name {
+      type timezone-name-type;
+      description
+        "The TZ database name to use for the system, such
+         as 'Europe/Stockholm'.";
+      reference "IANA Time Zone Database
+        http://www.iana.org/time-zones";
+    }
+  }
+
+  grouping system-clock-state {
+    description
+      "Operational state data for system-wide clock configuration";
+  }
+
+  grouping system-clock-top {
+    description
+      "Top-level grouping for system-wide clock configuration";
+
+    container clock {
+      description
+        "Top-level container for clock configuration data";
+
+      container config {
+        description
+          "Configuration data for system clock";
+
+        uses system-clock-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for system clock";
+
+        uses system-clock-config;
+        uses system-clock-state;
+      }
+    }
+  }
+
+  grouping system-global-config {
+    description "system-wide configuration parameters";
+
+    leaf hostname {
+      type oc-inet:domain-name;
+      description
+        "The hostname of the device -- should be a single domain
+        label, without the domain.";
+    }
+
+    leaf domain-name {
+      type oc-inet:domain-name;
+      description
+        "Specifies the domain name used to form fully qualified name
+        for unqualified hostnames.";
+    }
+
+    leaf login-banner {
+      type string;
+      description
+        "The console login message displayed before the login prompt,
+        i.e., before a user logs into the system.";
+    }
+
+    leaf motd-banner {
+      type string;
+      description
+        "The console message displayed after a user logs into the
+        system.  They system may append additional standard
+        information such as the current system date and time, uptime,
+        last login timestamp, etc.";
+    }
+  }
+
+  grouping system-global-state {
+    description
+      "Global operational state data for the system";
+
+    leaf current-datetime {
+        type yang:date-and-time;
+        description
+          "The current system date and time.";
+    }
+
+    leaf boot-time {
+        type oc-types:timeticks64;
+        description
+          "This timestamp indicates the time that the system was last
+          restarted.  The value is the timestamp in seconds relative
+          to the Unix Epoch (Jan 1, 1970 00:00:00 UTC).";
+    }
+
+  }
+
+  grouping system-dns-config {
+    description "DNS / resolver related configuration data";
+
+    leaf-list search {
+      type oc-inet:domain-name;
+      ordered-by user;
+      description
+        "An ordered list of domains to search when resolving
+        a host name.";
+    }
+  }
+
+  grouping system-dns-state {
+    description
+      "Operational state data for system DNS resolver";
+
+  }
+
+  grouping system-dns-servers-config {
+    description
+      "Configuration data for DNS resolvers";
+
+    //RFC 7317 includes a single-value choice statement to for
+    //TCP and UDP transport.  This has been removed since it the
+    //transport protocol is not generally available as an options
+    //on target devices.  It may be added back if and when needed.
+
+    leaf address {
+      type oc-inet:ip-address;
+      description
+        "The address of the DNS server, can be either IPv4
+        or IPv6.";
+    }
+
+    leaf port {
+      type oc-inet:port-number;
+      default 53;
+      description
+        "The port number of the DNS server.";
+    }
+
+    //RFC 7317 includes resolver timeout and attempts options. These
+    //have been omitted as they are not available on many targets. If
+    //and when they are required, they may be added back in.
+  }
+
+  grouping system-dns-static-config {
+    description
+      "Configuration data for static host entries";
+
+    leaf hostname {
+      type string;
+      description
+        "Hostname for the static DNS entry";
+    }
+
+    leaf-list alias {
+      type string;
+      description
+        "Additional aliases for the hostname";
+    }
+
+    leaf-list ipv4-address {
+      type oc-inet:ipv4-address;
+      description
+        "List of IPv4 addressses for the host entry";
+    }
+
+    leaf-list ipv6-address {
+      type oc-inet:ipv6-address;
+      description
+        "List of IPv6 addresses for the host entry";
+    }
+  }
+
+  grouping system-dns-static-state {
+    description
+      "Operational state data for static host entries";
+  }
+
+  grouping system-dns-static-top {
+    description
+      "Top-level grouping for static DNS host entries";
+
+    container host-entries {
+      description
+        "Enclosing container for list of static host entries";
+
+      list host-entry {
+        key "hostname";
+        description
+          "List of static host entries";
+
+        leaf hostname {
+          type leafref {
+            path "../config/hostname";
+          }
+          description
+            "Reference to the hostname list key";
+        }
+
+        container config {
+          description
+            "Configuration data for static host entries";
+
+          uses system-dns-static-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for static host entries";
+
+          uses system-dns-static-config;
+          uses system-dns-static-state;
+        }
+      }
+    }
+  }
+
+  grouping system-dns-servers-state {
+    description
+      "Operational state data for DNS resolvers";
+
+  }
+
+  grouping system-dns-servers-top {
+    description
+      "Top-level grouping for the list of DNS resolvers.";
+
+    container servers {
+      description
+        "Enclosing container for DNS resolver list";
+
+      list server {
+        key "address";
+        ordered-by user;
+        description
+          "List of the DNS servers that the resolver should query.
+
+           When the resolver is invoked by a calling application, it
+           sends the query to the first name server in this list.  If
+           no response has been received within 'timeout' seconds,
+           the resolver continues with the next server in the list.
+           If no response is received from any server, the resolver
+           continues with the first server again.  When the resolver
+           has traversed the list 'attempts' times without receiving
+           any response, it gives up and returns an error to the
+           calling application.
+
+           Implementations MAY limit the number of entries in this
+           list.";
+
+        leaf address {
+          type leafref {
+            path "../config/address";
+          }
+          description
+            "References the configured address of the DNS server";
+        }
+
+        container config {
+          description
+            "Configuration data for each DNS resolver";
+
+          uses system-dns-servers-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for each DNS resolver";
+
+          uses system-dns-servers-config;
+          uses system-dns-servers-state;
+        }
+
+      }
+    }
+  }
+
+  grouping system-dns-top {
+    description
+      "Top-level grouping for DNS / resolver config and operational
+      state data";
+
+    container dns {
+      description
+        "Enclosing container for DNS resolver data";
+
+      container config {
+        description
+          "Configuration data for the DNS resolver";
+
+        uses system-dns-config;
+
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for the DNS resolver";
+
+        uses system-dns-config;
+        uses system-dns-state;
+
+      }
+
+      uses system-dns-servers-top;
+      uses system-dns-static-top;
+    }
+  }
+
+  grouping system-ntp-server-config {
+    description
+      "Configuration data for NTP servers";
+
+    leaf address {
+      type oc-inet:host;
+      description
+        "The address or hostname of the NTP server.";
+    }
+
+    leaf port {
+      type oc-inet:port-number;
+      default 123;
+      description
+        "The port number of the NTP server.";
+    }
+
+    leaf version {
+      type uint8 {
+        range 1..4;
+      }
+      default 4;
+      description
+        "Version number to put in outgoing NTP packets";
+    }
+
+    leaf association-type {
+      type enumeration {
+        enum SERVER {
+          description
+            "Use client association mode.  This device
+             will not provide synchronization to the
+             configured NTP server.";
+        }
+        enum PEER {
+          description
+            "Use symmetric active association mode.
+             This device may provide synchronization
+             to the configured NTP server.";
+        }
+        enum POOL {
+          description
+            "Use client association mode with one or
+             more of the NTP servers found by DNS
+             resolution of the domain name given by
+             the 'address' leaf.  This device will not
+             provide synchronization to the servers.";
+        }
+      }
+      default SERVER;
+      description
+        "The desired association type for this NTP server.";
+    }
+    leaf iburst {
+      type boolean;
+      default false;
+      description
+        "Indicates whether this server should enable burst
+        synchronization or not.";
+    }
+    leaf prefer {
+      type boolean;
+      default false;
+      description
+        "Indicates whether this server should be preferred
+        or not.";
+    }
+  }
+
+  grouping system-ntp-server-state {
+    description
+      "Operational state data for NTP servers";
+
+    leaf stratum {
+      type uint8;
+      description
+        "Indicates the level of the server in the NTP hierarchy. As
+        stratum number increases, the accuracy is degraded.  Primary
+        servers are stratum while a maximum value of 16 indicates
+        unsynchronized.  The values have the following specific
+        semantics:
+
+        | 0      | unspecified or invalid
+        | 1      | primary server (e.g., equipped with a GPS receiver)
+        | 2-15   | secondary server (via NTP)
+        | 16     | unsynchronized
+        | 17-255 | reserved";
+      reference
+        "RFC 5905 - Network Time Protocol Version 4: Protocol and
+        Algorithms Specification";
+    }
+
+    leaf root-delay {
+      type uint32;
+      // TODO: reconsider units for these values -- the spec defines
+      // rootdelay and rootdisperson as 2 16-bit integers for seconds
+      // and fractional seconds, respectively.  This gives a
+      // precision of ~15 us (2^-16).  Using milliseconds here based
+      // on what implementations typically provide and likely lack
+      // of utility for less than millisecond precision with NTP
+      // time sync.
+      units "milliseconds";
+      description
+        "The round-trip delay to the server, in milliseconds.";
+      reference
+        "RFC 5905 - Network Time Protocol Version 4: Protocol and
+        Algorithms Specification";
+    }
+
+    leaf root-dispersion {
+      type uint64;
+      units "milliseconds";
+      description
+        "Dispersion (epsilon) represents the maximum error inherent
+        in the measurement";
+      reference
+        "RFC 5905 - Network Time Protocol Version 4: Protocol and
+        Algorithms Specification";
+    }
+
+    leaf offset {
+      type uint64;
+      units "milliseconds";
+      description
+        "Estimate of the current time offset from the peer.  This is
+        the time difference between the local and reference clock.";
+    }
+
+    leaf poll-interval {
+      type uint32;
+      units "seconds";
+      description
+        "Polling interval of the peer";
+    }
+  }
+
+  grouping system-ntp-server-top {
+    description
+      "Top-level grouping for the list of NTP servers";
+
+    container servers {
+      description
+        "Enclosing container for the list of NTP servers";
+
+      list server {
+        key "address";
+        description
+          "List of NTP servers to use for system clock
+          synchronization.  If '/system/ntp/enabled'
+          is 'true', then the system will attempt to
+          contact and utilize the specified NTP servers.";
+
+        leaf address {
+          type leafref {
+            path "../config/address";
+          }
+          description
+            "References the configured address or hostname of the
+            NTP server.";
+        }
+
+        container config {
+          description
+            "Configuration data for an NTP server.";
+
+          uses system-ntp-server-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for an NTP server.";
+
+          uses system-ntp-server-config;
+          uses system-ntp-server-state;
+        }
+
+      }
+    }
+  }
+
+  grouping system-ntp-auth-keys-config {
+    description
+      "Configuration data ";
+
+    leaf key-id {
+      type uint16;
+      description
+        "Integer identifier used by the client and server to
+        designate a secret key.  The client and server must use
+        the same key id.";
+    }
+
+    leaf key-type {
+      type identityref {
+        base NTP_AUTH_TYPE;
+      }
+      description
+        "Encryption type used for the NTP authentication key";
+    }
+
+    leaf key-value {
+      type string;
+      description
+        "NTP authentication key value";
+    }
+  }
+
+  grouping system-ntp-auth-keys-state {
+    description
+      "Operational state data for NTP auth key data";
+  }
+
+  grouping system-ntp-auth-keys-top {
+    description
+      "Top-level grouping for NTP auth key data";
+
+    container ntp-keys {
+      description
+        "Enclosing container for list of NTP authentication keys";
+
+      list ntp-key {
+        key "key-id";
+        description
+          "List of NTP authentication keys";
+
+        leaf key-id {
+          type leafref {
+            path "../config/key-id";
+          }
+          description
+            "Reference to auth key-id list key";
+        }
+
+        container config {
+          description
+            "Configuration data for NTP auth keys";
+
+          uses system-ntp-auth-keys-config;
+        }
+
+        container state {
+
+          config false;
+
+          description
+            "Operational state data for NTP auth keys";
+
+          uses system-ntp-auth-keys-config;
+          uses system-ntp-auth-keys-state;
+        }
+      }
+    }
+  }
+
+  grouping system-ntp-config {
+    description
+      "Configuration data for system-wide NTP operation.";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "Enables the NTP protocol and indicates that the system should
+        attempt to synchronize the system clock with an NTP server
+        from the servers defined in the 'ntp/server' list.";
+    }
+
+    leaf ntp-source-address {
+      type oc-inet:ip-address;
+      description
+        "Source address to use on outgoing NTP packets";
+    }
+
+    leaf enable-ntp-auth {
+      type boolean;
+      default false;
+      description
+        "Enable or disable NTP authentication -- when enabled, the
+        system will only use packets containing a trusted
+        authentication key to synchronize the time.";
+    }
+  }
+
+  grouping system-ntp-state {
+    description
+      "Operational state data for system-wide NTP operation.";
+
+    leaf auth-mismatch {
+      type yang:counter64;
+      description
+        "Count of the number of NTP packets received that were not
+        processed due to authentication mismatch.";
+    }
+  }
+
+  grouping system-ntp-top {
+    description
+      "Top-level grouping for configuration and state data for NTP";
+
+    container ntp {
+      description
+        "Top-level container for NTP configuration and state";
+
+      container config {
+        description
+          "Configuration data for NTP client.";
+
+        uses system-ntp-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for NTP services.";
+
+        uses system-ntp-config;
+        uses system-ntp-state;
+      }
+      uses system-ntp-auth-keys-top;
+      uses system-ntp-server-top;
+    }
+  }
+
+  grouping system-memory-config {
+    description
+      "Configuration data for system memory";
+  }
+
+  grouping system-memory-state {
+    description
+      "Operational state data for system memory";
+
+    leaf physical {
+      type uint64;
+      units bytes;
+      // TODO: consider making units in megabytes
+      description
+        "Reports the total physical memory available on the
+        system.";
+    }
+
+    leaf reserved {
+      type uint64;
+      units bytes;
+      description
+        "Memory reserved for system use";
+    }
+  }
+
+  grouping system-memory-top {
+    description
+      "Top-level grouping for system memory data definitions";
+
+    container memory {
+      description
+        "Top-level container for system memory data";
+
+      container config {
+        description
+          "Configuration data for system memory";
+
+        uses system-memory-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data for system memory";
+
+        uses system-memory-config;
+        uses system-memory-state;
+      }
+    }
+  }
+
+
+  grouping system-top {
+    description
+      "Top level system data containers";
+
+    container system {
+      description
+        "Enclosing container for system-related configuration and
+        operational state data";
+
+      container config {
+        description "Global configuration data for the system";
+
+        uses system-global-config;
+
+      }
+
+      container state {
+
+        config false;
+
+        description "Global operational state data for the system";
+
+        uses system-global-config;
+        uses system-global-state;
+
+      }
+
+      uses system-clock-top;
+      uses system-dns-top;
+      uses system-ntp-top;
+      uses oc-sys-term:system-ssh-server-top;
+      uses oc-sys-term:system-telnet-server-top;
+      uses oc-log:logging-top;
+      uses oc-aaa:aaa-top;
+      uses system-memory-top;
+      uses oc-proc:procmon-processes-top;
+    }
+  }
+
+  // data definition statements
+
+  uses system-top;
+
+}
diff --git a/models/openconfig/src/main/yang/telemetry/openconfig-telemetry-types.yang b/models/openconfig/src/main/yang/telemetry/openconfig-telemetry-types.yang
new file mode 100644
index 0000000..57c875e
--- /dev/null
+++ b/models/openconfig/src/main/yang/telemetry/openconfig-telemetry-types.yang
@@ -0,0 +1,109 @@
+module openconfig-telemetry-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/telemetry-types";
+
+  prefix "oc-telemetry-types";
+
+  import openconfig-extensions { prefix oc-ext; }
+
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module defines type and identities used by the OpenConfig
+    telemetry model.";
+
+  oc-ext:openconfig-version "0.4.0";
+
+  revision "2017-02-20" {
+    description
+      "Fixes for YANG 1.0 compliance, add types module";
+    reference "0.4.0";
+  }
+
+  revision "2016-04-05" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+
+
+  // identity statements
+
+  identity DATA_ENCODING_METHOD {
+    description
+      "Base identity for supported encoding for configuration and
+      operational state data";
+  }
+
+  identity ENC_XML {
+    base DATA_ENCODING_METHOD;
+    description
+      "XML encoding";
+  }
+
+  identity ENC_JSON_IETF {
+    base DATA_ENCODING_METHOD;
+    description
+      "JSON encoded based on IETF draft standard";
+    reference
+      "draft-ietf-netmod-yang-json";
+  }
+
+  identity ENC_PROTO3 {
+    base DATA_ENCODING_METHOD;
+    description
+      "Protocol buffers v3";
+    reference
+      "https://developers.google.com/protocol-buffers/docs/overview";
+  }
+
+  identity STREAM_PROTOCOL {
+    description "Base identity for a telemetry stream protocol";
+  }
+
+  identity STREAM_SSH {
+    base "STREAM_PROTOCOL";
+    description
+      "Telemetry stream is carried over a SSH connection";
+  }
+
+  identity STREAM_GRPC {
+    base "STREAM_PROTOCOL";
+    description
+      "Telemetry stream is carried over via the gRPC framework";
+  }
+
+  identity STREAM_JSON_RPC {
+    base "STREAM_PROTOCOL";
+      description
+        "Telemetry stream is carried via the JSON-RPC framework";
+  }
+
+  identity STREAM_THRIFT_RPC {
+    base "STREAM_PROTOCOL";
+      description
+        "Telemetry stream is carried via the Apache Thrift framework";
+  }
+
+  identity STREAM_WEBSOCKET_RPC {
+    base "STREAM_PROTOCOL";
+      description
+        "Telemetry stream is carried by the WebSocket framework";
+  }
+
+  
+  // typedef statements
+
+
+
+}
diff --git a/models/openconfig/src/main/yang/telemetry/openconfig-telemetry.yang b/models/openconfig/src/main/yang/telemetry/openconfig-telemetry.yang
new file mode 100644
index 0000000..73b8679
--- /dev/null
+++ b/models/openconfig/src/main/yang/telemetry/openconfig-telemetry.yang
@@ -0,0 +1,757 @@
+module openconfig-telemetry {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/telemetry";
+
+  prefix "oc-telemetry";
+
+  // import some basic types
+  import openconfig-inet-types { prefix oc-inet; }
+  import openconfig-extensions { prefix oc-ext; }
+  import openconfig-telemetry-types { prefix oc-telemetry-types; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group www.openconfig.net";
+
+  description
+    "Data model which creates the configuration for the telemetry
+     systems and functions on the device.";
+
+  oc-ext:openconfig-version "0.4.0";
+
+  revision "2017-02-20" {
+    description
+      "Fixes for YANG 1.0 compliance, add types module";
+    reference "0.4.0";
+  }
+
+  revision "2016-04-05" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  grouping telemetry-top {
+    description
+      "Top level grouping for telemetry configuration and operational
+      state data";
+
+    container telemetry-system {
+      description
+        "Top level configuration and state for the
+         device's telemetry system.";
+
+      container sensor-groups {
+        description
+          "Top level container for sensor-groups.";
+
+        list sensor-group {
+          key "sensor-group-id";
+          description
+            "List of telemetry sensory groups on the local
+             system, where a sensor grouping represents a resuable
+             grouping of multiple paths and exclude filters.";
+
+          leaf sensor-group-id {
+            type leafref {
+              path "../config/sensor-group-id";
+            }
+            description
+              "Reference to the name or identifier of the
+               sensor grouping";
+          }
+          container config {
+            description
+              "Configuration parameters relating to the
+               telemetry sensor grouping";
+            uses telemetry-sensor-group-config;
+          }
+          container state {
+            config false;
+            description
+              "State information relating to the telemetry
+               sensor group";
+            uses telemetry-sensor-group-config;
+          }
+
+          container sensor-paths {
+            description
+              "Top level container to hold a set of sensor
+               paths grouped together";
+
+            list sensor-path {
+              key "path";
+              description
+                "List of paths in the model which together
+                 comprise a sensor grouping. Filters for each path
+                 to exclude items are also provided.";
+
+              leaf path {
+                type leafref {
+                  path "../config/path";
+                }
+                description
+                  "Reference to the path of interest";
+              }
+              container config {
+                description
+                  "Configuration parameters to configure a set
+                   of data model paths as a sensor grouping";
+                uses telemetry-sensor-path-config;
+              }
+              container state {
+                config false;
+                description
+                  "Configuration parameters to configure a set
+                   of data model paths as a sensor grouping";
+                uses telemetry-sensor-path-config;
+              }
+            }
+          }
+        }
+      }
+
+        container destination-groups {
+          description
+            "Top level container for destination group configuration
+             and state.";
+
+          list destination-group {
+            key "group-id";
+            description
+              "List of destination-groups. Destination groups allow the
+               reuse of common telemetry destinations across the
+               telemetry configuration. An operator references a
+               set of destinations via the configurable
+               destination-group-identifier.
+
+               A destination group may contain one or more telemetry
+               destinations";
+
+            leaf group-id {
+              type leafref {
+                path "../config/group-id";
+              }
+              description
+                "Unique identifier for the destination group";
+            }
+
+            container config {
+              description
+                "Top level config container for destination groups";
+              leaf group-id {
+                type string;
+                description
+                  "Unique identifier for the destination group";
+              }
+            }
+
+            container state {
+              config false;
+              description
+                "Top level state container for destination groups";
+
+              leaf group-id {
+                type string;
+                description
+                  "Unique identifier for destination group";
+              }
+            }
+
+            container destinations {
+              description
+                "The destination container lists the destination
+                 information such as IP address and port of the
+                 telemetry messages from the network element.";
+              list destination {
+                key "destination-address destination-port";
+                description
+                  "List of telemetry stream destinations";
+
+                leaf destination-address {
+                  type leafref {
+                    path "../config/destination-address";
+                  }
+                  description
+                    "Reference to the destination address of the
+                     telemetry stream";
+                }
+
+                leaf destination-port {
+                  type leafref {
+                    path "../config/destination-port";
+                  }
+                  description
+                    "Reference to the port number of the stream
+                     destination";
+                }
+
+                container config {
+                  description
+                    "Configuration parameters relating to
+                     telemetry destinations";
+                  uses telemetry-stream-destination-config;
+                }
+
+                container state {
+                  config false;
+                  description
+                    "State information associated with
+                     telemetry destinations";
+                  uses telemetry-stream-destination-config;
+                }
+              }
+            }
+          }
+        }
+
+      container subscriptions {
+        description
+          "This container holds information for both persistent
+           and dynamic telemetry subscriptions.";
+
+        container persistent {
+          description
+            "This container holds information relating to persistent
+             telemetry subscriptions. A persistent telemetry
+             subscription is configued locally on the device through
+             configuration, and is persistent across device restarts or
+             other redundancy changes.";
+
+          list subscription {
+            key "subscription-name";
+            description
+              "List of telemetry subscriptions. A telemetry
+              subscription consists of a set of collection
+              destinations, stream attributes, and associated paths to
+              state information in the model (sensor data)";
+
+            leaf subscription-name {
+              type leafref {
+                path "../config/subscription-name";
+              }
+              description
+                "Reference to the identifier of the subscription
+                itself. The id will be the handle to refer to the
+                subscription once created";
+            }
+
+            container config {
+              description
+                "Config parameters relating to the telemetry
+                subscriptions on the local device";
+
+              uses telemetry-subscription-name-config;
+              uses telemetry-local-source-address-config;
+              uses telemetry-qos-marking-config;
+              uses telemetry-stream-protocol-config;
+              uses telemetry-stream-encoding-config;
+            }
+
+            container state {
+              config false;
+              description
+                "State parameters relating to the telemetry
+                subscriptions on the local device";
+
+              uses telemetry-subscription-name-config;
+              uses telemetry-subscription-config;
+              uses telemetry-subscription-state;
+              uses telemetry-local-source-address-config;
+              uses telemetry-qos-marking-config;
+              uses telemetry-stream-protocol-config;
+              uses telemetry-stream-encoding-config;
+            }
+
+            container sensor-profiles {
+              description
+                "A sensor profile is a set of sensor groups or
+                individual sensor paths which are associated with a
+                telemetry subscription. This is the source of the
+                telemetry data for the subscription to send to the
+                defined collectors.";
+              list sensor-profile {
+                key "sensor-group";
+                description
+                  "List of telemetry sensor groups used
+                  in the subscription";
+
+                leaf sensor-group {
+                  type leafref {
+                    path "../config/sensor-group";
+                  }
+                  description
+                    "Reference to the telemetry sensor group name";
+                }
+
+                container config {
+                  description
+                    "Configuration parameters related to the sensor
+                    profile for a subscription";
+                  uses telemetry-sensor-profile-config;
+                }
+
+                container state {
+                  config false;
+                  description
+                    "State information relating to the sensor profile
+                    for a subscription";
+                  uses telemetry-sensor-profile-config;
+                }
+              }
+            }
+
+            container destination-groups {
+              description
+                "A subscription may specify destination addresses.
+                 If the subscription supplies destination addresses,
+                 the network element will be the initiator of the
+                 telemetry streaming, sending it to the destination(s)
+                 specified.
+
+                 If the destination set is omitted, the subscription
+                 preconfigures certain elements such as paths and
+                 sample intervals under a specified subscription ID.
+                 In this case, the network element will NOT initiate an
+                 outbound connection for telemetry, but will wait for
+                 an inbound connection from a network management
+                 system.
+
+                 It is expected that the network management system
+                 connecting to the network element will reference
+                 the preconfigured subscription ID when initiating
+                 a subscription.";
+
+              list destination-group {
+                key "group-id";
+                description
+                  "Identifier of the previously defined destination
+                   group";
+
+                leaf group-id {
+                  type leafref {
+                    path "../config/group-id";
+                  }
+                  description
+                    "The destination group id references a configured
+                     group of destinations for the telemetry stream.";
+                }
+
+                container config {
+                  description
+                  "Configuration parameters related to telemetry
+                   destinations.";
+
+                  leaf group-id {
+                    type leafref {
+                      path "../../../../../../../destination-groups"
+                        + "/destination-group/group-id";
+                    }
+                    description
+                      "The destination group id references a reusable
+                       group of destination addresses and ports for
+                       the telemetry stream.";
+                  }
+                }
+
+                container state {
+                  config false;
+                  description
+                  "State information related to telemetry
+                   destinations";
+
+                  leaf group-id {
+                    type leafref {
+                      path "../../../../../../../destination-groups"
+                        + "/destination-group/group-id";
+                    }
+                    description
+                      "The destination group id references a reusable
+                       group of destination addresses and ports for
+                       the telemetry stream.";
+                  }
+                }
+              }
+            }
+          }
+        }
+
+        container dynamic {
+          description
+            "This container holds information relating to dynamic
+            telemetry subscriptions. A dynamic subscription is
+            typically configured through an RPC channel, and does not
+            persist across device restarts, or if the RPC channel is
+            reset or otherwise torn down.";
+
+
+          list subscription {
+            key "subscription-id";
+            config false;
+            description
+              "List representation of telemetry subscriptions that
+              are configured via an inline RPC, otherwise known
+              as dynamic telemetry subscriptions.";
+
+            leaf subscription-id {
+              type leafref {
+                path "../state/subscription-id";
+              }
+
+              description
+                "Reference to the identifier of the subscription
+                itself. The id will be the handle to refer to the
+                subscription once created";
+            }
+
+              container state {
+                config false;
+                description
+                  "State information relating to dynamic telemetry
+                   subscriptions.";
+
+                uses telemetry-subscription-config;
+                uses telemetry-stream-destination-config;
+                uses telemetry-stream-frequency-config;
+                uses telemetry-heartbeat-config;
+                uses telemetry-suppress-redundant-config;
+                uses telemetry-qos-marking-config;
+                uses telemetry-stream-protocol-config;
+                uses telemetry-stream-encoding-config;
+              }
+
+              container sensor-paths {
+                description
+                  "Top level container to hold a set of sensor
+                   paths grouped together";
+
+                list sensor-path {
+                  key "path";
+                  description
+                    "List of paths in the model which together
+                    comprise a sensor grouping. Filters for each path
+                    to exclude items are also provided.";
+
+                  leaf path {
+                    type leafref {
+                      path "../state/path";
+                    }
+                    description
+                      "Reference to the path of interest";
+                  }
+
+                  container state {
+                    config false;
+                    description
+                      "State information for a dynamic subscription's
+                      paths of interest";
+                    uses telemetry-sensor-path-config;
+                  }
+                }
+              }
+          }
+        }
+      }
+    }
+  }
+
+  // identity statements
+
+  // typedef statements
+
+  // grouping statements
+
+  grouping telemetry-sensor-path-config {
+    description
+      "Configuration parameters relating to the
+       grouping of data model paths comprising a
+       sensor grouping";
+      leaf path {
+        type string;
+        description
+          "Path to a section of operational state of interest
+           (the sensor).";
+      }
+
+      leaf exclude-filter {
+        type string;
+        description
+          "Filter to exclude certain values out of the state
+           values";
+          //May not be necessary. Could remove.
+      }
+  }
+
+  grouping telemetry-heartbeat-config {
+    description
+      "Configuration parameters relating to the
+       heartbeat of the telemetry subscription";
+    leaf heartbeat-interval {
+      type uint64;
+      description
+        "Maximum time interval in seconds that may pass
+         between updates from a device to a telemetry collector.
+         If this interval expires, but there is no updated data to
+         send (such as if suppress_updates has been configured), the
+         device must send a telemetry message to the collector.";
+    }
+  }
+
+  grouping telemetry-suppress-redundant-config {
+    description
+      "Configuration parameters relating to suppression of
+       redundant upstream updates";
+    leaf suppress-redundant {
+      type boolean;
+      description
+        "Boolean flag to control suppression of redundant
+         telemetry updates to the collector platform. If this flag is
+         set to TRUE, then the collector will only send an update at
+         the configured interval if a subscribed data value has
+         changed. Otherwise, the device will not send an update to
+         the collector until expiration of the heartbeat interval.";
+    }
+  }
+
+  grouping telemetry-sensor-profile-config {
+    description
+      "Configuration parameters relating to the sensor groups
+       used in the sensor profile";
+    leaf sensor-group {
+      type leafref {
+        path "../../../../../../../sensor-groups/sensor-group"
+        + "/config/sensor-group-id";
+      }
+      description
+        "Reference to the sensor group which is used in the profile";
+    }
+    uses telemetry-stream-subscription-config;
+  }
+
+  grouping telemetry-stream-subscription-config {
+    description
+      "Configuration used when the sensor is a stream based sensor.";
+
+    uses telemetry-stream-frequency-config;
+    uses telemetry-heartbeat-config;
+    uses telemetry-suppress-redundant-config;
+
+  }
+
+  grouping telemetry-qos-marking-config {
+    description
+      "Config parameters relating to the quality of service
+       marking on device generated telemetry packets";
+
+    leaf originated-qos-marking {
+      type oc-inet:dscp;
+      description
+        "DSCP marking of packets generated by the telemetry
+         subsystem on the network device.";
+    }
+  }
+
+
+  grouping telemetry-sensor-group-config {
+    description
+      "Config parameters related to the sensor groups
+       on the device";
+    leaf sensor-group-id {
+      type string;
+      description
+        "Name or identifier for the sensor group itself.
+         Will be referenced by other configuration specifying a
+         sensor group";
+    }
+  }
+
+  grouping telemetry-subscription-config {
+    description
+      "Configuration parameters relating to the telemetry
+       subscription";
+    leaf subscription-id {
+      type uint64;
+      description
+        "System generated identifer of the telemetry
+         subscription.";
+    }
+  }
+
+  grouping telemetry-subscription-name-config {
+    description
+      "Configuration parameters relating to the configured
+       name of the telemetry subscription. The name is a user
+       configured string value which uniquely identifies the
+       subscription in the configuration database.";
+
+     leaf subscription-name {
+       type string;
+       description
+         "User configured identifier of the telemetry
+          subscription. This value is used primarily for
+          subscriptions configured locally on the network
+          element.";
+     }
+  }
+
+  grouping telemetry-subscription-state {
+    description
+      "State values for the telemetry subscription";
+    //TODO add values
+  }
+
+  grouping telemetry-stream-protocol-config {
+    description
+      "Configuration parameters relating to the
+       transport protocol carrying telemetry
+       data.";
+
+    leaf protocol {
+      type identityref {
+        base oc-telemetry-types:STREAM_PROTOCOL;
+      }
+      description
+        "Selection of the transport protocol for the telemetry
+         stream.";
+    }
+  }
+
+  grouping telemetry-stream-encoding-config {
+    description
+      "Configuration parameters relating to the
+       encoding of telemetry data to and from the
+       network element. The encoding method controls
+       specifically the wire format of the telemetry
+       data, and also controls which RPC framework
+       may be in use to exchange telemetry data.";
+
+     leaf encoding {
+       type identityref {
+         base oc-telemetry-types:DATA_ENCODING_METHOD;
+       }
+       description
+         "Selection of the specific encoding or RPC framework
+          for telemetry messages to and from the network element.";
+     }
+  }
+
+  grouping telemetry-stream-destination-config {
+    description
+      "Configuration parameters for the stream destinations";
+      leaf destination-address {
+        type oc-inet:ip-address;
+        description
+          "IP address of the telemetry stream destination";
+      }
+      leaf destination-port {
+        type uint16;
+        description
+          "Protocol (udp or tcp) port number for the telemetry
+           stream destination";
+      }
+  }
+
+  grouping telemetry-stream-frequency-config {
+    description
+      "Config parameters for the frequency of updates to
+        the collector";
+    leaf sample-interval {
+      type uint64;
+      description
+        "Time in milliseconds between the device's sample of a
+         telemetry data source. For example, setting this to 100
+         would require the local device to collect the telemetry
+         data every 100 milliseconds. There can be latency or jitter
+         in transmitting the data, but the sample must occur at
+         the specified interval.
+
+         The timestamp must reflect the actual time when the data
+         was sampled, not simply the previous sample timestamp +
+         sample-interval.
+
+         If sample-interval is set to 0, the telemetry sensor
+         becomes event based. The sensor must then emit data upon
+         every change of the underlying data source.";
+    }
+  }
+
+  grouping telemetry-sensor-specification {
+    description
+      "Config related to creating telemetry sensor groups. A sensor
+       group is a related set of sensor paths and/or filters to
+       exclude items. A group is assigned a reusable identifer, so
+       it can be used in multiple telemetry subscriptions.";
+    list telemetry-sensor-group {
+      key "telemetry-sensor-group-id";
+      description
+        "List of telemetry sensor groups";
+
+      leaf telemetry-sensor-group-id {
+        type string;
+        description
+          "The sensor group identifer is a reusable handle which
+           identifies a single sensor group. It is referenced from
+           the subscription configuration.";
+      }
+      uses telemetry-sensor-paths;
+    }
+  }
+
+  grouping telemetry-sensor-paths {
+    description
+      "This grouping contains these paths to leaves or containers
+       in the data model which are the sources of telemetry
+       information.";
+
+    list telemetry-sensor-paths {
+      key "telemetry-sensor-path";
+      description
+        "A list of sensor paths and exclude filters which comprise
+        a sensor grouping";
+
+      leaf telemetry-sensor-path {
+        type string;
+        description
+          "The sensor path is a path to a portion of operational
+          state of interest in the data model";
+      }
+      // This may not be needed. Decide on removal.
+      leaf sensor-exclude-filter {
+        type string;
+        description
+          "The exclude filter allows certain values of state to be
+          filtered out of the telemetry stream";
+      }
+    }
+  }
+
+
+  grouping telemetry-local-source-address-config {
+    description
+      "Config relating to the local source address for telemetry
+       messages";
+    // TODO: Make this a reference to an interface.
+    leaf local-source-address {
+      type oc-inet:ip-address;
+      description
+        "The IP address which will be the source of packets from
+         the device to a telemetry collector destination.";
+    }
+  }
+
+  // data definition statements
+
+  uses telemetry-top;
+
+  // augment statements
+
+  // rpc statements
+
+  // notification statements
+
+}
diff --git a/models/openconfig/src/main/yang/types/openconfig-inet-types.yang b/models/openconfig/src/main/yang/types/openconfig-inet-types.yang
new file mode 100644
index 0000000..498a6e4
--- /dev/null
+++ b/models/openconfig/src/main/yang/types/openconfig-inet-types.yang
@@ -0,0 +1,316 @@
+module openconfig-inet-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/types/inet";
+  prefix "oc-inet";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains a set of Internet address related
+    types for use in OpenConfig modules.
+
+    Portions of this code were derived from IETF RFC 6021.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "0.3.0";
+
+  revision 2017-07-06 {
+    description
+      "Add domain-name and host typedefs";
+    reference "0.3.0";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Add ip-version typedef.";
+    reference "0.2.0";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Update copyright notice.";
+    reference "0.1.1";
+  }
+
+  revision 2017-01-26 {
+    description
+      "Initial module for inet types";
+    reference "0.1.0";
+  }
+
+  // IPv4 and IPv6 types.
+
+  typedef ipv4-address {
+    type string {
+      pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'        +
+              '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]'  +
+              '[0-9]|25[0-5])$';
+    }
+    description
+      "An IPv4 address in dotted quad notation using the default
+      zone.";
+  }
+
+  typedef ipv4-address-zoned {
+    type string {
+      pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'        +
+              '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]'  +
+              '[0-9]|25[0-5])(%[a-zA-Z0-9_]+)$';
+    }
+    description
+      "An IPv4 address in dotted quad notation.  This type allows
+      specification of a zone index to disambiguate identical
+      address values.  For link-local addresses, the index is
+      typically the interface index or interface name.";
+  }
+
+  typedef ipv6-address {
+    type string {
+        pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')$';
+    }
+    description
+      "An IPv6 address represented as either a full address; shortened
+      or mixed-shortened formats, using the default zone.";
+  }
+
+  typedef ipv6-address-zoned {
+    type string {
+        pattern
+          // Must support compression through different lengths
+          // therefore this regexp is complex.
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|'        +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')(%[a-zA-Z0-9_]+)$';
+    }
+    description
+      "An IPv6 address represented as either a full address; shortened
+      or mixed-shortened formats.  This type allows specification of
+      a zone index to disambiguate identical address values.  For
+      link-local addresses, the index is typically the interface
+      index or interface name.";
+  }
+
+  typedef ipv4-prefix {
+    type string {
+      pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'       +
+              '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+              '[0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))$';
+    }
+    description
+      "An IPv4 prefix represented in dotted quad notation followed by
+      a slash and a CIDR mask (0 <= mask <= 32).";
+  }
+
+  typedef ipv6-prefix {
+    type string {
+        pattern
+          '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|'         +
+          '([0-9a-fA-F]{1,4}:){1,7}:|'                        +
+          '([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}'         +
+          '([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|' +
+          '([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|' +
+          '([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|' +
+          '([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|' +
+          '[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|'      +
+          ':((:[0-9a-fA-F]{1,4}){1,7}|:)'                     +
+          ')/(12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9])$';
+    }
+    description
+      "An IPv6 prefix represented in full, shortened, or mixed
+      shortened format followed by a slash and CIDR mask
+      (0 <= mask <= 128).";
+  }
+
+  typedef ip-address {
+    type union {
+      type ipv4-address;
+      type ipv6-address;
+    }
+    description
+      "An IPv4 or IPv6 address with no prefix specified.";
+  }
+
+  typedef ip-prefix {
+    type union {
+      type ipv4-prefix;
+      type ipv6-prefix;
+    }
+    description
+      "An IPv4 or IPv6 prefix.";
+  }
+
+  typedef ip-version {
+    type enumeration {
+      enum UNKNOWN {
+        value 0;
+        description
+         "An unknown or unspecified version of the Internet
+          protocol.";
+      }
+      enum IPV4 {
+        value 4;
+        description
+         "The IPv4 protocol as defined in RFC 791.";
+      }
+      enum IPV6 {
+        value 6;
+        description
+         "The IPv6 protocol as defined in RFC 2460.";
+      }
+    }
+    description
+     "This value represents the version of the IP protocol.
+      Note that integer representation of the enumerated values
+      are not specified, and are not required to follow the
+      InetVersion textual convention in SMIv2.";
+    reference
+     "RFC  791: Internet Protocol
+      RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
+      RFC 4001: Textual Conventions for Internet Network Addresses";
+  }
+
+  typedef domain-name {
+    type string {
+      length "1..253";
+      pattern
+        '((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*' +
+        '([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)'   +
+        '|\.';
+    }
+    description
+      "The domain-name type represents a DNS domain name. 
+      Fully quallified left to the models which utilize this type.
+
+      Internet domain names are only loosely specified.  Section
+      3.5 of RFC 1034 recommends a syntax (modified in Section
+      2.1 of RFC 1123).  The pattern above is intended to allow
+      for current practice in domain name use, and some possible
+      future expansion.  It is designed to hold various types of
+      domain names, including names used for A or AAAA records
+      (host names) and other records, such as SRV records.  Note
+      that Internet host names have a stricter syntax (described
+      in RFC 952) than the DNS recommendations in RFCs 1034 and
+      1123, and that systems that want to store host names in
+      schema nodes using the domain-name type are recommended to
+      adhere to this stricter standard to ensure interoperability.
+
+      The encoding of DNS names in the DNS protocol is limited
+      to 255 characters.  Since the encoding consists of labels
+      prefixed by a length bytes and there is a trailing NULL
+      byte, only 253 characters can appear in the textual dotted
+      notation.
+
+      Domain-name values use the US-ASCII encoding.  Their canonical
+      format uses lowercase US-ASCII characters.  Internationalized
+      domain names MUST be encoded in punycode as described in RFC
+      3492";
+  }
+
+  typedef host {
+    type union {
+      type ip-address;
+      type domain-name;
+    }
+    description
+      "The host type represents either an unzoned IP address or a DNS
+      domain name.";
+  }
+
+  typedef as-number {
+    type uint32;
+    description
+      "A numeric identifier for an autonomous system (AS). An AS is a
+      single domain, under common administrative control, which forms
+      a unit of routing policy. Autonomous systems can be assigned a
+      2-byte identifier, or a 4-byte identifier which may have public
+      or private scope. Private ASNs are assigned from dedicated
+      ranges. Public ASNs are assigned from ranges allocated by IANA
+      to the regional internet registries (RIRs).";
+    reference
+      "RFC 1930 Guidelines for creation, selection, and registration
+                of an Autonomous System (AS)
+       RFC 4271 A Border Gateway Protocol 4 (BGP-4)";
+  }
+
+  typedef dscp {
+    type uint8 {
+      range "0..63";
+    }
+    description
+      "A differentiated services code point (DSCP) marking within the
+      IP header.";
+    reference
+      "RFC 2474 Definition of the Differentiated Services Field
+                 (DS Field) in the IPv4 and IPv6 Headers";
+  }
+
+  typedef ipv6-flow-label {
+    type uint32 {
+      range "0..1048575";
+    }
+    description
+      "The IPv6 flow-label is a 20-bit value within the IPv6 header
+      which is optionally used by the source of the IPv6 packet to
+      label sets of packets for which special handling may be
+      required.";
+    reference
+      "RFC 2460 Internet Protocol, Version 6 (IPv6) Specification";
+  }
+
+  typedef port-number {
+    type uint16;
+    description
+      "A 16-bit port number used by a transport protocol such as TCP
+      or UDP.";
+    reference
+      "RFC 768 User Datagram Protocol
+       RFC 793 Transmission Control Protocol";
+  }
+
+  typedef uri {
+    type string;
+    description
+      "An ASCII-encoded Uniform Resource Identifier (URI) as defined
+      in RFC 3986.";
+    reference
+      "RFC 3986 Uniform Resource Identifier (URI): Generic Syntax";
+  }
+}
diff --git a/models/openconfig/src/main/yang/types/openconfig-types.yang b/models/openconfig/src/main/yang/types/openconfig-types.yang
new file mode 100644
index 0000000..fa76f80
--- /dev/null
+++ b/models/openconfig/src/main/yang/types/openconfig-types.yang
@@ -0,0 +1,332 @@
+module openconfig-types {
+  yang-version "1";
+
+  namespace "http://openconfig.net/yang/openconfig-types";
+
+  prefix "oc-types";
+
+  // import statements
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module contains a set of general type definitions that
+    are used across OpenConfig models. It can be imported by modules
+    that make use of these types.";
+
+  oc-ext:openconfig-version "0.3.3";
+
+  revision "2017-08-16" {
+    description
+      "Apply fix for ieetfloat32 length parameter";
+    reference "0.3.3";
+  }
+
+  revision "2017-01-13" {
+    description
+      "Add ADDRESS_FAMILY identity";
+    reference "0.3.2";
+  }
+
+  revision "2016-11-14" {
+    description
+      "Correct length of ieeefloat32";
+    reference "0.3.1";
+  }
+
+  revision "2016-11-11" {
+    description
+      "Additional types - ieeefloat32 and routing-password";
+    reference "0.3.0";
+  }
+
+  revision "2016-05-31" {
+    description
+      "OpenConfig public release";
+    reference "0.2.0";
+  }
+
+  typedef percentage {
+    type uint8 {
+      range "0..100";
+    }
+    description
+      "Integer indicating a percentage value";
+  }
+
+  typedef std-regexp {
+    type string;
+    description
+      "This type definition is a placeholder for a standard
+      definition of a regular expression that can be utilised in
+      OpenConfig models. Further discussion is required to
+      consider the type of regular expressions that are to be
+      supported. An initial proposal is POSIX compatible.";
+  }
+
+  typedef timeticks64 {
+    type uint64;
+    description
+     "This type is based on the timeticks type defined in
+     RFC 6991, but with 64-bit width.  It represents the time,
+     modulo 2^64, in hundredths of a second between two epochs.";
+    reference
+      "RFC 6991 - Common YANG Data Types";
+  }
+
+  typedef ieeefloat32 {
+    type binary {
+      length "4";
+    }
+    description
+      "An IEEE 32-bit floating point number. The format of this number
+      is of the form:
+        1-bit  sign
+        8-bit  exponent
+        23-bit fraction
+      The floating point value is calculated using:
+        (-1)**S * 2**(Exponent-127) * (1+Fraction)";
+  }
+
+  typedef routing-password {
+    type string;
+    description
+      "This type is indicative of a password that is used within
+      a routing protocol which can be returned in plain text to the
+      NMS by the local system. Such passwords are typically stored
+      as encrypted strings. Since the encryption used is generally
+      well known, it is possible to extract the original value from
+      the string - and hence this format is not considered secure.
+      Leaves specified with this type should not be modified by
+      the system, and should be returned to the end-user in plain
+      text. This type exists to differentiate passwords, which
+      may be sensitive, from other string leaves. It could, for
+      example, be used by the NMS to censor this data when
+      viewed by particular users.";
+  }
+
+  grouping avg-min-max-stats-precision1 {
+    description
+      "Common nodes for recording average, minimum, and
+      maximum values for a statistic.  These values all have
+      fraction-digits set to 1.";
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The maximum value of the statitic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision1 {
+    description
+      "Common grouping for recording an instantaneous statistic value
+      in addition to avg-min-max stats";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 1;
+      }
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    uses avg-min-max-stats-precision1;
+  }
+
+  grouping avg-min-max-instant-stats-precision2-dB {
+    description
+      "Common grouping for recording dB values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dB;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision2-dBm {
+    description
+      "Common grouping for recording dBm values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units dBm;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  grouping avg-min-max-instant-stats-precision2-mA {
+    description
+      "Common grouping for recording mA values with 2 decimal
+      precision. Values include the instantaneous, average,
+      minimum, and maximum statistics";
+
+    leaf instant {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The instantaneous value of the statistic.";
+    }
+
+    leaf avg {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The arithmetic mean value of the statistic over the
+        sampling period.";
+    }
+
+    leaf min {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The minimum value of the statistic over the sampling
+        period";
+    }
+
+    leaf max {
+      type decimal64 {
+        fraction-digits 2;
+      }
+      units mA;
+      description
+        "The maximum value of the statistic over the sampling
+        period";
+    }
+  }
+
+  identity ADDRESS_FAMILY {
+    description
+      "A base identity for all address families";
+  }
+
+  identity IPV4 {
+    base ADDRESS_FAMILY;
+    description
+      "The IPv4 address family";
+  }
+
+  identity IPV6 {
+    base ADDRESS_FAMILY;
+    description
+      "The IPv6 address family";
+  }
+
+  identity MPLS {
+    base ADDRESS_FAMILY;
+    description
+      "The MPLS address family";
+  }
+
+  identity L2_ETHERNET {
+    base ADDRESS_FAMILY;
+    description
+      "The 802.3 Ethernet address family";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/types/openconfig-yang-types.yang b/models/openconfig/src/main/yang/types/openconfig-yang-types.yang
new file mode 100644
index 0000000..749fac4
--- /dev/null
+++ b/models/openconfig/src/main/yang/types/openconfig-yang-types.yang
@@ -0,0 +1,156 @@
+module openconfig-yang-types {
+
+  yang-version "1";
+  namespace "http://openconfig.net/yang/types/yang";
+  prefix "oc-yang";
+
+  import openconfig-extensions { prefix "oc-ext"; }
+
+  organization
+    "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    www.openconfig.net";
+
+  description
+    "This module contains a set of extension types to the
+    YANG builtin types that are used across multiple
+    OpenConfig models.
+
+    Portions of this code were derived from IETF RFC 6021.
+    Please reproduce this note if possible.
+
+    IETF code is subject to the following copyright and license:
+    Copyright (c) IETF Trust and the persons identified as authors of
+    the code.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms contained in, the Simplified BSD License set forth in
+    Section 4.c of the IETF Trust's Legal Provisions Relating
+    to IETF Documents (http://trustee.ietf.org/license-info).";
+
+  oc-ext:openconfig-version "0.1.2";
+
+  revision 2017-07-30 {
+    description
+      "Fixed unprintable character";
+    reference "0.1.2";
+  }
+
+  revision 2017-04-03 {
+    description
+      "Update copyright notice.";
+    reference "0.1.1";
+  }
+
+  revision 2017-01-26 {
+    description
+      "Initial module for inet types";
+    reference "0.1.0";
+  }
+
+  typedef dotted-quad {
+    type string {
+      pattern '^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|'       +
+              '25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4]' +
+              '[0-9]|25[0-5])$';
+    }
+    description
+      "An unsigned 32-bit integer expressed as a dotted quad. The
+      format is four octets written as decimal numbers separated
+      with a period character.";
+  }
+
+  typedef hex-string {
+    type string {
+      pattern '^[0-9a-fA-F]*$';
+    }
+    description
+      "A string consisting of a hexadecimal characters.";
+  }
+
+  typedef counter32 {
+    type uint32;
+    description
+
+      "A 32-bit counter. A counter value is a monotonically increasing
+      value which is used to express a count of a number of
+      occurrences of a particular event or entity. When the counter
+      reaches its maximum value, in this case 2^32-1, it wraps to 0.
+
+      Discontinuities in the counter are generally triggered only when
+      the counter is reset to zero.";
+  }
+
+  typedef counter64 {
+    type uint64;
+    description
+
+      "A 64-bit counter. A counter value is a monotonically increasing
+      value which is used to express a count of a number of
+      occurrences of a particular event or entity. When a counter64
+      reaches its maximum value, 2^64-1, it loops to zero.
+      Discontinuities in a counter are generally triggered only when
+      the counter is reset to zero, through operator or system
+      intervention.";
+  }
+
+  typedef date-and-time {
+    type string {
+      pattern
+        '^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}' +
+        '(\.[0-9]+)?Z[+-][0-9]{2}:[0-9]{2}$';
+    }
+    description
+      "A date and time, expressed in the format described in RFC3339.
+      That is to say:
+
+      YYYY-MM-DDTHH:MM:SSZ+-hh:mm
+
+      where YYYY is the year, MM is the month expressed as a two-digit
+      month (zero padding if required), DD is the day of the month,
+      expressed as a two digit value. T is the literal character 'T',
+      HH is the hour of the day expressed as a two digit number, using
+      the 24-hour clock, MM is the minute of the hour expressed as a
+      two digit number. Z is the literal character 'Z', followed by a
+      timezone offset expressed in hours (hh) and minutes (mm), both
+      expressed as two digit numbers. The time offset is specified as
+      a positive or negative offset to UTC using the '+' or '-'
+      character preceding the offset.
+
+      Optionally, fractional seconds can be expressed after the minute
+      of the hour as a decimal number of unspecified precision
+      reflecting fractions of a second.";
+    reference
+      "RFC3339 - Date and Time on the Internet: Timestamps";
+  }
+
+  typedef gauge64 {
+    type uint64;
+    description
+      "A gauge value may increase or decrease - and reflects a value
+      at a particular point in time. If the value of the variable
+      being modeled using the gauge exceeds its maximum - 2^64-1 in
+      this case - the gauge is set to its maximum value.";
+  }
+
+  typedef phys-address {
+    type string {
+      pattern '^([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?$';
+    }
+    description
+      "A physical layer address, expressed as a series of pairs of
+      hexadecimal digits.";
+  }
+
+  typedef mac-address {
+    type string {
+      pattern '^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$';
+    }
+    description
+      "An IEEE 802 MAC address";
+  }
+}
diff --git a/models/openconfig/src/main/yang/vlan/openconfig-vlan-types.yang b/models/openconfig/src/main/yang/vlan/openconfig-vlan-types.yang
new file mode 100644
index 0000000..ac0c467
--- /dev/null
+++ b/models/openconfig/src/main/yang/vlan/openconfig-vlan-types.yang
@@ -0,0 +1,189 @@
+module openconfig-vlan-types {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/vlan-types";
+
+  prefix "oc-vlan-types";
+
+  // import some basic types
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module defines configuration and state variables for VLANs,
+    in addition to VLAN parameters associated with interfaces";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Move top-level vlan data to network-instance; Update
+      identities to comply to style guide; fixed pattern
+      quoting; corrected trunk vlan types; added TPID config to
+      base interface.";
+    reference "2.0.0";
+  }
+
+  revision "2016-05-26" {
+    description
+      "OpenConfig public release";
+    reference "1.0.2";
+  }
+
+  // extension statements
+
+  // feature statements
+
+  // identity statements
+
+  identity TPID_TYPES {
+    description
+      "Base identity for TPID values that can override the VLAN
+      ethertype value";
+  }
+
+  identity TPID_0X8100 {
+    base TPID_TYPES;
+    description
+      "Default TPID value for 802.1q single-tagged VLANs.";
+  }
+
+  identity TPID_0X8A88 {
+    base TPID_TYPES;
+    description
+      "TPID value for 802.1ad provider bridging, Q-in-Q,
+      or stacked VLANs";
+  }
+
+  identity TPID_0X9100 {
+    base TPID_TYPES;
+    description
+      "Alternate TPID value";
+  }
+
+  identity TPID_0X9200 {
+    base TPID_TYPES;
+    description
+      "Alternate TPID value";
+  }
+
+  // typedef statements
+
+  // TODO: typedefs should be defined in a vlan-types.yang file.
+  typedef vlan-id {
+    type uint16 {
+      range 1..4094;
+    }
+    description
+      "Type definition representing a single-tagged VLAN";
+  }
+
+  typedef vlan-range {
+    type string {
+      // range specified as [lower]..[upper]
+      pattern '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+              '[1-9][0-9]{1,2}|[1-9])\.\.(409[0-4]|'       +
+              '40[0-8][0-9]|[1-3][0-9]{3}|[1-9][0-9]{1,2}|' +
+              '[1-9])$';
+    }
+    description
+      "Type definition representing a range of single-tagged
+      VLANs. A range is specified as x..y where x and y are
+      valid VLAN IDs (1 <= vlan-id <= 4094). The range is
+      assumed to be inclusive, such that any VLAN-ID matching
+      x <= VLAN-ID <= y falls within the range.";
+  }
+
+  typedef qinq-id {
+    type string {
+      pattern
+        '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'       +
+        '[1-9][0-9]{1,2}|[1-9])\.'                    +
+        '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'      +
+        '[1-9][0-9]{1,2}|[1-9])|\*)$';
+    }
+    description
+      "Type definition representing a single double-tagged/QinQ VLAN
+      identifier. The format of a QinQ VLAN-ID is x.y where X is the
+      'outer' VLAN identifier, and y is the 'inner' VLAN identifier.
+      Both x and y must be valid VLAN IDs (1 <= vlan-id <= 4094)
+      with the exception that y may be equal to a wildcard (*). In
+      cases where y is set to the wildcard, this represents all inner
+      VLAN identifiers where the outer VLAN identifier is equal to
+      x";
+  }
+
+  typedef qinq-id-range {
+    type union {
+      type string {
+        // match cases where the range is specified as x..y.z
+        pattern
+          '^(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.'                 +
+          '((409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'   +
+          '[1-9][0-9]{1,2}|[1-9])|\*)$';
+      }
+      type string {
+        // match cases where the range is specified as x.y..z
+        pattern
+          '^(\*|(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9]))\.'                 +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])\.\.'               +
+          '(409[0-4]|40[0-8][0-9]|[1-3][0-9]{3}|'    +
+          '[1-9][0-9]{1,2}|[1-9])$';
+      }
+    }
+    description
+      "A type definition representing a range of double-tagged/QinQ
+      VLAN identifiers. The format of a QinQ VLAN-ID range can be
+      specified in three formats. Where the range is outer VLAN IDs
+      the range is specified as x..y.z. In this case outer VLAN
+      identifiers meeting the criteria x <= outer-vlan-id <= y are
+      accepted iff the inner VLAN-ID is equal to y - or any inner-tag
+      if the wildcard is specified. Alternatively the range can be
+      specified as x.y..z. In this case only VLANs with an
+      outer-vlan-id qual to x are accepted (x may again be the
+      wildcard). Inner VLANs are accepted if they meet the inequality
+      y <= inner-vlan-id <= z.";
+  }
+
+  typedef vlan-mode-type {
+    type enumeration {
+      enum ACCESS {
+        description "Access mode VLAN interface (No 802.1q header)";
+      }
+      enum TRUNK {
+        description "Trunk mode VLAN interface";
+      }
+    }
+    description
+      "VLAN interface mode (trunk or access)";
+  }
+
+  typedef vlan-ref {
+    type union {
+      type vlan-id;
+      type string;
+      // TODO: string should be changed to leafref to reference
+      // an existing VLAN.  this is not allowed in YANG 1.0 but
+      // is expected to be in YANG 1.1.
+      // type leafref {
+      //  path "vlan:vlans/vlan:vlan/vlan:config/vlan:name";
+      // }
+    }
+    description
+      "Reference to a VLAN by name or id";
+  }
+
+}
diff --git a/models/openconfig/src/main/yang/vlan/openconfig-vlan.yang b/models/openconfig/src/main/yang/vlan/openconfig-vlan.yang
new file mode 100644
index 0000000..24aaecf
--- /dev/null
+++ b/models/openconfig/src/main/yang/vlan/openconfig-vlan.yang
@@ -0,0 +1,436 @@
+module openconfig-vlan {
+
+  yang-version "1";
+
+  // namespace
+  namespace "http://openconfig.net/yang/vlan";
+
+  prefix "oc-vlan";
+
+  // import some basic types
+  import openconfig-vlan-types { prefix oc-vlan-types; }
+  import openconfig-interfaces { prefix oc-if; }
+  import openconfig-if-ethernet { prefix oc-eth; }
+  import openconfig-if-aggregate { prefix oc-lag; }
+  import iana-if-type { prefix ift; }
+  import openconfig-extensions { prefix oc-ext; }
+
+  // meta
+  organization "OpenConfig working group";
+
+  contact
+    "OpenConfig working group
+    netopenconfig@googlegroups.com";
+
+  description
+    "This module defines configuration and state variables for VLANs,
+    in addition to VLAN parameters associated with interfaces";
+
+  oc-ext:openconfig-version "2.0.0";
+
+  revision "2017-07-14" {
+    description
+      "Move top-level vlan data to network-instance; Update
+      identities to comply to style guide; fixed pattern
+      quoting; corrected trunk vlan types; added TPID config to
+      base interface.";
+    reference "2.0.0";
+  }
+
+  revision "2016-05-26" {
+    description
+      "OpenConfig public release";
+    reference "1.0.2";
+  }
+
+  // grouping statements
+
+  grouping vlan-config {
+    description "VLAN configuration container.";
+
+    leaf vlan-id {
+      type oc-vlan-types:vlan-id;
+      description "Interface VLAN id.";
+    }
+
+    leaf name {
+      type string;
+      description "Interface VLAN name.";
+    }
+
+    leaf status {
+      type enumeration {
+        enum ACTIVE {
+          description "VLAN is active";
+        }
+        enum SUSPENDED {
+          description "VLAN is inactive / suspended";
+        }
+      }
+      default ACTIVE;
+      description "Admin state of the VLAN";
+    }
+
+  }
+
+  grouping vlan-state {
+    description "State variables for VLANs";
+
+    // placeholder
+
+  }
+
+  grouping vlan-tpid-config {
+    description
+      "TPID configuration for dot1q-enabled interfaces";
+
+    leaf tpid {
+      type identityref {
+        base oc-vlan-types:TPID_TYPES;
+      }
+      default oc-vlan-types:TPID_0X8100;
+      description
+        "Optionally set the tag protocol identifier field (TPID) that
+        is accepted on the VLAN";
+    }
+  }
+
+  grouping vlan-tpid-state {
+    description
+      "TPID opstate for dot1q-enabled interfaces";
+
+    // placeholder
+
+  }
+
+  grouping vlan-members-state {
+    description
+      "List of interfaces / subinterfaces belonging to the VLAN.";
+
+    container members {
+      description
+        "Enclosing container for list of member interfaces";
+
+      list member {
+        config false;
+        description
+          "List of references to interfaces / subinterfaces
+          associated with the VLAN.";
+
+        uses oc-if:base-interface-ref-state;
+      }
+    }
+  }
+
+  grouping vlan-switched-config {
+    description
+      "VLAN related configuration that is part of the physical
+      Ethernet interface.";
+
+    leaf interface-mode {
+      type oc-vlan-types:vlan-mode-type;
+      description
+        "Set the interface to access or trunk mode for
+        VLANs";
+    }
+
+    leaf native-vlan {
+      when "interface-mode = 'TRUNK'" {
+        description
+          "Native VLAN is valid for trunk mode interfaces";
+      }
+      type oc-vlan-types:vlan-id;
+      description
+        "Set the native VLAN id for untagged frames arriving on
+        a trunk interface.  Tagged frames sent on an interface
+        configured with a native VLAN should have their tags
+        stripped prior to transmission. This configuration is only
+        valid on a trunk interface.";
+    }
+
+    leaf access-vlan {
+      when "interface-mode = 'ACCESS'" {
+        description
+          "Access VLAN assigned to the interfaces";
+      }
+      type oc-vlan-types:vlan-id;
+      description
+        "Assign the access vlan to the access port.";
+    }
+
+    leaf-list trunk-vlans {
+      when "interface-mode = 'TRUNK'" {
+        description
+          "Allowed VLANs may be specified for trunk mode
+          interfaces.";
+      }
+      type union {
+        type oc-vlan-types:vlan-id;
+        type oc-vlan-types:vlan-range;
+      }
+      description
+        "Specify VLANs, or ranges thereof, that the interface may
+        carry when in trunk mode.  If not specified, all VLANs are
+        allowed on the interface. Ranges are specified in the form
+        x..y, where x<y - ranges are assumed to be inclusive (such
+        that the VLAN range is x <= range <= y.";
+    }
+  }
+
+  grouping vlan-switched-state {
+    description
+      "VLAN related operational state that is part of Ethernet
+      interface state data";
+
+    //TODO: placeholder for operational state related to VLANs
+    //on the physical interface
+  }
+
+  grouping vlan-switched-top {
+    description
+      "Top-level grouping for VLAN data associated with an
+      Ethernet interface";
+
+    container switched-vlan {
+      description
+        "Enclosing container for VLAN interface-specific
+        data on Ethernet interfaces.  These are for standard
+        L2, switched-style VLANs.";
+
+      container config {
+          description "Configuration parameters for VLANs";
+
+          uses vlan-switched-config;
+      }
+
+      container state {
+
+        config false;
+        description "State variables for VLANs";
+
+        uses vlan-switched-config;
+        uses vlan-switched-state;
+      }
+    }
+  }
+
+  grouping vlan-logical-config {
+    description
+      "VLAN related configuration that is part of subinterface
+      (logical interface) configuration.  These are generally
+      L3 VLANs with an id that is local.";
+
+
+    leaf vlan-id {
+      type union {
+        type oc-vlan-types:vlan-id;
+        type oc-vlan-types:qinq-id;
+      }
+      description
+        "VLAN id for the subinterface -- specified inline for the
+        case of a local VLAN.  The id is scoped to the
+        subinterface, and could be repeated on different
+        subinterfaces.";
+    }
+  }
+
+  grouping vlan-logical-state {
+    description
+      "VLAN related operational state that is part of logical
+      interface state data";
+
+    //TODO: placeholder to add VLAN-specific state variables on
+    //the subinterface
+  }
+
+  grouping vlan-top {
+    description "Top-level grouping for VLAN configuration";
+
+    container vlans {
+      description "Container for VLAN configuration and state
+      variables";
+
+      list vlan {
+        key "vlan-id";
+
+        description "Configured VLANs keyed by id";
+
+        leaf vlan-id {
+          type leafref {
+            path "../config/vlan-id";
+          }
+          description "references the configured vlan-id";
+        }
+
+        container config {
+          description "Configuration parameters for VLANs";
+
+          uses vlan-config;
+        }
+
+        container state {
+
+          config false;
+          description "State variables for VLANs";
+
+          uses vlan-config;
+          uses vlan-state;
+        }
+        uses vlan-members-state;
+      }
+    }
+  }
+
+  grouping vlan-logical-top {
+    description
+      "Top-level grouping for VLAN data associated with a
+      logical interface or subinterface";
+
+    container vlan {
+      description
+        "Enclosing container for VLAN interface-specific
+        data on subinterfaces";
+
+      container config {
+          description "Configuration parameters for VLANs";
+
+          uses vlan-logical-config;
+        }
+
+        container state {
+
+          config false;
+          description "State variables for VLANs";
+
+          uses vlan-logical-config;
+          uses vlan-logical-state;
+        }
+    }
+  }
+
+  grouping vlan-routed-config {
+    description
+      "Configuration data for routed vlans (SVI, IRB, etc.)";
+
+    leaf vlan {
+      type union {
+        // TODO: in YANG 1.1, unions support leafref types which
+        // should be used here to reference a configured VLAN by
+        // id or name
+        type uint16;
+        type string;
+      }
+      description
+        "References the VLAN for which this IP interface
+        provides routing services -- similar to a switch virtual
+        interface (SVI), or integrated routing and bridging interface
+        (IRB) in some implementations.";
+    }
+
+  }
+
+  grouping vlan-routed-state {
+    description
+      "Operational state data for routed vlan interfaces.";
+  }
+
+  grouping vlan-routed-top {
+    description
+      "Top-level grouping for routed vlan logical interfaces";
+
+    container routed-vlan {
+      description
+        "Top-level container for routed vlan interfaces.  These
+        logical interfaces are also known as SVI (switched virtual
+        interface), IRB (integrated routing and bridging), RVI
+        (routed VLAN interface)";
+
+      container config {
+        description
+          "Configuration data for routed vlan interfaces";
+
+        uses vlan-routed-config;
+      }
+
+      container state {
+
+        config false;
+
+        description
+          "Operational state data ";
+
+        uses vlan-routed-config;
+        uses vlan-routed-state;
+      }
+    }
+  }
+
+  // data definition statements
+
+  // augment statements
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:subinterfaces/" +
+    "oc-if:subinterface" {
+      description
+        "Adds VLAN settings to individual subinterfaces";
+
+    uses vlan-logical-top;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:config" {
+    description
+      "Adds TPID / ethertype setting for the base interface";
+
+    uses vlan-tpid-config;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+    description
+      "Adds TPID / ethertype opstate for the base interface";
+
+    uses vlan-tpid-config;
+    uses vlan-tpid-state;
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-eth:ethernet" {
+    description
+      "Adds VLAN settings to individual Ethernet interfaces";
+
+    uses vlan-switched-top {
+      when "oc-if:type = 'ift:ethernetCsmacd'" {
+      description
+        "Active when the interface is Ethernet";
+      }
+    }
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface/oc-lag:aggregation" {
+    description "Adds VLAN settings to a LAG interface";
+
+    uses vlan-switched-top {
+      when "oc-if:type = 'ift:ieee8023adLag'" {
+        description
+          "Active when the interface is a LAG";
+      }
+    }
+  }
+
+  augment "/oc-if:interfaces/oc-if:interface" {
+    description
+      "Adds configuration and state for routed VLAN interfaces";
+
+    uses vlan-routed-top {
+      when "current()/oc-if:config/oc-if:type = 'ift:l3ipvlan'" {
+      description
+        "Active when the interface is a logical interface providing
+        L3 routing for VLANs";
+      }
+    }
+  }
+
+
+  // rpc statements
+
+  // notification statements
+
+}