diff --git a/protocols/isis/isisio/pom.xml b/protocols/isis/isisio/pom.xml
new file mode 100755
index 0000000..69ea2e1
--- /dev/null
+++ b/protocols/isis/isisio/pom.xml
@@ -0,0 +1,49 @@
+<!--
+  ~ Copyright 2016 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:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
+         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-isis</artifactId>
+        <version>1.6.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-isis-isisio</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS ISIS controller protocol</description>
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-isis-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-buffer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.easymock</groupId>
+            <artifactId>easymock</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
new file mode 100755
index 0000000..d3def43
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket;
+
+/**
+ * Represents ISIS constant parameters.
+ */
+public final class IsisConstantParameters {
+
+    public static final int IRPDISCRIMINATOR = 131;
+    public static final int PROOCOLID = 1;
+    public static final int VERSION = 1;
+    public static final int RESERVED = 0;
+    public static final int MAXAREAADDRESS = 3;
+    public static final int IDLENGTH = 6;
+    public static final int PROTOCOLSUPPORTED = 6;
+    public static final int PACKETMINIMUMLENGTH = 27;
+    public static final int PDULENGTHPOSITION = 17;
+    public static final int PDUHEADERFORREADFROM = 8;
+
+    /**
+     * Creates an instance of this class.
+     */
+    private IsisConstantParameters() {
+
+    }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java
new file mode 100755
index 0000000..4b60bd0
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis.io.isispacket;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
new file mode 100755
index 0000000..df76628
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents the area address TLV.
+ */
+public class AreaAddressTlv extends TlvHeader implements IsisTlv {
+
+    private List<String> areaAddress = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of area address TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public AreaAddressTlv(TlvHeader tlvHeader) {
+
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Gets the area address of area address TLV.
+     *
+     * @return area address
+     */
+    public List<String> areaAddress() {
+        return this.areaAddress;
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+        while (byteBuf.readableBytes() > 0) {
+            int addressLength = byteBuf.readByte();
+            byte[] addressBytes = new byte[IsisUtil.THREE_BYTES];
+            byteBuf.readBytes(addressBytes, 0, IsisUtil.THREE_BYTES);
+            String areaAddress = IsisUtil.areaAddres(addressBytes);
+            this.areaAddress.add(areaAddress);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+    }
+
+    /**
+     * Gets TLV body of area address TLV.
+     *
+     * @return byteArray TLV body of area address TLV
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        List<Byte> bytes = new ArrayList();
+        for (String areaAddress : this.areaAddress) {
+            bytes.add((byte) (areaAddress.length() / 2));
+            bytes.addAll(IsisUtil.areaAddresToBytes(areaAddress));
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
new file mode 100755
index 0000000..906acff
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents IP interface address TLV.
+ */
+public class IpInterfaceAddressTlv extends TlvHeader implements IsisTlv {
+    private List<Ip4Address> interfaceAddress = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of IP interface address TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public IpInterfaceAddressTlv(TlvHeader tlvHeader) {
+
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Gets interface address of interface address TLV.
+     *
+     * @return interfaceAddress interface address
+     */
+    public List<Ip4Address> interfaceAddress() {
+        return interfaceAddress;
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+        while (byteBuf.readableBytes() >= 4) {
+            byte[] addressbytes = new byte[IsisUtil.FOUR_BYTES];
+            byteBuf.readBytes(addressbytes, 0, IsisUtil.FOUR_BYTES);
+            this.interfaceAddress.add(Ip4Address.valueOf(addressbytes));
+        }
+
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+    }
+
+    /**
+     * Gets TLV body of interface address TLV.
+     *
+     * @return byteArray TLV body of interface address TLV.
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        List<Byte> bytes = new ArrayList();
+        for (Ip4Address ip4Address : this.interfaceAddress) {
+            bytes.addAll(Bytes.asList(ip4Address.toOctets()));
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
new file mode 100755
index 0000000..b8da9d9
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents ISIS neighbor TLV.
+ */
+public class IsisNeighborTlv extends TlvHeader implements IsisTlv {
+
+    private List<MacAddress> neighbor = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of ISIS neighbor TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public IsisNeighborTlv(TlvHeader tlvHeader) {
+
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Gets the MAC address of the neighbor TLV.
+     *
+     * @return neighbor MAC address of the neighbor TLV
+     */
+    public List<MacAddress> neighbor() {
+        return this.neighbor;
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+        while (byteBuf.readableBytes() >= 6) {
+            byte[] addressbytes = new byte[IsisUtil.SIX_BYTES];
+            byteBuf.readBytes(addressbytes, 0, IsisUtil.SIX_BYTES);
+            this.neighbor.add(MacAddress.valueOf(addressbytes));
+        }
+
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+
+    }
+
+    /**
+     * Gets TLV body of neighbor TLV.
+     *
+     * @return byteArray TLV body of neighbor TLV
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        List<Byte> bytes = new ArrayList();
+        for (MacAddress macAddress : this.neighbor) {
+            bytes.addAll(Bytes.asList(macAddress.toBytes()));
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
new file mode 100755
index 0000000..45c96ed
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+/**
+ * Represents ISIS TLV.
+ */
+public interface IsisTlv {
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
new file mode 100755
index 0000000..6135315
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents padding TLV.
+ */
+public class PaddingTlv extends TlvHeader implements IsisTlv {
+    private List<Byte> paddings = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of padding TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public PaddingTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+        while (byteBuf.readableBytes() > 0) {
+            this.paddings.add(byteBuf.readByte());
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+    }
+
+    /**
+     * Gets TLV body padding TLV.
+     *
+     * @return areaArea TLV body padding TLV\\
+     */
+    public byte[] tlvBodyAsBytes() {
+        byte[] areaArea = new byte[this.tlvLength()];
+        return areaArea;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
new file mode 100755
index 0000000..dad08bd
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents Protocol supported TLV.
+ */
+public class ProtocolSupportedTlv extends TlvHeader implements IsisTlv {
+
+    private List<Byte> protocolSupported = new ArrayList();
+
+    /**
+     * Sets TLV type and TLV length of protocol supported TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public ProtocolSupportedTlv(TlvHeader tlvHeader) {
+
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Gets the Protocol Supported by the TLV.
+     *
+     * @return Protocol Supported
+     */
+    public List<Byte> protocolSupported() {
+
+        return this.protocolSupported;
+
+    }
+
+    @Override
+    public void readFrom(ByteBuf byteBuf) {
+
+        while (byteBuf.readableBytes() > 0) {
+            this.protocolSupported.add(byteBuf.readByte());
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+
+        return bytes;
+    }
+
+    /**
+     * Gets TLV body of protocol supported TLV.
+     *
+     * @return byteArray TLV body of protocol supported TLV
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        List<Byte> bytes = new ArrayList();
+        for (byte byt : this.protocolSupported) {
+            bytes.add(byt);
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
new file mode 100755
index 0000000..4b28c35
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import io.netty.buffer.ByteBuf;
+import org.onosproject.isis.io.util.IsisUtil;
+
+/**
+ * Represents TLV finder.
+ */
+public class TlvFinder extends TlvHeader {
+
+    /**
+     * Sets the value for TLV header and the body of the TLV.
+     *
+     * @param tlvHeader tlvHeader
+     * @param byteBuf   byteBuf
+     * @return isisTlv ISIS TLV
+     */
+    public static IsisTlv findTlv(TlvHeader tlvHeader, ByteBuf byteBuf) {
+
+        IsisTlv isisTlv = null;
+
+        switch (tlvHeader.tlvType()) {
+            case IsisUtil.AREAADDRESS:
+                AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
+                areaAddressTlv.readFrom(byteBuf);
+                isisTlv = areaAddressTlv;
+                break;
+            case IsisUtil.IPINTERFACEADDRESS:
+                IpInterfaceAddressTlv ipTlv = new IpInterfaceAddressTlv(tlvHeader);
+                ipTlv.readFrom(byteBuf);
+                isisTlv = ipTlv;
+                break;
+            case IsisUtil.PROTOCOLSUPPORTED:
+                ProtocolSupportedTlv psTlv = new ProtocolSupportedTlv(tlvHeader);
+                psTlv.readFrom(byteBuf);
+                isisTlv = psTlv;
+                break;
+            case IsisUtil.ISNEIGHBORS:
+                IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
+                isisNeighborTlv.readFrom(byteBuf);
+                isisTlv = isisNeighborTlv;
+                break;
+            case IsisUtil.PADDING:
+                PaddingTlv paddingTlv = new PaddingTlv(tlvHeader);
+                paddingTlv.readFrom(byteBuf);
+                isisTlv = paddingTlv;
+                break;
+            default:
+                break;
+        }
+
+        return isisTlv;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
new file mode 100755
index 0000000..1c2cda4
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import io.netty.buffer.ByteBuf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents TLV header.
+ */
+public class TlvHeader implements IsisTlv {
+    private int tlvType;
+    private int tlvLength;
+
+    /**
+     * Gets the TLV length of the TLV.
+     *
+     * @return tlvLength TLV length
+     */
+    public int tlvLength() {
+        return tlvLength;
+    }
+
+    /**
+     * Sets the TLV length for the mTLV.
+     *
+     * @param tlvLength TLV length
+     */
+    public void setTlvLength(int tlvLength) {
+        this.tlvLength = tlvLength;
+    }
+
+    /**
+     * Gets the TLV type of the TLV.
+     *
+     * @return tlvType TLV type
+     */
+    public int tlvType() {
+        return tlvType;
+    }
+
+    /**
+     * Sets TLV type for the TLV.
+     *
+     * @param tlvType TLV type
+     */
+    public void setTlvType(int tlvType) {
+        this.tlvType = tlvType;
+    }
+
+    /**
+     * Sets the TLV values of TLV from b yte buffer.
+     *
+     * @param byteBuf byteBuf.
+     */
+    public void readFrom(ByteBuf byteBuf) {
+        //implemented in sub classes
+    }
+
+
+    /**
+     * Gets the TLV of the TLV as bytes.
+     *
+     * @return null
+     */
+    public byte[] asBytes() {
+        //implemented the subclasses
+        return null;
+    }
+
+    /**
+     * Gets the TLV header of the TLV.
+     *
+     * @return headerLst TLV of the TLV
+     */
+    public byte[] tlvHeaderAsByteArray() {
+        List<Byte> headerLst = new ArrayList();
+        headerLst.add((byte) this.tlvType);
+        headerLst.add((byte) this.tlvLength);
+        return Bytes.toArray(headerLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("tlvType", tlvType)
+                .add("tlvLength", tlvLength)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
new file mode 100755
index 0000000..b340126
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+/**
+ * Represents various values for TLV types.
+ */
+public enum TlvType {
+    AREAADDRESS(1),
+    ISREACHABILITY(2),
+    ISNEIGHBORS(6),
+    PADDING(8),
+    LSPENTRY(9),
+    AUTHENTICATION(10),
+    CHECKSUM(12),
+    EXTENDEDISREACHABILITY(22),
+    ISALIAS(24),
+    IPINTERNALREACHABILITY(128),
+    PROTOCOLSUPPORTED(129),
+    IPEXTERNALREACHABILITY(130),
+    IDRPINFORMATION(131),
+    IPINTERFACEADDRESS(132);
+
+    private int value;
+
+    /**
+     * Sets the TLV type value.
+     * @param value value.
+     */
+    TlvType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets value.
+     * @return value
+     */
+    public int value() {
+        return value;
+    }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
new file mode 100755
index 0000000..829517e
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2016 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.isis.io.isispacket.tlv;
+
+import com.google.common.primitives.Bytes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents conversion of TLV's to bytes.
+ */
+public final class TlvsToBytes {
+    /**
+     * Sets the ISIS TLV and returns in the form of bytes.
+     *
+     * @param isisTlv isisTlv
+     * @return tlvBytes TLV bytes
+     */
+    public static List<Byte> tlvToBytes(IsisTlv isisTlv) {
+
+        List<Byte> tlvBytes = new ArrayList();
+        if (isisTlv instanceof AreaAddressTlv) {
+            AreaAddressTlv areaAddressTlv = (AreaAddressTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(areaAddressTlv.asBytes()));
+        } else if (isisTlv instanceof IpInterfaceAddressTlv) {
+            IpInterfaceAddressTlv ipInterfaceAddressTlv = (IpInterfaceAddressTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(ipInterfaceAddressTlv.asBytes()));
+        } else if (isisTlv instanceof ProtocolSupportedTlv) {
+            ProtocolSupportedTlv protocolSupportedTlv = (ProtocolSupportedTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(protocolSupportedTlv.asBytes()));
+        } else if (isisTlv instanceof PaddingTlv) {
+            PaddingTlv paddingTlv = (PaddingTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(paddingTlv.asBytes()));
+        } else if (isisTlv instanceof IsisNeighborTlv) {
+            IsisNeighborTlv isisNeighborTlv = (IsisNeighborTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(isisNeighborTlv.asBytes()));
+        } else {
+            System.out.println("UNKNOWN TLV TYPE ::TlvsToBytes ");
+        }
+
+        return tlvBytes;
+    }
+    /**
+     * Creates an instance.
+     */
+    private TlvsToBytes() {
+        //private constructor
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java
new file mode 100755
index 0000000..11b325a
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis.io.isispacket.tlv;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
new file mode 100755
index 0000000..bfa972a
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis.io;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
new file mode 100755
index 0000000..46b5c53
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2016 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.isis.io.util;
+
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.onosproject.isis.io.isispacket.tlv.PaddingTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import javax.xml.bind.DatatypeConverter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * Represents ISIS utils.
+ */
+public final class IsisUtil {
+    public static final int AREAADDRESS = 1;
+    public static final int ISREACHABILITY = 2;
+    public static final int ISNEIGHBORS = 6;
+    public static final int PADDING = 8;
+    public static final int LSPENTRY = 9;
+    public static final int AUTHENTICATION = 10;
+    public static final int CHECKSUM = 12;
+    public static final int EXTENDEDISREACHABILITY = 22;
+    public static final int ISALIAS = 24;
+    public static final int IPINTERNALREACHABILITY = 128;
+    public static final int PROTOCOLSUPPORTED = 129;
+    public static final int IPEXTERNALREACHABILITY = 130;
+    public static final int IDRPINFORMATION = 131;
+    public static final int IPINTERFACEADDRESS = 132;
+    public static final int L1HELLOPDU = 1;
+    public static final int L2HELLOPDU = 2;
+    public static final int P2PHELLOPDU = 3;
+    public static final int L1LSPDU = 18;
+    public static final int L2LSPDU = 20;
+    public static final int L1CSNP = 24;
+    public static final int L2CSNP = 25;
+    public static final int L1PSNP = 26;
+    public static final int L2PSNP = 27;
+    public static final int L1L2_LS_PDUHEADERLENGTH = 27;
+    public static final int P2PPDUHEADERLENGTH = 20;
+    public static final int PSNPPDUHEADERLENGTH = 17;
+    public static final char ETHER_FRAME_LEN = 1514;
+    public static final int ID_SIX_BYTES = 6;
+    public static final int ID_PLUS_ONE_BYTE = 7;
+    public static final int ID_PLUS_TWO_BYTE = 8;
+    public static final int THREE_BYTES = 3;
+    public static final int SIX_BYTES = 6;
+    public static final int FOUR_BYTES = 4;
+    public static final int PADDING_FIXED_LENGTH = 255;
+
+    /**
+     * Creates an instance of this class.
+     */
+    private IsisUtil() {
+
+    }
+
+    /**
+     * Parse byte array to string system ID.
+     *
+     * @param bytes system ID
+     * @return systemId system ID.
+     */
+    public static String systemId(byte[] bytes) {
+        String systemId = "";
+        for (Byte byt : bytes) {
+            String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
+            if (hexa.length() % 2 != 0) {
+                hexa = "0" + hexa;
+            }
+            systemId = systemId + hexa;
+            if (systemId.length() == 4 || systemId.length() == 9) {
+                systemId = systemId + ".";
+            }
+        }
+        return systemId;
+    }
+
+    /**
+     * Parse byte array to LAN ID.
+     *
+     * @param bytes LAN ID
+     * @return systemId system ID.
+     */
+    public static String systemIdPlus(byte[] bytes) {
+        String systemId = "";
+        for (Byte byt : bytes) {
+            String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
+            if (hexa.length() % 2 != 0) {
+                hexa = "0" + hexa;
+            }
+            systemId = systemId + hexa;
+            if (systemId.length() == 4 || systemId.length() == 9
+                    || systemId.length() == 14) {
+                systemId = systemId + ".";
+            }
+        }
+        return systemId;
+    }
+
+    /**
+     * Parse byte array to area address.
+     *
+     * @param bytes area address
+     * @return areaAddress area address
+     */
+    public static String areaAddres(byte[] bytes) {
+        int count = 0;
+        String areaAddress = "";
+        for (Byte byt : bytes) {
+            String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
+            if (hexa.length() % 2 != 0) {
+                hexa = "0" + hexa;
+            }
+            if (count == 0) {
+                hexa = hexa + ".";
+            }
+            areaAddress = areaAddress + hexa;
+            count++;
+        }
+        return areaAddress;
+    }
+
+    /**
+     * Parse area address to bytes.
+     *
+     * @param address area address
+     * @return areaAddress area address
+     */
+    public static List<Byte> areaAddresToBytes(String address) {
+        List<Byte> idLst = new ArrayList();
+        StringTokenizer tokenizer = new StringTokenizer(address, ".");
+        int count = 0;
+        while (tokenizer.hasMoreElements()) {
+            String str = tokenizer.nextToken();
+            if (str.length() % 2 != 0) {
+                str = "0" + str;
+            }
+            if (count > 0) {
+
+                for (int i = 0; i < str.length(); i = i + 2) {
+                    idLst.add((byte) Integer.parseInt(str.substring(i, i + 2), 16));
+                }
+            } else {
+                idLst.add((byte) Integer.parseInt(str, 16));
+            }
+            count++;
+        }
+        return idLst;
+    }
+
+    /**
+     * Gets PDU header length.
+     *
+     * @param pduType PDU type
+     * @return headerLength header length
+     */
+    public static int getPduHeaderLength(int pduType) {
+        int headerLength = 0;
+        switch (pduType) {
+            case L1HELLOPDU:
+            case L2HELLOPDU:
+            case L1LSPDU:
+            case L2LSPDU:
+                headerLength = L1L2_LS_PDUHEADERLENGTH;
+                break;
+            case P2PHELLOPDU:
+                headerLength = P2PPDUHEADERLENGTH;
+                break;
+            case L1PSNP:
+            case L2PSNP:
+                headerLength = PSNPPDUHEADERLENGTH;
+                break;
+            default:
+                break;
+        }
+        return headerLength;
+    }
+
+    /**
+     * Parse source and LAN ID.
+     *
+     * @param id source and LAN ID
+     * @return sourceAndLanIdToBytes source and LAN ID
+     */
+    public static List<Byte> sourceAndLanIdToBytes(String id) {
+        List<Byte> idLst = new ArrayList();
+
+        StringTokenizer tokenizer = new StringTokenizer(id, ".");
+        while (tokenizer.hasMoreElements()) {
+            int i = 0;
+            String str = tokenizer.nextToken();
+            idLst.add((byte) Integer.parseInt(str.substring(0, i + 2), 16));
+            if (str.length() > 2) {
+                idLst.add((byte) Integer.parseInt(str.substring(i + 2, str.length()), 16));
+            }
+
+        }
+        return idLst;
+    }
+
+    /**
+     * Parse padding for PDU based on current length.
+     *
+     * @param currentLength current length
+     * @return byteArray padding array
+     */
+    public static byte[] paddingForPdu(int currentLength) {
+        List<Byte> bytes = new ArrayList<>();
+        while (ETHER_FRAME_LEN > currentLength) {
+            int length = ETHER_FRAME_LEN - currentLength;
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(PADDING);
+            if (length >= PADDING_FIXED_LENGTH) {
+                tlvHeader.setTlvLength(PADDING_FIXED_LENGTH);
+            } else {
+                tlvHeader.setTlvLength(ETHER_FRAME_LEN - currentLength);
+            }
+            PaddingTlv tlv = new PaddingTlv(tlvHeader);
+            bytes.addAll(Bytes.asList(tlv.asBytes()));
+            currentLength = currentLength + tlv.tlvLength();
+        }
+        byte[] byteArray = new byte[bytes.size()];
+        int i = 0;
+        for (byte byt : bytes) {
+            byteArray[i++] = byt;
+        }
+        return byteArray;
+
+    }
+
+    /**
+     * Converts an integer to two bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return numInBytes given number as bytes
+     */
+    public static byte[] convertToTwoBytes(int numberToConvert) {
+
+        byte[] numInBytes = new byte[2];
+        String s1 = Integer.toHexString(numberToConvert);
+        if (s1.length() % 2 != 0) {
+            s1 = "0" + s1;
+        }
+        byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+        if (hexas.length == 1) {
+            numInBytes[0] = 0;
+            numInBytes[1] = hexas[0];
+        } else {
+            numInBytes[0] = hexas[0];
+            numInBytes[1] = hexas[1];
+        }
+        return numInBytes;
+    }
+
+    /**
+     * Converts a number to four bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return numInBytes given number as bytes
+     */
+    public static byte[] convertToFourBytes(int numberToConvert) {
+
+        byte[] numInBytes = new byte[4];
+        String s1 = Integer.toHexString(numberToConvert);
+        if (s1.length() % 2 != 0) {
+            s1 = "0" + s1;
+        }
+        byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+        if (hexas.length == 1) {
+            numInBytes[0] = 0;
+            numInBytes[1] = 0;
+            numInBytes[2] = 0;
+            numInBytes[3] = hexas[0];
+        } else if (hexas.length == 2) {
+            numInBytes[0] = 0;
+            numInBytes[1] = 0;
+            numInBytes[2] = hexas[0];
+            numInBytes[3] = hexas[1];
+        } else if (hexas.length == 3) {
+            numInBytes[0] = 0;
+            numInBytes[1] = hexas[0];
+            numInBytes[2] = hexas[1];
+            numInBytes[3] = hexas[2];
+        } else {
+            numInBytes[0] = hexas[0];
+            numInBytes[1] = hexas[1];
+            numInBytes[2] = hexas[2];
+            numInBytes[3] = hexas[3];
+        }
+        return numInBytes;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
new file mode 100755
index 0000000..feaea77
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis.io.util;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java
new file mode 100755
index 0000000..fbbe013
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2016 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol.
+ */
+package org.onosproject.isis;
\ No newline at end of file
diff --git a/protocols/isis/pom.xml b/protocols/isis/pom.xml
index 189d298..3d4fafb 100644
--- a/protocols/isis/pom.xml
+++ b/protocols/isis/pom.xml
@@ -33,6 +33,7 @@
 
     <modules>
         <module>api</module>
+        <module>isisio</module>
     </modules>
 
 </project>
