diff --git a/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/UnicastMappingInstruction.java b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/UnicastMappingInstruction.java
new file mode 100644
index 0000000..2033919
--- /dev/null
+++ b/apps/mappingmanagement/api/src/main/java/org/onosproject/mapping/instructions/UnicastMappingInstruction.java
@@ -0,0 +1,151 @@
+/*
+ * 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.mapping.instructions;
+
+import java.util.Objects;
+
+/**
+ * Abstraction of an uni-cast mapping traffic engineering.
+ */
+public abstract class UnicastMappingInstruction implements MappingInstruction {
+
+    private static final String SEPARATOR = ":";
+
+    /**
+     * Represents the type of Unicast traffic engineering.
+     */
+    public enum UnicastType {
+
+        /**
+         * Signifies the weight value that used in unicast traffic engineering.
+         */
+        WEIGHT,
+
+        /**
+         * Signifies the priority value that used in unicast traffic engineering.
+         */
+        PRIORITY
+    }
+
+    public abstract UnicastType subtype();
+
+    @Override
+    public final Type type() {
+        return Type.UNICAST;
+    }
+
+    /**
+     * Represents an unicast weight configuration instruction.
+     */
+    public static final class WeightMappingInstruction extends UnicastMappingInstruction {
+
+        private final UnicastType subtype;
+        private final int weight;
+
+        WeightMappingInstruction(UnicastType subType, int weight) {
+            this.subtype = subType;
+            this.weight = weight;
+        }
+
+        @Override
+        public UnicastType subtype() {
+            return subtype;
+        }
+
+        /**
+         * Returns weight value of unicast TE.
+         *
+         * @return weight value of unicast TE
+         */
+        public int weight() {
+            return this.weight;
+        }
+
+        @Override
+        public String toString() {
+            return subtype().toString() + SEPARATOR + weight;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type(), subtype, weight);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof WeightMappingInstruction) {
+                WeightMappingInstruction that = (WeightMappingInstruction) obj;
+                return  Objects.equals(weight, that.weight) &&
+                        Objects.equals(subtype, that.subtype);
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Represents an unicast priority configuration instruction.
+     */
+    public static final class PriorityMappingInstruction extends UnicastMappingInstruction {
+
+        private final UnicastType subtype;
+        private final int priority;
+
+        PriorityMappingInstruction(UnicastType subType, int priority) {
+            this.subtype = subType;
+            this.priority = priority;
+        }
+
+        @Override
+        public UnicastType subtype() {
+            return this.subtype;
+        }
+
+        /**
+         * Returns priority value of unicast TE.
+         *
+         * @return priority value of unicast TE
+         */
+        public int priority() {
+            return this.priority;
+        }
+
+        @Override
+        public String toString() {
+            return subtype().toString() + SEPARATOR + priority;
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type(), subtype, priority);
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof PriorityMappingInstruction) {
+                PriorityMappingInstruction that = (PriorityMappingInstruction) obj;
+                return  Objects.equals(priority, that.priority) &&
+                        Objects.equals(subtype, that.subtype);
+            }
+            return false;
+        }
+    }
+}
