diff --git a/protocols/ospf/protocol/pom.xml b/protocols/ospf/protocol/pom.xml
new file mode 100644
index 0000000..eb04e23
--- /dev/null
+++ b/protocols/ospf/protocol/pom.xml
@@ -0,0 +1,45 @@
+<!--
+  ~ 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: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-ospf</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-ospf-protocol</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Ospf controller protocol</description>
+    <dependencies>
+    <dependency>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-ospf-api</artifactId>
+        <version>${project.version}</version>
+    </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-ospf-api</artifactId>
+            <version>1.4.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfErrorType.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfErrorType.java
new file mode 100644
index 0000000..1aacb07
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfErrorType.java
@@ -0,0 +1,38 @@
+/*
+ * 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.ospf.exceptions;
+
+/**
+ * Defines all error codes and error sub codes.
+ */
+public final class OspfErrorType {
+
+    //Represents an invalid OSPF message header
+    public static final byte MESSAGE_HEADER_ERROR = 1;
+    //Represents an invalid OSPF message body
+    public static final byte OSPF_MESSAGE_ERROR = 2;
+    //Message Header error sub codes
+    //Represents an invalid OSPF message length
+    public static final byte BAD_MESSAGE_LENGTH = 2;
+    //Represents an invalid OSPF message
+    public static final byte BAD_MESSAGE = 4;
+
+    /**
+     * Creates an instance of OSPF error type.
+     */
+    private OspfErrorType() {
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfParseException.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfParseException.java
new file mode 100644
index 0000000..24e8703
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/OspfParseException.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.ospf.exceptions;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Representation of a custom exception for OSPF.
+ */
+public class OspfParseException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+    private byte errorCode;
+    private byte errorSubCode;
+
+    /**
+     * Creates a new OSPF exception.
+     */
+    public OspfParseException() {
+        super();
+    }
+
+    /**
+     * Creates a new OSPF exception based on the given arguments.
+     *
+     * @param message the detail of exception in string
+     * @param cause   underlying cause of the error
+     */
+    public OspfParseException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Creates a new OSPF exception for the given message.
+     *
+     * @param message the detail of exception in string
+     */
+    public OspfParseException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new OSPF exception from throwable instance.
+     *
+     * @param cause underlying cause of the error
+     */
+    public OspfParseException(final Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Creates a new OSPF exception from error code and error sub code.
+     *
+     * @param errorCode    error code of OSPF message
+     * @param errorSubCode error sub code of OSPF message
+     */
+    public OspfParseException(final byte errorCode, final byte errorSubCode) {
+        super();
+        this.errorCode = errorCode;
+        this.errorSubCode = errorSubCode;
+    }
+
+    /**
+     * Returns error code for this exception.
+     *
+     * @return error code for this exception
+     */
+    public byte errorCode() {
+        return this.errorCode;
+    }
+
+    /**
+     * Returns error sub code for this exception.
+     *
+     * @return error sub code for this exception
+     */
+    public byte errorSubCode() {
+        return this.errorSubCode;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("errorCode", errorCode)
+                .add("errorSubCode", errorSubCode)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/package-info.java
new file mode 100644
index 0000000..d74c2be
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/exceptions/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 OSPF exception types.
+ */
+package org.onosproject.ospf.exceptions;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/package-info.java
new file mode 100644
index 0000000..f41cd9b
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/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 ospf protocol.
+ */
+package org.onosproject.ospf;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/LsaHeader.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/LsaHeader.java
new file mode 100644
index 0000000..94faad4
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/LsaHeader.java
@@ -0,0 +1,316 @@
+/*
+ * 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.ospf.protocol.lsa;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.controller.OspfLsa;
+import org.onosproject.ospf.controller.OspfLsaType;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Defines the LSA header, fields and the methods to access them.
+ */
+public class LsaHeader implements OspfLsa {
+
+    /*
+        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
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |            LS age             |    Options    |    LS type    |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                        Link State ID                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                     Advertising Router                        |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                     LS sequence number                        |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |         LS checksum           |             length            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       LSA header format
+       REFERENCE : RFC 2328
+     */
+    protected static final Logger log = LoggerFactory.getLogger(LsaHeader.class);
+    private int age;
+    private int options;
+    private int lsType;
+    private long lsSequenceNo;
+    private int lsCheckSum;
+    private int lsPacketLen;
+    private String linkStateId;
+    private Ip4Address advertisingRouter;
+
+    /**
+     * Gets LSA age.
+     *
+     * @return LSA age
+     */
+    public int age() {
+        return age;
+    }
+
+    /**
+     * Sets LSA age.
+     *
+     * @param age LSA age
+     */
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    /**
+     * Gets options value.
+     *
+     * @return options header value
+     */
+    public int options() {
+        return options;
+    }
+
+    /**
+     * Sets options header value.
+     *
+     * @param options header value
+     */
+    public void setOptions(int options) {
+        this.options = options;
+    }
+
+    /**
+     * Gets LSA type.
+     *
+     * @return LSA type
+     */
+    public int lsType() {
+        return lsType;
+    }
+
+    /**
+     * Sets LSA type.
+     *
+     * @param lsType LSA type
+     */
+    public void setLsType(int lsType) {
+        this.lsType = lsType;
+    }
+
+    /**
+     * Gets link state id.
+     *
+     * @return linkStateId link state id
+     */
+    public String linkStateId() {
+        return linkStateId;
+    }
+
+    /**
+     * Sets link state id.
+     *
+     * @param linkStateId link state id
+     */
+    public void setLinkStateId(String linkStateId) {
+        this.linkStateId = linkStateId;
+    }
+
+    /**
+     * Gets advertising router IP.
+     *
+     * @return advertising router
+     */
+    public Ip4Address advertisingRouter() {
+        return advertisingRouter;
+    }
+
+    /**
+     * Sets advertising router.
+     *
+     * @param advertisingRouter advertising router
+     */
+    public void setAdvertisingRouter(Ip4Address advertisingRouter) {
+        this.advertisingRouter = advertisingRouter;
+    }
+
+    /**
+     * Gets LSA sequence number.
+     *
+     * @return LSA sequence number
+     */
+    public long lsSequenceNo() {
+        return lsSequenceNo;
+    }
+
+    /**
+     * Sets LSA sequence number.
+     *
+     * @param lsSequenceNo LSA sequence number
+     */
+    public void setLsSequenceNo(long lsSequenceNo) {
+        this.lsSequenceNo = lsSequenceNo;
+    }
+
+    /**
+     * Gets LSA check sum.
+     *
+     * @return lsCheckSum LSA checksum
+     */
+    public int lsCheckSum() {
+        return lsCheckSum;
+    }
+
+    /**
+     * Sets LSA checksum.
+     *
+     * @param lsCheckSum LSA checksum
+     */
+    public void setLsCheckSum(int lsCheckSum) {
+        this.lsCheckSum = lsCheckSum;
+    }
+
+    /**
+     * Gets lsa packet length.
+     *
+     * @return lsPacketLen LSA packet length
+     */
+    public int lsPacketLen() {
+        return lsPacketLen;
+    }
+
+    /**
+     * Sets LSA packet length.
+     *
+     * @param lsPacketLen LSA packet length
+     */
+    public void setLsPacketLen(int lsPacketLen) {
+        this.lsPacketLen = lsPacketLen;
+    }
+
+    @Override
+    public OspfLsaType getOspfLsaType() {
+        if (lsType == OspfLsaType.ROUTER.value()) {
+            return OspfLsaType.ROUTER;
+        } else if (lsType == OspfLsaType.NETWORK.value()) {
+            return OspfLsaType.NETWORK;
+        } else if (lsType == OspfLsaType.SUMMARY.value()) {
+            return OspfLsaType.SUMMARY;
+        } else if (lsType == OspfLsaType.ASBR_SUMMARY.value()) {
+            return OspfLsaType.ASBR_SUMMARY;
+        } else if (lsType == OspfLsaType.EXTERNAL_LSA.value()) {
+            return OspfLsaType.EXTERNAL_LSA;
+        } else if (lsType == OspfLsaType.LINK_LOCAL_OPAQUE_LSA.value()) {
+            return OspfLsaType.LINK_LOCAL_OPAQUE_LSA;
+        } else if (lsType == OspfLsaType.AREA_LOCAL_OPAQUE_LSA.value()) {
+            return OspfLsaType.AREA_LOCAL_OPAQUE_LSA;
+        } else if (lsType == OspfLsaType.AS_OPAQUE_LSA.value()) {
+            return OspfLsaType.AS_OPAQUE_LSA;
+        }
+
+        return OspfLsaType.UNDEFINED;
+    }
+
+    @Override
+    public OspfLsa lsaHeader() {
+        return this;
+    }
+
+    /**
+     * Gets the LSA header as bytes.
+     *
+     * @return LSA header as bytes
+     */
+    public byte[] getLsaHeaderAsByteArray() {
+        List<Byte> headerLst = new ArrayList<>();
+        try {
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.age())));
+            headerLst.add((byte) this.options());
+            headerLst.add((byte) this.lsType());
+            headerLst.addAll(Bytes.asList(InetAddress.getByName(this.linkStateId()).getAddress()));
+            headerLst.addAll(Bytes.asList(this.advertisingRouter().toOctets()));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.lsSequenceNo())));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsCheckSum())));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsPacketLen())));
+        } catch (Exception e) {
+            log.debug("Error::getLsaHeaderAsByteArray {}", e.getMessage());
+            return Bytes.toArray(headerLst);
+        }
+        return Bytes.toArray(headerLst);
+    }
+
+    /**
+     * Populates the header from the LSA header instance.
+     *
+     * @param lsaHeader LSA header instance
+     */
+    public void populateHeader(LsaHeader lsaHeader) {
+        //assign all the header values
+        this.setAge(lsaHeader.age());
+        this.setOptions(lsaHeader.options());
+        this.setLsType(lsaHeader.lsType());
+        this.setLinkStateId(lsaHeader.linkStateId());
+        this.setAdvertisingRouter(lsaHeader.advertisingRouter());
+        this.setLsSequenceNo(lsaHeader.lsSequenceNo());
+        this.setLsCheckSum(lsaHeader.lsCheckSum());
+        this.setLsPacketLen(lsaHeader.lsPacketLen());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        LsaHeader that = (LsaHeader) o;
+        return Objects.equal(age, that.age) &&
+                Objects.equal(options, that.options) &&
+                Objects.equal(lsType, that.lsType) &&
+                Objects.equal(lsSequenceNo, that.lsSequenceNo) &&
+                Objects.equal(lsCheckSum, that.lsCheckSum) &&
+                Objects.equal(lsPacketLen, that.lsPacketLen) &&
+                Objects.equal(linkStateId, that.linkStateId) &&
+                Objects.equal(advertisingRouter, that.advertisingRouter);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(age, options, lsType, lsSequenceNo, lsCheckSum,
+                                lsPacketLen, linkStateId, advertisingRouter);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("age", age)
+                .add("options", options)
+                .add("lsType", lsType)
+                .add("lsSequenceNo", lsSequenceNo)
+                .add("lsCheckSum", lsCheckSum)
+                .add("lsPacketLen", lsPacketLen)
+                .add("linkStateId;", linkStateId)
+                .add("advertisingRouter", advertisingRouter)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeader.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeader.java
new file mode 100644
index 0000000..ac27445
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeader.java
@@ -0,0 +1,163 @@
+/*
+ * 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.ospf.protocol.lsa;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Defines the Opaque LSA header, fields and the methods to access them.
+ */
+public class OpaqueLsaHeader extends LsaHeader {
+    /*
+       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
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |            LS age             |     Options   |  9, 10, or 11 |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |  Opaque Type  |               Opaque ID                       |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |                      Advertising Router                       |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |                      LS Sequence Number                       |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      |         LS checksum           |           Length              |
+      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+      Opaque LSA header format
+      REFERENCE : RFC 5250
+     */
+    private int opaqueId;
+    private int opaqueType;
+
+    /**
+     * Populates the header from the lsaHeader instance.
+     *
+     * @param lsaHeader lsa header instance.
+     */
+    public void populateHeader(OpaqueLsaHeader lsaHeader) {
+        //assign all the header values
+        this.setAge(lsaHeader.age());
+        this.setOptions(lsaHeader.options());
+        this.setLsType(lsaHeader.lsType());
+        this.setLinkStateId(lsaHeader.linkStateId());
+        this.setAdvertisingRouter(lsaHeader.advertisingRouter());
+        this.setLsSequenceNo(lsaHeader.lsSequenceNo());
+        this.setLsCheckSum(lsaHeader.lsCheckSum());
+        this.setLsPacketLen(lsaHeader.lsPacketLen());
+        this.setOpaqueId(lsaHeader.opaqueId());
+        this.setOpaqueType(lsaHeader.opaqueType());
+    }
+
+    /**
+     * Gets the opaque id.
+     *
+     * @return opaque id
+     */
+    public int opaqueId() {
+        return opaqueId;
+    }
+
+    /**
+     * Sets the opaque id.
+     *
+     * @param opaqueId opaque id
+     */
+    public void setOpaqueId(int opaqueId) {
+        this.opaqueId = opaqueId;
+    }
+
+    /**
+     * Gets opaque type.
+     *
+     * @return opaque type
+     */
+    public int opaqueType() {
+        return opaqueType;
+    }
+
+    /**
+     * Sets opaque type.
+     *
+     * @param opaqueType opaque type
+     */
+    public void setOpaqueType(int opaqueType) {
+        this.opaqueType = opaqueType;
+    }
+
+    /**
+     * Gets header as byte array.
+     *
+     * @return header as byte array
+     */
+    public byte[] getOpaqueLsaHeaderAsByteArray() {
+        List<Byte> headerLst = new ArrayList<>();
+        try {
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.age())));
+            headerLst.add((byte) this.options());
+            headerLst.add((byte) this.lsType());
+            headerLst.add((byte) this.opaqueType());
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToThreeBytes(this.opaqueId())));
+            headerLst.addAll(Bytes.asList(this.advertisingRouter().toOctets()));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.lsSequenceNo())));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsCheckSum())));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.lsPacketLen())));
+        } catch (Exception e) {
+            log.debug("Error::getLsaHeaderAsByteArray {}", e.getMessage());
+            return Bytes.toArray(headerLst);
+        }
+        return Bytes.toArray(headerLst);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        OpaqueLsaHeader that = (OpaqueLsaHeader) o;
+        return Objects.equal(opaqueId, that.opaqueId) &&
+                Objects.equal(opaqueType, that.opaqueType) &&
+                Objects.equal(age(), that.age()) &&
+                Objects.equal(options(), that.options()) &&
+                Objects.equal(lsType(), that.lsType()) &&
+                Objects.equal(lsSequenceNo(), that.lsSequenceNo()) &&
+                Objects.equal(lsCheckSum(), that.lsCheckSum()) &&
+                Objects.equal(lsPacketLen(), that.lsPacketLen()) &&
+                Objects.equal(linkStateId(), that.linkStateId()) &&
+                Objects.equal(advertisingRouter(), that.advertisingRouter());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(opaqueId, opaqueType);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("opaqueId", this.opaqueId)
+                .add("opaqueType", opaqueType)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/package-info.java
new file mode 100644
index 0000000..9e1ce7a
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/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 OSPF LSA.
+ */
+package org.onosproject.ospf.protocol.lsa;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessage.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessage.java
new file mode 100644
index 0000000..e4d4448
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessage.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ospf.protocol.ospfpacket;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+/**
+ * Representation of an OSPF message.
+ */
+public interface OspfMessage {
+
+    /**
+     * Returns the type of OSPF message.
+     *
+     * @return OSPF message type
+     */
+    public OspfPacketType ospfMessageType();
+
+    /**
+     * Reads from ChannelBuffer and initializes the type of LSA.
+     *
+     * @param channelBuffer channel buffer instance
+     * @throws OspfParseException might throws exception while parsing buffer
+     */
+    void readFrom(ChannelBuffer channelBuffer) throws OspfParseException;
+
+    /**
+     * Returns OSPFMessage as byte array.
+     *
+     * @return OSPF message as bytes
+     */
+    byte[] asBytes();
+
+    /**
+     * Sets the source IP address.
+     *
+     * @param sourceIp IP address
+     */
+    public void setSourceIp(Ip4Address sourceIp);
+
+    /**
+     * Gets the destination IP address.
+     *
+     * @return destination IP address
+     */
+    public Ip4Address destinationIp();
+
+    /**
+     * Sets destination IP.
+     *
+     * @param destinationIp destination IP address
+     */
+    public void setDestinationIp(Ip4Address destinationIp);
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeader.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeader.java
new file mode 100644
index 0000000..b9d52a9
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeader.java
@@ -0,0 +1,290 @@
+/*
+ * 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.ospf.protocol.ospfpacket;
+
+import com.google.common.base.MoreObjects;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+/**
+ * Defines the OSPF Packet Header, fields and access methods.
+ * Every OSPF packet starts with a standard 24 byte header.
+ * This header contains all the information necessary to determine whether
+ * the packet should be accepted for further processing
+ */
+public class OspfPacketHeader implements OspfMessage {
+
+    /*
+        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
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |   Version #   |     Type      |         Packet length         |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Router ID                            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                           Area ID                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |           Checksum            |             AuType            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+     */
+
+    private int ospfVer;
+    private int ospfType;
+    private int ospfPackLength;
+    private Ip4Address routerId;
+    private Ip4Address areaId;
+    private int checkSum;
+    private int auType;
+    private int authentication;
+    private Ip4Address destinationIp;
+    private Ip4Address sourceIp;
+
+    /**
+     * Gets the source IP.
+     *
+     * @return source IP address
+     */
+    public Ip4Address sourceIp() {
+        return sourceIp;
+    }
+
+    /**
+     * Sets the source IP address.
+     *
+     * @param sourceIp source IP address
+     */
+    public void setSourceIp(Ip4Address sourceIp) {
+        this.sourceIp = sourceIp;
+    }
+
+    @Override
+    public OspfPacketType ospfMessageType() {
+        //default impl
+        return null;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+        //default impl
+    }
+
+    @Override
+    public byte[] asBytes() {
+        //default impl
+        return new byte[0];
+    }
+
+    /**
+     * Gets OSPF version.
+     *
+     * @return OSPF version
+     */
+    public int ospfVersion() {
+        return ospfVer;
+    }
+
+    /**
+     * Sets OSPF version.
+     *
+     * @param ospfVer OSPF version
+     */
+    public void setOspfVer(int ospfVer) {
+        this.ospfVer = ospfVer;
+    }
+
+    /**
+     * Gets OSPF packet type.
+     *
+     * @return OSPF packet type
+     */
+    public int ospfType() {
+        return ospfType;
+    }
+
+    /**
+     * Sets OSPF packet type.
+     *
+     * @param ospfType packet type
+     */
+    public void setOspftype(int ospfType) {
+        this.ospfType = ospfType;
+    }
+
+    /**
+     * Gets ospf packet length.
+     *
+     * @return OSPF packet length
+     */
+    public int ospfPacLength() {
+        return ospfPackLength;
+    }
+
+    /**
+     * Sets OSPF packet length.
+     *
+     * @param ospfPacLength packet length
+     */
+    public void setOspfPacLength(int ospfPacLength) {
+        this.ospfPackLength = ospfPacLength;
+    }
+
+    /**
+     * Gets router id.
+     *
+     * @return routerId
+     */
+    public Ip4Address routerId() {
+        return routerId;
+    }
+
+    /**
+     * Sets router id.
+     *
+     * @param routerId router id
+     */
+    public void setRouterId(Ip4Address routerId) {
+        this.routerId = routerId;
+    }
+
+    /**
+     * Gets area id.
+     *
+     * @return areaId area id
+     */
+    public Ip4Address areaId() {
+        return areaId;
+    }
+
+    /**
+     * Sets area id.
+     *
+     * @param areaId area id
+     */
+    public void setAreaId(Ip4Address areaId) {
+        this.areaId = areaId;
+    }
+
+    /**
+     * Gets checksum value.
+     *
+     * @return checkSum check sum value
+     */
+    public int checksum() {
+        return checkSum;
+    }
+
+    /**
+     * Sets checksum.
+     *
+     * @param checkSum check sum value
+     */
+    public void setChecksum(int checkSum) {
+        this.checkSum = checkSum;
+    }
+
+    /**
+     * Gets auth type.
+     *
+     * @return authType authentication type
+     */
+    public int authType() {
+        return auType;
+    }
+
+    /**
+     * Sets auth Type.
+     *
+     * @param auType authentication type
+     */
+    public void setAuthType(int auType) {
+        this.auType = auType;
+    }
+
+    /**
+     * Gets authentication.
+     *
+     * @return authentication
+     */
+    public int authentication() {
+        return authentication;
+    }
+
+    /**
+     * Sets authentication.
+     *
+     * @param authentication authentication
+     */
+    public void setAuthentication(int authentication) {
+        this.authentication = authentication;
+    }
+
+    /**
+     * Gets destination IP.
+     *
+     * @return destination IP
+     */
+    public Ip4Address destinationIp() {
+        return destinationIp;
+    }
+
+    /**
+     * Sets destination IP.
+     *
+     * @param destinationIp destination IP
+     */
+    public void setDestinationIp(Ip4Address destinationIp) {
+        this.destinationIp = destinationIp;
+    }
+
+    /**
+     * Populates the header from the packetHeader instance.
+     *
+     * @param ospfPacketHeader packet header instance.
+     */
+    public void populateHeader(OspfPacketHeader ospfPacketHeader) {
+        this.setSourceIp(ospfPacketHeader.sourceIp());
+        this.setOspfVer(ospfPacketHeader.ospfVersion());
+        this.setOspftype(ospfPacketHeader.ospfType());
+        this.setOspfPacLength(ospfPacketHeader.ospfPacLength());
+        this.setRouterId(ospfPacketHeader.routerId());
+        this.setAreaId(ospfPacketHeader.areaId());
+        this.setChecksum(ospfPacketHeader.checksum());
+        this.setAuthType(ospfPacketHeader.authType());
+        this.setAuthentication(ospfPacketHeader.authentication());
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("ospfVersion", ospfVer)
+                .add("ospfType", ospfType)
+                .add("ospfPackLength", ospfPackLength)
+                .add("routerId", routerId)
+                .add("areaId", areaId)
+                .add("checkSum", checkSum)
+                .add("auType", auType)
+                .add("authentication", authentication)
+                .add("destinationIP", destinationIp)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/package-info.java
new file mode 100644
index 0000000..592020d
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/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 different types of OSPF Packets.
+ */
+package org.onosproject.ospf.protocol.ospfpacket;
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/package-info.java
new file mode 100644
index 0000000..56164ed
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/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 OSPF protocol..
+ */
+package org.onosproject.ospf.protocol;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfInterfaceState.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfInterfaceState.java
new file mode 100644
index 0000000..5b55113
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfInterfaceState.java
@@ -0,0 +1,50 @@
+/*
+ * 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.ospf.protocol.util;
+
+/**
+ * Representation of an OSPF Interface states.
+ */
+public enum OspfInterfaceState {
+
+    DOWN(1),
+    LOOPBACK(2),
+    WAITING(3),
+    POINT2POINT(4),
+    DROTHER(5),
+    BDR(6),
+    DR(7);
+
+    private int value;
+
+    /**
+     * Creates an instance of Interface State.
+     *
+     * @param value Interface State value
+     */
+    OspfInterfaceState(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets value for Interface State.
+     *
+     * @return value Interface State
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfPacketType.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfPacketType.java
new file mode 100644
index 0000000..636d1b6
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfPacketType.java
@@ -0,0 +1,48 @@
+/*
+ * 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.ospf.protocol.util;
+
+/**
+ * Representation of different OSPF packet types.
+ */
+public enum OspfPacketType {
+
+    HELLO(1),
+    DD(2),
+    LSREQUEST(3),
+    LSUPDATE(4),
+    LSAACK(5);
+
+    private int value;
+
+    /**
+     * Creates instance of OSPF packet types.
+     *
+     * @param value
+     */
+    OspfPacketType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the value.
+     *
+     * @return value
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfParameters.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfParameters.java
new file mode 100644
index 0000000..357a529
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfParameters.java
@@ -0,0 +1,58 @@
+/*
+ * 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.ospf.protocol.util;
+
+/**
+ * Representation of an OSPF configuration parameters and constants.
+ */
+public final class OspfParameters {
+
+    public static final int LSREFRESHTIME = 1800; //max time between updates;
+    public static final int MINLSINTERVAL = 5; // set to 5 second
+    public static final int MINLSARRIVAL = 1; // set to 1 second
+    public static final int MAXAGE = 3600; // set to 1 hour in seconds
+    public static final int CHECKAGE = 300; // set to 5 mins
+    public static final int MAXAGEDIFF = 900; // set to 15 mins
+    public static final long MAXSEQUENCENUMBER = 2147483647;
+    public static final long STARTLSSEQUENCENUM = -2147483647;
+    public static final int AGECOUNTER = 1;
+    public static final String VERIFYCHECKSUM = "verifyChecksum";
+    public static final String REFRESHLSA = "refreshLsa";
+    public static final String MAXAGELSA = "maxAgeLsa";
+    public static final int START_NOW = 0;
+    public static final int TRAFFIC_ENGINEERING = 1;
+    public static final int INITIAL_BANDWIDTH = 12500000;
+    public static final int ROUTER = 1;
+    public static final int NETWORK = 2;
+    public static final int SUMMARY = 3;
+    public static final int ASBR_SUMMARY = 4;
+    public static final int EXTERNAL_LSA = 5;
+    public static final int LINK_LOCAL_OPAQUE_LSA = 9;
+    public static final int AREA_LOCAL_OPAQUE_LSA = 10;
+    public static final int AS_OPAQUE_LSA = 11;
+    public static final int HELLO = 1;
+    public static final int DD = 2;
+    public static final int LSREQUEST = 3;
+    public static final int LSUPDATE = 4;
+    public static final int LSACK = 5;
+    public static final int INFTRA_NS_DELAY = 1;
+    public static final int BDR = 6;
+    public static final int DR = 7;
+    public static final String OPAQUE_ENABLED_OPTION_VALUE = "01000010";
+
+    private OspfParameters() {
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfUtil.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfUtil.java
new file mode 100644
index 0000000..0185542
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/OspfUtil.java
@@ -0,0 +1,416 @@
+/*
+ * 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.ospf.protocol.util;
+
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.xml.bind.DatatypeConverter;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.StringTokenizer;
+
+/**
+ * Representation of an OSPF constants and utility methods.
+ */
+public final class OspfUtil {
+
+    public static final int OSPF_VERSION_2 = 2;
+    public static final int OSPF_VERSION = OSPF_VERSION_2;
+    public static final int PACKET_MINIMUM_LENGTH = 24;
+    public static final int OSPF_HEADER_LENGTH = 24;
+    public static final int LSA_HEADER_LENGTH = 20;
+    public static final int DD_HEADER_LENGTH = OSPF_HEADER_LENGTH + 8;
+    public static final int LSREQUEST_LENGTH = 12;
+    public static final int OSPFPACKET_LENGTH_POS1 = 2;
+    public static final int OSPFPACKET_LENGTH_POS2 = 3;
+    public static final int OSPFPACKET_CHECKSUM_POS1 = 12;
+    public static final int OSPFPACKET_CHECKSUM_POS2 = 13;
+    public static final int LSAPACKET_CHECKSUM_POS1 = 16;
+    public static final int LSAPACKET_CHECKSUM_POS2 = 17;
+    public static final Ip4Address ALL_SPF_ROUTERS = Ip4Address.valueOf("224.0.0.5");
+    public static final Ip4Address ALL_DROUTERS = Ip4Address.valueOf("224.0.0.6");
+    public static final int ONLY_ALL_SPF_ROUTERS = 1;
+    public static final int JOIN_ALL_DROUTERS = 2;
+    public static final int INITIALIZE_SET = 1;
+    public static final int INITIALIZE_NOTSET = 0;
+    public static final int MORE_SET = 1;
+    public static final int MORE_NOTSET = 0;
+    public static final int IS_MASTER = 1;
+    public static final int NOT_MASTER = 0;
+    public static final int NOT_ASSIGNED = 0;
+    public static final int FOUR_BYTES = 4;
+    public static final int EIGHT_BYTES = 8;
+    public static final int TWELVE_BYTES = 12;
+    public static final int EXTERNAL_DESTINATION_LENGTH = 12;
+    private static final Logger log =
+            LoggerFactory.getLogger(OspfUtil.class);
+
+    /**
+     * Creates an instance.
+     */
+    private OspfUtil() {
+
+    }
+
+    /**
+     * Checks given IPs are in same network or not.
+     *
+     * @param ip1  IP address
+     * @param ip2  IP address
+     * @param mask network mask
+     * @return true if both are in same network else false
+     * @throws Exception might throws exception while parsing ip address
+     */
+    public static boolean sameNetwork(Ip4Address ip1, Ip4Address ip2, Ip4Address mask)
+            throws Exception {
+
+        byte[] a1 = ip1.toOctets();
+        byte[] a2 = ip2.toOctets();
+        byte[] m = mask.toOctets();
+
+        for (int i = 0; i < a1.length; i++) {
+            if ((a1[i] & m[i]) != (a2[i] & m[i])) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Converts IP address to long.
+     *
+     * @param ipAddress IP address
+     * @return long value represents IP address
+     */
+    public static long ipAddressToLong(String ipAddress) {
+        StringTokenizer st = new StringTokenizer(ipAddress, ".");
+        long ipAsNumber = Long.parseLong(st.nextToken()) * (long) Math.pow(256, 3);
+        ipAsNumber += Long.parseLong(st.nextToken()) * (long) Math.pow(256, 2);
+        ipAsNumber += Long.parseLong(st.nextToken()) * 256;
+        ipAsNumber += +Long.parseLong(st.nextToken());
+
+        return ipAsNumber;
+    }
+
+    /**
+     * Checks option field to see whether opaque enabled or not.
+     * 2nd Bit in options field of DdPacket represents Opaque.
+     * 7th bit is external capability.
+     * This method checks Opaque bit is set in the options or not.
+     *
+     * @param options options value
+     * @return true if opaque enabled else false.
+     */
+    public static boolean isOpaqueEnabled(int options) {
+        Boolean[] bits = new Boolean[8];
+        for (int i = 7; i >= 0; i--) {
+            bits[i] = (options & (1 << i)) != 0;
+        }
+
+        List<Boolean> list = Arrays.asList(bits);
+        Collections.reverse(list);
+
+        //2nd bit is Opaque.
+        return list.get(1);
+    }
+
+    /**
+     * Converts a byte to integer variable.
+     *
+     * @param bytesToConvert bytes to convert
+     * @return integer representation of bytes
+     */
+    public static int byteToInteger(byte[] bytesToConvert) {
+        final StringBuilder builder = new StringBuilder();
+        for (byte eachByte : bytesToConvert) {
+            builder.append(String.format("%02x", eachByte));
+        }
+        int num = Integer.parseInt(builder.toString(), 16);
+        return num;
+    }
+
+    /**
+     * Converts a byte to long variable.
+     *
+     * @param bytesToConvert bytes to convert
+     * @return long representation of bytes
+     */
+    public static long byteToLong(byte[] bytesToConvert) {
+        final StringBuilder builder = new StringBuilder();
+        for (byte eachByte : bytesToConvert) {
+            builder.append(String.format("%02x", eachByte));
+        }
+        long num = Long.parseLong(builder.toString(), 16);
+        return num;
+    }
+
+    /**
+     * Creates a random number.
+     *
+     * @return random number
+     */
+    public static int createRandomNumber() {
+        Random rnd = new Random();
+        int randomNumber = 10000000 + rnd.nextInt(90000000);
+        return randomNumber;
+    }
+
+    /**
+     * Reads the LSA header from channel buffer.
+     *
+     * @param channelBuffer channel buffer instance
+     * @return LSA header instance.
+     * @throws Exception might throws exception while parsing buffer
+     */
+    public static LsaHeader readLsaHeader(ChannelBuffer channelBuffer) throws Exception {
+        //add all the LSA Headers - one header is of 20 bytes
+        LsaHeader lsaHeader = null;
+        if (channelBuffer.readableBytes() >= OspfUtil.LSA_HEADER_LENGTH) {
+            byte[] byteArray = new byte[OspfUtil.FOUR_BYTES];
+            channelBuffer.readBytes(byteArray, 0, OspfUtil.FOUR_BYTES);
+            ChannelBuffer tempBuffer = ChannelBuffers.copiedBuffer(byteArray);
+            int lsType = byteArray[3];
+            if (lsType == OspfParameters.AREA_LOCAL_OPAQUE_LSA || lsType == OspfParameters.LINK_LOCAL_OPAQUE_LSA
+                    || lsType == OspfParameters.AS_OPAQUE_LSA) {
+                OpaqueLsaHeader header = new OpaqueLsaHeader();
+                header.setAge(tempBuffer.readShort());
+                header.setOptions(tempBuffer.readByte());
+                header.setLsType(tempBuffer.readByte());
+                header.setOpaqueType(channelBuffer.readByte());
+                header.setOpaqueId(channelBuffer.readUnsignedMedium());
+                byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                header.setAdvertisingRouter(Ip4Address.valueOf(tempByteArray));
+                header.setLsSequenceNo(channelBuffer.readInt());
+                header.setLsCheckSum(channelBuffer.readUnsignedShort());
+                header.setLsPacketLen(channelBuffer.readShort());
+                byte[] opaqueIdBytes = OspfUtil.convertToTwoBytes(header.opaqueId());
+                header.setLinkStateId(header.opaqueType() + "." + "0" + "." +
+                                              opaqueIdBytes[0] + "." + opaqueIdBytes[1]);
+                lsaHeader = header;
+            } else {
+                LsaHeader header = new LsaHeader();
+                header.setAge(tempBuffer.readShort());
+                header.setOptions(tempBuffer.readByte());
+                header.setLsType(tempBuffer.readByte());
+                byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                header.setLinkStateId(InetAddress.getByAddress(tempByteArray).getHostName());
+                tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                header.setAdvertisingRouter(Ip4Address.valueOf(tempByteArray));
+                header.setLsSequenceNo(channelBuffer.readInt());
+                header.setLsCheckSum(channelBuffer.readUnsignedShort());
+                header.setLsPacketLen(channelBuffer.readShort());
+                lsaHeader = header;
+            }
+        }
+        return lsaHeader;
+    }
+
+
+    /**
+     * Converts an integer to two bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return 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 three bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return given number as bytes
+     */
+    public static byte[] convertToThreeBytes(int numberToConvert) {
+        byte[] numInBytes = new byte[3];
+        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] = hexas[0];
+        } else if (hexas.length == 2) {
+            numInBytes[0] = 0;
+            numInBytes[1] = hexas[0];
+            numInBytes[2] = hexas[1];
+        } else {
+            numInBytes[0] = hexas[0];
+            numInBytes[1] = hexas[1];
+            numInBytes[2] = hexas[2];
+        }
+        return numInBytes;
+    }
+
+    /**
+     * Converts a number to four bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return 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;
+    }
+
+    /**
+     * Converts a number to four bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return given number as bytes
+     */
+    public static byte[] convertToFourBytes(long numberToConvert) {
+
+        byte[] numInBytes = new byte[4];
+        String s1 = Long.toHexString(numberToConvert);
+        if (s1.length() % 2 != 0) {
+            s1 = "0" + s1;
+        }
+        if (s1.length() == 16) {
+            s1 = s1.substring(8, s1.length());
+        }
+        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;
+    }
+
+    /**
+     * Adds the checksum and length in packet.
+     *
+     * @param ospfPacket       ospf packet
+     * @param lengthBytePos1   length byte position
+     * @param lengthBytePos2   length byte position
+     * @param checksumBytePos1 checksum byte position
+     * @param checksumBytePos2 checksum byte position
+     * @return byte array with checksum and length
+     */
+    public static byte[] addLengthAndCheckSum(byte[] ospfPacket, int lengthBytePos1, int lengthBytePos2,
+                                              int checksumBytePos1, int checksumBytePos2) {
+        //Set the length of the packet
+        //Get the total length of the packet
+        int length = ospfPacket.length;
+        //Convert the lenth to two bytes as the length field is 2 bytes
+        byte[] lenthInTwoBytes = OspfUtil.convertToTwoBytes(length);
+        //ospf header 3rd and 4th position represents length
+        ospfPacket[lengthBytePos1] = lenthInTwoBytes[0]; //assign 1st byte in lengthBytePos1
+        ospfPacket[lengthBytePos2] = lenthInTwoBytes[1]; //assign 2st byte in lengthBytePos2
+
+        //Get the checksum as two bytes.
+        byte[] checkSumInTwoBytes = new ChecksumCalculator().calculateOspfCheckSum(ospfPacket,
+                                                                                   checksumBytePos1, checksumBytePos2);
+        ospfPacket[checksumBytePos1] = checkSumInTwoBytes[0]; //assign 1st byte in checksumBytePos1
+        ospfPacket[checksumBytePos2] = checkSumInTwoBytes[1]; //assign 2st byte in checksumBytePos2
+
+        return ospfPacket;
+    }
+
+    /**
+     * Adds metadata to ospf packet like whether to join multi cast group and destination IP.
+     *
+     * @param ospfPacket       OSPF packet
+     * @param allDroutersValue whether to join multi cast or not
+     * @param destinationIp    destination ip address
+     * @return byte array
+     */
+    public static byte[] addMetadata(byte[] ospfPacket, int allDroutersValue, Ip4Address destinationIp) {
+        byte[] packet;
+        byte[] allDroutersByteVal = {(byte) allDroutersValue};
+        byte[] destIpAsBytes = destinationIp.toOctets();
+        byte[] metadata = Bytes.concat(allDroutersByteVal, destIpAsBytes);
+
+        packet = Bytes.concat(metadata, ospfPacket);
+
+        return packet;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/package-info.java
new file mode 100644
index 0000000..c3ea5cd
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/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 ospf protocol utilities.
+ */
+package org.onosproject.ospf.protocol.util;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/LsaHeaderTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/LsaHeaderTest.java
new file mode 100644
index 0000000..2876deb
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/LsaHeaderTest.java
@@ -0,0 +1,308 @@
+/*
+ * 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.ospf.protocol.lsa;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.controller.OspfLsaType;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+
+/**
+ * Unit test class for LsaHeader.
+ */
+public class LsaHeaderTest {
+
+    private LsaHeader lsaHeader;
+    private int result;
+    private Ip4Address result1;
+    private long result2;
+    private OspfLsaType ospflsaType;
+    private LsaHeader header;
+    private byte[] result3;
+    private LsaHeader lsaHeader1;
+    private String result4;
+
+    @Before
+    public void setUp() throws Exception {
+        lsaHeader = new LsaHeader();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lsaHeader = null;
+        result1 = null;
+        ospflsaType = null;
+        header = null;
+        result3 = null;
+        lsaHeader1 = null;
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(lsaHeader.equals(new LsaHeader()), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        result = lsaHeader.hashCode();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests age() getter method.
+     */
+    @Test
+    public void testGetAge() throws Exception {
+        lsaHeader.setAge(10);
+        result = lsaHeader.age();
+        assertThat(result, is(10));
+    }
+
+    /**
+     * Tests age() setter method.
+     */
+    @Test
+    public void testSetAge() throws Exception {
+        lsaHeader.setAge(10);
+        result = lsaHeader.age();
+        assertThat(result, is(10));
+    }
+
+    /**
+     * Tests options() getter method.
+     */
+    @Test
+    public void testGetOptions() throws Exception {
+        lsaHeader.setOptions(2);
+        result = lsaHeader.options();
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests options() setter method.
+     */
+    @Test
+    public void testSetOptions() throws Exception {
+        lsaHeader.setOptions(2);
+        result = lsaHeader.options();
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests lsType() getter method.
+     */
+    @Test
+    public void testGetLsType() throws Exception {
+        lsaHeader.setLsType(1);
+        result = lsaHeader.lsType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests lsType() setter method.
+     */
+    @Test
+    public void testSetLsType() throws Exception {
+        lsaHeader.setLsType(1);
+        result = lsaHeader.lsType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests linkStateId() getter method.
+     */
+    @Test
+    public void testGetLinkStateId() throws Exception {
+        lsaHeader.setLinkStateId("10.226.165.164");
+        result4 = lsaHeader.linkStateId();
+        assertThat(result4, is("10.226.165.164"));
+    }
+
+    /**
+     * Tests linkStateId() setter method.
+     */
+    @Test
+    public void testSetLinkStateId() throws Exception {
+        lsaHeader.setLinkStateId("10.226.165.164");
+        result4 = lsaHeader.linkStateId();
+        assertThat(result4, is("10.226.165.164"));
+    }
+
+    /**
+     * Tests advertisingRouter() setter method.
+     */
+    @Test
+    public void testGetAdvertisingRouter() throws Exception {
+        lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("10.226.165.164"));
+        result1 = lsaHeader.advertisingRouter();
+        assertThat(result1, is(Ip4Address.valueOf("10.226.165.164")));
+    }
+
+    /**
+     * Tests advertisingRouter() setter method.
+     */
+    @Test
+    public void testSetAdvertisingRouter() throws Exception {
+        lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("10.226.165.164"));
+        result1 = lsaHeader.advertisingRouter();
+        assertThat(result1, is(Ip4Address.valueOf("10.226.165.164")));
+    }
+
+    /**
+     * Tests lsSequenceNo() getter method.
+     */
+    @Test
+    public void testGetLsSequenceNo() throws Exception {
+        lsaHeader.setLsSequenceNo(222);
+        result2 = lsaHeader.lsSequenceNo();
+        assertThat(result2, is(222L));
+    }
+
+    /**
+     * Tests lsSequenceNo() setter method.
+     */
+    @Test
+    public void testSetLsSequenceNo() throws Exception {
+        lsaHeader.setLsSequenceNo(222);
+        result2 = lsaHeader.lsSequenceNo();
+        assertThat(result2, is(222L));
+    }
+
+    /**
+     * Tests lsCheckSum() getter method.
+     */
+    @Test
+    public void testGetLsChecksum() throws Exception {
+        lsaHeader.setLsCheckSum(2);
+        result = lsaHeader.lsCheckSum();
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests lsCheckSum() setter method.
+     */
+    @Test
+    public void testSetLsChecksum() throws Exception {
+        lsaHeader.setLsCheckSum(2);
+        result = lsaHeader.lsCheckSum();
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests lsPacketLen() getter method.
+     */
+    @Test
+    public void testGetLsPacketLen() throws Exception {
+        lsaHeader.setLsPacketLen(48);
+        result = lsaHeader.lsPacketLen();
+        assertThat(result, is(48));
+    }
+
+    /**
+     * Tests lsPacketLen() getter method.
+     */
+    @Test
+    public void testSetLsPacketLen() throws Exception {
+        lsaHeader.setLsPacketLen(48);
+        result = lsaHeader.lsPacketLen();
+        assertThat(result, is(48));
+    }
+
+    /**
+     * Tests getOspfLsaType() getter method.
+     */
+    @Test
+    public void testGetOspfLsaType() throws Exception {
+        lsaHeader.setLsType(1);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.ROUTER));
+        lsaHeader.setLsType(2);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.NETWORK));
+        lsaHeader.setLsType(3);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.SUMMARY));
+        lsaHeader.setLsType(4);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.ASBR_SUMMARY));
+        lsaHeader.setLsType(5);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.EXTERNAL_LSA));
+        lsaHeader.setLsType(6);
+        ospflsaType = lsaHeader.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.UNDEFINED));
+    }
+
+    /**
+     * Tests lsaHeader() getter method.
+     */
+    @Test
+    public void testGetLsaHeader() throws Exception {
+        header = (LsaHeader) lsaHeader.lsaHeader();
+        assertThat(header, instanceOf(LsaHeader.class));
+    }
+
+    /**
+     * Tests getLsaHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetLsaHeaderAsByteArray() throws Exception {
+        result3 = lsaHeader.getLsaHeaderAsByteArray();
+        assertThat(result3, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lsaHeader.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests populateHeader() method.
+     */
+    @Test
+    public void testPopulateHeader() throws Exception {
+        lsaHeader1 = new LsaHeader();
+        lsaHeader1.setLsPacketLen(10);
+        lsaHeader1.setAdvertisingRouter(Ip4Address.valueOf("1.1.1.1"));
+        lsaHeader1.setOptions(2);
+        lsaHeader1.setAge(20);
+        lsaHeader1.setLsType(3);
+        lsaHeader1.setLinkStateId("2.2.2.2");
+        lsaHeader1.setLsCheckSum(1234);
+        lsaHeader1.setLsSequenceNo(456789);
+        lsaHeader.populateHeader(lsaHeader1);
+        assertThat(lsaHeader1, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeaderTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeaderTest.java
new file mode 100644
index 0000000..cbf54ec
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/OpaqueLsaHeaderTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.ospf.protocol.lsa;
+
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for OpaqueLsaHeader.
+ */
+public class OpaqueLsaHeaderTest {
+
+    private OpaqueLsaHeader opaqueHeader;
+    private OpaqueLsaHeader opaqueLsaHeader1;
+    private int num;
+    private byte[] result;
+    private int result1;
+
+    @Before
+    public void setUp() throws Exception {
+        opaqueHeader = new OpaqueLsaHeader();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        opaqueHeader = null;
+        opaqueLsaHeader1 = null;
+        result = null;
+    }
+
+    /**
+     * Tests populateHeader() method.
+     */
+    @Test
+    public void testPopulateHeader() throws Exception {
+        opaqueLsaHeader1 = new OpaqueLsaHeader();
+        opaqueLsaHeader1.setLsPacketLen(10);
+        opaqueLsaHeader1.setAdvertisingRouter(Ip4Address.valueOf("1.1.1.1"));
+        opaqueLsaHeader1.setOptions(2);
+        opaqueLsaHeader1.setAge(20);
+        opaqueLsaHeader1.setLsType(3);
+        opaqueLsaHeader1.setOpaqueId(1);
+        opaqueLsaHeader1.setOpaqueType(3);
+        opaqueLsaHeader1.setLsCheckSum(1234);
+        opaqueLsaHeader1.setLsSequenceNo(456789);
+        opaqueLsaHeader1.populateHeader(opaqueLsaHeader1);
+        assertThat(opaqueLsaHeader1, is(notNullValue()));
+    }
+
+    /**
+     * Tests opaqueId() getter method.
+     */
+    @Test
+    public void testGetOpaqueId() throws Exception {
+        opaqueHeader.setOpaqueId(1);
+        num = opaqueHeader.opaqueId();
+        assertThat(num, is(1));
+    }
+
+    /**
+     * Tests opaqueId() setter method.
+     */
+    @Test
+    public void testSetOpaqueId() throws Exception {
+        opaqueHeader.setOpaqueId(1);
+        num = opaqueHeader.opaqueId();
+        assertThat(num, is(1));
+    }
+
+    /**
+     * Tests opaqueType() getter method.
+     */
+    @Test
+    public void testGetOpaqueType() throws Exception {
+        opaqueHeader.setOpaqueType(1);
+        num = opaqueHeader.opaqueType();
+        assertThat(num, is(1));
+    }
+
+    /**
+     * Tests opaqueType() setter method.
+     */
+    @Test
+    public void testSetOpaqueType() throws Exception {
+        opaqueHeader.setOpaqueType(1);
+        num = opaqueHeader.opaqueType();
+        assertThat(num, is(1));
+    }
+
+    /**
+     * Tests getOpaqueLsaHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetOpaqueLsaHeaderAsByteArray() throws Exception {
+        result = opaqueHeader.getOpaqueLsaHeaderAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(opaqueHeader.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashcode() throws Exception {
+
+        result1 = opaqueHeader.hashCode();
+        assertThat(result1, is(Matchers.notNullValue()));
+
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeaderTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeaderTest.java
new file mode 100644
index 0000000..0acb1bf
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfPacketHeaderTest.java
@@ -0,0 +1,318 @@
+/*
+ * 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.ospf.protocol.ospfpacket;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for OspfPacketHeader.
+ */
+public class OspfPacketHeaderTest {
+
+    private final byte[] packet = {0, 0, 0, 0};
+    private OspfPacketHeader ospfPacketHeader;
+    private ChannelBuffer channelBuffer;
+    private byte[] result2;
+    private int result;
+    private Ip4Address result1;
+
+    @Before
+    public void setUp() throws Exception {
+        ospfPacketHeader = new OspfPacketHeader();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ospfPacketHeader = null;
+        ospfPacketHeader = null;
+        channelBuffer = null;
+        result2 = null;
+        result1 = null;
+    }
+
+    /**
+     * Tests sourceIp() getter method.
+     */
+    @Test
+    public void testGetSourceIP() throws Exception {
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("1.1.1.1"));
+        assertThat(ospfPacketHeader.sourceIp(), is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests sourceIp() setter method.
+     */
+    @Test
+    public void testSetSourceIP() throws Exception {
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("1.1.1.1"));
+        assertThat(result, is(notNullValue()));
+        assertThat(ospfPacketHeader.sourceIp(), is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests ospfMessageType() getter method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        assertThat(ospfPacketHeader.ospfMessageType(), nullValue());
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        ospfPacketHeader.readFrom(channelBuffer);
+        assertThat(ospfPacketHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result2 = ospfPacketHeader.asBytes();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests ospfVersion() getter method.
+     */
+    @Test
+    public void testGetOspfVer() throws Exception {
+        ospfPacketHeader.setOspfVer(2);
+        result = ospfPacketHeader.ospfVersion();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests ospfVersion() setter method.
+     */
+    @Test
+    public void testSetOspfVer() throws Exception {
+        ospfPacketHeader.setOspfVer(2);
+        result = ospfPacketHeader.ospfVersion();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests ospfType() getter method.
+     */
+    @Test
+    public void testGetOspfType() throws Exception {
+        ospfPacketHeader.setOspftype(3);
+        result = ospfPacketHeader.ospfType();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests ospfType() setter method.
+     */
+    @Test
+    public void testSetOspfType() throws Exception {
+        ospfPacketHeader.setOspftype(3);
+        result = ospfPacketHeader.ospfType();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests ospfPacLength() getter method.
+     */
+    @Test
+    public void testGetOspfPacLength() throws Exception {
+        ospfPacketHeader.setOspfPacLength(3);
+        result = ospfPacketHeader.ospfPacLength();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests ospfPacLength() setter method.
+     */
+    @Test
+    public void testSetOspfPacLength() throws Exception {
+        ospfPacketHeader.setOspfPacLength(3);
+        int result = ospfPacketHeader.ospfPacLength();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests routerId()getter method.
+     */
+    @Test
+    public void testGetRouterId() throws Exception {
+
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.routerId();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+
+    }
+
+    /**
+     * Tests routerId() setter method.
+     */
+    @Test
+    public void testSetRouterId() throws Exception {
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.routerId();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests areaId() getter method.
+     */
+    @Test
+    public void testGetAreaId() throws Exception {
+        ospfPacketHeader.setAreaId(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.areaId();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests areaId() setter method.
+     */
+    @Test
+    public void testSetAreaId() throws Exception {
+        ospfPacketHeader.setAreaId(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.areaId();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests checksum() getter method.
+     */
+    @Test
+    public void testGetChecksum() throws Exception {
+        ospfPacketHeader.setChecksum(3);
+        result = ospfPacketHeader.checksum();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests checksum() setter method.
+     */
+    @Test
+    public void testSetChecksum() throws Exception {
+        ospfPacketHeader.setChecksum(3);
+        result = ospfPacketHeader.checksum();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests authType() getter method.
+     */
+    @Test
+    public void testGetAutype() throws Exception {
+        ospfPacketHeader.setAuthType(3);
+        result = ospfPacketHeader.authType();
+        Assert.assertNotNull(result);
+        Assert.assertEquals(3, result);
+    }
+
+    /**
+     * Tests authType() setter method.
+     */
+    @Test
+    public void testSetAutype() throws Exception {
+        ospfPacketHeader.setAuthType(3);
+        result = ospfPacketHeader.authType();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests authentication() getter method.
+     */
+    @Test
+    public void testGetAuthentication() throws Exception {
+        ospfPacketHeader.setAuthentication(3);
+        result = ospfPacketHeader.authentication();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests authentication() setter method.
+     */
+    @Test
+    public void testSetAuthentication() throws Exception {
+        ospfPacketHeader.setAuthentication(3);
+        result = ospfPacketHeader.authentication();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(3));
+    }
+
+    /**
+     * Tests destinationIp() getter method.
+     */
+    @Test
+    public void testGetDestinationIP() throws Exception {
+        ospfPacketHeader.setDestinationIp(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.destinationIp();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests destinationIp() setter method.
+     */
+    @Test
+    public void testSetDestinationIP() throws Exception {
+        ospfPacketHeader.setDestinationIp(Ip4Address.valueOf("1.1.1.1"));
+        result1 = ospfPacketHeader.destinationIp();
+        assertThat(result1, is(notNullValue()));
+        assertThat(result1, is(Ip4Address.valueOf("1.1.1.1")));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(ospfPacketHeader.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests populateHeader() method.
+     */
+    @Test
+    public void testPopulateHeader() throws Exception {
+        ospfPacketHeader.populateHeader(new OspfPacketHeader());
+        assertThat(ospfPacketHeader, is(notNullValue()));
+    }
+
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/OspfUtilTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/OspfUtilTest.java
new file mode 100644
index 0000000..750a08d
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/OspfUtilTest.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.ospf.protocol.util;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for OspfUtil.
+ */
+public class OspfUtilTest {
+
+    private final int ospfChecksumPos1 = 12;
+    private final int ospfChecksumPos2 = 13;
+    private final int lsaChecksumPos1 = 16;
+    private final int lsaChecksumPos2 = 17;
+    private final int ospfLengthPos1 = 2;
+    private final int ospfLengthPos2 = 3;
+    private final int lsaLengthPos1 = 18;
+    private final int lsaLengthPos2 = 19;
+    private final byte[] input = {0, 2};
+    private final byte[] packet = {2, 1, 0, 52, -64, -88, 56, 1, -64, -88, 56, 1, 0, 100, 0, 100, 0, 0, 0, 0, 0, 0,
+            0, 0, -64, -88, 56, 1, 0, 10, 1, 1, 0, 0, 0, 40, -64, -88, 56, 1, -64, -88, 56, 1, -64, -88, 56, 1, -64,
+            -88, 56, 1};
+    private final byte[] rLsa = {14, 16, 2, 1, -64, -88, -86, 2, -64, -88, -86, 2, -128, 0, 0, 1, 74, -114, 0, 48, 2,
+            0, 0, 2, -64, -88, -86, 0, -1, -1, -1, 0, 3, 0, 0, 10, -64, -88, -86, 0, -1, -1, -1, 0, 3, 0, 0, 10};
+    private final byte[] opaqueheader = {14, 16, 2, 1, -64, -88, -86, 2, -64, -88, -86, 2, -128, 0, 0, 1, 74, -114,
+            0, 48};
+    private int num;
+    private int result;
+    private int input2;
+    private long input4;
+    private ChannelBuffer channelBuffer;
+    private byte[] result1;
+    private LsaHeader lsaHeader;
+    private boolean result2;
+    private long result3;
+
+
+    @Before
+    public void setUp() throws Exception {
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        channelBuffer = null;
+        result1 = null;
+        lsaHeader = null;
+    }
+
+
+    /**
+     * Tests byteToInteger() method.
+     */
+    @Test
+    public void testByteToInteger() throws Exception {
+        result = OspfUtil.byteToInteger(input);
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+
+    }
+
+    /**
+     * Tests byteToLong() method.
+     */
+    @Test
+    public void testByteToLong() throws Exception {
+        result3 = OspfUtil.byteToLong(input);
+        assertThat(result3, is(notNullValue()));
+        assertThat(result3, is(2L));
+    }
+
+    /**
+     * Tests byteToInteger() method.
+     */
+    @Test
+    public void testByteToLong1() throws Exception {
+        result3 = OspfUtil.byteToLong(input);
+        assertThat(result3, is(notNullValue()));
+        assertThat(result3, is(2L));
+    }
+
+    /**
+     * Tests byteToInteger() method.
+     */
+    @Test
+    public void testByteToInteger1() throws Exception {
+        result = OspfUtil.byteToInteger(input);
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(2));
+    }
+
+    /**
+     * Tests to createRandomNumber() method.
+     */
+    @Test
+    public void testCreateRandomNumber() throws Exception {
+        num = OspfUtil.createRandomNumber();
+        assertThat(num, is(notNullValue()));
+    }
+
+    /**
+     * Tests readLsaHeader() method.
+     */
+    @Test
+    public void testReadLsaHeader2() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        lsaHeader = OspfUtil.readLsaHeader(channelBuffer);
+        assertThat(lsaHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests to readLsaHeader method.
+     */
+    @Test
+    public void testReadLsaHeader1() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(opaqueheader);
+        lsaHeader = OspfUtil.readLsaHeader(channelBuffer);
+        assertThat(lsaHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests convertToTwoBytes() method.
+     */
+    @Test
+    public void testConvertToTwoBytes() throws Exception {
+        input2 = 4;
+        result1 = OspfUtil.convertToTwoBytes(input2);
+        assertThat(result1.length, is(2));
+        input2 = 1000;
+        result1 = OspfUtil.convertToTwoBytes(input2);
+        assertThat(result1.length, is(2));
+    }
+
+    /**
+     * Tests convertToThreeBytes() method.
+     */
+    @Test
+    public void testConvertToThreeBytes() throws Exception {
+        input2 = 1000000;
+        result1 = OspfUtil.convertToThreeBytes(input2);
+        assertThat(result1.length, is(3));
+        input2 = 1000;
+        result1 = OspfUtil.convertToThreeBytes(input2);
+        assertThat(result1.length, is(3));
+        input2 = 1;
+        result1 = OspfUtil.convertToThreeBytes(input2);
+        assertThat(result1.length, is(3));
+    }
+
+    /**
+     * Tests convertToFourBytes() method.
+     */
+    @Test
+    public void testConvertToFourBytes() throws Exception {
+        input4 = 214748364110L;
+        result1 = OspfUtil.convertToFourBytes(input4);
+        assertThat(result1.length, is(4));
+        input4 = 1000000;
+        result1 = OspfUtil.convertToFourBytes(input4);
+        assertThat(result1.length, is(4));
+        input4 = 10000;
+        result1 = OspfUtil.convertToFourBytes(input4);
+        assertThat(result1.length, is(4));
+        input4 = 1;
+        result1 = OspfUtil.convertToFourBytes(input4);
+        assertThat(result1.length, is(4));
+
+    }
+
+    /**
+     * Tests convertToFourBytes() method.
+     */
+    @Test
+    public void testConvertToFourBytes1() throws Exception {
+        input4 = 2147483635;
+        result1 = OspfUtil.convertToFourBytes(this.input4);
+        assertThat(result1.length, is(4));
+        this.input4 = 1000000;
+        result1 = OspfUtil.convertToFourBytes(this.input4);
+        assertThat(result1.length, is(4));
+        this.input4 = 10000;
+        result1 = OspfUtil.convertToFourBytes(this.input4);
+        assertThat(result1.length, is(4));
+        this.input4 = 1;
+        result1 = OspfUtil.convertToFourBytes(this.input4);
+        assertThat(result1.length, is(4));
+
+    }
+
+    /**
+     * Tests addLengthAndCheckSum() method.
+     */
+    @Test
+    public void testAddLengthAndCheckSum() throws Exception {
+        result1 = OspfUtil.addLengthAndCheckSum(packet, ospfLengthPos1, ospfLengthPos2,
+                                                ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(result1[ospfChecksumPos1], is(packet[ospfChecksumPos1]));
+        assertThat(result1[ospfChecksumPos2], is(packet[ospfChecksumPos2]));
+        assertThat(result1[ospfLengthPos1], is(packet[ospfLengthPos1]));
+        assertThat(result1[ospfLengthPos2], is(packet[ospfLengthPos2]));
+    }
+
+    /**
+     * Tests addMetadata() method.
+     */
+    @Test
+    public void testAddMetadata() throws Exception {
+        result1 = OspfUtil.addMetadata(packet, 123, Ip4Address.valueOf("1.1.1.1"));
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests addLengthAndCheckSum() method.
+     */
+    @Test
+    public void testAddLsaLengthAndCheckSum() throws Exception {
+        result1 = OspfUtil.addLengthAndCheckSum(rLsa, lsaLengthPos1, lsaLengthPos2,
+                                                lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(result1[lsaLengthPos1], is(rLsa[lsaLengthPos1]));
+        assertThat(result1[lsaLengthPos2], is(rLsa[lsaLengthPos2]));
+        assertThat(result1[lsaChecksumPos1], is(rLsa[lsaChecksumPos1]));
+        assertThat(result1[lsaChecksumPos2], is(rLsa[lsaChecksumPos2]));
+    }
+
+    /**
+     * Tests addMetadata() method.
+     */
+    @Test
+    public void testAddMetaData() throws Exception {
+        result1 = OspfUtil.addMetadata(packet, 1, Ip4Address.valueOf("2.2.2.2"));
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests sameNetwork() method.
+     */
+    @Test
+    public void testSameNetwork() throws Exception {
+        result2 = OspfUtil.sameNetwork(Ip4Address.valueOf("10.10.10.10"), Ip4Address.valueOf("10.10.10.11"),
+                                       Ip4Address.valueOf("255.255.255.255"));
+        assertThat(result2, is(false));
+        result2 = OspfUtil.sameNetwork(Ip4Address.valueOf("10.10.10.10"), Ip4Address.valueOf("10.10.10.10"),
+                                       Ip4Address.valueOf("255.255.255.255"));
+        assertThat(result2, is(true));
+    }
+
+    /**
+     * Tests isOpaqueEnabled() method.
+     */
+    @Test
+    public void testIsOpaqueEnabled() throws Exception {
+        result2 = OspfUtil.isOpaqueEnabled(2);
+        assertThat(result2, is(false));
+    }
+
+    /**
+     * Tests sameNetwork() method.
+     */
+    @Test
+    public void testisIsOpaqueEnabled() throws Exception {
+        result2 = OspfUtil.isOpaqueEnabled(2);
+        assertThat(result2, is(false));
+    }
+
+    /**
+     * Tests readLsaHeader() method.
+     */
+    @Test
+    public void testReadLsaHeader() throws Exception {
+        byte[] header = {0, 10, 2, 1, 7, 7, 7, 7, 7, 7, 7, 7, -128, 0, 0, 2, 46, -126, 0,
+                48, 0, 0, 0, 2, 1, 1, 1, 1, 10, 10, 10, 7, 1, 0, 0, 10, 10, 10, 10, 0, -1, -1, -1,
+                0, 3, 0, 0, 10, 0, 10, 66, 10, 1, 0, 0, 1, 7, 7, 7, 7, -128, 0, 0, 1, -64, 79, 0,
+                116, 0, 1, 0, 4, 0, 0, 0, 0, 0, 2, 0, 84, 0, 1, 0, 1, 1, 0, 0, 0, 0, 2, 0, 4, 10,
+                10, 10, 0, 0, 5, 0, 4, 0, 0, 0, 0, 0, 6, 0, 4, 73, -104, -106, -128, 0, 7, 0, 4, 73
+                , -104, -106, -128, 0, 8, 0, 32, 73, -104, -106, -128, 73, -104, -106, -128, 73, -104, -106,
+                -128, 73, -104, -106, -128, 73, -104, -106, -128, 73, -104, -106, -128, 73, -104, -106, -128,
+                73, -104, -106, -128, 0, 9, 0, 4, 0, 0, 0, 0};
+        channelBuffer = ChannelBuffers.copiedBuffer(header);
+        lsaHeader = OspfUtil.readLsaHeader(channelBuffer);
+        assertThat(lsaHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests readLsaHeader() method.
+     */
+    @Test
+    public void testReadreadLsaHeader() throws Exception {
+        byte[] header = {0, 2, 2, 1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0, 0, 1, 58, -100, 0, 48};
+        channelBuffer = ChannelBuffers.copiedBuffer(header);
+        lsaHeader = OspfUtil.readLsaHeader(channelBuffer);
+        assertThat(lsaHeader, is(notNullValue()));
+    }
+}
\ No newline at end of file
