diff --git a/pcep/api/pom.xml b/pcep/api/pom.xml
new file mode 100755
index 0000000..a315079
--- /dev/null
+++ b/pcep/api/pom.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2014 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.
+  -->
+<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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-pcep-controller</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-pcep-controller-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Pcep controller subsystem API</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-pcepio</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <version>2.3</version>
+                <configuration>
+                    <artifactSet>
+                        <excludes>
+                            <exclude>io.netty:netty</exclude>
+                            <exclude>com.google.guava:guava</exclude>
+                            <exclude>org.slf4j:slfj-api</exclude>
+                            <exclude>ch.qos.logback:logback-core</exclude>
+                            <exclude>ch.qos.logback:logback-classic</exclude>
+                            <exclude>com.google.code.findbugs:annotations</exclude>
+                        </excludes>
+                    </artifactSet>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Export-Package>
+                            org.onosproject.pcep.*,org.onosproject.pcepio.*
+                        </Export-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PccId.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PccId.java
new file mode 100755
index 0000000..3ff622b
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PccId.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Objects;
+
+import org.onlab.packet.IpAddress;
+
+/**
+ * The class representing a network client pc ip.
+ * This class is immutable.
+ */
+public final class PccId {
+
+    private static final String SCHEME = "pcep";
+    private static final long UNKNOWN = 0;
+    private final IpAddress ipAddress;
+
+    /**
+     * Private constructor.
+     */
+    private PccId(IpAddress ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    /**
+     * Create a PccId from ip address.
+     *
+     * @param ipAddress IP address
+     * @return ipAddress
+     */
+    public static PccId pccId(IpAddress ipAddress) {
+        return new PccId(ipAddress);
+    }
+
+    /**
+     * Returns the ip address.
+     *
+     * @return ipAddress
+     */
+    public IpAddress ipAddress() {
+        return ipAddress;
+    }
+
+    /**
+     * Convert the PccId value to a ':' separated hexadecimal string.
+     *
+     * @return the PccId value as a ':' separated hexadecimal string.
+     */
+    @Override
+    public String toString() {
+        return ipAddress.toString();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof PccId)) {
+            return false;
+        }
+
+        PccId otherPccid = (PccId) other;
+        return Objects.equals(ipAddress, otherPccid.ipAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ipAddress);
+    }
+
+    /**
+     * Returns PccId created from the given client URI.
+     *
+     * @param uri device URI
+     * @return pccid
+     */
+    public static PccId pccid(URI uri) {
+        checkArgument(uri.getScheme().equals(SCHEME), "Unsupported URI scheme");
+        return new PccId(IpAddress.valueOf(uri.getSchemeSpecificPart()));
+    }
+
+    /**
+     * Produces client URI from the given DPID.
+     *
+     * @param pccid client pccid
+     * @return client URI
+     */
+    public static URI uri(PccId pccid) {
+        return uri(pccid.ipAddress());
+    }
+
+    /**
+     * Produces client URI from the given ip address.
+     *
+     * @param ipAddress ip of client
+     * @return client URI
+     */
+    public static URI uri(IpAddress ipAddress) {
+        try {
+            return new URI(SCHEME, ipAddress.toString(), null);
+        } catch (URISyntaxException e) {
+            return null;
+        }
+    }
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClient.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClient.java
new file mode 100755
index 0000000..2c478ec
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClient.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+import java.util.List;
+
+import org.onosproject.pcepio.protocol.PcepFactory;
+import org.onosproject.pcepio.protocol.PcepMessage;
+
+/**
+ * Represents to provider facing side of a path computation client(pcc).
+ */
+public interface PcepClient {
+
+    /**
+     * Writes the message to the driver.
+     *
+     * @param msg the message to write
+     */
+    public void sendMessage(PcepMessage msg);
+
+    /**
+     * Writes the PcepMessage list to the driver.
+     *
+     * @param msgs the messages to be written
+     */
+    public void sendMessage(List<PcepMessage> msgs);
+
+    /**
+     * Handle a message from the pcc.
+     *
+     * @param fromClient the message to handle
+     */
+    public void handleMessage(PcepMessage fromClient);
+
+    /**
+     * Provides the factory for this PCEP version.
+     *
+     * @return PCEP version specific factory.
+     */
+    public PcepFactory factory();
+
+    /**
+     * Gets a string version of the ID for this pcc.
+     *
+     * @return string version of the ID
+     */
+    public String getStringId();
+
+    /**
+     * Gets the ipAddress of the client.
+     *
+     * @return the client pccId in IPAddress format
+     */
+    public PccId getPccId();
+
+    /**
+     * Checks if the pcc is still connected.
+     *
+     * @return true if client is connected, false otherwise
+     */
+    public boolean isConnected();
+
+    /**
+     * Disconnects the pcc by closing the TCP connection. Results in a call
+     * to the channel handler's channelDisconnected method for cleanup.
+     */
+    public void disconnectClient();
+
+    /**
+     * Indicates if this pcc is optical.
+     *
+     * @return true if optical
+     */
+    public boolean isOptical();
+
+    /**
+     * Identifies the channel used to communicate with the pcc.
+     *
+     * @return string representation of the connection to the client
+     */
+    public String channelId();
+
+    /**
+     * To set the status of state synchronization.
+     *
+     * @param value to set the synchronization status
+     */
+    public void setIsSyncComplete(boolean value);
+
+    /**
+     * Indicates the state synchronization status of this pcc.
+     *
+     * @return true/false if the synchronization is completed/not completed
+     */
+    public boolean isSyncComplete();
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientController.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientController.java
new file mode 100755
index 0000000..1a7cd39
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientController.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+import java.util.List;
+
+import org.onosproject.pcepio.protocol.PcepMessage;
+
+/**
+ * Abstraction of an Pcep controller. Serves as a one stop
+ * shop for obtaining Pcep devices and (un)register listeners
+ * on pcep events
+ */
+public interface PcepClientController {
+
+    /**
+     * Returns list of pcc clients connected to this Pcep controller.
+     *
+     * @return list of PcepClient elements
+     */
+    public List<PcepClient> getClients();
+
+    /**
+     * Returns the actual pcc client for the given ip address.
+     *
+     * @param pccId the id of the pcc client to fetch
+     * @return the interface to this pcc client
+     */
+    public PcepClient getClient(PccId pccId);
+
+    /**
+     * Register a listener for meta events that occur to pcep
+     * devices.
+     *
+     * @param listener the listener to notify
+     */
+    public void addListener(PcepClientListener listener);
+
+    /**
+     * Unregister a listener.
+     *
+     * @param listener the listener to unregister
+     */
+    public void removeListener(PcepClientListener listener);
+
+    /**
+     * Register a listener for OF msg events.
+     *
+     * @param listener the listener to notify
+     */
+    public void addEventListener(PcepEventListener listener);
+
+    /**
+     * Unregister a listener.
+     *
+     * @param listener the listener to unregister
+     */
+    public void removeEventListener(PcepEventListener listener);
+
+    /**
+     * Send a message to a particular pcc client.
+     *
+     * @param pccId the id of the client to send message.
+     * @param msg the message to send
+     */
+    public void writeMessage(PccId pccId, PcepMessage msg);
+
+    /**
+     * Process a message and notify the appropriate listeners.
+     *
+     * @param pccId id of the client the message arrived on
+     * @param msg the message to process.
+     */
+    public void processClientMessage(PccId pccId, PcepMessage msg);
+
+    /**
+     * Close all connected PCC clients.
+     */
+    public void closeConnectedClients();
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientListener.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientListener.java
new file mode 100755
index 0000000..3f7e0f0
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepClientListener.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+/**
+ * Allows for providers interested in PCC client events to be notified.
+ */
+public interface PcepClientListener {
+
+    /**
+     * Notify that the PCC was connected.
+     *
+     * @param pccId the id of the client that connected
+     */
+    public void clientConnected(PccId pccId);
+
+    /**
+     * Notify that the PCC was disconnected.
+     *
+     * @param pccId the id of the client that disconnected.
+     */
+    public void clientDisconnected(PccId pccId);
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepEventListener.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepEventListener.java
new file mode 100755
index 0000000..905749b
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepEventListener.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+import org.onosproject.pcepio.protocol.PcepMessage;
+/**
+ * Notifies providers about pcep msg events.
+ */
+public interface PcepEventListener {
+
+    /**
+     * Handles the message event.
+     *
+     * @param pccId id of the pcc
+     * @param msg the message
+     */
+    public void handleMessage(PccId pccId, PcepMessage msg);
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepPacketStats.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepPacketStats.java
new file mode 100755
index 0000000..92bb2db
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/PcepPacketStats.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2015 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.pcep.controller;
+
+/**
+ * The representation for PCEP packet statistics.
+ */
+public interface PcepPacketStats {
+
+    /**
+     * Returns the count for no of packets sent out.
+     *
+     * @return int value of no of packets sent
+     */
+    public int outPacketCount();
+
+    /**
+     * Returns the count for no of packets received.
+     *
+     * @return int value of no of packets sent
+     */
+    public int inPacketCount();
+
+    /**
+     * Returns the count for no of wrong packets received.
+     *
+     * @return int value of no of wrong packets received
+     */
+    public int wrongPacketCount();
+
+    /**
+     * Returns the time value.
+     *
+     * @return long value of time
+     */
+    public long getTime();
+
+    /**
+     * Sets the time value.
+     *
+     * @param time long value of time
+     */
+    public void setTime(long time);
+
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepAgent.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepAgent.java
new file mode 100755
index 0000000..71ed834
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepAgent.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2015 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.pcep.controller.driver;
+
+import org.onosproject.pcep.controller.PccId;
+import org.onosproject.pcep.controller.PcepClient;
+import org.onosproject.pcepio.protocol.PcepMessage;
+
+/**
+ * Responsible for keeping track of the current set Pcep clients
+ * connected to the system.
+ *
+ */
+public interface PcepAgent {
+
+    /**
+     * Add a pcc client that has just connected to the system.
+     *
+     * @param pccId the id of pcc client to add
+     * @param pc the actual pce client object.
+     * @return true if added, false otherwise.
+     */
+    public boolean addConnectedClient(PccId pccId, PcepClient pc);
+
+    /**
+     * Checks if the activation for this pcc client is valid.
+     *
+     * @param pccId the id of pcc client to check
+     * @return true if valid, false otherwise
+     */
+    public boolean validActivation(PccId pccId);
+
+    /**
+     * Clear all state in controller client maps for a pcc client that has
+     * disconnected from the local controller. Also release control for
+     * that pccIds client from the global repository. Notify client listeners.
+     *
+     * @param pccIds the id of pcc client to remove.
+     */
+    public void removeConnectedClient(PccId pccIds);
+
+    /**
+     * Process a message coming from a pcc client.
+     *
+     * @param pccId the id of pcc client the message was received.
+     * @param m the message to process
+     */
+    public void processPcepMessage(PccId pccId, PcepMessage m);
+
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriver.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriver.java
new file mode 100755
index 0000000..16d0b0b
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriver.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2015 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.pcep.controller.driver;
+
+import org.jboss.netty.channel.Channel;
+import org.onosproject.pcep.controller.PccId;
+import org.onosproject.pcep.controller.PcepClient;
+import org.onosproject.pcep.controller.PcepPacketStats;
+import org.onosproject.pcepio.protocol.PcepVersion;
+
+
+/**
+ * Represents the driver side of an Path computation client(pcc).
+ *
+ */
+public interface PcepClientDriver extends PcepClient {
+
+    /**
+     * Sets the Pcep agent to be used. This method
+     * can only be called once.
+     *
+     * @param agent the agent to set.
+     */
+    public void setAgent(PcepAgent agent);
+
+    /**
+     * Announce to the Pcep agent that this pcc client has connected.
+     *
+     * @return true if successful, false if duplicate switch.
+     */
+    public boolean connectClient();
+
+    /**
+     * Remove this pcc client from the Pcep agent.
+     */
+    public void removeConnectedClient();
+
+    /**
+     * Sets the PCEP version for this pcc.
+     *
+     * @param pcepVersion the version to set.
+     */
+    public void setPcVersion(PcepVersion pcepVersion);
+
+    /**
+     * Sets the associated Netty channel for this pcc.
+     *
+     * @param channel the Netty channel
+     */
+    public void setChannel(Channel channel);
+
+
+    /**
+     * Sets the keep alive time for this pcc.
+     *
+     * @param keepAliveTime the keep alive time to set.
+     */
+    public void setPcKeepAliveTime(byte keepAliveTime);
+
+    /**
+     * Sets the dead time for this pcc.
+     *
+     * @param deadTime the dead timer value to set.
+     */
+    public void setPcDeadTime(byte deadTime);
+
+    /**
+     * Sets the session id for this pcc.
+     *
+     * @param sessionId the session id value to set.
+     */
+    public void setPcSessionId(byte sessionId);
+
+    /**
+     * Sets whether the pcc is connected.
+     *
+     * @param connected whether the pcc is connected
+     */
+    public void setConnected(boolean connected);
+
+    /**
+     * Initializes the behavior.
+     *
+     * @param pccId id of pcc
+     * @param pcepVersion Pcep version
+     * @param pktStats Pcep Packet Stats
+     */
+    void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats);
+
+    /**
+     * Checks whether the handshake is complete.
+     *
+     * @return true is finished, false if not.
+     */
+    boolean isHandshakeComplete();
+
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriverFactory.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriverFactory.java
new file mode 100755
index 0000000..d1e4733
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/PcepClientDriverFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2015 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.pcep.controller.driver;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.pcepio.protocol.PcepVersion;
+
+/**
+ * Pcc Client factory which returns concrete pcc client objects for the
+ * physical pcc client in use.
+ *
+ */
+public interface PcepClientDriverFactory {
+
+
+    /**
+     * Constructs the real Pcep Client representation.
+     *
+     * @param pccIpAddress the ip address for this pcc client.
+     * @param pcepVersion the Pcep version in use
+     * @return the Pcep client representation.
+     */
+    public PcepClientDriver getPcepClientImpl(IpAddress pccIpAddress,
+            PcepVersion pcepVersion);
+}
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/package-info.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/package-info.java
new file mode 100755
index 0000000..2748ecc
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/driver/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * PCEP controller driver API.
+ */
+package org.onosproject.pcep.controller.driver;
diff --git a/pcep/api/src/main/java/org/onosproject/pcep/controller/package-info.java b/pcep/api/src/main/java/org/onosproject/pcep/controller/package-info.java
new file mode 100755
index 0000000..547b68d
--- /dev/null
+++ b/pcep/api/src/main/java/org/onosproject/pcep/controller/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 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.
+ */
+
+/**
+ * PCEP controller API.
+ */
+package org.onosproject.pcep.controller;
diff --git a/pcep/pcepio/pom.xml b/pcep/pcepio/pom.xml
new file mode 100755
index 0000000..ef25d40
--- /dev/null
+++ b/pcep/pcepio/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2014 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.
+  -->
+<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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-pcep-controller</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-pcepio</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Pcepio Protocol subsystem</description>
+   
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-osgi</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.console</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+            </plugin>            
+        </plugins>
+    </build>
+
+</project>
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java
new file mode 100755
index 0000000..85bc33f
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepParseException.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2015 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.pcepio.exceptions;
+
+/**
+ * Custom Exception for PCEP IO.
+ */
+public class PcepParseException extends Exception {
+
+    private static final long serialVersionUID = 7960991379951448423L;
+    private byte errType = 0;
+    private byte errValue = 0;
+
+    /**
+     * Default constructor to create a new exception.
+     */
+    public PcepParseException() {
+        super();
+    }
+
+    /**
+     * Constructor to create exception from message and cause.
+     *
+     * @param message the detail of exception in string
+     * @param cause underlying cause of the error
+     */
+    public PcepParseException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor to create exception from message.
+     *
+     * @param message the detail of exception in string
+     */
+    public PcepParseException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor to create exception from error type and error value.
+     *
+     * @param errType error type of pcep
+     * @param errValue error value of pcep
+     */
+    public PcepParseException(final byte errType, final byte errValue) {
+        super();
+        this.errType = errType;
+        this.errValue = errValue;
+    }
+
+    /**
+     * Constructor to create exception from cause.
+     *
+     * @param cause underlying cause of the error
+     */
+    public PcepParseException(final Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Returns error type for this exception.
+     *
+     * @return ErrorType
+     */
+    public byte getErrorType() {
+        return this.errType;
+    }
+
+    /**
+     * Returns error value for this exception.
+     *
+     * @return ErrorValue
+     */
+    public byte getErrorValue() {
+        return this.errValue;
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java
new file mode 100755
index 0000000..25bdf5b
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/exceptions/PcepTunnelAttributeException.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 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.pcepio.exceptions;
+
+/**
+ * Custom exception for Tunnel Attributes.
+ */
+public class PcepTunnelAttributeException extends Exception {
+
+    private static final long serialVersionUID = 7860981378961458434L;
+
+    /**
+     * Default constructor to create a new exception.
+     */
+    public PcepTunnelAttributeException() {
+        super();
+    }
+
+    /**
+     * Constructor to create exception from message and cause.
+     *
+     * @param message the detail of exception in string
+     * @param cause underlying cause of the error
+     */
+    public PcepTunnelAttributeException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Constructor to create exception from message.
+     *
+     * @param message the detail of exception in string
+     */
+    public PcepTunnelAttributeException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Constructor to create exception from cause.
+     *
+     * @param cause underlying cause of the error
+     */
+    public PcepTunnelAttributeException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcInitiatedLspRequest.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcInitiatedLspRequest.java
new file mode 100755
index 0000000..990ee69
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcInitiatedLspRequest.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity Provides PcInitiatedLspRequest for PCEP Initiate message.
+ * Reference : PCE initiated tunnel setup draft-ietf-pce-pce-initiated-lsp-03.
+ */
+public interface PcInitiatedLspRequest {
+
+    /**
+     * Returns object of PcepSrpObject.
+     *
+     * @return srpObject PCEP SRP object
+     */
+    PcepSrpObject getSrpObject();
+
+    /**
+     * Returns object of PcepLspObject.
+     *
+     * @return lspObject PCEP LSP object
+     */
+    PcepLspObject getLspObject();
+
+    /**
+     * Returns object of PcepEndPointsObject.
+     *
+     * @return endPointsObject PCEP EndPoints object
+     */
+    PcepEndPointsObject getEndPointsObject();
+
+    /**
+     * Returns object of PcepEroObject.
+     *
+     * @return eroObject PCEP ERO object
+     */
+    PcepEroObject getEroObject();
+
+    /**
+     * Returns object of PcepAttribute.
+     *
+     * @return pcepAttribute PCEP Attributes
+     */
+    PcepAttribute getPcepAttribute();
+
+    /**
+     * Sets PcepSrpObject.
+     *
+     * @param srpobj PCEP SRP object
+     */
+    void setSrpObject(PcepSrpObject srpobj);
+
+    /**
+     * Sets PcepLspObject.
+     *
+     * @param lspObject PCEP LSP object
+     */
+    void setLspObject(PcepLspObject lspObject);
+
+    /**
+     * Sets PcepEndPointsObject.
+     *
+     * @param endPointsObject PCEP EndPoints object
+     */
+    void setEndPointsObject(PcepEndPointsObject endPointsObject);
+
+    /**
+     * Sets PcepEroObject.
+     *
+     * @param eroObject PCEP ERO object
+     */
+    void setEroObject(PcepEroObject eroObject);
+
+    /**
+     * Sets PcepAttribute.
+     *
+     * @param pcepAttribute PCEP Attributes
+     */
+    void setPcepAttribute(PcepAttribute pcepAttribute);
+
+    /**
+     * Prints the attribute of PC-INITIATED LSP INITIATION REQUEST.
+     */
+    void print();
+
+    /**
+     * Builder interface with get and set functions to build PcInitiatedLspRequest.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcInitiatedLspRequest.
+         *
+         * @return PcInitiatedLspRequest
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcInitiatedLspRequest build() throws PcepParseException;
+
+        /**
+         * Returns object of PcepSrpObject.
+         *
+         * @return srpObject
+         */
+        PcepSrpObject getSrpObject();
+
+        /**
+         * Returns object of PcepLspObject.
+         *
+         * @return lspObject
+         */
+        PcepLspObject getLspObject();
+
+        /**
+         * Returns object of PcepEndPointsObject.
+         *
+         * @return endPointsObject
+         */
+        PcepEndPointsObject getEndPointsObject();
+
+        /**
+         * Returns object of PcepEroObject.
+         *
+         * @return eroObject
+         */
+        PcepEroObject getEroObject();
+
+        /**
+         * Returns object of PcepAttribute.
+         *
+         * @return pcepAttribute
+         */
+        PcepAttribute getPcepAttribute();
+
+        /**
+         * Sets PcepSrpObject.
+         *
+         * @param srpobj PCEP SRP Object
+         * @return builder by setting PcepSrpObject
+         */
+        Builder setSrpObject(PcepSrpObject srpobj);
+
+        /**
+         * Sets PcepLspObject.
+         *
+         * @param lspObject PCEP LSP Object
+         * @return builder by setting PcepLspObject
+         */
+        Builder setLspObject(PcepLspObject lspObject);
+
+        /**
+         * Sets PcepEndPointsObject.
+         *
+         * @param endPointsObject EndPoints Object
+         * @return builder by setting PcepEndPointsObject
+         */
+        Builder setEndPointsObject(PcepEndPointsObject endPointsObject);
+
+        /**
+         * Sets PcepEroObject.
+         *
+         * @param eroObject PCEP ERO Object
+         * @return builder by setting PcepEroObject
+         */
+        Builder setEroObject(PcepEroObject eroObject);
+
+        /**
+         * Sets PcepAttribute.
+         *
+         * @param pcepAttribute PCEP Attributes
+         * @return builder by setting PcepAttribute
+         */
+        Builder setPcepAttribute(PcepAttribute pcepAttribute);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepAttribute.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepAttribute.java
new file mode 100755
index 0000000..cba9a53
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepAttribute.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+/**
+ * Abstraction of an entity which Provides List of PCEP Attributes.
+ */
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+public interface PcepAttribute {
+
+    /**
+     * writes lspa , bandwidth , Metriclist and Iro objects to the channel.
+     *
+     * @param bb of type channel buffer.
+     * @return object length index.
+     * @throws PcepParseException while writing objects to channel buffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Returns PcepLspaObject.
+     *
+     * @return LspaObject
+     */
+    PcepLspaObject getLspaObject();
+
+    /**
+     * Returns PcepBandwidthObject.
+     *
+     * @return BandwidthObject
+     */
+    PcepBandwidthObject getBandwidthObject();
+
+    /**
+     * Returns PcepIroObject.
+     *
+     * @return iroObject
+     */
+    PcepIroObject getIroObject();
+
+    /**
+     * Sets the PcepBandwidthObject.
+     *
+     * @param bandwidthObject bandwidth object
+     */
+    void setBandwidthObject(PcepBandwidthObject bandwidthObject);
+
+    /**
+     * Sets the PcepLspaObject.
+     *
+     * @param lspaObject lspa object
+     */
+    void setLspaObject(PcepLspaObject lspaObject);
+
+    /**
+     * Sets the PcepIroObject.
+     *
+     * @param iroObject iro object
+     */
+    void setIroObject(PcepIroObject iroObject);
+
+    /**
+     * Returns PcepMetricObject List.
+     *
+     * @return list of metric objects
+     */
+    LinkedList<PcepMetricObject> getMetricObjectList();
+
+    /**
+     * Sets PcepMetricObject List.
+     *
+     * @param llMetricList list of metric objects
+     */
+    void setMetricObjectList(LinkedList<PcepMetricObject> llMetricList);
+
+    /**
+     * Prints the attributes of AttributeList.
+     */
+
+    public void print();
+
+    /**
+     * Builder interface with get and set functions to build PcepAttribute.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepAttribute.
+         *
+         * @return PcepAttribute
+         */
+        PcepAttribute build();
+
+        /**
+         * Returns PcepLspaObject.
+         *
+         * @return LspaObject
+         */
+        PcepLspaObject getLspaObject();
+
+        /**
+         * Returns PcepBandwidthObject.
+         *
+         * @return BandwidthObject
+         */
+        PcepBandwidthObject getBandwidthObject();
+
+        /**
+         * Returns PcepIroObject.
+         *
+         * @return iroObject
+         */
+        PcepIroObject getIroObject();
+
+        /**
+         * Sets the PcepBandwidthObject.
+         *
+         * @param bandwidthObject bandwidth object
+         * @return Builder object for PcepAttrubute
+         */
+        Builder setBandwidthObject(PcepBandwidthObject bandwidthObject);
+
+        /**
+         * Sets the PcepLspaObject.
+         *
+         * @param lspaObject lspa object
+         * @return Builder object for PcepAttrubute
+         */
+        Builder setLspaObject(PcepLspaObject lspaObject);
+
+        /**
+         * Sets the PcepIroObject.
+         *
+         * @param iroObject iro object
+         * @return Builder object for PcepAttrubute
+         */
+        Builder setIroObject(PcepIroObject iroObject);
+
+        /**
+         * Returns PcepMetricObject List.
+         *
+         * @return list of metric objects
+         */
+        LinkedList<PcepMetricObject> getMetricObjectList();
+
+        /**
+         * Sets PcepMetricObject List.
+         *
+         * @param llMetricList list of metric objects
+         * @return Builder object for PcepAttrubute
+         */
+        Builder setMetricObjectList(LinkedList<PcepMetricObject> llMetricList);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
new file mode 100755
index 0000000..323889d
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepBandwidthObject.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP Bandwidth Object.
+ */
+public interface PcepBandwidthObject {
+
+    /**
+     * Returns bandwidth value.
+     *
+     * @return bandwidth value
+     */
+    int getBandwidth();
+
+    /**
+     * Sets bandwidth with specified value.
+     *
+     * @param iBandwidth Bandwidth's value
+     */
+    void setBandwidth(int iBandwidth);
+
+    /**
+     * Prints attributes of bandwidth object.
+     */
+    void print();
+
+    /**
+     * Writes the BandwidthObject into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException if bandwidth object header fails to write in channel buffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build bandwidth object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds BandwidthObject.
+         *
+         * @return BandwidthObject
+         * @throws PcepParseException if build fails while creating PcepBandwidthObject
+         */
+        PcepBandwidthObject build() throws PcepParseException;
+
+        /**
+         * Returns bandwidth object header.
+         *
+         * @return bandwidth object header
+         */
+        PcepObjectHeader getBandwidthObjHeader();
+
+        /**
+         * Sets bandwidth object header and returns its builder.
+         *
+         * @param obj Bandwidth object header
+         * @return Builder by setting Bandwidth object header
+         */
+        Builder setBandwidthObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns bandwidth value.
+         *
+         * @return bandwidth
+         */
+        int getBandwidth();
+
+        /**
+         * Sets bandwidth value and return its builder.
+         *
+         * @param iBandwidth bandwidth value
+         * @return Builder by setting bandwidth
+         */
+        Builder setBandwidth(int iBandwidth);
+
+        /**
+         * Sets P flag in Bandwidth object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Bandwidth object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepCloseMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepCloseMsg.java
new file mode 100755
index 0000000..15295a4
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepCloseMsg.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP Close Message.
+ */
+public interface PcepCloseMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns reason field in Close message.
+     *
+     * @return reason field
+     */
+    byte getReason();
+
+    /**
+     * Sets reason field in Close message with specified value.
+     *
+     * @param value of Reason field
+     */
+    void setReason(byte value);
+
+    /**
+     * Returns LinkedList of Optional Tlv in Close Message.
+     *
+     * @return list of optional tlv
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets LinkedList of Optional Tlvs in Close Message.
+     *
+     * @param llOptionalTlv LinkedList of type PcepValueType
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer);
+
+    /**
+     * Builder interface with get and set functions to build Close message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepCloseMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns Close Object header.
+         *
+         * @return Close Object header
+         */
+        PcepObjectHeader getCloseObjHeader();
+
+        /**
+         * Sets close object header and returns its builder.
+         *
+         * @param obj close object header
+         * @return Builder by setting Close object header
+         */
+        Builder setCloseObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns reason field in Close message.
+         *
+         * @return reason field in Close message
+         */
+        byte getReason();
+
+        /**
+         * Sets reason field and return its builder.
+         *
+         * @param value of Reason field
+         * @return builder by setting reason field
+         */
+        Builder setReason(byte value);
+
+        /**
+         * Returns LinkedList of Optional Tlvs.
+         *
+         * @return list of optional tlv
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets LinkedList of Optional Tlvs in Close Message.
+         *
+         * @param llOptionalTlv list of optional tlv
+         * @return Builder by setting Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in Close object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Close object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEndPointsObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEndPointsObject.java
new file mode 100755
index 0000000..8a486c3
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEndPointsObject.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP End Points Object.
+ */
+public interface PcepEndPointsObject {
+
+    /**
+     * Returns Source IpAddress from End Points Object.
+     *
+     * @return Source IpAddress from End Points Object
+     */
+    int getSourceIpAddress();
+
+    /**
+     * Sets Source IpAddress in End Points Object.
+     *
+     * @param sourceIpAddress Source IP Address
+     */
+    void setSourceIpAddress(int sourceIpAddress);
+
+    /**
+     * Returns Destination IpAddress from End Points Object.
+     *
+     * @return Destination IpAddress from End Points Object
+     */
+    int getDestIpAddress();
+
+    /**
+     * Sets Destination IpAddress in End Points Object.
+     *
+     * @param destIpAddress Destination IP Address
+     */
+    void setDestIpAddress(int destIpAddress);
+
+    /**
+     * Prints attributes of EndPoints object.
+     */
+    void print();
+
+    /**
+     * Writes the EndPointsObject into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing EndPointObject into ChannelBuffer
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build EndPoints object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds End Points Object.
+         *
+         * @return End Points Object
+         * @throws PcepParseException while building EndPointObject
+         */
+        PcepEndPointsObject build() throws PcepParseException;
+
+        /**
+         * Returns End Points Object header.
+         *
+         * @return End Points Object header
+         */
+        PcepObjectHeader getEndPointsObjHeader();
+
+        /**
+         * Sets End Points Object header and returns its builder.
+         *
+         * @param obj End Points Object header
+         * @return Builder by setting End Points Object header
+         */
+        Builder setEndPointsObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Source IpAddress from End Points Object.
+         *
+         * @return Source IpAddress from End Points Object
+         */
+        int getSourceIpAddress();
+
+        /**
+         * Sets Source IpAddress in End Points Object and returns builder.
+         *
+         * @param sourceIpAddress Source IP Address
+         * @return Builder by setting Source IpAddress in End Points Object
+         */
+        Builder setSourceIpAddress(int sourceIpAddress);
+
+        /**
+         * Returns Destination IpAddress from End Points Object.
+         *
+         * @return Destination IpAddress from End Points Object
+         */
+        int getDestIpAddress();
+
+        /**
+         * Sets Destination IpAddress in End Points Object.
+         *
+         * @param destIpAddress Destination IP Address
+         * @return Builder by setting Destination IpAddress in End Points Object
+         */
+        Builder setDestIpAddress(int destIpAddress);
+
+        /**
+         * Sets P flag in Bandwidth object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Bandwidth object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEroObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEroObject.java
new file mode 100755
index 0000000..7c3fb2d
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepEroObject.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP ERO Object.
+ */
+public interface PcepEroObject {
+
+    /**
+     * Return LinkedList of SubObjects of ERO Object.
+     *
+     * @return list of subobjects
+     */
+    LinkedList<PcepValueType> getSubObjects();
+
+    /**
+     * Sets LinkedList of SubObjects in ERO Object.
+     *
+     * @param llSubObjects list of subobjects
+     */
+    void setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+    /**
+     * Writes the ERO Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing ERO Object into ChannelBuffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints attributes of ERO object.
+     */
+    void print();
+
+    /**
+     * Builder interface with get and set functions to build ERO object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds ERO Object.
+         *
+         * @return ERO Object
+         */
+        PcepEroObject build();
+
+        /**
+         * Returns ERO Object Header.
+         *
+         * @return ERO Object Header
+         */
+        PcepObjectHeader getEroObjHeader();
+
+        /**
+         * Sets ERO Object header and returns its builder.
+         *
+         * @param obj ERO Object header
+         * @return Builder by setting ERO Object header
+         */
+        Builder setEroObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns LinkedList of SubObjects in ERO Objects.
+         *
+         * @return list of subobjects
+         */
+        LinkedList<PcepValueType> getSubObjects();
+
+        /**
+         * Sets LinkedList of SubObjects and returns its builder.
+         *
+         * @param llSubObjects list of SubObjects
+         * @return Builder by setting list of SubObjects
+         */
+        Builder setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+        /**
+         * Sets P flag in ERO object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in ERO object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java
new file mode 100755
index 0000000..acb3363
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepError.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity which provides PCEP error for PCEP error message.
+ */
+public interface PcepError {
+
+    /**
+     * Returns the PcepRPObject List.
+     *
+     * @return list of type PcepRPObject
+     */
+    LinkedList<PcepRPObject> getRPObjList();
+
+    /**
+     * Sets the RP Objects lists.
+     *
+     * @param llRPObjList list of type PcepRPObject
+     */
+    void setRPObjList(LinkedList<PcepRPObject> llRPObjList);
+
+    /**
+     * Returns the PcepTEObject List.
+     *
+     * @return list of type PcepTEObject
+     */
+    LinkedList<PcepTEObject> getTEObjList();
+
+    /**
+     * Sets the TE Objects lists.
+     *
+     * @param llTEObjList list of type PcepTEObject
+     */
+    void setTEObjList(LinkedList<PcepTEObject> llTEObjList);
+
+    /**
+     * Returns the PcepErrorObject.
+     *
+     * @return list of type PcepErrorObject
+     */
+    LinkedList<PcepErrorObject> getErrorObjList();
+
+    /**
+     * Sets the Error Objects lists.
+     *
+     * @param llErrorObjList list of type PcepErrorObject
+     */
+    public void setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);
+
+    /**
+     * Writes the byte stream of PCEP error to the channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @return object length index
+     * @throws PcepParseException while writing Error part into ChannelBuffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints the attributes of PCEP Error.
+     */
+    public void print();
+
+    /**
+     * Builder interface with get and set functions to build PcepError.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepError Object.
+         *
+         * @return PcepError Object
+         */
+        PcepError build();
+
+        /**
+         * Returns the PcepRPObject.
+         *
+         * @return list of type PcepRPObject
+         */
+        LinkedList<PcepRPObject> getRPObjList();
+
+        /**
+         * Sets RP Object lists and returns its builder.
+         *
+         * @param llRPObjList list of type PcepRpObject
+         * @return builder by setting Linked list of RP Object
+         */
+        Builder setRPObjList(LinkedList<PcepRPObject> llRPObjList);
+
+        /**
+         * Returns the PcepTEObject.
+         *
+         * @return llTEObjList of type PcepTEObject
+         */
+        LinkedList<PcepTEObject> getTEObjList();
+
+        /**
+         * Sets TE Object lists and returns its builder.
+         *
+         * @param llTEObjList list of type PcepTEObject
+         * @return builder by setting list of type PcepTEObject
+         */
+        Builder setTEObjList(LinkedList<PcepTEObject> llTEObjList);
+
+        /**
+         * Returns the PcepErrorObject.
+         *
+         * @return list of type PcepErrorObject
+         */
+        LinkedList<PcepErrorObject> getErrorObjList();
+
+        /**
+         * Sets Error Object lists and returns its builder.
+         *
+         * @param llErrorObjList list of type PcepErrorObject
+         * @return builder by setting list of type PcepErrorObject
+         */
+        Builder setErrorObjList(LinkedList<PcepErrorObject> llErrorObjList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java
new file mode 100755
index 0000000..6519631
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorInfo.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity which provides PCEP Error Info.
+ * Reference :PCEP Extension for Transporting TE Data draft-dhodylee-pce-pcep-te-data-extn-02.
+ */
+public interface PcepErrorInfo {
+
+    /**
+     * Returns whether error info list is present or not.
+     *
+     * @return true if error info present, false otherwise
+     */
+    public boolean isErrorInfoPresent();
+
+    /**
+     * Reads from channel buffer for TE and RP objects.
+     *
+     * @param bb of channel buffer
+     * @throws PcepParseException while parsing Error info part.
+     */
+    public void read(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Writes byte stream of PCEP error info to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @throws PcepParseException while writing Error info part into Channel Buffer.
+     */
+    public void write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints the attributes of error info list.
+     */
+    public void print();
+
+    /**
+     * Returns Error Value in PCEP-ERROR Object.
+     *
+     * @return list of Error Value in PCEP-ERROR Object
+     */
+    public LinkedList<Integer> getErrorValue();
+
+    /**
+     * Returns Error Type in PCEP-ERROR Object.
+     *
+     * @return list of Error Type in PCEP-ERROR Object
+     */
+    public LinkedList<Integer> getErrorType();
+
+    /**
+     * Builder interface with get and set functions to build ErrorInfo.
+     */
+    public interface Builder {
+
+        /**
+         * Builds ErrorInfo Object.
+         *
+         * @return ErrorInfo Object.
+         */
+        PcepErrorInfo build();
+
+        /**
+         * Returns list of PcepError.
+         *
+         * @return list of PcepError
+         */
+        LinkedList<PcepError> getPcepErrorList();
+
+        /**
+         * Sets PcepError lists and returns its builder.
+         *
+         * @param llPcepErrorList list of PcepError
+         * @return builder by setting list of PcepError.
+         */
+        Builder setPcepErrorList(LinkedList<PcepError> llPcepErrorList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorMsg.java
new file mode 100755
index 0000000..9987d67
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorMsg.java
@@ -0,0 +1,92 @@
+package org.onosproject.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.types.ErrorObjListWithOpen;
+
+/**
+ * Abstraction of an entity providing PCEP Error Message.
+ */
+public interface PcepErrorMsg extends PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns Object of ErrorObjListWithOpen.
+     *
+     * @return Object of ErrorObjListWithOpen
+     */
+    public ErrorObjListWithOpen getErrorObjListWithOpen();
+
+    /**
+     * Sets errObjListWithOpen object.
+     *
+     * @param errObjListWithOpen error object List with open object
+     */
+    public void setErrorObjListWithOpen(ErrorObjListWithOpen errObjListWithOpen);
+
+    /**
+     * Returns Object of PcepErrorInfo.
+     *
+     * @return Object of PcepErrorInfo
+     */
+    public PcepErrorInfo getPcepErrorInfo();
+
+    /**
+     * Sets errInfo Object.
+     *
+     * @param errInfo error information
+     */
+    public void setPcepErrorInfo(PcepErrorInfo errInfo);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer);
+
+    /**
+     * Builder interface with get and set functions to build PCEP Error message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepErrorMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns Object of ErrorObjListWithOpen.
+         *
+         * @return Object of ErrorObjListWithOpen
+         */
+        public ErrorObjListWithOpen getErrorObjListWithOpen();
+
+        /**
+         * Sets errObjListWithOpen object.
+         *
+         * @param errObjListWithOpen error object with open object
+         * @return builder by setting Object of ErrorObjListWithOpen
+         */
+        public Builder setErrorObjListWithOpen(ErrorObjListWithOpen errObjListWithOpen);
+
+        /**
+         * Returns Object of PcepErrorInfo.
+         *
+         * @return Object of PcepErrorInfo
+         */
+        public PcepErrorInfo getPcepErrorInfo();
+
+        /**
+         * Sets errInfo Object.
+         *
+         * @param errInfo error information
+         * @return builder by getting Object of PcepErrorInfo
+         */
+        public Builder setPcepErrorInfo(PcepErrorInfo errInfo);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorObject.java
new file mode 100755
index 0000000..72fb0ce
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepErrorObject.java
@@ -0,0 +1,159 @@
+package org.onosproject.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP Error Object.
+ */
+public interface PcepErrorObject {
+
+    /**
+     * Returns Error Type in Error Object.
+     *
+     * @return Error Type in Error Object
+     */
+    int getErrorType();
+
+    /**
+     * Sets Error Type in Error Object.
+     *
+     * @param value Error Type
+     */
+    void setErrorType(byte value);
+
+    /**
+     * Returns Error Value in Error Object.
+     *
+     * @return Error Value
+     */
+    byte getErrorValue();
+
+    /**
+     * Sets Error Value in Error Object.
+     *
+     * @param value Error Value
+     */
+    void setErrorValue(byte value);
+
+    /**
+     * Returns Optional Tlvs in Error Object.
+     *
+     * @return list of Optional Tlvs in Error Object
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets Optional Tlvs in Error Object.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of Error object.
+     */
+    void print();
+
+    /**
+     * Writes the Error Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing Error Object into ChannelBuffer
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Error object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds Error Object.
+         *
+         * @return Error Object.
+         */
+        PcepErrorObject build();
+
+        /**
+         * Returns Error Object header.
+         *
+         * @return Error Object header
+         */
+        PcepObjectHeader getErrorObjHeader();
+
+        /**
+         * Sets Error Object header and returns its Builder.
+         *
+         * @param obj Error Object header
+         * @return Builder by setting Error Object header
+         */
+        Builder setErrorObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Error Type in Error Object.
+         *
+         * @return Error Type in Error Object
+         */
+        int getErrorType();
+
+        /**
+         * Sets Error Type and returns its builder.
+         *
+         * @param value of Error-Type field
+         * @return builder by setting Error Type field.
+         */
+        Builder setErrorType(byte value);
+
+        /**
+         * Returns Error Value in Error Object.
+         *
+         * @return Error Value
+         */
+        byte getErrorValue();
+
+        /**
+         * Sets Error Value and returns its builder.
+         *
+         * @param value of Error-Value field
+         * @return Builder by setting Error Value field.
+         */
+        Builder setErrorValue(byte value);
+
+        /**
+         * Returns list of Optional Tlvs of Error Object.
+         *
+         * @return list of Optional Tlvs of Error Object
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets Optional Tlvs of Error Object and returns its Builder.
+         *
+         * @param llOptionalTlv Optional Tlvs of Error Object
+         * @return Builder by setting Optional Tlvs.
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in Error object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Error object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java
new file mode 100755
index 0000000..f1eb3fe
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactories.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class PcepFactories {
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepFactories.class);
+
+    private static final GenericReader GENERIC_READER = new GenericReader();
+
+    public static final byte SHIFT_FLAG = 5;
+
+    private PcepFactories() {
+    }
+
+    /*
+     * Returns the instance of PCEP Version.
+     *
+     * @param version
+     * @return PCEP version
+     */
+    public static PcepFactory getFactory(PcepVersion version) {
+        switch (version) {
+        case PCEP_1:
+            // TODO :  to get the pcep version 1 factory
+        default:
+            throw new IllegalArgumentException("[PcepFactory:]Unknown version: " + version);
+        }
+    }
+
+    private static class GenericReader implements PcepMessageReader<PcepMessage> {
+
+        @Override
+        public PcepMessage readFrom(ChannelBuffer bb) throws PcepParseException {
+
+            if (!bb.readable()) {
+                log.debug("Empty message received");
+                throw new PcepParseException("Empty message received");
+            }
+
+            /*
+             * 0                   1                   2                   3
+             * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+             * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+             * | Ver |  Flags  |                                               |
+             * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+             *
+             * Currently Version 1 is supported
+             * Currently no flags are used, it is all ignored
+             */
+
+            byte packetVersion = bb.getByte(bb.readerIndex());
+            packetVersion = (byte) (packetVersion >> SHIFT_FLAG);
+            PcepFactory factory;
+
+            switch (packetVersion) {
+
+            case 1:
+                // TODO : get the factory for version 1
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown Packet version: " + packetVersion);
+            }
+            // TODO : Read the PCEP message from the factory
+            return null;
+        }
+    }
+
+    /*
+     * Returns GENERIC_READER.
+     *
+     * @return GENERIC_READER
+     */
+    public static PcepMessageReader<PcepMessage> getGenericReader() {
+        return GENERIC_READER;
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactory.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactory.java
new file mode 100755
index 0000000..e9eb125
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFactory.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+/**
+ * Abstraction of an Message factory providing Builder functions to PCEP Messages and Objects.
+ *
+ */
+public interface PcepFactory {
+
+    /**
+     * To get Builder Object for Open Message.
+     *
+     * @return Builder Object for Open Message
+     */
+    PcepOpenMsg.Builder buildOpenMsg();
+
+    /**
+     * To get Builder Object for Open Object.
+     *
+     * @return Builder Object for Open Object
+     */
+    PcepOpenObject.Builder buildOpenObject();
+
+    /**
+     * To get Builder Object for Keepalive Message.
+     *
+     * @return Builder Object for Keepalive Message
+     */
+    PcepKeepaliveMsg.Builder buildKeepaliveMsg();
+
+    /**
+     * To get Builder Object for Close Message.
+     *
+     * @return Builder Object for Close Message
+     */
+    PcepCloseMsg.Builder buildCloseMsg();
+
+    /**
+     * To get Builder Object for Report Message.
+     *
+     * @return Builder Object for Report Message
+     */
+    PcepReportMsg.Builder buildReportMsg();
+
+    /**
+     * To get Builder Object for Update Message.
+     *
+     * @return Builder Object for Update Message
+     */
+    PcepUpdateMsg.Builder buildUpdateMsg();
+
+    /**
+     * To get Builder Object for Initiate Message.
+     *
+     * @return Builder Object for Initiate Message
+     */
+    PcepInitiateMsg.Builder buildPcepInitiateMsg();
+
+    /**
+     * To get Builder Object for LSP Object.
+     *
+     * @return Builder Object for LSP Object
+     */
+    PcepLspObject.Builder buildLspObject();
+
+    /**
+     * To get Builder Object for SRP Object.
+     *
+     * @return Builder Object for SRP Object
+     */
+    PcepSrpObject.Builder buildSrpObject();
+
+    /**
+     * To get Builder Object for EndPoints Object.
+     *
+     * @return Builder Object for EndPoints Object
+     */
+    PcepEndPointsObject.Builder buildEndPointsObject();
+
+    /**
+     * To get Builder Object for ERO Object.
+     *
+     * @return Builder Object for ERO Object
+     */
+    PcepEroObject.Builder buildEroObject();
+
+    /**
+     * To get Builder Object for RRO Object.
+     *
+     * @return Builder Object for RRO Object
+     */
+    PcepRroObject.Builder buildRroObject();
+
+    /**
+     * To get Builder Object for LSPA Object.
+     *
+     * @return Builder Object for LSPA Object
+     */
+    PcepLspaObject.Builder buildLspaObject();
+
+    /**
+     * To get Builder Object for IRO Object.
+     *
+     * @return Builder Object for IRO Object
+     */
+    PcepIroObject.Builder buildIroObject();
+
+    /**
+     * To get Builder Object for METRIC Object.
+     *
+     * @return Builder Object for METRIC Object
+     */
+    PcepMetricObject.Builder buildMetricObject();
+
+    /**
+     * To get Builder Object for Bandwidth Object.
+     *
+     * @return Builder Object for Bandwidth Object
+     */
+    PcepBandwidthObject.Builder buildBandwidthObject();
+
+    /**
+     * Returns PCEP Message Reader.
+     *
+     * @return PCEP Message Reader
+     */
+    PcepMessageReader<PcepMessage> getReader();
+
+    /**
+     * Returns PCEP version.
+     *
+     * @return PCEP version
+     */
+    PcepVersion getVersion();
+
+    /**
+     * Returns PcepStateReport.
+     *
+     * @return PcepStateReport
+     */
+    PcepStateReport.Builder buildPcepStateReport();
+
+    /**
+     * Returns PcepUpdateRequest.
+     *
+     * @return PcepUpdateRequest
+     */
+    PcepUpdateRequest.Builder buildPcepUpdateRequest();
+
+    /**
+     * Returns PcInitiatedLspRequest.
+     *
+     * @return PcInitiatedLspRequest
+     */
+    PcInitiatedLspRequest.Builder buildPcInitiatedLspRequest();
+
+    /**
+     * Returns PcepMsgPath.
+     *
+     * @return PcepMsgPath
+     */
+    PcepMsgPath.Builder buildPcepMsgPath();
+
+    /**
+     * Return PcepAttribute list.
+     *
+     * @return PcepAttribute
+     */
+    PcepAttribute.Builder buildPcepAttribute();
+
+    /**
+     * To get Builder Object for LabelUpdate message.
+     *
+     * @return Builder Object for LabelUpdate message
+     */
+    PcepLabelUpdateMsg.Builder buildPcepLabelUpdateMsg();
+
+    /**
+     * To get Builder Object for PcepLabelUpdate Object.
+     *
+     * @return Builder Object for PcepLabelUpdate Object
+     */
+    PcepLabelUpdate.Builder buildPcepLabelUpdateObject();
+
+    /**
+     * To get Builder Object for PcepLabel Object.
+     *
+     * @return Builder Object for PcepLabel Object
+     */
+    PcepLabelObject.Builder buildLabelObject();
+
+    /**
+     * To get Builder Object for Error Message.
+     *
+     * @return Builder Object for Error Message
+     */
+    PcepErrorMsg.Builder buildPcepErrorMsg();
+
+    /**
+     * To get Builder Object for Error Object.
+     *
+     * @return Builder Object for Error Object
+     */
+    PcepErrorObject.Builder buildPcepErrorObject();
+
+    /**
+     * To get Builder Object for FecIpv4Adjacency.
+     *
+     * @return Builder Object for FecIpv4Adjacency
+     */
+    PcepFecObjectIPv4Adjacency.Builder buildFecIpv4Adjacency();
+
+    /**
+     * To get Builder Object for ErrorInfo.
+     *
+     * @return Builder Object for ErrorInfo
+     */
+    PcepErrorInfo.Builder buildPcepErrorInfo();
+
+    /**
+     * To get Builder Object for PcepError.
+     *
+     * @return Builder Object for PcepError
+     */
+    PcepError.Builder buildPcepError();
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObject.java
new file mode 100755
index 0000000..e356470
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObject.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP FEC Object.
+ */
+public interface PcepFecObject {
+
+    /**
+     * Returns PCEP Version of FEC Object.
+     *
+     * @return PCEP Version of FEC Object
+     */
+    PcepVersion getVersion();
+
+    /**
+     * Returns FEC Object type.
+     *
+     * @return FEC Object type
+     */
+    int getType();
+
+    /**
+     * Writes the FEC into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing FEC Object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints attributes of FEC object.
+     */
+    void print();
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4.java
new file mode 100755
index 0000000..60c6b75
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP FEC Object of Type 1 IPv4 Node ID.
+ */
+public interface PcepFecObjectIPv4 extends PcepFecObject {
+
+    /**
+     * Returns NodeID of FEC Object.
+     *
+     * @return NodeID of FEC Object
+     */
+    int getNodeID();
+
+    /**
+     * Sets NodeID with specified value.
+     *
+     * @param value node id
+     */
+    void setNodeID(int value);
+
+    @Override
+    void print();
+
+    @Override
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build FEC object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds FEC Object IPv4.
+         *
+         * @return FEC Object IPv4
+         * @throws PcepParseException while creating FEC IPv4 Object.
+         */
+        PcepFecObjectIPv4 build() throws PcepParseException;
+
+        /**
+         * Returns FEC Object IPv4 header.
+         *
+         * @return FEC Object IPv4 header
+         */
+        PcepObjectHeader getFecIpv4ObjHeader();
+
+        /**
+         * Sets FEC Object IPv4 header and returns its builder.
+         *
+         * @param obj FEC Object IPv4 header
+         * @return Builder by setting FEC Object IPv4 header
+         */
+        Builder setFecIpv4ObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns NodeID of FEC Object.
+         *
+         * @return NodeID of FEC Object
+         */
+        int getNodeID();
+
+        /**
+         * Sets NodeID and returns its builder.
+         *
+         * @param value node id
+         * @return builder by setting NodeID
+         */
+        Builder setNodeID(int value);
+
+        /**
+         * Sets P flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4Adjacency.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4Adjacency.java
new file mode 100755
index 0000000..675b6fb
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4Adjacency.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing FEC Object of Type 3 IPv4 Adjacency.
+ */
+public interface PcepFecObjectIPv4Adjacency extends PcepFecObject {
+
+    /**
+     * Returns Local IPv4Address of FEC Object.
+     *
+     * @return Local IPv4Address of FEC Object
+     */
+    int getLocalIPv4Address();
+
+    /**
+     * Sets Local IPv4Address with specified value.
+     *
+     * @param value Local IPv4Address
+     */
+    void seLocalIPv4Address(int value);
+
+    /**
+     * Returns Remote IPv4Address of FEC Object.
+     *
+     * @return Remote IPv4Address of FEC Object
+     */
+    int getRemoteIPv4Address();
+
+    /**
+     * Sets Remote IPv4Address with specified value.
+     *
+     * @param value Remote IPv4Address
+     */
+    void seRemoteIPv4Address(int value);
+
+    @Override
+    void print();
+
+    @Override
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build FEC object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds FEC Object IPv4 Adjacency.
+         *
+         * @return FEC Object IPv4 Adjacency
+         * @throws PcepParseException while building FEC IPv4 Adjacency object.
+         */
+        PcepFecObjectIPv4Adjacency build() throws PcepParseException;
+
+        /**
+         * Returns FEC Object IPv4 Adjacency header.
+         *
+         * @return FEC Object IPv4 Adjacency header
+         */
+        PcepObjectHeader getFecIpv4AdjacencyObjHeader();
+
+        /**
+         * Sets FEC Object IPv4 Adjacency header and returns its builder.
+         *
+         * @param obj FEC Object IPv4 Adjacency header
+         * @return Builder by setting FEC Object IPv4 header
+         */
+        Builder setFecIpv4AdjacencyObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Local IPv4Address of FEC Object.
+         *
+         * @return Local IPv4Address of FEC Object
+         */
+        int getLocalIPv4Address();
+
+        /**
+         * Sets Local IPv4Address and returns its builder.
+         *
+         * @param value Local IPv4Address
+         * @return Builder by setting Local IPv4Address
+         */
+        Builder seLocalIPv4Address(int value);
+
+        /**
+         * Sets Remote IPv4Address with specified value.
+         *
+         * @return Remote IPv4 Address
+         */
+        int getRemoteIPv4Address();
+
+        /**
+         * Sets Remote IPv4Address and returns its builder.
+         *
+         * @param value Remote IPv4Address
+         * @return Builder by setting Remote IPv4Address
+         */
+        Builder seRemoteIPv4Address(int value);
+
+        /**
+         * Sets P flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4UnnumberedAdjacency.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4UnnumberedAdjacency.java
new file mode 100755
index 0000000..08a7b42
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv4UnnumberedAdjacency.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP FEC Object of Type is 5 Unnumbered Adjacency with IPv4 NodeIDs.
+ */
+public interface PcepFecObjectIPv4UnnumberedAdjacency extends PcepFecObject {
+
+    /**
+     * Returns Local NodeID of FEC Object.
+     *
+     * @return Local NodeID of FEC Object
+     */
+    int getLocalNodeID();
+
+    /**
+     * Sets Local NodeID with specified value.
+     *
+     * @param value Local NodeID
+     */
+    void setLocalNodeID(int value);
+
+    /**
+     * Returns Local InterfaceID of FEC Object.
+     *
+     * @return Local InterfaceID of FEC Object
+     */
+    int getLocalInterfaceID();
+
+    /**
+     * Sets Local InterfaceID with specified value.
+     *
+     * @param value Local InterfaceID
+     */
+    void setLocalInterfaceID(int value);
+
+    /**
+     * Returns Remote NodeID of FEC Object.
+     *
+     * @return Remote NodeID of FEC Object
+     */
+    int getRemoteNodeID();
+
+    /**
+     * Sets Remote NodeID with specified value.
+     *
+     * @param value Remote NodeID
+     */
+    void setRemoteNodeID(int value);
+
+    /**
+     * Returns Remote InterfaceID of FEC Object.
+     *
+     * @return Remote InterfaceID of FEC Object
+     */
+    int getRemoteInterfaceID();
+
+    /**
+     * Sets Remote InterfaceID with specified value.
+     *
+     * @param value Remote InterfaceID
+     */
+    void setRemoteInterfaceID(int value);
+
+    @Override
+    void print();
+
+    @Override
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build bandwidth object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds FEC Unnumbered Adjacency with IPv4 Object.
+         *
+         * @return FEC Unnumbered Adjacency with IPv4 Object
+         * @throws PcepParseException when building FEC IPv4 Unnumbered Adjacency object.
+         */
+        PcepFecObjectIPv4UnnumberedAdjacency build() throws PcepParseException;
+
+        /**
+         * Returns FEC Unnumbered Adjacency with IPv4 header.
+         *
+         * @return FEC Unnumbered Adjacency with IPv4 header
+         */
+        PcepObjectHeader getFecIpv4UnnumberedAdjacencyObjHeader();
+
+        /**
+         * Sets FEC Unnumbered Adjacency with IPv4 header and returns its builder.
+         *
+         * @param obj FEC Unnumbered Adjacency with IPv4 header
+         * @return Builder by setting FEC Unnumbered Adjacency with IPv4 header
+         */
+        Builder setFecIpv4UnnumberedAdjacencyObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Local NodeID of FEC Object.
+         *
+         * @return Local NodeID of FEC Object
+         */
+        int getLocalNodeID();
+
+        /**
+         * Sets Local NodeID and returns its builder.
+         *
+         * @param value Local NodeID
+         * @return Builder by setting Local NodeID
+         */
+        Builder setLocalNodeID(int value);
+
+        /**
+         * Returns Local InterfaceID of FEC Object.
+         *
+         * @return Local InterfaceID of FEC Object
+         */
+        int getLocalInterfaceID();
+
+        /**
+         * Sets Local InterfaceID and returns its builder.
+         *
+         * @param value Local InterfaceID
+         * @return Builder by setting Local InterfaceID
+         */
+        Builder setLocalInterfaceID(int value);
+
+        /**
+         * Returns Remote NodeID of FEC Object.
+         *
+         * @return Remote NodeID of FEC Object
+         */
+        int getRemoteNodeID();
+
+        /**
+         * Sets Remote NodeID and returns its builder.
+         *
+         * @param value Remote NodeID
+         * @return Builder by setting Remote NodeID
+         */
+        Builder setRemoteNodeID(int value);
+
+        /**
+         * Returns Remote InterfaceID of FEC Object.
+         *
+         * @return Remote InterfaceID of FEC Object
+         */
+        int getRemoteInterfaceID();
+
+        /**
+         * Sets Remote InterfaceID and returns its builder.
+         *
+         * @param value Remote InterfaceID
+         * @return Builder by setting Remote InterfaceID
+         */
+        Builder setRemoteInterfaceID(int value);
+
+        /**
+         * Sets P flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6.java
new file mode 100755
index 0000000..b8bfe2f
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing FEC Object of Type is 2 IPv6 Node ID.
+ */
+public interface PcepFecObjectIPv6 extends PcepFecObject {
+
+    /**
+     * Returns NodeID of FEC Object.
+     *
+     * @return NodeID of FEC Object
+     */
+    byte[] getNodeID();
+
+    /**
+     * Sets NodeID with specified value.
+     *
+     * @param value node id
+     */
+    void setNodeID(byte[] value);
+
+    @Override
+    void print();
+
+    @Override
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build FEC object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds FEC Object IPv6.
+         *
+         * @return FEC Object IPv6
+         * @throws PcepParseException while building FEC IPv6 Object.
+         */
+        PcepFecObjectIPv6 build() throws PcepParseException;
+
+        /**
+         * Returns FEC Object IPv6 header.
+         *
+         * @return FEC Object IPv6 header
+         */
+        PcepObjectHeader getFecIpv6ObjHeader();
+
+        /**
+         * Sets FEC Object IPv6 header and returns its builder.
+         *
+         * @param obj FEC Object IPv6 header
+         * @return Builder by setting FEC Object IPv6 header
+         */
+        Builder setFecIpv6ObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns NodeID of FEC Object.
+         *
+         * @return NodeID of FEC Object
+         */
+        byte[] getNodeID();
+
+        /**
+         * Sets NodeID and returns its builder.
+         *
+         * @param value node id
+         * @return Builder by setting NodeID
+         */
+        Builder setNodeID(byte[] value);
+
+        /**
+         * Sets P flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6Adjacency.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6Adjacency.java
new file mode 100755
index 0000000..3fc4bb5
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepFecObjectIPv6Adjacency.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing FEC Object of Type is 4 IPv6 Adjacency.
+ */
+public interface PcepFecObjectIPv6Adjacency extends PcepFecObject {
+
+    /**
+     * Returns Local IPv6Address of FEC Object.
+     *
+     * @return Local IPv6Address of FEC Object
+     */
+    byte[] getLocalIPv6Address();
+
+    /**
+     * Sets Local IPv6Address with specified value.
+     *
+     * @param value Local IPv6Address
+     */
+    void seLocalIPv6Address(byte[] value);
+
+    /**
+     * Returns Remote IPv6Address of FEC Object.
+     *
+     * @return Remote IPv6Address of FEC Object
+     */
+    byte[] getRemoteIPv6Address();
+
+    /**
+     * Sets Remote IPv6Address with specified value.
+     *
+     * @param value Remote IPv6Address
+     */
+    void seRemoteIPv6Address(byte[] value);
+
+    @Override
+    void print();
+
+    @Override
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build FEC object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds FEC Object IPv6 Adjacency.
+         *
+         * @return FEC Object IPv6 Adjacency
+         * @throws PcepParseException while building FEC IPv6 Adjacency object.
+         */
+        PcepFecObjectIPv6Adjacency build() throws PcepParseException;
+
+        /**
+         * Returns FEC Object IPv6 Adjacency header.
+         *
+         * @return FEC Object IPv6 Adjacency header
+         */
+        PcepObjectHeader getFecIpv6AdjacencyObjHeader();
+
+        /**
+         * Sets FEC Object IPv6 Adjacency header and returns its builder.
+         *
+         * @param obj FEC Object IPv6 Adjacency header
+         * @return Builder by setting FEC Object IPv6 Adjacency header
+         */
+        Builder setFecIpv6AdjacencyObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Local IPv6Address of FEC Object.
+         *
+         * @return Local IPv6Address of FEC Object
+         */
+        byte[] getLocalIPv6Address();
+
+        /**
+         * Sets Local IPv6Address and returns its builder.
+         *
+         * @param value Local IPv6Address
+         * @return Builder by setting Local IPv6Address
+         */
+        Builder setLocalIPv6Address(byte[] value);
+
+        /**
+         * Returns Remote IPv6Address of FEC Object.
+         *
+         * @return Remote IPv6Address of FEC Object
+         */
+        byte[] getRemoteIPv6Address();
+
+        /**
+         * Sets Remote IPv6Address and returns its builder.
+         *
+         * @param value Remote IPv6Address
+         * @return Builder by setting Remote IPv6Address
+         */
+        Builder setRemoteIPv6Address(byte[] value);
+
+        /**
+         * Sets P flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in FEC object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInitiateMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInitiateMsg.java
new file mode 100755
index 0000000..0d23948
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInitiateMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Initiate Message.
+ */
+public interface PcepInitiateMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns list of PcInitiatedLspRequestList.
+     *
+     * @return list of PcInitiatedLspRequestList
+     */
+    LinkedList<PcInitiatedLspRequest> getPcInitiatedLspRequestList();
+
+    /**
+     * Sets list of PcInitiatedLspRequestList.
+     *
+     * @param llPcInitiatedLspRequestList list of PcInitiatedLspRequestList
+     */
+    void setPcInitiatedLspRequestList(LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Initiate message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepInitiateMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns list of PcInitiatedLspRequestList.
+         *
+         * @return list of PcInitiatedLspRequestList
+         */
+        LinkedList<PcInitiatedLspRequest> getPcInitiatedLspRequestList();
+
+        /**
+         * Sets PcInitiatedLspRequestList.
+         *
+         * @param llPcInitiatedLspRequestList list of PcInitiatedLspRequestList
+         * @return builder by setting list of PcInitiatedLspRequestList
+         */
+        Builder setPcInitiatedLspRequestList(LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInterLayerObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInterLayerObject.java
new file mode 100755
index 0000000..2772db8
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepInterLayerObject.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP INTER Layer Object.
+ */
+public interface PcepInterLayerObject {
+
+    /**
+     * Returns N Flag in INTER Layer Object.
+     *
+     * @return N Flag in INTER Layer Object
+     */
+    boolean getbNFlag();
+
+    /**
+     * Sets N Flag in INTER Layer Object with specified value.
+     *
+     * @param value N Flag
+     */
+    void setbNFlag(boolean value);
+
+    /**
+     * Returns I Flag in INTER Layer Object.
+     *
+     * @return I Flag in INTER Layer Object
+     */
+    boolean getbIFlag();
+
+    /**
+     * Sets I Flag in INTER Layer Object with specified value.
+     *
+     * @param value I Flag
+     */
+    void setbIFlag(boolean value);
+
+    /**
+     * Prints attributes of INTER Layer object.
+     */
+    void print();
+
+    /**
+     * Writes the INTER Layer Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing Inter Layer Object.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build INTER Layer object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds INTER Layer object.
+         *
+         * @return INTER Layer object
+         */
+        PcepInterLayerObject build();
+
+        /**
+         * Returns INTER Layer object header.
+         *
+         * @return INTER Layer object header
+         */
+        PcepObjectHeader getInterLayerObjHeader();
+
+        /**
+         * Sets INTER Layer object header and returns its builder.
+         *
+         * @param obj INTER Layer object header
+         * @return Builder by setting INTER Layer object header
+         */
+        Builder setInterLayerObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns N Flag in INTER Layer Object.
+         *
+         * @return N Flag in INTER Layer Object
+         */
+        boolean getbNFlag();
+
+        /**
+         * Sets N flag and return its builder.
+         *
+         * @param value N flag
+         * @return Builder by setting N flag
+         */
+        Builder setbNFlag(boolean value);
+
+        /**
+         * Returns I Flag in INTER Layer Object.
+         *
+         * @return I Flag in INTER Layer Object
+         */
+        boolean getbIFlag();
+
+        /**
+         * Sets I flag and return its builder.
+         *
+         * @param value I flag
+         * @return Builder by setting N flag
+         */
+        Builder setbIFlag(boolean value);
+
+        /**
+         * Sets P flag in INTER Layer object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in INTER Layer object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepIroObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepIroObject.java
new file mode 100755
index 0000000..672677b
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepIroObject.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP IRO Object.
+ */
+public interface PcepIroObject {
+
+    /**
+     * Returns list of  SubObjects.
+     *
+     * @return list of  SubObjects
+     */
+    LinkedList<PcepValueType> getSubObjects();
+
+    /**
+     * Sets list of SubObjects.
+     *
+     * @param llSubObjects list of SubObjects
+     */
+    void setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+    /**
+     * Prints attributes of IRO object.
+     */
+    void print();
+
+    /**
+     * Writes the IRO into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing IRO object.
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build IRO object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds IRO Object.
+         *
+         * @return IRO Object
+         */
+        PcepIroObject build();
+
+        /**
+         * Returns IRO object header.
+         *
+         * @return IRO object header
+         */
+        PcepObjectHeader getIroObjHeader();
+
+        /**
+         * Sets IRO object header and returns its builder.
+         *
+         * @param obj IRO object header
+         * @return Builder by setting IRO object header
+         */
+        Builder setIroObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns list of SubObjects.
+         *
+         * @return list of SubObjects
+         */
+        LinkedList<PcepValueType> getSubObjects();
+
+        /**
+         * Sets list of SubObjects in IRO Object and returns its builder.
+         *
+         * @param llSubObjects list of  SubObjects
+         * @return Builder by setting list of  SubObjects
+         */
+        Builder setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+        /**
+         * Sets P flag in IRO object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in IRO object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsg.java
new file mode 100755
index 0000000..aad8811
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsg.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Abstraction of an entity providing PCEP Keepalive Message.
+ */
+public interface PcepKeepaliveMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer);
+
+    /**
+     * Builder interface with get and set functions to build Keepalive message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepKeepaliveMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelObject.java
new file mode 100755
index 0000000..82cac1f
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelObject.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP Label Object.
+ */
+public interface PcepLabelObject {
+
+    /**
+     * Returns O flag in Label Object.
+     *
+     * @return Boolean value
+     */
+    boolean getOFlag();
+
+    /**
+     * Sets O flag in Label Object with specified value.
+     *
+     * @param value O flag
+     */
+    void setOFlag(boolean value);
+
+    /**
+     * Returns Label from Label Object.
+     *
+     * @return Label value
+     */
+    int getLabel();
+
+    /**
+     * Sets Label field in Label Object with specified value.
+     *
+     * @param value Label
+     */
+    void setLabel(int value);
+
+    /**
+     * Returns list of Optional Tlvs.
+     *
+     * @return list of Optional Tlvs
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets Optional Tlvs in Label Object.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of Label object.
+     */
+    void print();
+
+    /**
+     * Writes the Label Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing LABEL object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Label object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds Label Object.
+         *
+         * @return Label Object
+         * @throws PcepParseException while building LABEL object.
+         */
+        PcepLabelObject build() throws PcepParseException;
+
+        /**
+         * Returns Label object header.
+         *
+         * @return Label object header
+         */
+        PcepObjectHeader getLabelObjHeader();
+
+        /**
+         * Sets Label object header and returns its builder.
+         *
+         * @param obj Label object header
+         * @return Builder by setting Label object header
+         */
+        Builder setLabelObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns O flag in Label Object.
+         *
+         * @return Label value
+         */
+        boolean getOFlag();
+
+        /**
+         * Sets O flag and return its builder.
+         *
+         * @param value O flag
+         * @return Builder by setting O flag
+         */
+        Builder setOFlag(boolean value);
+
+        /**
+         * Returns Label from Label Object.
+         *
+         * @return Label value
+         */
+        int getLabel();
+
+        /**
+         * Sets Label field and return its builder.
+         *
+         * @param value Label field
+         * @return Builder by setting Label field
+         */
+        Builder setLabel(int value);
+
+        /**
+         * Returns list of Optional Tlvs.
+         *
+         * @return list of Optional Tlvs
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs and return its builder.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return Builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in Label object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        public Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Label object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        public Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRange.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRange.java
new file mode 100755
index 0000000..53ce6e4
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRange.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Label Range.
+ */
+public interface PcepLabelRange {
+
+    /**
+     * Returns object of PCEP SRP Object.
+     *
+     * @return srpObject
+     */
+    public PcepSrpObject getSrpObject();
+
+    /**
+     * Sets PCEP SRP Object.
+     *
+     * @param srpObject SRP object.
+     */
+    public void setSrpObject(PcepSrpObject srpObject);
+
+    /**
+     * Returns list of PcepLabelRangeObject.
+     *
+     * @return Label Range List
+     */
+    public LinkedList<PcepLabelRangeObject> getLabelRangeList();
+
+    /**
+     * Sets list of PcepLabelRangeObject.
+     *
+     * @param llLabelRangeList Label Range List
+     */
+    public void setLabelRangeList(LinkedList<PcepLabelRangeObject> llLabelRangeList);
+
+    /**
+     * Write the byte stream of PcepLabelRange to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @return object length index
+     * @throws PcepParseException while writing LABEL RANGE into Channel Buffer.
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints Attributes of PcepLabelRange.
+     */
+    public void print();
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeObject.java
new file mode 100755
index 0000000..dfd8c12
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeObject.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP LabelRange Object.
+ */
+public interface PcepLabelRangeObject {
+
+    /**
+     * Sets LabelRange Object header.
+     *
+     * @param obj LabelRange Object header
+     */
+    void setLabelRangeObjHeader(PcepObjectHeader obj);
+
+    /**
+     * Sets LabelType in LabelRange Object.
+     *
+     * @param labelType label type value
+     */
+    void setLabelType(byte labelType);
+
+    /**
+     * Sets RangeSize in LabelRange Object.
+     *
+     * @param rangeSize range size value
+     */
+    void setRangeSize(int rangeSize);
+
+    /**
+     * Sets LabelBase in LabelRange Object.
+     *
+     * @param labelBase label base value
+     */
+    void setLabelBase(int labelBase);
+
+    /**
+     * Returns LabelRange object header.
+     *
+     * @return LabelRange object header
+     */
+    PcepObjectHeader getLabelRangeObjHeader();
+
+    /**
+     * Returns LabelType field in LabelRange object.
+     *
+     * @return LabelType field in LabelRange object
+     */
+    byte getLabelType();
+
+    /**
+     * Returns RangeSize field in LabelRange object.
+     *
+     * @return RangeSize field in LabelRange object
+     */
+    int getRangeSize();
+
+    /**
+     * Returns LabelBase field in LabelRange object.
+     *
+     * @return LabelBase field in LabelRange object
+     */
+    int getLabelBase();
+
+    /**
+     * Prints attributes of LabelRange object.
+     */
+    void print();
+
+    /**
+     * Writes the LabelRange Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing LABEL RANGE object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build LabelRange object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds LabelRange Object.
+         *
+         * @return LabelRange Object
+         * @throws PcepParseException while building LABEL RANGE object.
+         */
+        PcepLabelRangeObject build() throws PcepParseException;
+
+        /**
+         * Returns LabelRange object header.
+         *
+         * @return LabelRange object header
+         */
+        PcepObjectHeader getLabelRangeObjHeader();
+
+        /**
+         * Sets LabelRange object header and returns its builder.
+         *
+         * @param obj LabelRange object header
+         * @return Builder by setting LabelRange object header
+         */
+        Builder setLabelRangeObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns LabelType field in LabelRange object.
+         *
+         * @return LabelType field in LabelRange object
+         */
+        byte getLabelType();
+
+        /**
+         * Sets LabelType field and returns its builder.
+         *
+         * @param labelType LabelType field
+         * @return Builder by setting LabelType field
+         */
+        Builder setLabelType(byte labelType);
+
+        /**
+         * Returns RangeSize field in LabelRange object.
+         *
+         * @return RangeSize field in LabelRange object
+         */
+        int getRangeSize();
+
+        /**
+         * Sets RangeSize field and returns its builder.
+         *
+         * @param rangeSize RangeSize field
+         * @return Builder by setting RangeSize field
+         */
+        Builder setRangeSize(int rangeSize);
+
+        /**
+         * Returns LabelBase field in LabelRange object.
+         *
+         * @return LabelBase field in LabelRange object
+         */
+        int getLabelBase();
+
+        /**
+         * Sets LabelBase field and returns its builder.
+         *
+         * @param labelBase LabelBase field
+         * @return Builder by setting LabelBase field
+         */
+        Builder setLabelBase(int labelBase);
+
+        /**
+         * Sets P flag in TE object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in TE object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeResvMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeResvMsg.java
new file mode 100755
index 0000000..04b180f
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelRangeResvMsg.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Label Range Reservation Message.
+ */
+public interface PcepLabelRangeResvMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns LabelRange field in Label Range Reservation message.
+     *
+     * @return LabelRange field
+     */
+    PcepLabelRange getLabelRange();
+
+    /**
+     * Sets LabelRange field in Label Range Reservation message with specified value.
+     *
+     * @param lR label range object
+     */
+    void setLabelRange(PcepLabelRange lR);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Label Range Reservation message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepLabelRangeResvMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns LabelRange field in Label Range Reservation message.
+         *
+         * @return LabelRange object
+         */
+        PcepLabelRange getLabelRange();
+
+        /**
+         * Sets LabelRange field and returns its Builder.
+         *
+         * @param lR label range object
+         * @return builder by setting LabelRange field
+         */
+        Builder setLabelRange(PcepLabelRange lR);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdate.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdate.java
new file mode 100755
index 0000000..3db19b9
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdate.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2014 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepLabelDownload;
+import org.onosproject.pcepio.types.PcepLabelMap;
+
+/***
+ * Abstraction to provide PCEP Label Updates.
+ */
+public interface PcepLabelUpdate {
+
+    /**
+     * Writes the byte stream of PcepLabelUpdate into channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @throws PcepParseException while writing LABEL UPDATE.
+     */
+    public void write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Sets the Label Download object.
+     *
+     * @param labelDownload PCEP Label Download object
+     */
+    public void setLabelDownload(PcepLabelDownload labelDownload);
+
+    /**
+     * Returns the PcepLabelDownload object.
+     *
+     * @return labelDownload PCEP Label Download
+     */
+    public PcepLabelDownload getLabelDownload();
+
+    /**
+     * Sets the Label map object.
+     *
+     * @param labelMap PCEP Label Map object
+     */
+    public void setLabelMap(PcepLabelMap labelMap);
+
+    /**
+     * Returns the PcepLabelMap object.
+     *
+     * @return labelMap PCEP Label Map
+     */
+    public PcepLabelMap getLabelMap();
+
+    /**
+     * Prints the attributes of PCEP Label update.
+     */
+    public void print();
+
+    /**
+     * Builder interface with get and set functions to build Label Update message.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepLableUpdate Object.
+         *
+         * @return PcepLableUpdate Object
+         * @throws PcepParseException while building LABEL-UPDATE.
+         */
+        PcepLabelUpdate build() throws PcepParseException;
+
+        /**
+         * Sets the Label Download object.
+         *
+         * @param labelDownload PCEP Label Download object
+         * @return Builder by setting labelDownload object
+         */
+        Builder setLabelDownload(PcepLabelDownload labelDownload);
+
+        /**
+         * Returns the PcepLabelDownload object.
+         *
+         * @return labelDownload PCEP Label Download
+         */
+        PcepLabelDownload getLabelDownload();
+
+        /**
+         * Sets the Label map object.
+         *
+         * @param labelMap PCEP Label Map object
+         * @return Builder by setting PcepLabelMap object
+         */
+        Builder setLabelMap(PcepLabelMap labelMap);
+
+        /**
+         * Returns the PcepLabelMap object.
+         *
+         * @return labelMap PCEP Label Map
+         */
+        PcepLabelMap getLabelMap();
+    }
+
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsg.java
new file mode 100755
index 0000000..d6e147b
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Label Update Message.
+ */
+public interface PcepLabelUpdateMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns list of PcLabelUpdateList.
+     *
+     * @return list of PcLabelUpdateList.
+     */
+    LinkedList<PcepLabelUpdate> getPcLabelUpdateList();
+
+    /**
+     * Sets list of PcLabelUpdateList.
+     *
+     * @param llPcLabelUpdateList list of PcLabelUpdateList
+     */
+    void setPcLabelUpdateList(LinkedList<PcepLabelUpdate> llPcLabelUpdateList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Label Update message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepLabelUpdateMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns list of PcLabelUpdateList.
+         *
+         * @return list of PcLabelUpdateList.
+         */
+        LinkedList<PcepLabelUpdate> getPcLabelUpdateList();
+
+        /**
+         * Sets list of PcLabelUpdateList.
+         *
+         * @param llPcLabelUpdateList list of PcLabelUpdateList.
+         * @return Builder by setting list of PcLabelUpdateList.
+         */
+        Builder setPcLabelUpdateList(LinkedList<PcepLabelUpdate> llPcLabelUpdateList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspObject.java
new file mode 100755
index 0000000..8a03833
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspObject.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP LSP Object.
+ */
+public interface PcepLspObject {
+
+    /**
+     * Returns PlspId of LSP Object.
+     *
+     * @return PlspId of LSP Object
+     */
+    int getPlspId();
+
+    /**
+     * Sets PlspId with specified value.
+     *
+     * @param value PlspId
+     */
+    void setPlspId(int value);
+
+    /**
+     * Returns O flag in LSP Object.
+     *
+     * @return O flag in LSP Object
+     */
+    byte getOFlag();
+
+    /**
+     * Sets O flag with specified value.
+     *
+     * @param value O flag
+     */
+    void setOFlag(byte value);
+
+    /**
+     * Returns A flag in LSP Object.
+     *
+     * @return A flag in LSP Object
+     */
+    boolean getAFlag();
+
+    /**
+     * Sets A flag with specified value.
+     *
+     * @param value A flag
+     */
+    void setAFlag(boolean value);
+
+    /**
+     * Returns R flag in LSP Object.
+     *
+     * @return R flag in LSP Object
+     */
+    boolean getRFlag();
+
+    /**
+     * Sets R flag with specified value.
+     *
+     * @param value R flag
+     */
+    void setRFlag(boolean value);
+
+    /**
+     * Returns S flag in LSP Object.
+     *
+     * @return S flag in LSP Object
+     */
+    boolean getSFlag();
+
+    /**
+     * Sets S flag with specified value.
+     *
+     * @param value S flag
+     */
+    void setSFlag(boolean value);
+
+    /**
+     * Returns D flag in LSP Object.
+     *
+     * @return D flag in LSP Object
+     */
+    boolean getDFlag();
+
+    /**
+     * Sets D flag with specified value.
+     *
+     * @param value D flag
+     */
+    void setDFlag(boolean value);
+
+    /**
+     * Returns list of Optional Tlvs in LSP Object.
+     *
+     * @return list of Optional Tlvs
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets list of Optional Tlvs in LSP Object.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of LSP object.
+     */
+    void print();
+
+    /**
+     * Writes the LSP Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing LSP object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build LSP object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds LSP Object.
+         *
+         * @return LSP Object
+         */
+        PcepLspObject build();
+
+        /**
+         * Returns LSP object header.
+         *
+         * @return LSP object header
+         */
+        PcepObjectHeader getLspObjHeader();
+
+        /**
+         * Sets LSP object header and returns its builder.
+         *
+         * @param obj LSP object header
+         * @return Builder by setting LSP object header
+         */
+        Builder setLspObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns PlspId of LSP Object.
+         *
+         * @return PlspId of LSP Object
+         */
+        int getPlspId();
+
+        /**
+         * Sets PlspId with specific value and return its builder.
+         *
+         * @param value PlspId
+         * @return Builder by setting PlspId
+         */
+        Builder setPlspId(int value);
+
+        /**
+         * Returns O flag in LSP Object.
+         *
+         * @return O flag in LSP Object
+         */
+        byte getOFlag();
+
+        /**
+         * Sets O flag with specific value and return its builder.
+         *
+         * @param value O flag
+         * @return Builder by setting O flag
+         */
+        Builder setOFlag(byte value);
+
+        /**
+         * Returns A flag in LSP Object.
+         *
+         * @return A flag in LSP Object
+         */
+        boolean getAFlag();
+
+        /**
+         * Sets A flag with specific value and return its builder.
+         *
+         * @param value A flag
+         * @return Builder by setting A flag
+         */
+        Builder setAFlag(boolean value);
+
+        /**
+         * Returns A flag in LSP Object.
+         *
+         * @return A flag in LSP Object
+         */
+        boolean getRFlag();
+
+        /**
+         * Sets R flag with specific value and return its builder.
+         *
+         * @param value r flag
+         * @return Builder by setting r flag
+         */
+        Builder setRFlag(boolean value);
+
+        /**
+         * Returns S flag in LSP Object.
+         *
+         * @return S flag in LSP Object
+         */
+        boolean getSFlag();
+
+        /**
+         * Sets S flag with specific value and return its builder.
+         *
+         * @param value s flag
+         * @return Builder by setting S flag
+         */
+        Builder setSFlag(boolean value);
+
+        /**
+         * Returns D flag in LSP Object.
+         *
+         * @return D flag in LSP Object
+         */
+        boolean getDFlag();
+
+        /**
+         * Sets D flag with specific value and return its builder.
+         *
+         * @param value D flag
+         * @return Builder by setting D flag
+         */
+        Builder setDFlag(boolean value);
+
+        /**
+         * Returns list of Optional Tlvs in LSP Object.
+         *
+         * @return list of Optional Tlvs in LSP Object
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs and return its builder.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return Builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in LSP object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in LSP object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspaObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspaObject.java
new file mode 100755
index 0000000..d730002
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepLspaObject.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP LSPA Object.
+ */
+public interface PcepLspaObject {
+
+    /**
+     * Returns L flag in LSPA Object.
+     *
+     * @return L flag in LSPA Object
+     */
+    boolean getLFlag();
+
+    /**
+     * Sets L flag in LSPA Object.
+     *
+     * @param value L flag
+     */
+    void setLFlag(boolean value);
+
+    /**
+     * Returns Exclude Any field in LSPA Object.
+     *
+     * @return Exclude Any field in LSPA Object
+     */
+    int getExcludeAny();
+
+    /**
+     * Sets Exclude Any field in LSPA Object.
+     *
+     * @param value Exclude Any field
+     */
+    void setExcludeAny(int value);
+
+    /**
+     * Returns Include Any field in LSPA Object.
+     *
+     * @return Include Any field in LSPA Object
+     */
+    int getIncludeAny();
+
+    /**
+     * Sets Include Any field in LSPA Object.
+     *
+     * @param value Include Any field
+     */
+    void setIncludeAny(int value);
+
+    /**
+     * Returns Include All field in LSPA Object.
+     *
+     * @return Include All field in LSPA Object
+     */
+    int getIncludeAll();
+
+    /**
+     * Sets Include All field in LSPA Object.
+     *
+     * @param value Include All field
+     */
+    void setIncludeAll(int value);
+
+    /**
+     * Returns Setup Priority field in LSPA Object.
+     *
+     * @return Setup Priority field in LSPA Object
+     */
+    byte getSetupPriority();
+
+    /**
+     * Sets Setup Priority field in LSPA Object.
+     *
+     * @param value Setup Priority field
+     */
+    void setSetupPriority(byte value);
+
+    /**
+     * Returns Hold Priority field in LSPA Object.
+     *
+     * @return Hold Priority field in LSPA Object
+     */
+    byte getHoldPriority();
+
+    /**
+     * Sets Hold Priority field in LSPA Object.
+     *
+     * @param value Hold Priority field
+     */
+    void setHoldPriority(byte value);
+
+    /**
+     * Returns list of Optional Tlvs in LSPA Object.
+     *
+     * @return list of Optional Tlvs in LSPA Object
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets Optional Tlvs in LSPA Object.
+     *
+     * @param llOptionalTlv Optional Tlvs in LSPA Object
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of LSPA object.
+     */
+    void print();
+
+    /**
+     * Writes the LSPA Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing LSPA object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build bandwidth object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds LSPA Object.
+         *
+         * @return LSPA Object
+         * @throws PcepParseException while building LSPA object.
+         */
+        PcepLspaObject build() throws PcepParseException;
+
+        /**
+         * Returns LSPA object header.
+         *
+         * @return LSPA object header
+         */
+        PcepObjectHeader getLspaObjHeader();
+
+        /**
+         * Sets LSPA object header and returns its builder.
+         *
+         * @param obj LSPA object header
+         * @return Builder by setting LSPA object header
+         */
+        Builder setLspaObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns L flag in LSPA Object.
+         *
+         * @return L flag in LSPA Object
+         */
+        boolean getLFlag();
+
+        /**
+         * Sets L flag in LSPA Object and return its builder.
+         *
+         * @param value L flag in LSPA Object
+         * @return Builder by setting L flag
+         */
+        Builder setLFlag(boolean value);
+
+        /**
+         * Returns Exclude Any field in LSPA Object.
+         *
+         * @return Exclude Any field in LSPA Object
+         */
+        int getExcludeAny();
+
+        /**
+         * Sets Exclude Any field in LSPA Object and return its builder.
+         *
+         * @param value Exclude Any field in LSPA Object
+         * @return Builder by setting Exclude Any field
+         */
+        Builder setExcludeAny(int value);
+
+        /**
+         * Returns Include Any field in LSPA Object.
+         *
+         * @return Include Any field in LSPA Object
+         */
+        int getIncludeAny();
+
+        /**
+         * Sets Include Any field in LSPA Object and return its builder.
+         *
+         * @param value Include Any field in LSPA Object
+         * @return Builder by setting Include Any field
+         */
+        Builder setIncludeAny(int value);
+
+        /**
+         * Returns Include All field in LSPA Object.
+         *
+         * @return Include All field in LSPA Object
+         */
+        int getIncludeAll();
+
+        /**
+         * Sets Include All field in LSPA Object and return its builder.
+         *
+         * @param value Include All field in LSPA Object
+         * @return Builder by setting Include All field
+         */
+        Builder setIncludeAll(int value);
+
+        /**
+         * Returns Setup Priority field in LSPA Object.
+         *
+         * @return Setup Priority field in LSPA Object
+         */
+        byte getSetupPriority();
+
+        /**
+         * Sets Setup Priority field in LSPA Object and return its builder.
+         *
+         * @param value Setup Priority field in LSPA Object
+         * @return Builder by setting Setup Priority field
+         */
+        Builder setSetupPriority(byte value);
+
+        /**
+         * Returns Hold Priority field in LSPA Object.
+         *
+         * @return Hold Priority field in LSPA Object
+         */
+        byte getHoldPriority();
+
+        /**
+         * Sets Hold Priority field in LSPA Object and return its builder.
+         *
+         * @param value Hold Priority field in LSPA Object
+         * @return Builder by setting Hold Priority field
+         */
+        Builder setHoldPriority(byte value);
+
+        /**
+         * Returns list of Optional Tlvs in LSPA Object.
+         *
+         * @return list of Optional Tlvs in LSPA Object
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs in LSPA Object.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in LSPA object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in LSPA object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessage.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessage.java
new file mode 100755
index 0000000..a6a71a1
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessage.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Messages.
+ */
+public interface PcepMessage extends PcepObject {
+
+    @Override
+    PcepVersion getVersion();
+
+    /**
+     * Returns Type of PCEP Message.
+     *
+     * @return Type of PCEP Message
+     */
+    PcepType getType();
+
+    /**
+     * Prints attributes of PCEP Messages.
+     */
+    void print();
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build PCEP Message.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PCEP Message.
+         *
+         * @return PCEP Message
+         * @throws PcepParseException when build fails to create PCEP message
+         */
+        PcepMessage build() throws PcepParseException;
+
+        /**
+         * Returns Version of PCEP Message.
+         *
+         * @return Version of PCEP Message
+         */
+        PcepVersion getVersion();
+
+        /**
+         * Returns Type of PCEP Message.
+         *
+         * @return Type of PCEP Message
+         */
+        PcepType getType();
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java
new file mode 100755
index 0000000..591a033
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageReader.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Message Reader.
+ */
+public interface PcepMessageReader<T> {
+
+    /**
+     * Reads the Objects in the PCEP Message and Returns PCEP Message.
+     *
+     * @param bb Channel Buffer
+     * @return PCEP Message
+     * @throws PcepParseException while parsing PCEP message.
+     * @throws PcepParseException when received message is empty
+     */
+    T readFrom(ChannelBuffer bb) throws PcepParseException;
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageWriter.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageWriter.java
new file mode 100755
index 0000000..cb16db2
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMessageWriter.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Message Writer.
+ */
+public interface PcepMessageWriter<T> {
+
+    /**
+     * Writes the Objects of the PCEP Message into Channel Buffer.
+     *
+     * @param bb Channel Buffer
+     * @param message PCEP Message
+     * @throws PcepParseException while writing PCEP message.
+     */
+    public void write(ChannelBuffer bb, T message) throws PcepParseException;
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java
new file mode 100755
index 0000000..108d225
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMetricObject.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+
+/**
+ * Abstraction of an entity providing PCEP Metric Object.
+ */
+public interface PcepMetricObject {
+
+    /**
+     * Returns Metric value in Metric Object.
+     *
+     * @return Metric value
+     */
+    int getMetricVal();
+
+    /**
+     * Sets Metric value in Metric Object with specified value.
+     *
+     * @param value Metric value
+     */
+    void setMetricVal(int value);
+
+    /**
+     * Returns Y flag in Metric Object.
+     *
+     * @return Y flag in Metric Object
+     */
+    byte getYFlag();
+
+    /**
+     * Sets Y flag in Metric Object with specified value.
+     *
+     * @param value Y flag
+     */
+    void setYFlag(byte value);
+
+    /**
+     * Returns C flag in Metric Object.
+     *
+     * @return C flag in Metric Object
+     */
+    boolean getCFlag();
+
+    /**
+     * Sets C flag in Metric Object with specified value.
+     *
+     * @param value C flag
+     */
+    void setCFlag(boolean value);
+
+    /**
+     * Returns B flag in Metric Object.
+     *
+     * @return B flag in Metric Object
+     */
+    boolean getBFlag();
+
+    /**
+     * Sets B flag in Metric Object with specified value.
+     *
+     * @param value B flag
+     */
+    void setBFlag(boolean value);
+
+    /**
+     * Returns BType field in Metric Object.
+     *
+     * @return BType field in Metric Object
+     */
+    byte getBType();
+
+    /**
+     * Sets BType field in Metric Object with specified value.
+     *
+     * @param value BType field
+     */
+    void setBType(byte value);
+
+    /**
+     * Prints attributes of Metric object.
+     */
+    void print();
+
+    /**
+     * Writes the Metric Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing METRIC object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Metric object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds Metric Object.
+         *
+         * @return Metric Object
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcepMetricObject build() throws PcepParseException;
+
+        /**
+         * Returns Metric object header.
+         *
+         * @return Metric object header
+         */
+        PcepObjectHeader getMetricObjHeader();
+
+        /**
+         * Sets Metric object header and returns its builder.
+         *
+         * @param obj Metric object header
+         * @return Builder by setting Metric object header
+         */
+        Builder setMetricObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Metric value in Metric Object.
+         *
+         * @return Metric value
+         */
+        int getMetricVal();
+
+        /**
+         * Sets Metric Value in Metric Object and returns its builder.
+         *
+         * @param value Metric Value
+         * @return Builder by setting Metric Value
+         */
+        Builder setMetricVal(int value);
+
+        /**
+         * Returns Flags in Metric Object.
+         *
+         * @return Flags in Metric Object
+         */
+        byte getYFlag();
+
+        /**
+         * Sets Flags in Metric Object and returns its builder.
+         *
+         * @param value Flags
+         * @return Builder by setting Flags
+         */
+        Builder setYFlag(byte value);
+
+        /**
+         * Returns C flag in Metric Object.
+         *
+         * @return C flag in Metric Object
+         */
+        boolean getCFlag();
+
+        /**
+         * Sets C flag in Metric Object and returns its builder.
+         *
+         * @param value C flag
+         * @return Builder by setting C flag
+         */
+        Builder setCFlag(boolean value);
+
+        /**
+         * Returns B flag in Metric Object.
+         *
+         * @return B flag in Metric Object
+         */
+        boolean getBFlag();
+
+        /**
+         * Sets B flag in Metric Object and returns its builder.
+         *
+         * @param value B flag
+         * @return Builder by setting B flag
+         */
+        Builder setBFlag(boolean value);
+
+        /**
+         * Returns BType field in Metric Object.
+         *
+         * @return BType field in Metric Object
+         */
+        byte getBType();
+
+        /**
+         * Sets B Type field in Metric Object and returns its builder.
+         *
+         * @param value B Type field
+         * @return Builder by setting B Type field
+         */
+        Builder setBType(byte value);
+
+        /**
+         * Sets P flag in Metric object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Metric object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMsgPath.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMsgPath.java
new file mode 100755
index 0000000..de2d19a
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepMsgPath.java
@@ -0,0 +1,107 @@
+package org.onosproject.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity Provides PCEP Message PAth for update message.
+ * Reference :PCE extensions for stateful draft-ietf-pce-stateful-pce-10.
+ */
+public interface PcepMsgPath {
+
+    /**
+     * Returns object of PcepEroObject.
+     *
+     * @return eroObject
+     */
+    PcepEroObject getEroObject();
+
+    /**
+     * Returns object of PcepAttribute.
+     *
+     * @return pcepAttribute
+     */
+    PcepAttribute getPcepAttribute();
+
+    /**
+     * Sets PcepEroObject.
+     *
+     * @param eroObject PCEP ERO Object.
+     */
+    void setEroObject(PcepEroObject eroObject);
+
+    /**
+     * Sets PcepAttribute.
+     *
+     * @param pcepAttribute PCEP-Attribute.
+     */
+    void setPcepAttribute(PcepAttribute pcepAttribute);
+
+    /**
+     * reads ERO object and attribute list.
+     *
+     * @param bb of type channel buffer
+     * @return PcepMsgPath
+     * @throws PcepParseException while parsing Message Path from Channel Buffer.
+     */
+    public PcepMsgPath read(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * writes ERO object and attribute list to channel.
+     *
+     * @param bb of type channel buffer
+     * @return object length index
+     * @throws PcepParseException while writing Message Path into Channel Buffer.
+     */
+
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Prints the attributes of PCEP message path.
+     */
+    void print();
+
+    /**
+     * Builder interface with get and set functions to build PcepMsgPath.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepMsgPath.
+         *
+         * @return PcepMsgPath
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcepMsgPath build() throws PcepParseException;
+
+        /**
+         * Returns object of PcepEroObject.
+         *
+         * @return PcepEroObject
+         */
+        PcepEroObject getEroObject();
+
+        /**
+         * Returns object of PcepAttribute.
+         *
+         * @return pcepAttribute
+         */
+        PcepAttribute getPcepAttribute();
+
+        /**
+         * Sets PcepEroObject.
+         *
+         * @param eroObject PcepEroObject
+         * @return Builder by setting ERO object.
+         */
+        Builder setEroObject(PcepEroObject eroObject);
+
+        /**
+         * Sets PcepAttribute.
+         *
+         * @param pcepAttribute PCEP-Attribute
+         * @return Builder by setting PCEP-Attribute.
+         */
+        Builder setPcepAttribute(PcepAttribute pcepAttribute);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepNai.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepNai.java
new file mode 100755
index 0000000..196c513
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepNai.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Abstraction of an entity provides NAI information in SR ERO Object.
+ */
+public interface PcepNai {
+
+    /**
+     *  To get the ST type of the NAI information.
+     *
+     *  @return type of ST info
+     */
+    byte getType();
+
+    /**
+     *  To write the object information to channelBuffer.
+     *
+     *  @param cb of type channel buffer
+     *  @return length of written bytes.
+     */
+    int write(ChannelBuffer cb);
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepObject.java
new file mode 100755
index 0000000..26dad56
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepObject.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+/**
+ * Abstraction of an entity providing PCEP Object.
+ */
+public interface PcepObject extends Writeable {
+
+    /**
+     * Returns Version of PCEP Object.
+     *
+     * @return Version of PCEP Object
+     */
+    PcepVersion getVersion();
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenMsg.java
new file mode 100755
index 0000000..afa6c8b
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenMsg.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Open Message.
+ */
+public interface PcepOpenMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Sets OpenObject in Open Message with Specified Obj.
+     *
+     * @param obj OpenObject
+     */
+    void setPcepOpenObject(PcepOpenObject obj);
+
+    /**
+     * Returns OpenObject in Open Message.
+     *
+     * @return OpenObject in Open Message
+     */
+    PcepOpenObject getPcepOpenObject();
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer);
+
+    /**
+     * Builder interface with get and set functions to build Open message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepOpenMsg build() throws PcepParseException;
+
+        /**
+         * Sets Open Object in Open Message and return its builder.
+         *
+         * @param obj Open Object
+         * @return builder by setting Open Object
+         */
+        Builder setPcepOpenObj(PcepOpenObject obj);
+
+        /**
+         * Returns OpenObject in Open Message.
+         *
+         * @return OpenObject in Open Message
+         */
+        PcepOpenObject getPcepOpenObj();
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenObject.java
new file mode 100755
index 0000000..49c8184
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepOpenObject.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP Open Object.
+ */
+public interface PcepOpenObject {
+
+    /**
+     * Returns Open object header.
+     *
+     * @return Open object header
+     */
+    PcepObjectHeader getOpenObjHeader();
+
+    /**
+     * Sets Open object header in Open Object.
+     *
+     * @param obj Open object header
+     */
+    void setOpenObjHeader(PcepObjectHeader obj);
+
+    /**
+     * Returns version of Open Object.
+     *
+     * @return Version of Open Object
+     */
+    PcepVersion getVersion();
+
+    /**
+     * Returns KeepAlive Time in Open Object.
+     *
+     * @return KeepAlive Time in Open Object
+     */
+    byte getKeepAliveTime();
+
+    /**
+     * Sets KeepAlive Time in Open Object with specified value.
+     *
+     * @param value KeepAlive Time
+     */
+    void setKeepAliveTime(byte value);
+
+    /**
+     * Returns Dead Time in Open Object.
+     *
+     * @return Dead Time in Open Object
+     */
+    byte getDeadTime();
+
+    /**
+     * Sets Dead Time in Open Object with specified value.
+     *
+     * @param value Dead Time
+     */
+    void setDeadTime(byte value);
+
+    /**
+     * Returns SessionId in Open Object.
+     *
+     * @return SessionId in Open Object
+     */
+    byte getSessionId();
+
+    /**
+     * Sets SessionId in Open Object with specified value.
+     *
+     * @param value SessionId
+     */
+    void setSessionId(byte value);
+
+    /**
+     * Returns list of Optional Tlvs in Open Object.
+     *
+     * @return list of Optional Tlvs
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets list of Optional Tlvs in Open Object.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of Open object.
+     */
+    void print();
+
+    /**
+     * Writes the Open into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing Open Object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Open object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds Open Object.
+         *
+         * @return Open Object
+         * @throws PcepParseException while building PCEP-Open object
+         */
+        PcepOpenObject build() throws PcepParseException;
+
+        /**
+         * Returns Open object header.
+         *
+         * @return Open object header
+         */
+        PcepObjectHeader getOpenObjHeader();
+
+        /**
+         * Sets Open object header and returns its builder.
+         *
+         * @param obj Open object header
+         * @return Builder by setting Open object header
+         */
+        Builder setOpenObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns KeepAlive Time in Open Object.
+         *
+         * @return KeepAlive Time in Open Object
+         */
+        byte getKeepAliveTime();
+
+        /**
+         * Sets KeepAlive Time and returns its builder.
+         *
+         * @param value KeepAlive Time
+         * @return Builder by setting KeepAlive Time
+         */
+        Builder setKeepAliveTime(byte value);
+
+        /**
+         * Returns Dead Time in Open Object.
+         *
+         * @return Dead Time in Open Object
+         */
+        byte getDeadTime();
+
+        /**
+         * Sets Dead Time and returns its builder.
+         *
+         * @param value Dead Time
+         * @return Builder by setting Dead Time
+         */
+        Builder setDeadTime(byte value);
+
+        /**
+         * Returns SessionId in Open Object.
+         *
+         * @return SessionId in Open Object
+         */
+        byte getSessionId();
+
+        /**
+         * Sets SessionId and returns its builder.
+         *
+         * @param value SessionId
+         * @return Builder by setting SessionId
+         */
+        Builder setSessionId(byte value);
+
+        /**
+         * Returns list of Optional Tlvs in Open Object.
+         *
+         * @return list of Optional Tlvs in Open Object
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs and return its Builder.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in Open object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in Open object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRPObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRPObject.java
new file mode 100755
index 0000000..bdb69c3
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRPObject.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP RP Object.
+ */
+public interface PcepRPObject {
+
+    /**
+     * Returns RequestId Number in RP Object.
+     *
+     * @return RequestId Number in RP Object
+     */
+    int getRequestIdNum();
+
+    /**
+     * Sets RequestId Number with specified value.
+     *
+     * @param value RequestId Number
+     */
+    void setRequestIdNum(int value);
+
+    /**
+     * Returns O flag in RP Object.
+     *
+     * @return O flag in RP Object
+     */
+    boolean getOFlag();
+
+    /**
+     * Sets O flag with specified value.
+     *
+     * @param value O flag
+     */
+    void setOFlag(boolean value);
+
+    /**
+     * Returns B flag in RP Object.
+     *
+     * @return B flag in RP Object
+     */
+    boolean getBFlag();
+
+    /**
+     * Sets B flag with specified value.
+     *
+     * @param value B flag
+     */
+    void setBFlag(boolean value);
+
+    /**
+     * Returns R flag in RP Object.
+     *
+     * @return R flag in RP Object
+     */
+    boolean getRFlag();
+
+    /**
+     * Sets R flag with specified value.
+     *
+     * @param value R flag
+     */
+    void setRFlag(boolean value);
+
+    /**
+     * Returns Priority Flag in RP Object.
+     *
+     * @return Priority Flag in RP Object
+     */
+    byte getPriFlag();
+
+    /**
+     * Sets Priority Flag with specified value.
+     *
+     * @param value Priority Flag
+     */
+    void setPriFlag(byte value);
+
+    /**
+     * Returns list of Optional Tlvs in RP Object.
+     *
+     * @return list of Optional Tlvs in RP Object
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets list of Optional Tlvs in RP Object and returns its builder.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of RP object.
+     */
+    void print();
+
+    /**
+     * Writes the RP Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException while writing RP object into Channel Buffer.
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build bandwidth object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds RP Object.
+         *
+         * @return RP Object
+         */
+        PcepRPObject build();
+
+        /**
+         * Returns RP object header.
+         *
+         * @return RP object header
+         */
+        PcepObjectHeader getRPObjHeader();
+
+        /**
+         * Sets RP object header and returns its builder.
+         *
+         * @param obj RP object header
+         * @return Builder by setting RP object header
+         */
+        Builder setRPObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns Request Id Number in RP Object.
+         *
+         * @return Request Id Number in RP Object
+         */
+        int getRequestIdNum();
+
+        /**
+         * Sets Request Id Number and returns its builder.
+         *
+         * @param value Request Id Number
+         * @return Builder by setting Request Id Number
+         */
+        Builder setRequestIdNum(int value);
+
+        /**
+         * Returns O flag in RP Object.
+         *
+         * @return O flag in RP Object
+         */
+        boolean getOFlag();
+
+        /**
+         * Sets O flag and returns its builder.
+         *
+         * @param value O flag
+         * @return Builder by setting O flag
+         */
+        Builder setOFlag(boolean value);
+
+        /**
+         * Returns B flag in RP Object.
+         *
+         * @return B flag in RP Object
+         */
+        boolean getBFlag();
+
+        /**
+         * Sets B flag and returns its builder.
+         *
+         * @param value B flag
+         * @return Builder by setting B flag
+         */
+        Builder setBFlag(boolean value);
+
+        /**
+         * Returns R flag in RP Object.
+         *
+         * @return R flag in RP Object
+         */
+        boolean getRFlag();
+
+        /**
+         * Sets R flag and returns its builder.
+         *
+         * @param value R flag
+         * @return Builder by setting R flag
+         */
+        Builder setRFlag(boolean value);
+
+        /**
+         * Returns Priority Flag in RP Object.
+         *
+         * @return Priority Flag in RP Object
+         */
+        byte getPriFlag();
+
+        /**
+         * Sets Priority Flag and returns its builder.
+         *
+         * @param value Priority Flag
+         * @return Builder by setting Priority Flag
+         */
+        Builder setPriFlag(byte value);
+
+        /**
+         * Returns list of Optional Tlvs in RP Object.
+         *
+         * @return list of Optional Tlvs
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs and returns its builder.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return Builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in RP object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in RP object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepReportMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepReportMsg.java
new file mode 100755
index 0000000..ed9d71f
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepReportMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Report Message.
+ */
+public interface PcepReportMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns PcepStateReport list.
+     *
+     * @return list of PcepStateReport
+     */
+    LinkedList<PcepStateReport> getStateReportList();
+
+    /**
+     * Sets StateReportList.
+     *
+     * @param llStateReportList list of PcepStateReport.
+     */
+    void setStateReportList(LinkedList<PcepStateReport> llStateReportList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build Report message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepReportMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns StateReportList.
+         *
+         * @return StateReportList.
+         */
+        LinkedList<PcepStateReport> getStateReportList();
+
+        /**
+         * Sets list of PcepStateReport and returns builder.
+         *
+         * @param llStateReportList list of PcepStateReport.
+         * @return Builder by setting list of PcepStateReport.
+         */
+        Builder setStateReportList(LinkedList<PcepStateReport> llStateReportList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRroObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRroObject.java
new file mode 100755
index 0000000..a2d725e
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepRroObject.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP RRO Object.
+ */
+public interface PcepRroObject {
+
+    /**
+     * Returns list of SubObjects.
+     *
+     * @return list of SubObjects
+     */
+    LinkedList<PcepValueType> getSubObjects();
+
+    /**
+     * Sets list of SubObjects and return its builder.
+     *
+     * @param llSubObjects list of SubObjects
+     */
+    void setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+    /**
+     * Prints attributes of RRO object.
+     */
+    void print();
+
+    /**
+     * Writes the RRO Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException when object header failed to write in channel buffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build RRO object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds RRO Object.
+         *
+         * @return RRO Object
+         */
+        PcepRroObject build();
+
+        /**
+         * Returns RRO object header.
+         *
+         * @return RRO object header
+         */
+        PcepObjectHeader getRroObjHeader();
+
+        /**
+         * Sets RRO object header and returns its builder.
+         *
+         * @param obj RRO object header
+         * @return Builder by setting RRO object header
+         */
+        Builder setRroObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns list of SubObjects.
+         *
+         * @return list of SubObjects
+         */
+        LinkedList<PcepValueType> getSubObjects();
+
+        /**
+         * Sets list of SubObjects in RRO Object and returns its builder.
+         *
+         * @param llSubObjects list of SubObjects
+         * @return Builder by setting list of SubObjects
+         */
+        Builder setSubObjects(LinkedList<PcepValueType> llSubObjects);
+
+        /**
+         * Sets P flag in RRO object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in RRO object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java
new file mode 100755
index 0000000..0080d02
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepSrpObject.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP SRP Object.
+ */
+public interface PcepSrpObject {
+
+    /**
+     * Returns SRP ID of SRP Object.
+     *
+     * @return SRP ID of SRP Object
+     */
+    int getSrpID();
+
+    /**
+     * Sets SRP ID with specified value.
+     *
+     * @param srpID SRP ID of SRP Object
+     */
+    void setSrpID(int srpID);
+
+    /**
+     * Returns R flag of SRP Object.
+     *
+     * @return R flag of SRP Object
+     */
+    boolean getRFlag();
+
+    /**
+     * Sets R flag with specified value.
+     *
+     * @param bRFlag R Flag of SRP Object
+     */
+    void setRFlag(boolean bRFlag);
+
+    /**
+     * sets the optional TLvs.
+     *
+     * @param llOptionalTlv list of optional tlvs
+     */
+    public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Returns list of optional tlvs.
+     *
+     * @return llOptionalTlv list of optional tlvs
+     */
+    public LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Prints attributes of SRP object.
+     */
+    void print();
+
+    /**
+     * Writes the SRP Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException when tlv is null
+     */
+    int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build SRP object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds SRP Object.
+         *
+         * @return SRP Object
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcepSrpObject build() throws PcepParseException;
+
+        /**
+         * Returns SRP object header.
+         *
+         * @return SRP object header
+         */
+        PcepObjectHeader getSrpObjHeader();
+
+        /**
+         * Sets SRP object header and returns its builder.
+         *
+         * @param obj SRP object header
+         * @return Builder by setting SRP object header
+         */
+        Builder setSrpObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns SRP ID of SRP Object.
+         *
+         * @return SRP ID of SRP Object
+         */
+        int getSrpID();
+
+        /**
+         * Sets SRP ID and returns its builder.
+         *
+         * @param srpID SRP ID
+         * @return Builder by setting SRP ID
+         */
+        Builder setSrpID(int srpID);
+
+        /**
+         * Returns R flag of SRP Object.
+         *
+         * @return R flag of SRP Object
+         */
+        boolean getRFlag();
+
+        /**
+         * Sets R flag and returns its builder.
+         *
+         * @param bRFlag R flag
+         * @return Builder by setting R flag
+         */
+        Builder setRFlag(boolean bRFlag);
+
+        /**
+         * Returns list of optional tlvs.
+         *
+         * @return llOptionalTlv list of optional tlvs
+         */
+        public LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * sets the optional TLvs.
+         *
+         * @param llOptionalTlv List of optional tlv
+         * @return builder by setting list of optional tlv.
+         */
+        public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in SRP object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in SRP object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepStateReport.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepStateReport.java
new file mode 100755
index 0000000..5a0bce4
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepStateReport.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity provides State Report for PCEP Report Message.
+ */
+public interface PcepStateReport {
+
+    /**
+     * Provides PCEP Message path for report message.
+     */
+    public interface PcepMsgPath {
+
+        /**
+         * Returns PcepEroObject.
+         *
+         * @return eroObj
+         */
+        PcepEroObject getEroObject();
+
+        /**
+         * Sets PcepEroObject.
+         *
+         * @param eroObject Ero Object
+         */
+        void setEroObject(PcepEroObject eroObject);
+
+        /**
+         * Returns PcepAttribute.
+         *
+         * @return attrList
+         */
+        PcepAttribute getPcepAttribute();
+
+        /**
+         * Sets PcepAttribute.
+         *
+         * @param pcepAttribute Pcep Attribute object
+         */
+        void setPcepAttribute(PcepAttribute pcepAttribute);
+
+        /**
+         * Returns PcepRroObject.
+         *
+         * @return rroObj
+         */
+        PcepRroObject getRroObject();
+
+        /**
+         * Sets PcepRroObject.
+         *
+         * @param rroObject Rro object
+         */
+        void setRroObject(PcepRroObject rroObject);
+
+        /**
+         * Returns PcepBandwidthObject.
+         *
+         * @return bandwidth object
+         */
+        PcepBandwidthObject getBandwidthObject();
+
+        /**
+         * Sets PcepBandwidthObject.
+         *
+         * @param bandwidth bandwidth object
+         */
+        void setBandwidthObject(PcepBandwidthObject bandwidth);
+
+        /**
+         * Reads all the Objects for PCEP Message Path.
+         *
+         * @param bb of type channel buffer
+         * @return PCEP Message path
+         * @throws PcepParseException when invalid buffer received
+         */
+        public PcepMsgPath read(ChannelBuffer bb) throws PcepParseException;
+
+        /**
+         * Writes all the objects for pcep message path.
+         *
+         * @param bb of type channel buffer.
+         * @return object length index
+         * @throws PcepParseException when mandatory object is not set
+         */
+        public int write(ChannelBuffer bb) throws PcepParseException;
+
+        /***
+         * Prints the attribute of PCEP Message Path.
+         */
+        public void print();
+
+    }
+
+    /**
+     * Returns PcepSrpObject.
+     *
+     * @return srpObject
+     */
+    PcepSrpObject getSrpObject();
+
+    /**
+     * Returns PcepLspObject.
+     *
+     * @return lspObject
+     */
+    PcepLspObject getLspObject();
+
+    /**
+     * Returns PcepMsgPath.
+     *
+     * @return msgPath
+     */
+    PcepMsgPath getMsgPath();
+
+    /**
+     * Sets the SRP Object.
+     *
+     * @param srpObj Pcep Srp Object
+     */
+    void setSrpObject(PcepSrpObject srpObj);
+
+    /**
+     * Sets the LSP Object.
+     *
+     * @param lspObject Pcep Lsp Object
+     */
+    void setLspObject(PcepLspObject lspObject);
+
+    /**
+     * Sets the Path Object.
+     *
+     * @param msgPath Pcep MsgPath object
+     */
+    void setMsgPath(PcepMsgPath msgPath);
+
+    /**
+     * Prints the attribute of PCEP state report.
+     */
+    public void print();
+
+    /**
+     * Builder interface with get and set functions to build PcepStateReport.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepStateReport.
+         *
+         * @return PcepStateReport
+         * @throws PcepParseException when mandatory object is not set
+         */
+        PcepStateReport build() throws PcepParseException;
+
+        /**
+         * Returns PcepSrpObject.
+         *
+         * @return srpObject
+         */
+        PcepSrpObject getSrpObject();
+
+        /**
+         * Returns PcepLspObject.
+         *
+         * @return lspObject
+         */
+        PcepLspObject getLspObject();
+
+        /**
+         * Returns PcepMsgPath.
+         *
+         * @return msgPath
+         */
+        PcepMsgPath getMsgPath();
+
+        /**
+         * Sets the SRP Object.
+         *
+         * @param srpObj Pcep Srp Object
+         * @return builder by setting PcepSrpObject
+         */
+        Builder setSrpObject(PcepSrpObject srpObj);
+
+        /**
+         * Sets the LSP Object.
+         *
+         * @param lspObject Pcep Lsp Object
+         * @return builder by setting PcepLspObject
+         */
+        Builder setLspObject(PcepLspObject lspObject);
+
+        /**
+         * Sets the Path Object.
+         *
+         * @param msgPath Pcep MsgPath object
+         * @return builder by setting PcepMsgPath
+         */
+        Builder setMsgPath(PcepMsgPath msgPath);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java
new file mode 100755
index 0000000..7b40dfe
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEObject.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.types.PcepObjectHeader;
+import org.onosproject.pcepio.types.PcepValueType;
+
+/**
+ * Abstraction of an entity providing PCEP TE Object.
+ */
+public interface PcepTEObject {
+
+    /**
+     * Returns TE object header.
+     *
+     * @return TE object header
+     */
+    PcepObjectHeader getTEObjHeader();
+
+    /**
+     * Sets TE Object header.
+     *
+     * @param obj TE Object header
+     */
+    void setTEObjHeader(PcepObjectHeader obj);
+
+    /**
+     * Returns ProtocolId in TE Object.
+     *
+     * @return ProtocolId in TE Object
+     */
+    byte getProtocolId();
+
+    /**
+     * Sets ProtocolId in TE Object.
+     *
+     * @param yProtId ProtocolId in TE Object
+     */
+    void setProtocolId(byte yProtId);
+
+    /**
+     * Returns R flag in TE Object.
+     *
+     * @return R flag in TE Object
+     */
+    boolean getRFlag();
+
+    /**
+     * Sets R flag in TE Object.
+     *
+     * @param bRFlag R flag in TE Object
+     */
+    void setRFlag(boolean bRFlag);
+
+    /**
+     * Returns S flag in TE Object.
+     *
+     * @return S flag in TE Object
+     */
+    boolean getSFlag();
+
+    /**
+     * Sets S flag in TE Object.
+     *
+     * @param bSFlag S flag in TE Object
+     */
+    void setSFlag(boolean bSFlag);
+
+    /**
+     * Returns TE ID in TE Object.
+     *
+     * @return TE ID in TE Object
+     */
+    int getTEId();
+
+    /**
+     * Sets TE ID in TE Object.
+     *
+     * @param iTEId TE ID in TE Object
+     */
+    void setTEId(int iTEId);
+
+    /**
+     * Returns list of Optional Tlvs in TE Object.
+     *
+     * @return list of Optional Tlvs
+     */
+    LinkedList<PcepValueType> getOptionalTlv();
+
+    /**
+     * Sets list of Optional Tlvs in TE Object.
+     *
+     * @param llOptionalTlv list of Optional Tlvs
+     */
+    void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+    /**
+     * Prints attributes of TE object.
+     */
+    void print();
+
+    /**
+     * Writes the TE Object into channel buffer.
+     *
+     * @param bb channel buffer
+     * @return Returns the writerIndex of this buffer
+     * @throws PcepParseException when obj header is not written to channel buffer
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build TE object.
+     */
+    public interface Builder {
+
+        /**
+         * Builds TE Object.
+         *
+         * @return TE Object
+         */
+        PcepTEObject build();
+
+        /**
+         * Returns TE object header.
+         *
+         * @return TE object header
+         */
+        PcepObjectHeader getTEObjHeader();
+
+        /**
+         * Sets TE object header and returns its builder.
+         *
+         * @param obj TE object header
+         * @return Builder by setting TE object header
+         */
+        Builder setTEObjHeader(PcepObjectHeader obj);
+
+        /**
+         * Returns ProtocolId in TE Object.
+         *
+         * @return ProtocolId in TE Object
+         */
+        byte getProtocolId();
+
+        /**
+         * Sets ProtocolId in TE Object and returns its builder.
+         *
+         * @param yProtId ProtocolId in TE Object
+         * @return Builder by setting ProtocolId
+         */
+        Builder setProtocolId(byte yProtId);
+
+        /**
+         * Returns R flag in TE Object.
+         *
+         * @return R flag in TE Object
+         */
+        boolean getRFlag();
+
+        /**
+         * Sets R flag in TE Object and returns its builder.
+         *
+         * @param bRFlag R flag in TE Object
+         * @return Builder by setting R flag
+         */
+        Builder setRFlag(boolean bRFlag);
+
+        /**
+         * Returns S flag in TE Object.
+         *
+         * @return S flag in TE Object
+         */
+        boolean getSFlag();
+
+        /**
+         * Sets S flag in TE Object and returns its builder.
+         *
+         * @param bSFlag S flag in TE Object
+         * @return Builder by setting S flag
+         */
+        Builder setSFlag(boolean bSFlag);
+
+        /**
+         * Returns TE ID in TE Object.
+         *
+         * @return TE ID in TE Object
+         */
+        int getTEId();
+
+        /**
+         * Sets TE ID in TE Object and returns its builder.
+         *
+         * @param iTEId TE ID in TE Object
+         * @return Builder by setting TE ID
+         */
+        Builder setTEId(int iTEId);
+
+        /**
+         * Returns list of Optional Tlvs in TE Object.
+         *
+         * @return list of Optional Tlvs
+         */
+        LinkedList<PcepValueType> getOptionalTlv();
+
+        /**
+         * Sets list of Optional Tlvs in TE Object and returns its builder.
+         *
+         * @param llOptionalTlv list of Optional Tlvs
+         * @return Builder by setting list of Optional Tlvs
+         */
+        Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
+
+        /**
+         * Sets P flag in TE object header and returns its builder.
+         *
+         * @param value boolean value to set P flag
+         * @return Builder by setting P flag
+         */
+        Builder setPFlag(boolean value);
+
+        /**
+         * Sets I flag in TE object header and returns its builder.
+         *
+         * @param value boolean value to set I flag
+         * @return Builder by setting I flag
+         */
+        Builder setIFlag(boolean value);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java
new file mode 100755
index 0000000..bcdd011
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepTEReportMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP TE Report Message.
+ */
+public interface PcepTEReportMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns list of PCEP TE Objects.
+     *
+     * @return list of PCEP TE Objects
+     */
+    LinkedList<PcepTEObject> getTEReportList();
+
+    /**
+     * Sets list of Optional Tlvs in TE Report Message.
+     *
+     * @param llTEReportList list of optional Tlvs
+     */
+    void setTEReportList(LinkedList<PcepTEObject> llTEReportList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with get and set functions to build TE Report message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepTEReportMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns list of Optional Tlv in TE Report Message.
+         *
+         * @return list of Optional Tlv
+         */
+        LinkedList<PcepTEObject> getTEReportList();
+
+        /**
+         * Sets list of Optional Tlvs and returns its builder.
+         *
+         * @param llTEReportList list of Optional Tlvs
+         * @return Builder object for TE report message
+         */
+        Builder setTEReportList(LinkedList<PcepTEObject> llTEReportList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java
new file mode 100755
index 0000000..450fdfa
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepType.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+/**
+ * Enum to Provide the Different types of PCEP messages.
+ */
+public enum PcepType {
+
+    NONE(0), OPEN(1), KEEP_ALIVE(2), PATH_COMPUTATION_REQUEST(3), PATH_COMPUTATION_REPLY(4),
+    NOTIFICATION(5), ERROR(6), CLOSE(7), REPORT(10), UPDATE(11), INITIATE(12), LABEL_UPDATE(13),
+    TE_REPORT(14), LABEL_RANGE_RESERV(15), MAX(16), END(17);
+
+    int iValue;
+
+    /**
+     * Assign iValue with the value iVal as the types of PCEP message.
+     *
+     * @param iVal type of pcep message
+     */
+    PcepType(int iVal) {
+
+        iValue = iVal;
+    }
+
+    /**
+     * Returns iValue as type of PCEP message.
+     *
+     * @return iValue type of pcep message
+     */
+    public byte getType() {
+
+        return (byte) iValue;
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateMsg.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateMsg.java
new file mode 100755
index 0000000..6297f3c
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateMsg.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import java.util.LinkedList;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing PCEP Update Message.
+ */
+public interface PcepUpdateMsg extends PcepObject, PcepMessage {
+
+    @Override
+    PcepVersion getVersion();
+
+    @Override
+    PcepType getType();
+
+    /**
+     * Returns the update request list for PCEP Update Message.
+     *
+     * @return list of Update Requests
+     */
+    LinkedList<PcepUpdateRequest> getUpdateRequestList();
+
+    /**
+     * Sets the update request list for PCEP update message.
+     *
+     * @param llUpdateRequestList is a list of PCEP Update Requests
+     */
+    void setUpdateRequestList(LinkedList<PcepUpdateRequest> llUpdateRequestList);
+
+    @Override
+    void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
+
+    /**
+     * Builder interface with Get and Set Functions to build the PCEP update Message.
+     */
+    public interface Builder extends PcepMessage.Builder {
+
+        @Override
+        PcepUpdateMsg build();
+
+        @Override
+        PcepVersion getVersion();
+
+        @Override
+        PcepType getType();
+
+        /**
+         * Returns the update request list for the PCEP update message.
+         *
+         * @return list of Update Requests
+         */
+        LinkedList<PcepUpdateRequest> getUpdateRequestList();
+
+        /**
+         * Sets the  update request list for the PCEP update message.
+         *
+         * @param llUpdateRequestList list of Update requests
+         * @return builder by setting list llUpdateRequestList of PcepUpdateRequest.
+         */
+        Builder setUpdateRequestList(LinkedList<PcepUpdateRequest> llUpdateRequestList);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateRequest.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateRequest.java
new file mode 100755
index 0000000..0f360fa
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepUpdateRequest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+
+/**
+ * Abstraction of an entity providing PCEP Update Request List.
+ */
+public interface PcepUpdateRequest {
+
+    /**
+     * Returns object of PCEP SRP Object.
+     *
+     * @return srpObject of type PCEP SRP Object
+     */
+    PcepSrpObject getSrpObject();
+
+    /**
+     * Returns object of PCEP LSP Object.
+     *
+     * @return lspObject of type PCEP LSP Object
+     */
+    PcepLspObject getLspObject();
+
+    /**
+     * Returns object of PCEP MSG PATH.
+     *
+     * @return msgPath of type PCEP MSG PATH
+     */
+    PcepMsgPath getMsgPath();
+
+    /**
+     * Sets the PCEP SRP Object.
+     *
+     * @param srpObject object of type PCEP SRP Object
+     */
+    void setSrpObject(PcepSrpObject srpObject);
+
+    /**
+     * Sets the PCEP LSP Object.
+     *
+     * @param lspObject object of type PCEP LSP Object
+     */
+    void setLspObject(PcepLspObject lspObject);
+
+    /**
+     * sets the PCEP MSG PATH.
+     *
+     * @param msgPath object of type PCEP MSG PATH
+     */
+    void setMsgPath(PcepMsgPath msgPath);
+
+    /**
+     * Prints the attributes of PCEP Update Request.
+     */
+    public void print();
+
+    /**
+     * Builder interface with get and set functions to build PcepUpdateRequest.
+     */
+    public interface Builder {
+
+        /**
+         * Builds PcepUpdateRequest.
+         *
+         * @return PcepUpdateRequest
+         * @throws PcepParseException if mandatory object is not set
+         */
+        PcepUpdateRequest build() throws PcepParseException;
+
+        /**
+         * Returns PcepSrpObject.
+         *
+         * @return srpObject
+         */
+        PcepSrpObject getSrpObject();
+
+        /**
+         * Returns PcepLspObject.
+         *
+         * @return lspObject
+         */
+        PcepLspObject getLspObject();
+
+        /**
+         * Returns PcepMsgPath.
+         *
+         * @return msgPath
+         */
+        PcepMsgPath getMsgPath();
+
+        /**
+         * Sets the SRP Object.
+         *
+         * @param srpObj of type PcepSrpObject
+         * @return builder by setting PcepSrpObject
+         */
+        Builder setSrpObject(PcepSrpObject srpObj);
+
+        /**
+         * Sets the LSP Object.
+         *
+         * @param lspObject of type PcepLspObject
+         * @return builder by setting PcepLspObject
+         */
+        Builder setLspObject(PcepLspObject lspObject);
+
+        /**
+         * Sets the Path Object.
+         *
+         * @param msgPath of type PcepMsgPath
+         * @return builder by setting PcepMsgPath
+         */
+        Builder setMsgPath(PcepMsgPath msgPath);
+    }
+}
\ No newline at end of file
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepVersion.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepVersion.java
new file mode 100755
index 0000000..c761ed0
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/PcepVersion.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+/**
+ * Enum to provide PCEP Message Version.
+ */
+public enum PcepVersion {
+
+    PCEP_1(1);
+
+    public final int packetVersion;
+
+    /**
+     * Assign PCEP PacketVersion with WireVersion.
+     *
+     * @param wireVersion version of pcep
+     */
+    PcepVersion(final int wireVersion) {
+
+        this.packetVersion = wireVersion;
+    }
+
+    /**
+     * Returns Wire version of PCEP Message.
+     *
+     * @return packetVersion
+     */
+    public int getWireVersion() {
+        return packetVersion;
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/Writeable.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/Writeable.java
new file mode 100755
index 0000000..37aef58
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/protocol/Writeable.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2015 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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+/**
+ * Abstraction of an entity providing functionality to write byte streams of
+ * Messages to channel buffer.
+ */
+public interface Writeable {
+
+    /**
+     * Writes byte streams of messages to channel buffer.
+     *
+     * @param bb parameter of type channel buffer
+     * @throws PcepParseException when error occurs while writing pcep message to channel buffer
+     */
+    void writeTo(ChannelBuffer bb) throws PcepParseException;
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java
new file mode 100755
index 0000000..d76dc96
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/ErrorObjListWithOpen.java
@@ -0,0 +1,140 @@
+package org.onosproject.pcepio.types;
+
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+import org.onosproject.pcepio.protocol.PcepErrorObject;
+import org.onosproject.pcepio.protocol.PcepOpenObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+ * Provide the error object list with open object.
+ */
+public class ErrorObjListWithOpen {
+    //errorObjList is mandatory
+    LinkedList<PcepErrorObject> llerrorObjList;
+    // openObject is optional
+    PcepOpenObject openObject;
+    // flag to check if open object is set or not
+    public boolean isOpenObjectSet;
+    protected static final Logger log = LoggerFactory.getLogger(ErrorObjListWithOpen.class);
+
+    /*
+     * constructor to initialize errObj,openObj.
+     *
+     * @param errObj error object list
+     * @param openObj open object
+     */
+    public ErrorObjListWithOpen(LinkedList<PcepErrorObject> errObj, PcepOpenObject openObj) {
+        this.llerrorObjList = errObj;
+        this.openObject = openObj;
+        if (openObj != null) {
+            isOpenObjectSet = true;
+        } else {
+            isOpenObjectSet = false;
+        }
+    }
+
+    /*
+     * constructor to initialize errObj.
+     *
+     * @param errObj error object list
+     */
+    public ErrorObjListWithOpen(LinkedList<PcepErrorObject> errObj) {
+        this.llerrorObjList = errObj;
+        this.openObject = null;
+        isOpenObjectSet = false;
+    }
+
+    public LinkedList<Integer> getErrorType() {
+        LinkedList<Integer> errorType = new LinkedList<Integer>();
+        if (llerrorObjList != null) {
+            ListIterator<PcepErrorObject> errObjListIterator = llerrorObjList.listIterator();
+            int error;
+            PcepErrorObject errorObj;
+            while (errObjListIterator.hasNext()) {
+                errorObj =  errObjListIterator.next();
+                error = errorObj.getErrorType();
+                errorType.add(error);
+            }
+        }
+        return errorType;
+    }
+
+    public LinkedList<Integer> getErrorValue() {
+        LinkedList<Integer> errorValue = new LinkedList<Integer>();
+        if (llerrorObjList != null) {
+            ListIterator<PcepErrorObject> errObjListIterator = llerrorObjList.listIterator();
+            int error;
+            PcepErrorObject errorObj;
+            while (errObjListIterator.hasNext()) {
+                errorObj =  errObjListIterator.next();
+                error = errorObj.getErrorValue();
+                errorValue.add(error);
+
+            }
+        }
+        return errorValue;
+    }
+    /*
+     * Checks whether error object list is empty or not.
+     *
+     * @return whether error object list is empty or not
+     */
+    public boolean isErrorObjListWithOpenPresent() {
+        // ( <error-obj-list> [<Open>]
+        // At least in this case <error-obj-list> should be present.
+        return (!this.llerrorObjList.isEmpty()) ? true : false;
+    }
+
+    /*
+     * Write Error Object List and Open Object to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @throws PcepParseException when mandatory fields are not set
+     */
+    public int write(ChannelBuffer bb) throws PcepParseException {
+        int iLenStartIndex = bb.writerIndex();
+        boolean bIsErrObjListFound = false;
+
+        //<error-obj-list> is mandatory , if not present throw exception.
+        if (llerrorObjList != null) {
+            ListIterator<PcepErrorObject> errObjListIterator = llerrorObjList.listIterator();
+            while (errObjListIterator.hasNext()) {
+                errObjListIterator.next().write(bb);
+                bIsErrObjListFound = true;
+            }
+        }
+
+        if (!bIsErrObjListFound) {
+            throw new PcepParseException("Error: [ErrorObjListWithOpen::write] <error-obj-list> is mandatory.");
+        }
+
+        //Open Object is optional , if present write.
+        if (openObject != null) {
+            openObject.write(bb);
+        }
+
+        return bb.writerIndex() - iLenStartIndex;
+    }
+
+    /*
+     * Prints the attributes of ErrorObject List with open Object.
+     */
+    public void print() {
+        log.debug("ErrorObjListWithOpen:");
+        ListIterator<PcepErrorObject> pcepErrorObjIterator = llerrorObjList.listIterator();
+        log.debug("<error-obj-list> :");
+        while (pcepErrorObjIterator.hasNext()) {
+            pcepErrorObjIterator.next().print();
+        }
+
+        log.debug("OpenObject:");
+        if (openObject != null) {
+            openObject.print();
+        }
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelDownload.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelDownload.java
new file mode 100755
index 0000000..12f39f9
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelDownload.java
@@ -0,0 +1,95 @@
+package org.onosproject.pcepio.types;
+
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.onosproject.pcepio.protocol.PcepLabelObject;
+import org.onosproject.pcepio.protocol.PcepLspObject;
+import org.onosproject.pcepio.protocol.PcepSrpObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+ * Provides Pcep Label.
+ * REference :draft-zhao-pce-pcep-extension-for-pce-controller-01.
+ */
+public class PcepLabelDownload {
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepLabelDownload.class);
+
+    //PCEP SPR Object
+    PcepSrpObject srpObject;
+    //PCEP LSP Object
+    PcepLspObject lspObject;
+    //LinkList of Labels
+    LinkedList<PcepLabelObject> llLabelList;
+
+    /*
+     * Returns SRP Object.
+     *
+     * @return PCEP SRP Object
+     */
+    public PcepSrpObject getSrpObject() {
+        return srpObject;
+    }
+
+    /*
+     * Sets the Pcep Srp Object.
+     *
+     * @param srpobj PCEP SRP Object
+     */
+    public void setSrpObject(PcepSrpObject srpobj) {
+        this.srpObject = srpobj;
+    }
+
+    /*
+     * Returns LSP Object.
+     *
+     * @return PCEP LSP Object
+     */
+    public PcepLspObject getLspObject() {
+        return lspObject;
+    }
+
+    /*
+     * Sets the Pcep LSP Object.
+     *
+     * @param lspObject PCEP LSP Object
+     */
+    public void setLspObject(PcepLspObject lspObject) {
+        this.lspObject = lspObject;
+    }
+
+    /*
+     * Returns a list of labels.
+     *
+     * @return llLabelList list of pcep label objects
+     */
+    public LinkedList<PcepLabelObject> getLabelList() {
+        return llLabelList;
+    }
+
+    /*
+     * set the llLabelList list of type PcepLableObject.
+     *
+     * @param llLabelList list of pcep label objects
+     */
+    public void setLabelList(LinkedList<PcepLabelObject> llLabelList) {
+        this.llLabelList = llLabelList;
+    }
+
+    /*
+     * Prints the attribute of PcepLableObject.
+     */
+    public void print() {
+        log.debug("LABEL DOWNLOAD:");
+        srpObject.print();
+        lspObject.print();
+
+        log.debug("label-list:");
+        ListIterator<PcepLabelObject> listIterator = llLabelList.listIterator();
+        while (listIterator.hasNext()) {
+            listIterator.next().print();
+        }
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java
new file mode 100755
index 0000000..a421799
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepLabelMap.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2015 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.pcepio.types;
+
+import org.onosproject.pcepio.protocol.PcepFecObject;
+import org.onosproject.pcepio.protocol.PcepLabelObject;
+import org.onosproject.pcepio.protocol.PcepSrpObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provide PCEP Label Map.
+ * Reference :draft-zhao-pce-pcep-extension-for-pce-controller-01.
+ */
+public class PcepLabelMap {
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepLabelMap.class);
+    //PCEP SRP Object
+    PcepSrpObject srpObject;
+    //PCEP Label Object
+    PcepLabelObject labelObject;
+    //PCEP FEC Object
+    PcepFecObject fecObject;
+
+    /**
+     * Sets Fec Object.
+     *
+     * @param fecObject PCEP fec object
+     */
+    public void setFECObject(PcepFecObject fecObject) {
+        this.fecObject = fecObject;
+    }
+
+    /**
+     * Returns the PcepFecObject.
+     *
+     * @return PCEP fec object
+     */
+    public PcepFecObject getFECObject() {
+        return this.fecObject;
+    }
+
+    /**
+     * Returns SRP Object.
+     *
+     * @return PCEP SRP Object
+     */
+    public PcepSrpObject getSrpObject() {
+        return srpObject;
+    }
+
+    /**
+     * Sets the PCEP Srp Object.
+     *
+     * @param srpObject PCEP SRP Object
+     */
+    public void setSrpObject(PcepSrpObject srpObject) {
+        this.srpObject = srpObject;
+    }
+
+    /**
+     * Returns labelObject.
+     *
+     * @return PCEP label object
+     */
+    public PcepLabelObject getLabelObject() {
+        return labelObject;
+    }
+
+    /**
+     * Sets the Pcep labelObject.
+     *
+     * @param labelObject PCEP label object
+     */
+    public void setLabelObject(PcepLabelObject labelObject) {
+        this.labelObject = labelObject;
+    }
+
+    /**
+     * Prints the attribute of PcepLabelMap.
+     */
+    public void print() {
+        log.debug("LABEL MAP:");
+        srpObject.print();
+        labelObject.print();
+        fecObject.print();
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepObjectHeader.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepObjectHeader.java
new file mode 100755
index 0000000..d0f0c1d9
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepObjectHeader.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright 2015 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.pcepio.types;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides PCEP Object Header which is common for all the objects.
+ * Reference : RFC 5440.
+ */
+
+public class PcepObjectHeader {
+
+    /*
+        0                   1                   2                   3
+        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       | Object-Class  |   OT  |Res|P|I|   Object Length (bytes)       |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               |
+       //                        (Object body)                        //
+       |                                                               |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+                      PCEP Common Object Header
+     */
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepObjectHeader.class);
+
+    public static final boolean REQ_OBJ_MUST_PROCESS = true;
+    public static final boolean REQ_OBJ_OPTIONAL_PROCESS = false;
+    public static final boolean RSP_OBJ_IGNORED = true;
+    public static final boolean RSP_OBJ_PROCESSED = false;
+    public static final int OBJECT_TYPE_SHIFT_VALUE = 4;
+    public static final byte PFLAG_SET = 0x02;
+    public static final byte IFLAG_SET = 0x01;
+    public static final int SET = 1;
+    private byte objClass;
+    private byte objType;
+    private boolean bPFlag;
+    private boolean bIFlag;
+    private short objLen;
+
+    /**
+     * Constructor to initialize all the variables in object header.
+     *
+     * @param objClass PCEP Object class
+     * @param objType PCEP Object type
+     * @param bPFlag P flag
+     * @param bIFlag I flag
+     * @param objLen PCEP object length
+     */
+
+    public PcepObjectHeader(byte objClass, byte objType, boolean bPFlag, boolean bIFlag, short objLen) {
+        this.objClass = objClass;
+        this.objType = objType;
+        this.bPFlag = bPFlag;
+        this.bIFlag = bIFlag;
+        this.objLen = objLen;
+    }
+
+    /**
+     * Sets the Object class.
+     *
+     * @param value object class
+     */
+    public void setObjClass(byte value) {
+        this.objClass = value;
+    }
+
+    /**
+     * Sets the Object TYPE.
+     *
+     * @param value object type
+     */
+    public void setObjType(byte value) {
+        this.objType = value;
+    }
+
+    /**
+     * Sets the Object P flag.
+     *
+     * @param value p flag
+     */
+    public void setPFlag(boolean value) {
+        this.bPFlag = value;
+    }
+
+    /**
+     * Sets the Object I flag.
+     *
+     * @param value I flag
+     */
+    public void setIFlag(boolean value) {
+        this.bIFlag = value;
+    }
+
+    /**
+     * Sets the Object Length.
+     *
+     * @param value object length
+     */
+    public void setObjLen(short value) {
+        this.objLen = value;
+    }
+
+    /**
+     * Returns Object's P flag.
+     *
+     * @return bPFlag P flag
+     */
+    public boolean getPFlag() {
+        return this.bPFlag;
+    }
+
+    /**
+     * Returns Object's i flag.
+     *
+     * @return bIFlag I flag
+     */
+    public boolean getIFlag() {
+        return this.bIFlag;
+    }
+
+    /**
+     * Returns Object Length.
+     *
+     * @return objLen object length
+     */
+    public short getObjLen() {
+        return this.objLen;
+    }
+
+    /**
+     * Returns Object class.
+     *
+     * @return objClass object class
+     */
+    public byte getObjClass() {
+        return this.objClass;
+    }
+
+    /**
+     * Returns Object Type.
+     *
+     * @return objType object type
+     */
+    public byte getObjType() {
+        return this.objType;
+    }
+
+    /**
+     *  Writes Byte stream of PCEP object header to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @return objLenIndex object length index in channel buffer
+     */
+    public int write(ChannelBuffer bb) {
+
+        bb.writeByte(this.objClass);
+        byte temp = (byte) (this.objType << OBJECT_TYPE_SHIFT_VALUE);
+        if (this.bPFlag) {
+            temp = (byte) (temp | PFLAG_SET);
+        }
+        if (this.bIFlag) {
+            temp = (byte) (temp | IFLAG_SET);
+        }
+        bb.writeByte(temp);
+        int objLenIndex = bb.writerIndex();
+        bb.writeShort((short) 0);
+        return objLenIndex;
+    }
+
+    /**
+     * Read from channel buffer and Returns PCEP Objects header.
+     *
+     * @param bb of type channel buffer
+     * @return PCEP Object header
+     */
+    public static PcepObjectHeader read(ChannelBuffer bb) {
+
+        byte objClass;
+        byte objType;
+        boolean bPFlag;
+        boolean bIFlag;
+        short objLen;
+        objClass = bb.readByte();
+        byte temp = bb.readByte();
+        bIFlag = ((temp & IFLAG_SET) == IFLAG_SET) ? true : false;
+        bPFlag = ((temp & PFLAG_SET) == PFLAG_SET) ? true : false;
+        objType = (byte) (temp >> OBJECT_TYPE_SHIFT_VALUE);
+        objLen = bb.readShort();
+        return new PcepObjectHeader(objClass, objType, bPFlag, bIFlag, objLen);
+    }
+
+    /**
+     * Prints the Attributes of PCEP Object header.
+     */
+    public void print() {
+
+        log.debug("PcepObjectHeader");
+        log.debug("Object Class: " + objClass);
+        log.debug("Object Type: " + objType);
+        log.debug("Object Length: " + objLen);
+        log.debug("P flag: " + bPFlag);
+        log.debug("I flag: " + bIFlag);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpObjectHeader.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpObjectHeader.java
new file mode 100755
index 0000000..37ee9fc
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepRsvpObjectHeader.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2015 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.pcepio.types;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides PcepRsvpObjectHeader.
+ */
+public class PcepRsvpObjectHeader {
+
+    /*
+    0             1              2             3
+    +-------------+-------------+-------------+-------------+
+    |       Length (bytes)      |  Class-Num  |   C-Type    |
+    +-------------+-------------+-------------+-------------+
+    |                                                       |
+    //                  (Object contents)                   //
+    |                                                       |
+    +-------------+-------------+-------------+-------------+
+
+              ERROR_SPEC object Header
+    */
+
+    protected static final Logger log = LoggerFactory.getLogger(PcepRsvpObjectHeader.class);
+
+    public static final boolean REQ_OBJ_MUST_PROCESS = true;
+    public static final boolean REQ_OBJ_OPTIONAL_PROCESS = false;
+    public static final boolean RSP_OBJ_IGNORED = true;
+    public static final boolean RSP_OBJ_PROCESSED = false;
+    public static final int OBJECT_TYPE_SHIFT_VALUE = 4;
+    private byte objClassNum;
+    private byte objClassType;
+    private short objLen;
+
+    /**
+     * Constructor to initialize class num , length and type.
+     *
+     * @param objClassNum object class number
+     * @param objClassType object class type
+     * @param objLen object length
+     */
+    public PcepRsvpObjectHeader(byte objClassNum, byte objClassType, short objLen) {
+        this.objClassNum = objClassNum;
+        this.objClassType = objClassType;
+        this.objLen = objLen;
+    }
+
+    /**
+     * Sets the Class num.
+     *
+     * @param value object class number
+     */
+    public void setObjClassNum(byte value) {
+        this.objClassNum = value;
+    }
+
+    /**
+     * Sets the Class type.
+     *
+     * @param value object class type
+     */
+    public void setObjClassType(byte value) {
+        this.objClassType = value;
+    }
+
+    /**
+     * Sets the Class Length.
+     *
+     * @param value object length
+     */
+    public void setObjLen(short value) {
+        this.objLen = value;
+    }
+
+    /**
+     * Returns Object Length.
+     *
+     * @return objLen
+     */
+    public short getObjLen() {
+        return this.objLen;
+    }
+
+    /**
+     * Returns Object num.
+     *
+     * @return objClassNum
+     */
+    public byte getObjClassNum() {
+        return this.objClassNum;
+    }
+
+    /**
+     * Returns Object type.
+     *
+     * @return objClassType
+     */
+    public byte getObjClassType() {
+        return this.objClassType;
+    }
+
+    /**
+     * Writes the byte stream of PcepRsvpObjectHeader to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @return object length index in channel buffer
+     */
+    public int write(ChannelBuffer bb) {
+        int iLenStartIndex = bb.writerIndex();
+        bb.writeShort((short) 0);
+        bb.writeByte(this.objClassNum);
+        bb.writeByte(this.objClassType);
+        return bb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the PcepRsvpObjectHeader.
+     *
+     * @param bb of type channel buffer
+     * @return PcepRsvpObjectHeader
+     */
+    public static PcepRsvpObjectHeader read(ChannelBuffer bb) {
+        log.debug("PcepRsvpObjectHeader ::read ");
+        byte objClassNum;
+        byte objClassType;
+        short objLen;
+        objLen = bb.readShort();
+        objClassNum = bb.readByte();
+        objClassType = bb.readByte();
+
+        return new PcepRsvpObjectHeader(objClassNum, objClassType, objLen);
+    }
+
+    /**
+     * Prints the attribute of PcepRsvpObjectHeader.
+     */
+    public void print() {
+
+        log.debug("PcepObjectHeader");
+        log.debug("Object Class-Num: " + objClassNum);
+        log.debug("Object C-Type: " + objClassType);
+        log.debug("Object Length: " + objLen);
+    }
+}
diff --git a/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepValueType.java b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepValueType.java
new file mode 100755
index 0000000..9d3599b
--- /dev/null
+++ b/pcep/pcepio/src/main/java/org/onosproject/pcepio/types/PcepValueType.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2015 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.pcepio.types;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.pcepio.protocol.PcepVersion;
+
+/**
+ * Abstraction which Provides the PCEP Values of Type, Length ,Version.
+ */
+public interface PcepValueType {
+
+    /**
+     * Returns the Version Of PCEP Message.
+     *
+     * @return Version of PcepVersion Type.
+     */
+    PcepVersion getVersion();
+
+    /**
+     * Returns the Type of PCEP Message.
+     *
+     * @return value of type
+     */
+    public short getType();
+
+    /**
+     * Returns the Length of PCEP Message.
+     *
+     * @return value of Length
+     */
+    public short getLength();
+
+    /**
+     * Writes the byte Stream of PCEP Message to channel buffer.
+     *
+     * @param bb of type channel buffer
+     * @return length of bytes written to channel buffer
+     */
+    public int write(ChannelBuffer bb);
+
+    /**
+     * Prints the Attributes of PCEP Message.
+     */
+    public void print();
+}
diff --git a/pcep/pom.xml b/pcep/pom.xml
new file mode 100755
index 0000000..2ab2505
--- /dev/null
+++ b/pcep/pom.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2014 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.
+  -->
+<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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos</artifactId>
+        <version>1.3.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-pcep-controller</artifactId>
+    <packaging>pom</packaging>
+
+    <description>ONOS Pcep Protocol subsystem</description>
+
+    <modules>
+        <module>api</module>
+        <module>pcepio</module>
+    </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-misc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onlab-junit</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
