diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteTarget.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteTarget.java
new file mode 100755
index 0000000..5a009f9
--- /dev/null
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/RouteTarget.java
@@ -0,0 +1,145 @@
+/*
+ * 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.
+ */
+
+package org.onosproject.bgpio.types;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Implementation of RouteTarget.
+ */
+public class RouteTarget implements BgpValueType {
+
+    /*
+     * Type 0x00: Local Administrator sub-field uses 2 octets with AS number and
+     * Assigned number uses 4 octests Type 0x01: Local Administrator sub-field
+     * uses 4 octets with IP address and Assigned number uses 2 octests Type
+     * 0x02: Local Administrator sub-field uses 4 octets with AS number and
+     * Assigned number uses 2 octests
+     */
+    private byte[] routeTarget;
+    private short type;
+
+    public enum RouteTargetype {
+
+        AS((short) 0x0002), IP((short) 0x0102), LARGEAS((short) 0x0202);
+        short value;
+
+        /**
+         * Assign val with the value as the tunnel type.
+         *
+         * @param val tunnel type
+         */
+        RouteTargetype(short val) {
+            value = val;
+        }
+
+        /**
+         * Returns value of route type.
+         *
+         * @return route type
+         */
+        public short getType() {
+            return value;
+        }
+    }
+
+    /**
+     * Resets fields.
+     */
+    public RouteTarget() {
+        this.type = 0;
+        this.routeTarget = null;
+    }
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param type        type
+     * @param routeTarget route target
+     */
+    public RouteTarget(short type, byte[] routeTarget) {
+        this.type = type;
+        this.routeTarget = routeTarget;
+    }
+
+    /**
+     * Reads route target from channelBuffer.
+     *
+     * @param type type
+     * @param cb   channelBuffer
+     * @return object of RouteTarget
+     */
+    public static RouteTarget read(short type, ChannelBuffer cb) {
+        return new RouteTarget(type, cb.readBytes(6).array());
+    }
+
+    /**
+     * Returns route target.
+     *
+     * @return route target
+     */
+    public byte[] getRouteTarget() {
+        return this.routeTarget;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof RouteTarget) {
+            RouteTarget that = (RouteTarget) obj;
+            if (this.type == that.type
+                    && this.routeTarget == that.routeTarget) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(routeTarget);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass()).add("type", type)
+                .add("routeTarget", routeTarget).toString();
+    }
+
+    @Override
+    public short getType() {
+        return type;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeShort(type);
+        cb.writeBytes(routeTarget);
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    @Override
+    public int compareTo(Object rd) {
+        return 0;
+    }
+}
