diff --git a/model/src/main/java/org/onosproject/yang/model/AtomicPath.java b/model/src/main/java/org/onosproject/yang/model/AtomicPath.java
new file mode 100644
index 0000000..39a4122
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/AtomicPath.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
+ * Vestibulum commodo. Ut rhoncus gravida arcu.
+ */
+
+package org.onosproject.yang.model;
+
+/**
+ * Abstraction of an entity which identifies a generated class uniquely among
+ * its siblings.
+ */
+public class AtomicPath {
+
+    private DataNode.Type type;
+
+    /**
+     * Creates a atomic path object.
+     *
+     * @param type atomic path type
+     */
+    protected AtomicPath(DataNode.Type type) {
+        this.type = type;
+    }
+
+    /**
+     * Returns the atomic path type.
+     *
+     * @return the atomic path type
+     */
+    public DataNode.Type type() {
+        return type;
+    }
+
+    /**
+     * Sets the atomic path type identifier of leaf-list.
+     *
+     * @param type atomic path type
+     */
+    public void type(DataNode.Type type) {
+        this.type = type;
+    }
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/KeyInfo.java b/model/src/main/java/org/onosproject/yang/model/KeyInfo.java
new file mode 100644
index 0000000..2c35d45
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/KeyInfo.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+/**
+ * Representation of Key class generated for list must implement this interface
+ * which would carry the information about key leaves to uniquely identify
+ * the list.
+ */
+public interface KeyInfo<T extends MultiInstanceObject<?>> {
+
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java b/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java
new file mode 100644
index 0000000..a1a6f11
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/LeafIdentifier.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+/**
+ * Abstraction of an entity which identifies a leaf uniquely among
+ * its siblings.
+ */
+public interface LeafIdentifier {
+
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/ModelObjectId.java b/model/src/main/java/org/onosproject/yang/model/ModelObjectId.java
new file mode 100644
index 0000000..b0a522f
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/ModelObjectId.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static java.util.Objects.hash;
+
+/**
+ * Representation of an entity which identifies a resource in the generated
+ * java code. It is a list of atomic path to identify the node
+ * hierarchy to reach a resource in the instance tree.
+ */
+public final class ModelObjectId {
+
+    /**
+     * List of atomic paths.
+     */
+    List<AtomicPath> atomicPaths;
+
+    /**
+     * Create object from builder.
+     *
+     * @param builder initialized builder
+     */
+    private ModelObjectId(Builder builder) {
+        atomicPaths = builder.atomicPathList;
+    }
+
+    /**
+     * Returns the list of atomic used to uniquely identify the node.
+     *
+     * @return atomic path uniquely identifying the branch
+     */
+    public List<AtomicPath> atomicPaths() {
+        return atomicPaths;
+    }
+
+    /**
+     * Retrieves a new path identifier builder.
+     *
+     * @return path identifier builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public int hashCode() {
+        return hash(atomicPaths);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        ModelObjectId that = (ModelObjectId) obj;
+        List<AtomicPath> thatList = that.atomicPaths;
+        return atomicPaths.size() == thatList.size() &&
+                atomicPaths.containsAll(thatList);
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("atomicPaths", atomicPaths)
+                .toString();
+    }
+
+    /**
+     * Builder to construct java path identifier.
+     */
+    public static class Builder {
+
+        private List<AtomicPath> atomicPathList = new LinkedList<>();
+
+        /**
+         * Adds the node's identity for container.
+         *
+         * @param container generated default container class
+         * @param <T>       generated java class which extends model object
+         * @return updated builder pointing to the specified schema location
+         */
+        public <T extends ModelObject> Builder addChild(Class<T> container) {
+            atomicPathList.add(new SingleInstanceNode<>(container));
+            return this;
+        }
+
+        /**
+         * Adds the node's identity for list.
+         *
+         * @param list generated default list class
+         * @param key  key object to identify the list instance
+         * @param <T>  generated java class which extends model object
+         * @param <K>  generated java class for key to uniquely
+         *             identify the list
+         * @return updated builder pointing to the specified schema location
+         */
+        public <T extends ModelObject & MultiInstanceObject<K>,
+                K extends KeyInfo<T>> Builder addChild(Class<T> list, K key) {
+            atomicPathList.add(new MultiInstanceNode<>(list, key));
+            return this;
+        }
+
+        /**
+         * Adds the node's identity for leaf.
+         *
+         * @param leaf leaf attribute in generated java
+         * @param <E>  generated leaf identifier for leaf
+         * @return updated builder pointing to the specified schema location
+         */
+        public <E extends LeafIdentifier> Builder addChild(E leaf) {
+            atomicPathList.add(new SingleInstanceLeaf<>(leaf));
+            return this;
+        }
+
+        /**
+         * Adds the node's identity for leaf list.
+         *
+         * @param leafList leaf-list attribute in generated java.
+         * @param value    value to identify the leaf-list instance
+         * @param <E>      generated leaf identifier for leaf-list
+         * @return updated builder pointing to the specified schema location
+         */
+        public <E extends LeafIdentifier> Builder addChild(E leafList,
+                                                           Object value) {
+            atomicPathList.add(new MultiInstanceLeaf<>(leafList, value));
+            return this;
+        }
+
+        /**
+         * Builds a path identifier to based on set path information of
+         * the generated java class.
+         *
+         * @return built path identifier
+         */
+        public ModelObjectId build() {
+            return new ModelObjectId(this);
+        }
+    }
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/MultiInstanceLeaf.java b/model/src/main/java/org/onosproject/yang/model/MultiInstanceLeaf.java
new file mode 100644
index 0000000..ff3224d
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/MultiInstanceLeaf.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_LEAF_VALUE_NODE;
+
+/**
+ * Represents a leaf-list attribute in class.
+ */
+public class MultiInstanceLeaf<E extends LeafIdentifier>
+        extends AtomicPath {
+
+    private E leafIdentifier;
+    private Object value;
+
+    /**
+     * Creates a multi instance leaf object.
+     *
+     * @param ll attribute of generated default class
+     * @param v  value of leaflist
+     */
+    public MultiInstanceLeaf(E ll, Object v) {
+        super(MULTI_INSTANCE_LEAF_VALUE_NODE);
+        leafIdentifier = ll;
+        value = v;
+    }
+
+    /**
+     * Returns leaf identifier.
+     *
+     * @return leaf identifier
+     */
+    public E leafIdentifier() {
+        return leafIdentifier;
+    }
+
+    /**
+     * Sets the leaf identifier of leaf-list.
+     *
+     * @param ll leaf identifier of leaf-list
+     */
+    public void leafIdentifier(E ll) {
+        leafIdentifier = ll;
+    }
+
+    /**
+     * Returns value of leaf-list.
+     *
+     * @return value of leaf-list
+     */
+    public Object value() {
+        return value;
+    }
+
+    /**
+     * Sets the value of leaf-list.
+     *
+     * @param v the value of leaf-list
+     */
+    public void value(Object v) {
+        value = v;
+    }
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java b/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java
new file mode 100644
index 0000000..0042c8e
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/MultiInstanceNode.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+
+/**
+ * Represents a multi instance object.
+ */
+public class MultiInstanceNode<T extends ModelObject, K extends KeyInfo>
+        extends AtomicPath {
+
+    private Class<T> listClass;
+    private K key;
+
+    /**
+     * Creates a multi instance object.
+     *
+     * @param list generated class for list
+     * @param k    key object to uniquely identify the list
+     */
+    public MultiInstanceNode(Class<T> list, K k) {
+        super(MULTI_INSTANCE_NODE);
+        listClass = list;
+        key = k;
+    }
+
+    /**
+     * Returns the generated java class for list.
+     *
+     * @return the generated list class
+     */
+    public Class<T> listClass() {
+        return listClass;
+    }
+
+    /**
+     * Sets the generated java class for list.
+     *
+     * @param list the generated class for list
+     */
+    public void listClass(Class<T> list) {
+        listClass = list;
+    }
+
+    /**
+     * Returns the key object for list.
+     *
+     * @return the key object for list
+     */
+    public K key() {
+        return key;
+    }
+
+    /**
+     * Sets the key object for list.
+     *
+     * @param k the object for list
+     */
+    public void key(K k) {
+        key = k;
+    }
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java b/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java
new file mode 100644
index 0000000..f32ea40
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/MultiInstanceObject.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+/**
+ * Abstraction of an entity which identifies a list.
+ */
+public interface MultiInstanceObject<T extends KeyInfo<? extends
+        MultiInstanceObject<T>>> {
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java b/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java
new file mode 100644
index 0000000..34889c5
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/SingleInstanceLeaf.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+
+/**
+ * Represents a leaf attribute in class.
+ */
+public class SingleInstanceLeaf<E extends LeafIdentifier> extends AtomicPath {
+
+    private E leafIdentifier;
+
+    /**
+     * Creates a single instance leaf node object.
+     *
+     * @param leaf leaf attribute of generated default class
+     */
+    public SingleInstanceLeaf(E leaf) {
+        super(SINGLE_INSTANCE_LEAF_VALUE_NODE);
+        this.leafIdentifier = leaf;
+    }
+
+    /**
+     * Returns leaf identifier.
+     *
+     * @return leaf identifier
+     */
+    public E leafIdentifier() {
+        return leafIdentifier;
+    }
+
+    /**
+     * Sets the leaf identifier of leaf-list.
+     *
+     * @param leaf leaf identifier of leaf-list
+     */
+    public void leafIdentifier(E leaf) {
+        this.leafIdentifier = leaf;
+    }
+}
diff --git a/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java b/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java
new file mode 100644
index 0000000..80fe27a
--- /dev/null
+++ b/model/src/main/java/org/onosproject/yang/model/SingleInstanceNode.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.yang.model;
+
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+
+/**
+ * Represents a single instance object.
+ */
+public class SingleInstanceNode<T extends ModelObject> extends AtomicPath {
+
+    private Class<T> containerClass;
+
+    /**
+     * Creates a single instance node object.
+     *
+     * @param container generated class for container
+     */
+    public SingleInstanceNode(Class<T> container) {
+        super(SINGLE_INSTANCE_NODE);
+        containerClass = container;
+    }
+
+    /**
+     * Returns the generated java class for container.
+     *
+     * @return the generated container class
+     */
+    public Class<T> container() {
+        return containerClass;
+    }
+
+    /**
+     * Sets the generated java class for list.
+     *
+     * @param container the generated class for container
+     */
+    public void container(Class<T> container) {
+        containerClass = container;
+    }
+}
