diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/subtypes/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/subtypes/package-info.java
new file mode 100644
index 0000000..404e681
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/subtypes/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 Sub Types.
+ */
+package org.onosproject.ospf.protocol.lsa.subtypes;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10.java
new file mode 100644
index 0000000..e9faf3e
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10.java
@@ -0,0 +1,202 @@
+/*
+ * 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.types;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.ospf.controller.OspfLsaType;
+import org.onosproject.ospf.exceptions.OspfErrorType;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.TlvHeader;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.OpaqueTopLevelTlvTypes;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.RouterTlv;
+import org.onosproject.ospf.protocol.util.OspfParameters;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of an Opaque LSA of type area local (10).
+ */
+public class OpaqueLsa10 extends OpaqueLsaHeader {
+    /*
+      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 Information                       |
+     +                                                               +
+     |                              ...                              |
+
+        Opaque LSA format
+        REFERENCE : RFC 5250
+    */
+    private List<TopLevelTlv> topLevelValues = new ArrayList<>();
+    private byte[] opaqueInfo = null;
+
+    /**
+     * Creates an instance of Opaque type 10 LSA.
+     *
+     * @param lsaHeader LSA header instance
+     */
+    public OpaqueLsa10(OpaqueLsaHeader lsaHeader) {
+        populateHeader(lsaHeader);
+    }
+
+    /**
+     * Returns the list of top level TLVs.
+     *
+     * @return list of top level TLVs
+     */
+    public List<TopLevelTlv> topLevelValues() {
+        return topLevelValues;
+    }
+
+    /**
+     * Adds TLV value.
+     *
+     * @param value TLV value
+     */
+    public void addValue(TopLevelTlv value) {
+        topLevelValues.add(value);
+    }
+
+    /**
+     * Reads from channel buffer and populate instance.
+     *
+     * @param channelBuffer channelBuffer instance
+     * @throws OspfParseException might throws exception while parsing buffer
+     */
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+
+        try {
+            if (this.opaqueId() == OspfParameters.TRAFFIC_ENGINEERING) {
+                while (channelBuffer.readableBytes() > 0) {
+                    TlvHeader tlvHeader = new TlvHeader();
+                    tlvHeader.setTlvType(channelBuffer.readUnsignedShort());
+                    tlvHeader.setTlvLength(channelBuffer.readUnsignedShort());
+                    if (tlvHeader.tlvType() == OpaqueTopLevelTlvTypes.ROUTER.value()) {
+                        RouterTlv routerTlv = new RouterTlv(tlvHeader);
+                        routerTlv.readFrom(channelBuffer.readBytes(tlvHeader.tlvLength()));
+                        this.addValue(routerTlv);
+                    } else if (tlvHeader.tlvType() == OpaqueTopLevelTlvTypes.LINK.value()) {
+                        LinkTlv linkTlv = new LinkTlv(tlvHeader);
+                        linkTlv.readFrom(channelBuffer.readBytes(tlvHeader.tlvLength()));
+                        this.addValue(linkTlv);
+                    }
+                }
+            } else {
+                int length = channelBuffer.readableBytes();
+                opaqueInfo = new byte[length];
+                channelBuffer.readBytes(opaqueInfo, 0, length);
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::OpaqueLsa10:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
+                                         OspfErrorType.BAD_MESSAGE);
+        }
+    }
+
+    /**
+     * Returns instance as bytes.
+     *
+     * @return instance as bytes
+     * @throws Exception might throws exception while parsing packet
+     */
+    public byte[] asBytes() throws Exception {
+
+        byte[] lsaMessage = null;
+        byte[] lsaHeader = getOpaqueLsaHeaderAsByteArray();
+        byte[] lsaBody = getLsaBodyAsByteArray();
+        lsaMessage = Bytes.concat(lsaHeader, lsaBody);
+        return lsaMessage;
+
+    }
+
+    /**
+     * Gets the LSA body as byte array.
+     *
+     * @return the lsa body as byte array
+     * @throws Exception might throws exception while parsing packet
+     */
+    public byte[] getLsaBodyAsByteArray() throws Exception {
+        List<Byte> bodyLst = new ArrayList<>();
+        if (this.opaqueId() == 1) {
+            for (TopLevelTlv tlv : this.topLevelValues) {
+                //Check the sub type of lsa and build bytes accordingly
+                if (tlv instanceof RouterTlv) {
+                    RouterTlv routerTlv = (RouterTlv) tlv;
+                    bodyLst.addAll(Bytes.asList(routerTlv.asBytes()));
+                } else if (tlv instanceof LinkTlv) {
+                    LinkTlv linkTlv = (LinkTlv) tlv;
+                    bodyLst.addAll(Bytes.asList(linkTlv.asBytes()));
+                }
+            }
+        } else {
+            return opaqueInfo;
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public OspfLsaType getOspfLsaType() {
+        return OspfLsaType.AREA_LOCAL_OPAQUE_LSA;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("topLevelValues", topLevelValues)
+                .add("opaqueInfo", opaqueInfo)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        OpaqueLsa10 that = (OpaqueLsa10) o;
+        return Objects.equal(topLevelValues, that.topLevelValues) &&
+                Objects.equal(opaqueInfo, that.opaqueInfo);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(opaqueInfo, topLevelValues);
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/RouterLsa.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/RouterLsa.java
new file mode 100644
index 0000000..9ddef5a
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/RouterLsa.java
@@ -0,0 +1,304 @@
+/*
+ * 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.types;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.ospf.exceptions.OspfErrorType;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.subtypes.OspfLsaLink;
+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;
+
+/**
+ * Representation of a Router LSA, and the fields and methods to access them.
+ */
+public class RouterLsa 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   |       1       |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                        Link State ID                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                     Advertising Router                        |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                     LS sequence number                        |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |         LS checksum           |             length            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |    0    |V|E|B|        0      |            # links            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Link ID                              |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                         Link Data                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |     Type      |     # TOS     |            metric             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                              ...                              |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |      TOS      |        0      |          TOS  metric          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Link ID                              |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                         Link Data                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                              ...                              |
+     */
+    private static final Logger log =
+            LoggerFactory.getLogger(RouterLsa.class);
+    private boolean isVirtualEndPoint;
+    private boolean isAsBoundaryRouter;
+    private boolean isAreaBorderRouter;
+    private int noLink;
+    private List<OspfLsaLink> routerLinks = new ArrayList<>();
+
+    /**
+     * Creates an instance of Router LSA.
+     */
+    public RouterLsa() {
+    }
+
+    /**
+     * Creates an instance of Router LSA.
+     *
+     * @param lsaHeader lsa header instance
+     */
+    public RouterLsa(LsaHeader lsaHeader) {
+        populateHeader(lsaHeader);
+    }
+
+    /**
+     * Sets virtual endpoint or not.
+     *
+     * @param isVirtualEndPoint true or false
+     */
+    public void setVirtualEndPoint(boolean isVirtualEndPoint) {
+        this.isVirtualEndPoint = isVirtualEndPoint;
+    }
+
+    /**
+     * Sets if it is an AS boundary router or not.
+     *
+     * @param isAsBoundaryRouter true if AS boundary router else false
+     */
+    public void setAsBoundaryRouter(boolean isAsBoundaryRouter) {
+        this.isAsBoundaryRouter = isAsBoundaryRouter;
+    }
+
+    /**
+     * Sets whether it is an ABR or not.
+     *
+     * @param isAreaBorderRouter true if ABR else false
+     */
+    public void setAreaBorderRouter(boolean isAreaBorderRouter) {
+        this.isAreaBorderRouter = isAreaBorderRouter;
+    }
+
+    /**
+     * Gets number of links.
+     *
+     * @return number of links
+     */
+    public int noLink() {
+        return noLink;
+    }
+
+    /**
+     * Sets number of links.
+     *
+     * @param noLink number of links
+     */
+    public void setNoLink(int noLink) {
+        this.noLink = noLink;
+    }
+
+
+    /**
+     * Adds router link.
+     *
+     * @param lsaLink LSA link
+     */
+    public void addRouterLink(OspfLsaLink lsaLink) {
+        if (!this.routerLinks.contains(lsaLink)) {
+            this.routerLinks.add(lsaLink);
+        }
+    }
+
+    /**
+     * Gets router link.
+     *
+     * @return routerLinks LSA link list
+     */
+    public List<OspfLsaLink> routerLink() {
+        return this.routerLinks;
+    }
+
+    /**
+     * Reads from channel buffer and populate this.
+     *
+     * @param channelBuffer channelBuffer instance.
+     * @throws OspfParseException might throws exception while parsing buffer
+     */
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+
+        try {
+            int veb = channelBuffer.readByte();
+            int unUsed = channelBuffer.readByte();
+            //Convert the byte to veb bits
+            String strVeb = Integer.toBinaryString(veb);
+            if (strVeb.length() == 3) {
+                this.setVirtualEndPoint((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
+                this.setAsBoundaryRouter((Integer.parseInt(Character.toString(strVeb.charAt(1))) == 1) ? true : false);
+                this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(2))) == 1) ? true : false);
+            } else if (strVeb.length() == 2) {
+                this.setVirtualEndPoint(false);
+                this.setAsBoundaryRouter((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
+                this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(1))) == 1) ? true : false);
+            } else if (strVeb.length() == 1) {
+                this.setVirtualEndPoint(false);
+                this.setAsBoundaryRouter(false);
+                this.setAreaBorderRouter((Integer.parseInt(Character.toString(strVeb.charAt(0))) == 1) ? true : false);
+            }
+            this.setNoLink(channelBuffer.readUnsignedShort());
+            while (channelBuffer.readableBytes() >= OspfUtil.TWELVE_BYTES) {
+                OspfLsaLink ospfLsaLink = new OspfLsaLink();
+
+                byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                ospfLsaLink.setLinkId(InetAddress.getByAddress(tempByteArray).getHostName());
+                tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+                channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+                ospfLsaLink.setLinkData(InetAddress.getByAddress(tempByteArray).getHostName());
+                ospfLsaLink.setLinkType(channelBuffer.readByte());
+                ospfLsaLink.setTos(channelBuffer.readByte());
+                ospfLsaLink.setMetric(channelBuffer.readUnsignedShort());
+                //add the link
+                this.addRouterLink(ospfLsaLink);
+            }
+        } catch (Exception e) {
+            log.debug("Error::RouterLsa:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR, OspfErrorType.BAD_MESSAGE);
+        }
+    }
+
+    /**
+     * Returns instance as bytes.
+     *
+     * @return instance as bytes
+     * @throws OspfParseException might throws exception while parsing packet
+     */
+    public byte[] asBytes() throws OspfParseException {
+        byte[] lsaMessage = null;
+
+        byte[] lsaHeader = getLsaHeaderAsByteArray();
+        byte[] lsaBody = getLsaBodyAsByteArray();
+        lsaMessage = Bytes.concat(lsaHeader, lsaBody);
+
+        return lsaMessage;
+    }
+
+    /**
+     * Gets the LSA body as bytes.
+     *
+     * @return LSA body as bytes
+     */
+    public byte[] getLsaBodyAsByteArray() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        try {
+            int isVirtualEndPointVal = this.isVirtualEndPoint ? 1 : 0;
+            int isASBoundaryRouterVal = this.isAsBoundaryRouter ? 1 : 0;
+            int isAreaBorderRouterVal = this.isAreaBorderRouter ? 1 : 0;
+
+            StringBuilder sb = new StringBuilder();
+            sb.append(Integer.toBinaryString(isVirtualEndPointVal));
+            sb.append(Integer.toBinaryString(isASBoundaryRouterVal));
+            sb.append(Integer.toBinaryString(isAreaBorderRouterVal));
+
+            //added VEB
+            bodyLst.add((byte) Integer.parseInt(sb.toString(), 2));
+            //second byte is 0.
+            bodyLst.add((byte) 0);
+            //Number of links
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.noLink())));
+
+            //add each link details
+            for (OspfLsaLink lsaLink : routerLinks) {
+                bodyLst.addAll(Bytes.asList(InetAddress.getByName(lsaLink.linkId()).getAddress()));
+                bodyLst.addAll(Bytes.asList(InetAddress.getByName(lsaLink.linkData()).getAddress()));
+                bodyLst.add((byte) lsaLink.linkType());
+                bodyLst.add((byte) lsaLink.tos());
+                bodyLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(lsaLink.metric())));
+            }
+        } catch (Exception e) {
+            log.debug("Error::getLsrBodyAsByteArray {}", e.getMessage());
+            return Bytes.toArray(bodyLst);
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    /**
+     * Increment the link by 1.
+     */
+    public void incrementLinkNo() {
+        this.noLink++;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("isVirtualEndPoint", isVirtualEndPoint)
+                .add("isAsBoundaryRouter", isAsBoundaryRouter)
+                .add("isAreaBorderRouter", isAreaBorderRouter)
+                .add("noLink", noLink)
+                .add("routerLinks", routerLinks)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        RouterLsa that = (RouterLsa) o;
+        return Objects.equal(isVirtualEndPoint, that.isVirtualEndPoint) &&
+                Objects.equal(isAsBoundaryRouter, that.isAsBoundaryRouter) &&
+                Objects.equal(isAreaBorderRouter, that.isAreaBorderRouter) &&
+                Objects.equal(noLink, that.noLink) &&
+                Objects.equal(routerLinks, that.routerLinks);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(isVirtualEndPoint, isAsBoundaryRouter, isAreaBorderRouter,
+                                noLink, routerLinks);
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/package-info.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/package-info.java
new file mode 100644
index 0000000..00412ac
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/lsa/types/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 types.
+ */
+package org.onosproject.ospf.protocol.lsa.types;
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReader.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReader.java
new file mode 100644
index 0000000..4f26617
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReader.java
@@ -0,0 +1,148 @@
+/*
+ * 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.OspfErrorType;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
+import org.onosproject.ospf.protocol.util.OspfParameters;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A message reader which reads OSPF messages from ChannelBuffer and converts to OspfMessage instances.
+ */
+public class OspfMessageReader {
+    private static final Logger log = LoggerFactory.getLogger(OspfMessageReader.class);
+
+    /**
+     * Reads and Converts the channel buffer to OspfMessage instance.
+     *
+     * @param channelBuffer channel buffer instance.
+     * @return OSPF message instance.
+     * @throws Exception might throws exception while parsing buffer
+     */
+    public OspfMessage readFromBuffer(ChannelBuffer channelBuffer)
+            throws Exception {
+
+        if (channelBuffer.readableBytes() < OspfUtil.PACKET_MINIMUM_LENGTH) {
+            log.error("Packet should have minimum length...");
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+
+        try {
+            OspfPacketHeader ospfHeader = getOspfHeader(channelBuffer);
+            int len = ospfHeader.ospfPacLength() - OspfUtil.OSPF_HEADER_LENGTH;
+
+            OspfMessage ospfMessage = null;
+            switch (ospfHeader.ospfType()) {
+                case OspfParameters.HELLO:
+                    ospfMessage = new HelloPacket(ospfHeader);
+                    break;
+                case OspfParameters.DD:
+                    ospfMessage = new DdPacket(ospfHeader);
+                    break;
+                case OspfParameters.LSREQUEST:
+                    ospfMessage = new LsRequest(ospfHeader);
+                    break;
+                case OspfParameters.LSUPDATE:
+                    ospfMessage = new LsUpdate(ospfHeader);
+                    break;
+                case OspfParameters.LSACK:
+                    ospfMessage = new LsAcknowledge(ospfHeader);
+                    break;
+                default:
+                    log.debug("Message Reader[Decoder] - Unknown LSA type..!!!");
+                    break;
+            }
+
+            if (ospfMessage != null) {
+                try {
+                    log.debug("{} Received::Message Length :: {} ", ospfMessage.ospfMessageType(),
+                              ospfHeader.ospfPacLength());
+                    ospfMessage.readFrom(channelBuffer.readBytes(len));
+                } catch (Exception e) {
+                    throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
+                                                 OspfErrorType.BAD_MESSAGE);
+                }
+
+            }
+
+            return ospfMessage;
+        } catch (Exception e) {
+            throw new OspfParseException(OspfErrorType.OSPF_MESSAGE_ERROR,
+                                         OspfErrorType.BAD_MESSAGE);
+        }
+    }
+
+    /**
+     * Gets the OSPF packet Header.
+     *
+     * @param channelBuffer channel buffer instance.
+     * @return Ospf Header instance.
+     */
+    private OspfPacketHeader getOspfHeader(ChannelBuffer channelBuffer) throws Exception {
+        OspfPacketHeader ospfPacketHeader = new OspfPacketHeader();
+
+        byte[] sourceIpBytes = new byte[OspfUtil.FOUR_BYTES];
+        channelBuffer.readBytes(sourceIpBytes, 0, OspfUtil.FOUR_BYTES);
+        Ip4Address sourceIP = Ip4Address.valueOf(sourceIpBytes);
+
+        // Determine ospf version & Packet Type
+        int version = channelBuffer.readByte(); //byte 1 is ospf version
+        int packetType = channelBuffer.readByte(); //byte 2 is ospf packet type
+
+        // byte 3 & 4 combine is packet length.
+        int packetLength = channelBuffer.readShort();
+
+        if (packetLength > channelBuffer.readableBytes() + OspfUtil.FOUR_BYTES) {
+            log.error("Packet should have minimum length...");
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+
+        byte[] tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+        Ip4Address routerId = Ip4Address.valueOf(tempByteArray);
+
+        tempByteArray = new byte[OspfUtil.FOUR_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, OspfUtil.FOUR_BYTES);
+        Ip4Address areaId = Ip4Address.valueOf(tempByteArray);
+
+        int checkSum = channelBuffer.readUnsignedShort();
+        int auType = channelBuffer.readUnsignedShort();
+        int authentication = (int) channelBuffer.readLong();
+
+        ospfPacketHeader.setSourceIp(sourceIP);
+        ospfPacketHeader.setOspfVer(version);
+        ospfPacketHeader.setOspftype(packetType);
+        ospfPacketHeader.setOspfPacLength(packetLength);
+        ospfPacketHeader.setRouterId(routerId);
+        ospfPacketHeader.setAreaId(areaId);
+        ospfPacketHeader.setChecksum(checkSum);
+        ospfPacketHeader.setAuthType(auType);
+        ospfPacketHeader.setAuthentication(authentication);
+
+        return ospfPacketHeader;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriter.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriter.java
new file mode 100644
index 0000000..9782194
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriter.java
@@ -0,0 +1,91 @@
+/*
+* Copyright 2016 Open Networking Laboratory
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.onosproject.ospf.protocol.ospfpacket;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.onosproject.ospf.protocol.util.OspfParameters;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A message writer which writes an OspfMessage to ChannelBuffer.
+ */
+public class OspfMessageWriter {
+    private static final Logger log = LoggerFactory.getLogger(OspfMessageWriter.class);
+
+    /**
+     * Writes OSPF message to ChannelBuffer.
+     *
+     * @param ospfMessage    OSPF message
+     * @param interfaceState interface state
+     * @param interfaceType  interface type
+     * @return channelBuffer channel buffer instance
+     * @throws Exception might throws exception while parsing message
+     */
+    public ChannelBuffer writeToBuffer(OspfMessage ospfMessage, int interfaceState,
+                                       int interfaceType) throws Exception {
+
+        ChannelBuffer buf = null;
+        switch (ospfMessage.ospfMessageType().value()) {
+            case OspfParameters.HELLO:
+            case OspfParameters.LSACK:
+                buf = writeMessageToBuffer(ospfMessage, interfaceState);
+                break;
+            case OspfParameters.DD:
+            case OspfParameters.LSREQUEST:
+            case OspfParameters.LSUPDATE:
+                buf = writeMessageToBuffer(ospfMessage, interfaceState);
+                break;
+            default:
+                log.debug("Message Writer[Encoder] - Unknown Message to encode..!!!");
+                break;
+        }
+
+        return buf;
+    }
+
+    /**
+     * Writes an OSPF Message to channel buffer.
+     *
+     * @param ospfMessage    OSPF Message instance
+     * @param interfaceState interface state
+     * @return channelBuffer instance
+     */
+    private ChannelBuffer writeMessageToBuffer(OspfMessage ospfMessage, int interfaceState) throws Exception {
+        ChannelBuffer channelBuffer = null;
+        byte[] ospfMessageAsByte = ospfMessage.asBytes();
+        //Add the length and checksum in byte array at length position 2 & 3 and Checksum position
+        ospfMessageAsByte = OspfUtil.addLengthAndCheckSum(ospfMessageAsByte, OspfUtil.OSPFPACKET_LENGTH_POS1,
+                                                          OspfUtil.OSPFPACKET_LENGTH_POS2,
+                                                          OspfUtil.OSPFPACKET_CHECKSUM_POS1,
+                                                          OspfUtil.OSPFPACKET_CHECKSUM_POS2);
+        //Add Interface State Info and destination IP as metadata
+        if (interfaceState == OspfParameters.DR || interfaceState == OspfParameters.BDR) {
+            ospfMessageAsByte = OspfUtil.addMetadata(ospfMessageAsByte, OspfUtil.JOIN_ALL_DROUTERS,
+                                                     ospfMessage.destinationIp());
+        } else {
+            ospfMessageAsByte = OspfUtil.addMetadata(ospfMessageAsByte, OspfUtil.ONLY_ALL_SPF_ROUTERS,
+                                                     ospfMessage.destinationIp());
+        }
+
+        channelBuffer = ChannelBuffers.buffer(ospfMessageAsByte.length);
+        channelBuffer.writeBytes(ospfMessageAsByte);
+
+        return channelBuffer;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdate.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdate.java
new file mode 100644
index 0000000..e9c80e2
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdate.java
@@ -0,0 +1,310 @@
+/*
+ * 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.types;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.ospf.controller.OspfLsa;
+import org.onosproject.ospf.exceptions.OspfErrorType;
+import org.onosproject.ospf.exceptions.OspfParseException;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
+import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
+import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
+import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
+import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
+import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+import org.onosproject.ospf.protocol.util.OspfParameters;
+import org.onosproject.ospf.protocol.util.OspfUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Representation of an OSPF Link State Update packet.
+ * Link State Update packets are OSPF packet type 4.  These packets
+ * implement the flooding of LSAs.  Each Link State Update packet
+ * carries a collection of LSAs one hop further from their origin.
+ * Several LSAs may be included in a single packet.
+ */
+public class LsUpdate extends OspfPacketHeader {
+    /*
+        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 #   |       4       |         Packet length         |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                          Router ID                            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                           Area ID                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |           Checksum            |             AuType            |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                       Authentication                          |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                            # LSAs                             |
+       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+       |                                                               |
+       +-                                                            +-+
+       |                             LSAs                              |
+       +-                                                            +-+
+       |                              ...                              |
+     */
+    private static final Logger log = LoggerFactory.getLogger(LsUpdate.class);
+    private int numberOfLsa;
+    private List<OspfLsa> lsaList = new LinkedList<>();
+
+    /**
+     * Creates an instance of Link State Update packet.
+     */
+    public LsUpdate() {
+    }
+
+    /**
+     * Creates an instance of Link State Update packet.
+     *
+     * @param ospfHeader ospf header instance.
+     */
+    public LsUpdate(OspfPacketHeader ospfHeader) {
+        populateHeader(ospfHeader);
+    }
+
+    /**
+     * Gets the LSA list.
+     *
+     * @return list of LSA
+     */
+    public List getLsaList() {
+        return lsaList;
+    }
+
+    /**
+     * Adds the LSA to list.
+     *
+     * @param lsa LSA
+     */
+    public void addLsa(OspfLsa lsa) {
+        if (!lsaList.contains(lsa)) {
+            lsaList.add(lsa);
+        }
+    }
+
+    /**
+     * Gets the number of LSA.
+     *
+     * @return number of LSA
+     */
+    public int noLsa() {
+        return numberOfLsa;
+    }
+
+    /**
+     * Sets number of LSA.
+     *
+     * @param numberOfLsa number of LSA
+     */
+    public void setNumberOfLsa(int numberOfLsa) {
+        this.numberOfLsa = numberOfLsa;
+    }
+
+
+    @Override
+    public OspfPacketType ospfMessageType() {
+        return OspfPacketType.LSUPDATE;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) throws OspfParseException {
+        try {
+            //From header 4 bytes is number of lsa's
+            this.setNumberOfLsa(channelBuffer.readInt());
+            //get the remaining bytes represents Number of LSA's present. Add all the LSA's
+            while (channelBuffer.readableBytes() > OspfUtil.LSA_HEADER_LENGTH) {
+
+                LsaHeader header = OspfUtil.readLsaHeader(channelBuffer.readBytes(OspfUtil.LSA_HEADER_LENGTH));
+                int lsaLength = header.lsPacketLen();
+                int lsType = header.lsType();
+
+                switch (lsType) {
+                    case OspfParameters.LINK_LOCAL_OPAQUE_LSA:
+                        OpaqueLsa9 opaqueLsa9 = new OpaqueLsa9((OpaqueLsaHeader) header);
+                        opaqueLsa9.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(opaqueLsa9);
+                        break;
+                    case OspfParameters.AREA_LOCAL_OPAQUE_LSA:
+                        OpaqueLsa10 opaqueLsa10 = new OpaqueLsa10((OpaqueLsaHeader) header);
+                        opaqueLsa10.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(opaqueLsa10);
+                        break;
+                    case OspfParameters.AS_OPAQUE_LSA:
+                        OpaqueLsa11 opaqueLsa11 = new OpaqueLsa11((OpaqueLsaHeader) header);
+                        opaqueLsa11.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(opaqueLsa11);
+                        break;
+                    case OspfParameters.ROUTER:
+                        RouterLsa routerLsa = new RouterLsa(header);
+                        routerLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(routerLsa);
+                        break;
+                    case OspfParameters.NETWORK:
+                        NetworkLsa networkLsa = new NetworkLsa(header);
+                        networkLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(networkLsa);
+                        break;
+                    case OspfParameters.ASBR_SUMMARY:
+                        AsbrSummaryLsa asbrSummaryLsa = new AsbrSummaryLsa(header);
+                        asbrSummaryLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(asbrSummaryLsa);
+                        break;
+                    case OspfParameters.SUMMARY:
+                        SummaryLsa summaryLSA = new SummaryLsa(header);
+                        summaryLSA.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(summaryLSA);
+                        break;
+                    case OspfParameters.EXTERNAL_LSA:
+                        ExternalLsa externalLsa = new ExternalLsa(header);
+                        externalLsa.readFrom(channelBuffer.readBytes(lsaLength - OspfUtil.LSA_HEADER_LENGTH));
+                        addLsa(externalLsa);
+                        break;
+                    default:
+                        log.debug("LSUpdate::readLsUpdateBody::UnKnown LS Type: {}", lsType);
+                        break;
+                }
+            }
+        } catch (Exception e) {
+            log.debug("Error::LsUpdate:: {}", e.getMessage());
+            throw new OspfParseException(OspfErrorType.MESSAGE_HEADER_ERROR, OspfErrorType.BAD_MESSAGE_LENGTH);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] lsuMessage = null;
+
+        byte[] ospfHeader = getLsuHeaderAsByteArray();
+        byte[] lsuBody = getLsuBodyAsByteArray();
+        lsuMessage = Bytes.concat(ospfHeader, lsuBody);
+
+        return lsuMessage;
+    }
+
+    /**
+     * Gets lsu header.
+     *
+     * @return lsu header as byte array
+     */
+    public byte[] getLsuHeaderAsByteArray() {
+        List<Byte> headerLst = new ArrayList<>();
+        try {
+            headerLst.add((byte) this.ospfVersion());
+            headerLst.add((byte) this.ospfType());
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.ospfPacLength())));
+            headerLst.addAll(Bytes.asList(this.routerId().toOctets()));
+            headerLst.addAll(Bytes.asList(this.areaId().toOctets()));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.checksum())));
+            headerLst.addAll(Bytes.asList(OspfUtil.convertToTwoBytes(this.authType())));
+            //Authentication is 0 always. Total 8 bytes consist of zero
+            byte[] auth = new byte[OspfUtil.EIGHT_BYTES];
+            headerLst.addAll(Bytes.asList(auth));
+        } catch (Exception e) {
+            log.debug("Error::LSUpdate::getLsuHeaderAsByteArray:: {}", e.getMessage());
+            return Bytes.toArray(headerLst);
+        }
+
+        return Bytes.toArray(headerLst);
+    }
+
+    /**
+     * Get lsu body as byte array.
+     *
+     * @return lsu body as byte array
+     */
+    public byte[] getLsuBodyAsByteArray() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        try {
+            //add number of LSA's
+            bodyLst.addAll(Bytes.asList(OspfUtil.convertToFourBytes(this.noLsa())));
+            //for each type of LSA's from the list get lsa bytes
+            for (OspfLsa ospfLsa : lsaList) {
+                //Check the type of lsa and build bytes accordingly
+                switch (ospfLsa.getOspfLsaType().value()) {
+                    case OspfParameters.LINK_LOCAL_OPAQUE_LSA:
+                        OpaqueLsa9 opaqueLsa9 = (OpaqueLsa9) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(opaqueLsa9.asBytes()));
+                        break;
+                    case OspfParameters.AREA_LOCAL_OPAQUE_LSA:
+                        OpaqueLsa10 opaqueLsa10 = (OpaqueLsa10) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(opaqueLsa10.asBytes()));
+                        break;
+                    case OspfParameters.AS_OPAQUE_LSA:
+                        OpaqueLsa11 opaqueLsa11 = (OpaqueLsa11) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(opaqueLsa11.asBytes()));
+                        break;
+                    case OspfParameters.ROUTER:
+                        RouterLsa routerLsa = (RouterLsa) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(routerLsa.asBytes()));
+                        break;
+                    case OspfParameters.NETWORK:
+                        NetworkLsa networkLsa = (NetworkLsa) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(networkLsa.asBytes()));
+                        break;
+                    case OspfParameters.ASBR_SUMMARY:
+                        AsbrSummaryLsa asbrSummaryLsa = (AsbrSummaryLsa) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(asbrSummaryLsa.asBytes()));
+                        break;
+                    case OspfParameters.SUMMARY:
+                        SummaryLsa summaryLsa = (SummaryLsa) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(summaryLsa.asBytes()));
+                        break;
+                    case OspfParameters.EXTERNAL_LSA:
+                        ExternalLsa externalLsa = (ExternalLsa) ospfLsa;
+                        bodyLst.addAll(Bytes.asList(externalLsa.asBytes()));
+                        break;
+                    default:
+                        log.debug("LSUpdate::getLsuBodyAsByteArray::UnKnown ospfLsa: {}", ospfLsa);
+                        break;
+                }
+            }
+
+        } catch (Exception e) {
+            log.debug("Error::getLsuBodyAsByteArray {}", e.getMessage());
+            return Bytes.toArray(bodyLst);
+        }
+
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("noLsa", numberOfLsa)
+                .add("lsaList", lsaList)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/ChecksumCalculator.java b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/ChecksumCalculator.java
new file mode 100644
index 0000000..306ad1b
--- /dev/null
+++ b/protocols/ospf/protocol/src/main/java/org/onosproject/ospf/protocol/util/ChecksumCalculator.java
@@ -0,0 +1,309 @@
+/*
+ * 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.onosproject.ospf.controller.OspfLsa;
+import org.onosproject.ospf.controller.OspfLsaType;
+import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
+import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
+import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
+import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
+import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
+import org.onosproject.ospf.protocol.ospfpacket.OspfMessage;
+import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
+
+import java.util.Arrays;
+
+/**
+ * Calculates checksum for different types of OSPF packets.
+ */
+public class ChecksumCalculator {
+
+    /**
+     * Converts given string to sixteen bits integer.
+     * If hexasum is more than 16 bit value, needs to be reduced to 16 bit value.
+     *
+     * @param strToConvert hexasum value to convert
+     * @return 16 bit integer value
+     */
+    public static int convertToSixteenBits(String strToConvert) {
+        StringBuilder sb = new StringBuilder(strToConvert);
+        sb = sb.reverse();
+        StringBuilder s1 = new StringBuilder(sb.substring(0, 4));
+        s1 = s1.reverse();
+        StringBuilder s2 = new StringBuilder(sb.substring(4, sb.length()));
+        s2 = s2.reverse();
+        int num = Integer.parseInt(s1.toString(), 16) + Integer.parseInt(s2.toString(), 16);
+        return num;
+    }
+
+    /**
+     * Checks whether checksum is valid or not in the given OSPF message.
+     *
+     * @param ospfMessage  ospf message instance
+     * @param checksumPos1 position of checksum bit in packet
+     * @param checksumPos2 position of checksum bit in packet
+     * @return true if valid else false
+     */
+    public boolean isValidOspfCheckSum(OspfMessage ospfMessage, int checksumPos1, int checksumPos2) {
+
+        switch (ospfMessage.ospfMessageType().value()) {
+            case OspfParameters.HELLO:
+                ospfMessage = (HelloPacket) ospfMessage;
+                break;
+            case OspfParameters.DD:
+                ospfMessage = (DdPacket) ospfMessage;
+                break;
+            case OspfParameters.LSREQUEST:
+                ospfMessage = (LsRequest) ospfMessage;
+                break;
+            case OspfParameters.LSUPDATE:
+                ospfMessage = (LsUpdate) ospfMessage;
+                break;
+            case OspfParameters.LSACK:
+                ospfMessage = (LsAcknowledge) ospfMessage;
+                break;
+            default:
+                break;
+        }
+
+        byte[] messageAsBytes = ospfMessage.asBytes();
+        return validateOspfCheckSum(messageAsBytes, checksumPos1, checksumPos2);
+    }
+
+    /**
+     * Checks whether checksum is valid or not in the given OSPF LSA.
+     *
+     * @param ospfLsa         lsa instance
+     * @param lsType          lsa type
+     * @param lsaChecksumPos1 lsa checksum position in packet
+     * @param lsaChecksumPos2 lsa checksum position in packet
+     * @return true if valid else false
+     * @throws Exception might throw exception while processing
+     */
+    public boolean isValidLsaCheckSum(OspfLsa ospfLsa, int lsType, int lsaChecksumPos1,
+                                      int lsaChecksumPos2) throws Exception {
+        if (lsType == OspfLsaType.ROUTER.value()) {
+            RouterLsa lsa = (RouterLsa) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.NETWORK.value()) {
+            NetworkLsa lsa = (NetworkLsa) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.SUMMARY.value()) {
+            SummaryLsa lsa = (SummaryLsa) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.ASBR_SUMMARY.value()) {
+            AsbrSummaryLsa lsa = (AsbrSummaryLsa) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.EXTERNAL_LSA.value()) {
+            ExternalLsa lsa = (ExternalLsa) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.LINK_LOCAL_OPAQUE_LSA.value()) {
+            OpaqueLsa9 lsa = (OpaqueLsa9) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.AREA_LOCAL_OPAQUE_LSA.value()) {
+            OpaqueLsa10 lsa = (OpaqueLsa10) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        } else if (lsType == OspfLsaType.AS_OPAQUE_LSA.value()) {
+            OpaqueLsa11 lsa = (OpaqueLsa11) ospfLsa;
+            return validateLsaCheckSum(lsa.asBytes(), lsaChecksumPos1, lsaChecksumPos2);
+        }
+
+        return false;
+    }
+
+    /**
+     * Verifies the checksum is valid in given LSA packet bytes.
+     *
+     * @param lsaPacket       lsa as byte array
+     * @param lsaChecksumPos1 position of checksum bit in packet
+     * @param lsaChecksumPos2 position of checksum bit in packet
+     * @return true if valid else false
+     */
+    public boolean validateLsaCheckSum(byte[] lsaPacket, int lsaChecksumPos1, int lsaChecksumPos2) {
+
+        byte[] checksum = calculateLsaChecksum(lsaPacket, lsaChecksumPos1, lsaChecksumPos2);
+
+        if (lsaPacket[lsaChecksumPos1] == checksum[0] && lsaPacket[lsaChecksumPos2] == checksum[1]) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Verifies the checksum is valid in given OSPF packet bytes.
+     *
+     * @param ospfPacket   as byte array
+     * @param checksumPos1 position of checksum bit in packet
+     * @param checksumPos2 position of checksum bit in packet
+     * @return true if valid else false
+     */
+    public boolean validateOspfCheckSum(byte[] ospfPacket, int checksumPos1, int checksumPos2) {
+
+        byte[] checkSum = calculateOspfCheckSum(ospfPacket, checksumPos1, checksumPos2);
+
+        if (ospfPacket[checksumPos1] == checkSum[0] && ospfPacket[checksumPos2] == checkSum[1]) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Calculates the LSA checksum.
+     *
+     * @param lsaBytes        as byte array
+     * @param lsaChecksumPos1 position of checksum bit in packet
+     * @param lsaChecksumPos2 position of checksum bit in packet
+     * @return checksum bytes
+     */
+    public byte[] calculateLsaChecksum(byte[] lsaBytes, int lsaChecksumPos1, int lsaChecksumPos2) {
+
+        byte[] tempLsaByte = Arrays.copyOf(lsaBytes, lsaBytes.length);
+
+        int[] checksumOut = {0, 0};
+        tempLsaByte[lsaChecksumPos1] = 0;
+        tempLsaByte[lsaChecksumPos2] = 0;
+        byte[] byteCheckSum = {0, 0};
+        if (lsaBytes != null) {
+            for (int i = 2; i < tempLsaByte.length; i++) {
+                checksumOut[0] = checksumOut[0] + ((int) tempLsaByte[i] & 0xFF);
+                checksumOut[1] = checksumOut[1] + checksumOut[0];
+            }
+            checksumOut[0] = checksumOut[0] % 255;
+            checksumOut[1] = checksumOut[1] % 255;
+        }
+        int byte1 = (int) ((tempLsaByte.length - lsaChecksumPos1 - 1) * checksumOut[0] - checksumOut[1]) % 255;
+        if (byte1 <= 0) {
+            byte1 += 255;
+        }
+        int byte2 = 510 - checksumOut[0] - byte1;
+        if (byte2 > 255) {
+            byte2 -= 255;
+        }
+
+        byteCheckSum[0] = (byte) byte1;
+        byteCheckSum[1] = (byte) byte2;
+
+        return byteCheckSum;
+    }
+
+    /**
+     * Calculate checksum from hexasum.
+     *
+     * @param hexasum total of 16 bits hexadecimal values
+     * @return checksum value
+     */
+    private int calculateChecksum(int hexasum) {
+
+        char[] tempZeros = {'0', '0', '0', '0'};
+        StringBuffer hexaAsBinaryStr = new StringBuffer(Integer.toBinaryString(hexasum));
+        int length = hexaAsBinaryStr.length();
+        while (length > 16) {
+            if (hexaAsBinaryStr.length() % 4 != 0) {
+                int offset = hexaAsBinaryStr.length() % 4;
+                hexaAsBinaryStr.insert(0, tempZeros, 0, 4 - offset);
+            }
+            StringBuffer hexaStr1 = new StringBuffer(hexaAsBinaryStr.reverse().substring(0, 16));
+            String revHexaStr1 = hexaStr1.reverse().toString();
+            StringBuffer hexaStr2 = new StringBuffer(hexaAsBinaryStr.reverse());
+            StringBuffer hexaStr3 = new StringBuffer(hexaStr2.reverse().substring(16, hexaStr2.length()));
+            String revHexaStr3 = hexaStr3.reverse().toString();
+            int lastSixteenHexaBits = Integer.parseInt(revHexaStr1, 2);
+            int remainingHexaBits = Integer.parseInt(revHexaStr3, 2);
+            int totalCheckSum = lastSixteenHexaBits + remainingHexaBits;
+            hexaAsBinaryStr = new StringBuffer(Integer.toBinaryString(totalCheckSum));
+            length = hexaAsBinaryStr.length();
+        }
+        if (hexaAsBinaryStr.length() < 16) {
+            int count = 16 - hexaAsBinaryStr.length();
+            String s = hexaAsBinaryStr.toString();
+            for (int i = 0; i < count; i++) {
+                s = "0" + s;
+            }
+
+            hexaAsBinaryStr = new StringBuffer(s);
+
+        }
+        StringBuffer checksum = negate(hexaAsBinaryStr);
+        return Integer.parseInt(checksum.toString(), 2);
+    }
+
+    /**
+     * Negates given hexasum.
+     *
+     * @param binaryString binary form of hexasum
+     * @return binary from of calculateChecksum
+     */
+    private StringBuffer negate(StringBuffer binaryString) {
+        for (int i = 0; i < binaryString.length(); i++) {
+            if (binaryString.charAt(i) == '1') {
+                binaryString.replace(i, i + 1, "0");
+            } else {
+                binaryString.replace(i, i + 1, "1");
+            }
+        }
+
+        return binaryString;
+    }
+
+    /**
+     * Calculates the OSPF checksum for the given packet.
+     *
+     * @param packet       as byte array
+     * @param checksumPos1 position of checksum bit in packet
+     * @param checksumPos2 position of checksum bit in packet
+     * @return checksum bytes
+     */
+    public byte[] calculateOspfCheckSum(byte[] packet, int checksumPos1, int checksumPos2) {
+
+        int hexasum = 0;
+        for (int i = 0; i < packet.length; i = i + 2) {
+            if (i != 12) {
+                byte b1 = packet[i];
+                String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
+                b1 = packet[i + 1];
+                String s2 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0');
+                String hexa = s1 + s2;
+                int num1 = Integer.parseInt(hexa, 2);
+                hexasum = hexasum + num1;
+                String convertTo16 = Integer.toHexString(hexasum);
+                if (convertTo16.length() > 4) {
+                    hexasum = convertToSixteenBits(convertTo16);
+                }
+            }
+        }
+        StringBuilder sb = new StringBuilder(Integer.toHexString(hexasum));
+        if (sb.length() > 4) {
+            sb = sb.reverse();
+            StringBuilder s1 = new StringBuilder(sb.substring(0, 4));
+            s1 = s1.reverse();
+            StringBuilder s2 = new StringBuilder(sb.substring(4, sb.length()));
+            s2 = s2.reverse();
+            hexasum = Integer.parseInt(s1.toString(), 16) + Integer.parseInt(s2.toString(), 16);
+        }
+        int finalChecksum = calculateChecksum(hexasum);
+        return OspfUtil.convertToTwoBytes(finalChecksum);
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10Test.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10Test.java
new file mode 100644
index 0000000..93254ef
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/OpaqueLsa10Test.java
@@ -0,0 +1,249 @@
+/*
+ * 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.types;
+
+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.controller.OspfLsaType;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.TlvHeader;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.LinkTlv;
+import org.onosproject.ospf.protocol.lsa.tlvtypes.RouterTlv;
+
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for OpaqueLsa10.
+ */
+public class OpaqueLsa10Test {
+
+    private final byte[] packet = {0, 1, 0, 4, 1, 1, 1, 1, 0, 2, 0, 84, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+    private OpaqueLsa10 opaqueLsa10;
+    private TopLevelTlv tlv;
+    private OpaqueLsaHeader opqueHeader;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+    private RouterTlv routerTlv;
+    private RouterTlv routerTlv1;
+    private LinkTlv linkTlv;
+    private LinkTlv linkTlv1;
+    private OspfLsaType ospflsaType;
+    private int result1;
+    private List result2;
+
+    @Before
+    public void setUp() throws Exception {
+        opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        opaqueLsa10 = null;
+        tlv = null;
+        opqueHeader = null;
+        channelBuffer = null;
+        result = null;
+        routerTlv = null;
+        routerTlv1 = null;
+        linkTlv1 = null;
+        ospflsaType = null;
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(opaqueLsa10.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests addValue() method.
+     */
+    @Test
+    public void testAddValue() throws Exception {
+        tlv = new RouterTlv(new TlvHeader());
+        opaqueLsa10.addValue(tlv);
+        assertThat(opaqueLsa10, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test(expected = Exception.class)
+    public void testReadFrom() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(10);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(1);
+        opqueHeader.setOpaqueType(10);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(66);
+        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        opaqueLsa10.readFrom(channelBuffer);
+        result = opaqueLsa10.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test(expected = Exception.class)
+    public void testAsBytes() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(10);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(1);
+        opqueHeader.setOpaqueType(10);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(66);
+        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        opaqueLsa10.readFrom(channelBuffer);
+        result = opaqueLsa10.getLsaBodyAsByteArray();
+        result = opaqueLsa10.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsaBodyAsByteArray() method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetLsaBodyAsByteArray() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(10);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(1);
+        opqueHeader.setOpaqueType(10);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(2);
+        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
+        routerTlv = new RouterTlv(new TlvHeader());
+        linkTlv = new LinkTlv(new TlvHeader());
+        opaqueLsa10.addValue(routerTlv);
+        opaqueLsa10.addValue(linkTlv);
+        routerTlv1 = new RouterTlv(new TlvHeader());
+        linkTlv1 = new LinkTlv(new TlvHeader());
+        opaqueLsa10.addValue(routerTlv1);
+        opaqueLsa10.addValue(linkTlv1);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        opaqueLsa10.readFrom(channelBuffer);
+        result = opaqueLsa10.getLsaBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsaBodyAsByteArray() method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetLsaBodyAsByteArray1() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(10);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(1);
+        opqueHeader.setOpaqueType(10);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(2);
+        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
+        routerTlv = new RouterTlv(new TlvHeader());
+        opaqueLsa10.addValue(routerTlv);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        result = opaqueLsa10.getLsaBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsaBodyAsByteArray() method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetLsaBodyAsByteArray2() throws Exception {
+        opqueHeader = new OpaqueLsaHeader();
+        opqueHeader.setLsType(10);
+        opqueHeader.setLsPacketLen(48);
+        opqueHeader.setLsCheckSum(10);
+        opqueHeader.setAge(4);
+        opqueHeader.setOpaqueId(1);
+        opqueHeader.setOpaqueType(10);
+        opqueHeader.setLsSequenceNo(250);
+        opqueHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        opqueHeader.setOptions(2);
+        opaqueLsa10 = new OpaqueLsa10(opqueHeader);
+        linkTlv = new LinkTlv(new TlvHeader());
+        opaqueLsa10.addValue(linkTlv);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet);
+        opaqueLsa10.readFrom(channelBuffer);
+        result = opaqueLsa10.getLsaBodyAsByteArray();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests getOspfLsaType() getter method.
+     */
+    @Test
+    public void testGetOspfLsaType() throws Exception {
+        opaqueLsa10.setLsType(10);
+        ospflsaType = opaqueLsa10.getOspfLsaType();
+        assertThat(ospflsaType, is(notNullValue()));
+        assertThat(ospflsaType, is(OspfLsaType.AREA_LOCAL_OPAQUE_LSA));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashcode() throws Exception {
+
+        result1 = opaqueLsa10.hashCode();
+        assertThat(result1, is(notNullValue()));
+
+    }
+
+    /**
+     * Tests topLevelValues() method.
+     */
+    @Test
+    public void testTopLevelValues() throws Exception {
+
+        result2 = opaqueLsa10.topLevelValues();
+        assertThat(result2, is(notNullValue()));
+
+    }
+
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/RouterLsaTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/RouterLsaTest.java
new file mode 100644
index 0000000..09a3b4d
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/lsa/types/RouterLsaTest.java
@@ -0,0 +1,266 @@
+/*
+ * 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.types;
+
+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.controller.OspfLsaType;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.subtypes.OspfLsaLink;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+
+/**
+ * Unit test class for RouterLsa.
+ */
+public class RouterLsaTest {
+
+    private RouterLsa routerLsa;
+    private int result1;
+    private OspfLsaLink ospflsaLink;
+    private byte[] inputArray;
+    private LsaHeader lsaHeader;
+    private ChannelBuffer channelBuffer;
+    private byte[] result2;
+    private OspfLsaType result3;
+
+    @Before
+    public void setUp() throws Exception {
+        routerLsa = new RouterLsa();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        routerLsa = null;
+        ospflsaLink = null;
+        inputArray = null;
+        lsaHeader = null;
+        channelBuffer = null;
+        result2 = null;
+        result3 = null;
+    }
+
+
+    /**
+     * Tests virtualEndPoint() setter method.
+     */
+    @Test
+    public void testSetVirtualEndPoint() throws Exception {
+        routerLsa.setVirtualEndPoint(true);
+        assertThat(routerLsa, is(notNullValue()));
+    }
+
+
+    /**
+     * Tests isAsBoundaryRouter() setter method.
+     */
+    @Test
+    public void testSetAsBoundaryRouter() throws Exception {
+        routerLsa.setAsBoundaryRouter(true);
+        assertThat(routerLsa, is(notNullValue()));
+    }
+
+    /**
+     * Tests areaBorderRouter() setter method.
+     */
+    @Test
+    public void testSetAreaBorderRouter() throws Exception {
+        routerLsa.setAreaBorderRouter(true);
+        assertThat(routerLsa, is(notNullValue()));
+    }
+
+    /**
+     * Tests noLink() getter method.
+     */
+    @Test
+    public void testGetNoLink() throws Exception {
+        routerLsa.setNoLink(10);
+        result1 = routerLsa.noLink();
+        assertThat(result1, is(10));
+    }
+
+    /**
+     * Tests noLink() setter method.
+     */
+    @Test
+    public void testSetNoLink() throws Exception {
+        routerLsa.setNoLink(10);
+        result1 = routerLsa.noLink();
+        assertThat(result1, is(10));
+    }
+
+    /**
+     * Tests addRouterLink() method.
+     */
+    @Test
+    public void testAddRouterLink() throws Exception {
+        routerLsa.setNoLink(0);
+        ospflsaLink = createOspfLsaLink();
+        routerLsa.addRouterLink(ospflsaLink);
+        routerLsa.incrementLinkNo();
+        result1 = routerLsa.noLink();
+        assertThat(result1, is(1));
+
+    }
+
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        ospflsaLink = createOspfLsaLink();
+        routerLsa.addRouterLink(ospflsaLink);
+        inputArray = createByteForRouterLsa();
+        lsaHeader = createLsaHeader();
+        routerLsa = new RouterLsa(lsaHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(inputArray);
+        routerLsa.readFrom(channelBuffer);
+        assertThat(routerLsa, is(notNullValue()));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test(expected = Exception.class)
+    public void testReadFrom1() throws Exception {
+        byte[] temp = {0, 0, 0};
+        ospflsaLink = createOspfLsaLink();
+        routerLsa.addRouterLink(ospflsaLink);
+        inputArray = temp;
+        lsaHeader = createLsaHeader();
+        routerLsa = new RouterLsa(lsaHeader);
+        channelBuffer = ChannelBuffers.copiedBuffer(inputArray);
+        routerLsa.readFrom(channelBuffer);
+        assertThat(routerLsa, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result2 = routerLsa.asBytes();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsaBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLsaBodyAsByteArray() throws Exception {
+        routerLsa.setAreaBorderRouter(true);
+        routerLsa.setVirtualEndPoint(true);
+        routerLsa.setAreaBorderRouter(true);
+        ospflsaLink = createOspfLsaLink();
+        routerLsa.addRouterLink(ospflsaLink);
+        result2 = routerLsa.getLsaBodyAsByteArray();
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getOspfLsaType() getter method.
+     */
+    @Test
+    public void testGetOspfLsaType() throws Exception {
+        routerLsa.setLsType(1);
+        result3 = routerLsa.getOspfLsaType();
+        assertThat(result3, is(OspfLsaType.ROUTER));
+    }
+
+    /**
+     * Tests incrementLinkNo() method.
+     */
+    @Test
+    public void testIncrementLinkNo() throws Exception {
+        routerLsa.setNoLink(1);
+        routerLsa.incrementLinkNo();
+        assertThat(routerLsa.noLink(), is(2));
+    }
+
+    /**
+     * Tests lsaHeader() method.
+     */
+    @Test
+    public void testGetLsaHeader() throws Exception {
+        lsaHeader = (LsaHeader) routerLsa.lsaHeader();
+        assertThat(lsaHeader, instanceOf(RouterLsa.class));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(routerLsa.toString(), is(notNullValue()));
+
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private OspfLsaLink createOspfLsaLink() {
+        ospflsaLink = new OspfLsaLink();
+        ospflsaLink.setLinkId("10.226.165.164");
+        ospflsaLink.setMetric(10);
+        ospflsaLink.setTos(50);
+        ospflsaLink.setLinkType(2);
+        ospflsaLink.setLinkData("10.226.165.170");
+        return ospflsaLink;
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private byte[] createByteForRouterLsa() {
+        byte[] packet = {2, 1, 1, 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};
+        return packet;
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private LsaHeader createLsaHeader() {
+        lsaHeader = new LsaHeader();
+        lsaHeader.setLsType(1);
+        lsaHeader.setLsPacketLen(48);
+        lsaHeader.setLsCheckSum(10);
+        lsaHeader.setAge(4);
+        lsaHeader.setLinkStateId("10.226.165.164");
+        lsaHeader.setLsSequenceNo(250);
+        lsaHeader.setAdvertisingRouter(Ip4Address.valueOf("100.226.165.165"));
+        lsaHeader.setOptions(2);
+        return lsaHeader;
+    }
+
+    /**
+     * Tests hashcode() method.
+     */
+    @Test
+    public void testHashcode() throws Exception {
+
+        result1 = routerLsa.hashCode();
+        assertThat(result1, is(notNullValue()));
+
+    }
+}
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReaderTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReaderTest.java
new file mode 100644
index 0000000..8b1d089
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageReaderTest.java
@@ -0,0 +1,104 @@
+/*
+ * 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.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for OspfMessageReader.
+ */
+
+public class OspfMessageReaderTest {
+
+    private final byte[] packet1 = {1, 1, 1, 1, 2, 1, 0, 44, -64, -88, -86, 8,
+            0, 0, 0, 1, 39, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0,
+            10, 2, 1, 0, 0, 0, 40, -64, -88, -86, 8, 0, 0, 0, 0};
+    private final byte[] packet2 = {1, 1, 1, 1, 2, 2, 0, 52, -64, -88, -86, 8, 0,
+            0, 0, 1, -96, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, -36, 2, 7, 65, 119,
+            -87, 126, 0, 23, 2, 1, 10, 10, 10, 10, 10, 10, 10, 10, -128, 0, 0, 6,
+            -69, 26, 0, 36};
+    private final byte[] packet3 = {1, 1, 1, 1, 2, 3, 0, 36, -64, -88, -86, 3, 0,
+            0, 0, 1, -67, -57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -64, -88,
+            -86, 8, -64, -88, -86, 8};
+    private final byte[] packet4 = {1, 1, 1, 1, 2, 4, 1, 36, -64, -88, -86, 3, 0,
+            0, 0, 1, 54, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0,
+            2, 2, 1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0
+            , 0, 1, 58, -100, 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, 0, 3, 2, 5, 80, -44,
+            16, 0, -64, -88, -86, 2, -128, 0, 0, 1, 42, 73, 0,
+            36, -1, -1, -1, -1, -128, 0, 0, 20, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 3, 2, 5, -108, 121, -85, 0, -64, -88,
+            -86, 2, -128, 0, 0, 1, 52, -91, 0, 36, -1, -1, -1,
+            0, -128, 0, 0, 20, -64, -88, -86, 1, 0, 0, 0, 0, 0,
+            3, 2, 5, -64, -126, 120, 0, -64, -88, -86, 2, -128, 0,
+            0, 1, -45, 25, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, 0, 0,
+            -64, -88, -86, 2, -128, 0, 0, 1, 55, 8, 0, 36, -1, -1
+            , -1, 0, -128, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            3, 2, 5, -64, -88, 1, 0, -64, -88, -86, 2, -128, 0, 0,
+            1, 44, 18, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, -84, 0, -64,
+            -88, -86, 2, -128, 0, 0, 1, 51, 65, 0, 36, -1, -1, -1, 0,
+            -128, 0, 0, 20, -64, -88, -86, 10, 0, 0, 0, 0};
+    private final byte[] packet5 = {1, 1, 1, 1, 2, 5, 0, 44, -64, -88, -86, 8, 0, 0,
+            0, 1, -30, -12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 16, 2, 1, -64, -88, -86,
+            2, -64, -88, -86, 2, -128, 0, 0, 1, 74, -114, 0, 48};
+    private OspfMessageReader ospfMessageReader;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        ospfMessageReader = new OspfMessageReader();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ospfMessageReader = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests readFromBuffer() method.
+     */
+    @Test
+    public void testReadFromBuffer() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        ospfMessageReader.readFromBuffer(channelBuffer);
+
+        channelBuffer = ChannelBuffers.copiedBuffer(packet2);
+        ospfMessageReader.readFromBuffer(channelBuffer);
+
+        channelBuffer = ChannelBuffers.copiedBuffer(packet3);
+        ospfMessageReader.readFromBuffer(channelBuffer);
+
+        channelBuffer = ChannelBuffers.copiedBuffer(packet4);
+        ospfMessageReader.readFromBuffer(channelBuffer);
+
+        channelBuffer = ChannelBuffers.copiedBuffer(packet5);
+        ospfMessageReader.readFromBuffer(channelBuffer);
+        assertThat(ospfMessageReader, is(notNullValue()));
+
+    }
+}
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriterTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriterTest.java
new file mode 100644
index 0000000..0600ebc
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/OspfMessageWriterTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for OspfMessageWriter.
+ */
+public class OspfMessageWriterTest {
+
+    private OspfMessageWriter ospfMessageWriter;
+    private HelloPacket helloPacket;
+    private DdPacket ddPacket;
+    private LsAcknowledge lsAck;
+    private LsRequest lsReq;
+    private LsUpdate lsUpdate;
+
+    @Before
+    public void setUp() throws Exception {
+        ospfMessageWriter = new OspfMessageWriter();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        ospfMessageWriter = null;
+        helloPacket = null;
+        ddPacket = null;
+        lsAck = null;
+        lsReq = null;
+        lsUpdate = null;
+    }
+
+    /**
+     * Tests writeToBuffer() method.
+     */
+    @Test
+    public void testWriteToBuffer() throws Exception {
+        helloPacket = new HelloPacket();
+        helloPacket.setAuthType(1);
+        helloPacket.setOspftype(1);
+        helloPacket.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        helloPacket.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        helloPacket.setChecksum(201);
+        helloPacket.setAuthentication(2);
+        helloPacket.setOspfPacLength(48);
+        helloPacket.setOspfVer(2);
+        helloPacket.setNetworkMask(Ip4Address.valueOf("255.255.255.255"));
+        helloPacket.setOptions(2); //not setting now
+        helloPacket.setHelloInterval(10);
+        helloPacket.setRouterPriority(1);
+        helloPacket.setRouterDeadInterval(40);
+        helloPacket.setDr(Ip4Address.valueOf("1.1.1.1"));
+        helloPacket.setBdr(Ip4Address.valueOf("2.2.2.2"));
+        helloPacket.addNeighbor(Ip4Address.valueOf("8.8.8.8"));
+        helloPacket.setDestinationIp(Ip4Address.valueOf("5.5.5.5"));
+        ospfMessageWriter.writeToBuffer(helloPacket, 7, 1);
+        assertThat(ospfMessageWriter, is(notNullValue()));
+    }
+
+    @Test(expected = Exception.class)
+    public void testWriteToBuffer1() throws Exception {
+
+        ddPacket = new DdPacket();
+        ddPacket.setAuthType(1);
+        ddPacket.setOspftype(2);
+        ddPacket.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        ddPacket.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        ddPacket.setChecksum(201);
+        ddPacket.setAuthentication(2);
+        ddPacket.setOspfPacLength(48);
+        ddPacket.setOspfVer(2);
+        ospfMessageWriter.writeToBuffer(ddPacket, 1, 1);
+        assertThat(ospfMessageWriter, is(notNullValue()));
+    }
+
+    @Test(expected = Exception.class)
+    public void testWriteToBuffer2() throws Exception {
+
+        lsAck = new LsAcknowledge();
+        lsAck.setAuthType(1);
+        lsAck.setOspftype(5);
+        lsAck.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsAck.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        lsAck.setChecksum(201);
+        lsAck.setAuthentication(2);
+        lsAck.setOspfPacLength(48);
+        lsAck.setOspfVer(2);
+        ospfMessageWriter.writeToBuffer(lsAck, 1, 1);
+        assertThat(ospfMessageWriter, is(notNullValue()));
+    }
+
+    @Test(expected = Exception.class)
+    public void testWriteToBuffer3() throws Exception {
+        lsReq = new LsRequest();
+        lsReq.setAuthType(1);
+        lsReq.setOspftype(3);
+        lsReq.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsReq.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        lsReq.setChecksum(201);
+        lsReq.setAuthentication(2);
+        lsReq.setOspfPacLength(48);
+        lsReq.setOspfVer(2);
+        ospfMessageWriter.writeToBuffer(lsReq, 1, 1);
+        assertThat(ospfMessageWriter, is(notNullValue()));
+    }
+
+    @Test(expected = Exception.class)
+    public void testWriteToBuffer4() throws Exception {
+        lsUpdate = new LsUpdate();
+        lsUpdate.setAuthType(1);
+        lsUpdate.setOspftype(3);
+        lsUpdate.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsUpdate.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        lsUpdate.setChecksum(201);
+        lsUpdate.setAuthentication(2);
+        lsUpdate.setOspfPacLength(48);
+        lsUpdate.setOspfVer(2);
+        ospfMessageWriter.writeToBuffer(lsUpdate, 1, 1);
+        assertThat(ospfMessageWriter, is(notNullValue()));
+    }
+
+    /**
+     * Tests writeToBuffer() method.
+     */
+    @Test(expected = Exception.class)
+    public void testWriteToBuffer5() throws Exception {
+        lsAck = new LsAcknowledge();
+        lsAck.setAuthType(1);
+        lsAck.setOspftype(5);
+        lsAck.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsAck.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        lsAck.setChecksum(201);
+        lsAck.setAuthentication(2);
+        lsAck.setOspfPacLength(48);
+        lsAck.setOspfVer(2);
+        ospfMessageWriter.writeToBuffer(lsAck, 1, 1);
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdateTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdateTest.java
new file mode 100644
index 0000000..8d48099
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/ospfpacket/types/LsUpdateTest.java
@@ -0,0 +1,345 @@
+/*
+ * 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.types;
+
+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.controller.OspfLsa;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
+import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
+import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
+import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
+import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
+import org.onosproject.ospf.protocol.ospfpacket.OspfPacketHeader;
+import org.onosproject.ospf.protocol.util.OspfPacketType;
+
+import java.util.List;
+import java.util.Vector;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for LsUpdate.
+ */
+public class LsUpdateTest {
+
+    private final byte[] packet1 = {0, 0, 0, 2, 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};
+    private final byte[] packet3 = {0, 0, 0, 1, 0, 100, 2, 10, 1, 0, 0, 1, 9, 9, 9, 9,
+            -128, 0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2,
+            0, 4, -64, -88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0,
+            0, 0, 5, 0, 4, 0, 0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0,
+            0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0,
+            0, 0, 1};
+    private final byte[] packet2 = {0, 0,
+            0, 1, 0, 1, 2, 2, -64, -88,
+            -86, 8, -64, -88, -86, 8, -128, 0, 0, 1, 55, -73, 0, 32, -1, -1, -1, 0, -64,
+            -88, -86, 3, -64, -88, -86, 8};
+    private final byte[] packet4 = {0, 0, 0, 1, 0, 100, 2, 9, 1, 0, 0, 1, 9, 9, 9, 9, -128,
+            0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
+            -88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0,
+            0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
+
+    private final byte[] packet5 = {0, 0, 0, 1, 0, 100, 2, 11, 1, 0, 0, 1, 9, 9, 9, 9, -128, 0,
+            0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64, -88,
+            7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0,
+            1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet6 = {0, 0, 0, 1, 0, 100, 2, 3, 1, 0, 0, 1, 9, 9, 9, 9, -128,
+            0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
+            -88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4,
+            0, 0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
+    private final byte[] packet7 = {0, 0, 0, 1, 0, 100, 2, 4, 1, 0, 0, 1, 9, 9, 9, 9, -128,
+            0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64,
+            -88, 7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0,
+            0, 0, 1, 0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 9, 0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
+
+    private final byte[] packet8 = {0, 0, 0, 2, 1, 4, 2, 1, 5, 5, 5, 5, 5, 5, 5, 5, -128, 0, 0,
+            4, -39, -84, 0, 36, 1, 0, 0, 1, -64, -88, 7, 90, -64, -88, 7, 92, 2, 0, 0, 10, 1, 4,
+            2, 4, -34, -34, -34, -34, 5, 5, 5, 5, -128, 0, 0, 1, 31, -93, 0, 28, 0, 0, 0, 0, 0,
+            0, 0, 10};
+    private LsUpdate lsUpdate;
+    private RouterLsa ospflsa;
+    private NetworkLsa ospflsa1;
+    private SummaryLsa ospflsa2;
+    private AsbrSummaryLsa ospflsa3;
+    private ExternalLsa ospflsa4;
+    private Vector<OspfLsa> listLSA = new Vector();
+    private List lsa;
+    private int result;
+    private OspfPacketType ospfMessageType;
+    private OspfPacketHeader ospfPacketHeader;
+    private byte[] result1;
+    private ChannelBuffer channelBuffer;
+    private OpaqueLsa10 opaqueLsa10;
+    private OpaqueLsa9 opaqueLsa9;
+    private OpaqueLsa11 opaqueLsa11;
+
+    @Before
+    public void setUp() throws Exception {
+        lsUpdate = new LsUpdate();
+        ospflsa = new RouterLsa();
+        lsUpdate.setAuthType(1);
+        lsUpdate.setOspftype(2);
+        lsUpdate.setRouterId(Ip4Address.valueOf("10.226.165.164"));
+        lsUpdate.setAreaId(Ip4Address.valueOf("10.226.165.100"));
+        lsUpdate.setChecksum(201);
+        lsUpdate.setAuthentication(2);
+        lsUpdate.setOspfPacLength(48);
+        lsUpdate.setOspfVer(2);
+        ospflsa.setLsType(1);
+        lsUpdate.addLsa(ospflsa);
+        ospflsa1 = new NetworkLsa();
+        ospflsa1.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
+        ospflsa1.setLsType(2);
+        lsUpdate.addLsa(ospflsa1);
+        ospflsa2 = new SummaryLsa(new LsaHeader());
+        ospflsa2.setLsType(3);
+        lsUpdate.addLsa(ospflsa2);
+        ospflsa3 = new AsbrSummaryLsa(new LsaHeader());
+        ospflsa3.setNetworkMask(Ip4Address.valueOf("10.226.165.164"));
+        ospflsa3.setLsType(4);
+        lsUpdate.addLsa(ospflsa3);
+        ospflsa4 = new ExternalLsa(new LsaHeader());
+        ospflsa4.setLsType(5);
+        lsUpdate.addLsa(ospflsa4);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        lsUpdate = null;
+        ospflsa = null;
+        ospflsa1 = null;
+        ospflsa2 = null;
+        ospflsa3 = null;
+        ospflsa4 = null;
+        listLSA.clear();
+        lsa = null;
+        ospfMessageType = null;
+        ospfPacketHeader = null;
+        result1 = null;
+        channelBuffer = null;
+        opaqueLsa9 = null;
+        opaqueLsa10 = null;
+        opaqueLsa11 = null;
+    }
+
+    /**
+     * Tests getLsaList() getter method.
+     */
+    @Test
+    public void testGetListLsa() throws Exception {
+        lsUpdate.addLsa(ospflsa);
+        lsUpdate.addLsa(ospflsa);
+        lsa = lsUpdate.getLsaList();
+        assertThat(lsa, is(notNullValue()));
+        assertThat(lsa.size(), is(5));
+    }
+
+    /**
+     * Tests addLsa() method.
+     */
+    @Test
+    public void testAddLsa() throws Exception {
+        lsUpdate.addLsa(ospflsa);
+        assertThat(lsUpdate, is(notNullValue()));
+    }
+
+    /**
+     * Tests noLsa() getter  method.
+     */
+    @Test
+    public void testGetNoLsa() throws Exception {
+        lsUpdate.setNumberOfLsa(5);
+        result = lsUpdate.noLsa();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(5));
+    }
+
+    /**
+     * Tests noLsa() setter  method.
+     */
+    @Test
+    public void testSetNoLsa() throws Exception {
+        lsUpdate.setNumberOfLsa(5);
+        result = lsUpdate.noLsa();
+        assertThat(result, is(notNullValue()));
+        assertThat(result, is(5));
+    }
+
+    /**
+     * Tests ospfMessageType() getter  method.
+     */
+    @Test
+    public void testGetOspfMessageType() throws Exception {
+        ospfMessageType = lsUpdate.ospfMessageType();
+        assertThat(ospfMessageType, is(OspfPacketType.LSUPDATE));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        ospfPacketHeader = new OspfPacketHeader();
+        ospfPacketHeader.setAreaId(Ip4Address.valueOf("1.1.1.1"));
+        ospfPacketHeader.setAuthentication(0);
+        ospfPacketHeader.setAuthType(0);
+        ospfPacketHeader.setChecksum(12345);
+        ospfPacketHeader.setDestinationIp(Ip4Address.valueOf("10.10.10.10"));
+        ospfPacketHeader.setOspfPacLength(56);
+        ospfPacketHeader.setOspftype(4);
+        ospfPacketHeader.setOspfVer(2);
+        ospfPacketHeader.setRouterId(Ip4Address.valueOf("2.2.2.2"));
+        ospfPacketHeader.setSourceIp(Ip4Address.valueOf("3.3.3.3"));
+        lsUpdate = new LsUpdate(ospfPacketHeader);
+        result1 = createLsUpdatePacket();
+        channelBuffer = ChannelBuffers.copiedBuffer(result1);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet1);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet2);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet3);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet4);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet5);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet6);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet7);
+        lsUpdate.readFrom(channelBuffer);
+        channelBuffer = ChannelBuffers.copiedBuffer(packet8);
+        lsUpdate.readFrom(channelBuffer);
+        assertThat(lsUpdate, is(notNullValue()));
+        assertThat(lsUpdate.ospfMessageType(), is(OspfPacketType.LSUPDATE));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        result1 = lsUpdate.asBytes();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsuHeaderAsByteArray() method.
+     */
+    @Test
+    public void testGetLsuHeaderAsByteArray() throws Exception {
+        result1 = lsUpdate.getLsuHeaderAsByteArray();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests getLsuBodyAsByteArray() method.
+     */
+    @Test
+    public void testGetLsuBodyAsByteArray() throws Exception {
+        lsUpdate.setNumberOfLsa(8);
+        lsUpdate.addLsa(ospflsa3);
+        opaqueLsa9 = new OpaqueLsa9(new OpaqueLsaHeader());
+        opaqueLsa9.setLsType(9);
+        lsUpdate.addLsa(opaqueLsa9);
+        opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
+        opaqueLsa10.setLsType(10);
+        lsUpdate.addLsa(opaqueLsa10);
+        opaqueLsa11 = new OpaqueLsa11(new OpaqueLsaHeader());
+        opaqueLsa10.setLsType(11);
+        lsUpdate.addLsa(opaqueLsa11);
+        result1 = lsUpdate.getLsuBodyAsByteArray();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    @Test
+    public void testGetLsuBodyAsByteArray1() throws Exception {
+        lsUpdate.setNumberOfLsa(8);
+        opaqueLsa10 = new OpaqueLsa10(new OpaqueLsaHeader());
+        opaqueLsa10.setLsType(10);
+        lsUpdate.addLsa(opaqueLsa10);
+        assertThat(result1, is(nullValue()));
+    }
+
+    @Test
+    public void testGetLsuBodyAsByteArray2() throws Exception {
+        opaqueLsa11 = new OpaqueLsa11(new OpaqueLsaHeader());
+        opaqueLsa11.setLsType(11);
+        lsUpdate.addLsa(opaqueLsa11);
+        result1 = lsUpdate.getLsuBodyAsByteArray();
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests to string method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lsUpdate.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Utility method used by junit methods.
+     */
+    private byte[] createLsUpdatePacket() {
+        byte[] lsUpdatePacket = {0, 0, 0, 7, 0, 2, 2,
+                1, -64, -88, -86, 3, -64, -88, -86, 3, -128, 0, 0, 1, 58,
+                -100, 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
+                , 0, 3, 2, 5, 80, -44, 16, 0, -64, -88, -86, 2, -128, 0, 0
+                , 1, 42, 73, 0, 36, -1, -1, -1, -1, -128, 0, 0, 20, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -108, 121, -85, 0, -64, -88
+                , -86, 2, -128, 0, 0, 1, 52, -91, 0, 36, -1, -1, -1, 0,
+                -128, 0, 0, 20, -64, -88, -86, 1, 0, 0, 0, 0, 0, 3, 2, 5
+                , -64, -126, 120, 0, -64, -88, -86, 2, -128, 0, 0, 1, -45,
+                25, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 3, 2, 5, -64, -88, 0, 0, -64, -88, -86, 2,
+                -128, 0, 0, 1, 55, 8, 0, 36, -1, -1, -1, 0, -128, 0, 0,
+                20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, 1, 0,
+                -64, -88, -86, 2, -128, 0, 0, 1, 44, 18, 0, 36, -1, -1, -1, 0, -128, 0,
+                0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 5, -64, -88, -84, 0, -64, -88,
+                -86, 2, -128, 0, 0, 1, 51, 65, 0, 36, -1, -1, -1, 0, -128, 0, 0, 20, -64,
+                -88, -86, 10, 0, 0, 0, 0};
+        return lsUpdatePacket;
+    }
+}
\ No newline at end of file
diff --git a/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/ChecksumCalculatorTest.java b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/ChecksumCalculatorTest.java
new file mode 100644
index 0000000..6b17cbb
--- /dev/null
+++ b/protocols/ospf/protocol/src/test/java/org/onosproject/ospf/protocol/util/ChecksumCalculatorTest.java
@@ -0,0 +1,367 @@
+/*
+ * 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.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.ospf.protocol.lsa.LsaHeader;
+import org.onosproject.ospf.protocol.lsa.OpaqueLsaHeader;
+import org.onosproject.ospf.protocol.lsa.types.AsbrSummaryLsa;
+import org.onosproject.ospf.protocol.lsa.types.ExternalLsa;
+import org.onosproject.ospf.protocol.lsa.types.NetworkLsa;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa10;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa11;
+import org.onosproject.ospf.protocol.lsa.types.OpaqueLsa9;
+import org.onosproject.ospf.protocol.lsa.types.RouterLsa;
+import org.onosproject.ospf.protocol.lsa.types.SummaryLsa;
+import org.onosproject.ospf.protocol.ospfpacket.types.DdPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.HelloPacket;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsAcknowledge;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsRequest;
+import org.onosproject.ospf.protocol.ospfpacket.types.LsUpdate;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for ChecksumCalculator.
+ */
+public class ChecksumCalculatorTest {
+
+    private final int ospfChecksumPos1 = 12;
+    private final int ospfChecksumPos2 = 13;
+    private final int lsaChecksumPos1 = 16;
+    private final int lsaChecksumPos2 = 17;
+    private final byte[] updatePacket = {1, 1, 1, 1, 2, 4, 0, -96, 9, 9, 9, 9, 5, 5, 5, 5, 62, 125,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 100, 2, 10, 1, 0, 0, 1, 9, 9, 9, 9, -128,
+            0, 0, 1, -7, 62, 0, -124, 0, 2, 0, 108, 0, 1, 0, 1, 2, 0, 0, 0, 0, 2, 0, 4, -64, -88,
+            7, -91, 0, 3, 0, 4, -64, -88, 7, -91, 0, 4, 0, 4, 0, 0, 0, 0, 0, 5, 0, 4, 0, 0, 0, 1,
+            0, 6, 0, 4, 0, 0, 0, 0, 0, 7, 0, 4, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+            0, 4, 0, 0, 0, 0, -128, 2, 0, 4, 0, 0, 0, 1};
+
+    private final byte[] helloPacket = {2, 1, 0, 44, -64, -88, -86, 8, 0, 0, 0, 1, 39, 59,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 10, 2, 1, 0, 0, 0, 40, -64, -88,
+            -86, 8, 0, 0, 0, 0};
+    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 ChecksumCalculator checksumCalculator;
+    private boolean validate;
+    private HelloPacket hello;
+    private LsUpdate message;
+    private DdPacket message1;
+    private LsRequest message2;
+    private RouterLsa router;
+    private LsAcknowledge lsack;
+    private ExternalLsa external;
+    private NetworkLsa external1;
+    private SummaryLsa external2;
+    private AsbrSummaryLsa external3;
+    private OpaqueLsa9 external4;
+    private OpaqueLsa10 external5;
+    private OpaqueLsa11 external6;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        checksumCalculator = new ChecksumCalculator();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        checksumCalculator = null;
+        hello = null;
+        message = null;
+        message1 = null;
+        message2 = null;
+        router = null;
+        lsack = null;
+        external = null;
+        external1 = null;
+        external2 = null;
+        external3 = null;
+        result = null;
+    }
+
+    /**
+     * Tests convertToSixteenBits() method.
+     */
+    @Test
+    public void testConvertToSixteenBits() throws Exception {
+        int num = checksumCalculator.convertToSixteenBits("16cdd");
+        assertThat(num, is(27870));
+    }
+
+    /**
+     * Tests isValidOspfCheckSum() method.
+     */
+    @Test
+    public void testIsValidOspfCheckSum() throws Exception {
+        hello = new HelloPacket();
+        hello.setOspfVer(2);
+        hello.setOspftype(1);
+        hello.setOspfPacLength(172);
+        hello.setRouterId(Ip4Address.valueOf("192.168.170.3"));
+        hello.setAreaId(Ip4Address.valueOf("0.0.0.1"));
+        hello.setChecksum(5537);
+        hello.setAuthType(0);
+        hello.setAuthentication(0);
+        validate = checksumCalculator.isValidOspfCheckSum(hello, ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(validate, is(false));
+        lsack = new LsAcknowledge();
+        lsack.setOspfVer(2);
+        lsack.setOspftype(5);
+        lsack.setOspfPacLength(172);
+        lsack.setRouterId(Ip4Address.valueOf("192.168.170.3"));
+        lsack.setAreaId(Ip4Address.valueOf("0.0.0.1"));
+        lsack.setChecksum(37537);
+        lsack.setAuthType(0);
+        lsack.setAuthentication(0);
+        validate = checksumCalculator.isValidOspfCheckSum(lsack, ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(validate, is(true));
+        message = new LsUpdate();
+        message.setOspfVer(2);
+        message.setOspftype(5);
+        message.setOspfPacLength(172);
+        message.setRouterId(Ip4Address.valueOf("192.168.170.3"));
+        message.setAreaId(Ip4Address.valueOf("0.0.0.1"));
+        message.setChecksum(37537);
+        message.setAuthType(0);
+        message.setAuthentication(0);
+        validate = checksumCalculator.isValidOspfCheckSum(message, ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(validate, is(true));
+        message1 = new DdPacket();
+        message1.setOspfVer(2);
+        message1.setOspftype(5);
+        message1.setOspfPacLength(172);
+        message1.setRouterId(Ip4Address.valueOf("192.168.170.3"));
+        message1.setAreaId(Ip4Address.valueOf("0.0.0.1"));
+        message1.setChecksum(37537);
+        message1.setAuthType(0);
+        message1.setAuthentication(0);
+        validate = checksumCalculator.isValidOspfCheckSum(message1, ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(validate, is(true));
+        message2 = new LsRequest();
+        message2.setOspfVer(2);
+        message2.setOspftype(5);
+        message2.setOspfPacLength(172);
+        message2.setRouterId(Ip4Address.valueOf("192.168.170.3"));
+        message2.setAreaId(Ip4Address.valueOf("0.0.0.1"));
+        message2.setChecksum(37537);
+        message2.setAuthType(0);
+        message2.setAuthentication(0);
+        validate = checksumCalculator.isValidOspfCheckSum(message2, ospfChecksumPos1, ospfChecksumPos2);
+        assertThat(validate, is(true));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test
+    public void testIsValidLsaCheckSum() throws Exception {
+        router = new RouterLsa();
+        router.setAge(1);
+        router.setOptions(2);
+        router.setLsType(1);
+        router.setLinkStateId("192.168.170.3");
+        router.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.3"));
+        router.setLsSequenceNo(2147483649L);
+        router.setLsCheckSum(49499);
+        router.setLsPacketLen(48);
+        validate = checksumCalculator.isValidLsaCheckSum(router, router.lsType(), lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(true));
+
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test
+    public void testIsValidLsaCheckSum4() throws Exception {
+        external = new ExternalLsa(new LsaHeader());
+        external.setAge(2);
+        external.setOptions(2);
+        external.setLsType(5);
+        external.setLinkStateId("80.212.16.0");
+        external.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external.setLsSequenceNo(2147483649L);
+        external.setLsCheckSum(25125);
+        external.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external, external.lsType(), lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsValidLsaCheckSum5() throws Exception {
+        external1 = new NetworkLsa();
+        external1.setAge(2);
+        external1.setOptions(2);
+        external1.setLsType(2);
+        external1.setLinkStateId("80.212.16.0");
+        external1.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external1.setLsSequenceNo(2147483649L);
+        external1.setLsCheckSum(25125);
+        external1.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external1, external1.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test
+    public void testIsValidLsaCheckSum6() throws Exception {
+
+        external2 = new SummaryLsa(new LsaHeader());
+        external2.setAge(2);
+        external2.setOptions(2);
+        external2.setLsType(3);
+        external2.setLinkStateId("80.212.16.0");
+        external2.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external2.setLsSequenceNo(2147483649L);
+        external2.setLsCheckSum(25125);
+        external2.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external2, external2.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsValidLsaCheckSum7() throws Exception {
+        external3 = new AsbrSummaryLsa(new LsaHeader());
+        external3.setAge(2);
+        external3.setOptions(2);
+        external3.setLsType(4);
+        external3.setLinkStateId("80.212.16.0");
+        external3.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external3.setLsSequenceNo(2147483649L);
+        external3.setLsCheckSum(25125);
+        external3.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external3, external3.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsValidLsaCheckSum1() throws Exception {
+        external4 = new OpaqueLsa9(new OpaqueLsaHeader());
+        external4.setAge(2);
+        external4.setOptions(2);
+        external4.setLsType(9);
+        external4.setLinkStateId("80.212.16.0");
+        external4.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external4.setLsSequenceNo(2147483649L);
+        external4.setLsCheckSum(25125);
+        external4.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external4, external4.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsValidLsaCheckSum2() throws Exception {
+        external5 = new OpaqueLsa10(new OpaqueLsaHeader());
+        external5.setAge(2);
+        external5.setOptions(2);
+        external5.setLsType(10);
+        external5.setLinkStateId("80.212.16.0");
+        external5.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external5.setLsSequenceNo(2147483649L);
+        external5.setLsCheckSum(25125);
+        external5.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external5, external5.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests isValidLsaCheckSum() method.
+     */
+    @Test(expected = Exception.class)
+    public void testIsValidLsaCheckSum3() throws Exception {
+        external6 = new OpaqueLsa11(new OpaqueLsaHeader());
+        external6.setAge(2);
+        external6.setOptions(2);
+        external6.setLsType(10);
+        external6.setLinkStateId("80.212.16.0");
+        external6.setAdvertisingRouter(Ip4Address.valueOf("192.168.170.2"));
+        external6.setLsSequenceNo(2147483649L);
+        external6.setLsCheckSum(25125);
+        external6.setLsPacketLen(36);
+        validate = checksumCalculator.isValidLsaCheckSum(external6, external6.lsType(),
+                                                         lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(validate, is(false));
+    }
+
+    /**
+     * Tests validateLsaCheckSum() method.
+     */
+    @Test
+    public void testValidateLsaCheckSum() throws Exception {
+        assertThat(checksumCalculator.validateLsaCheckSum(rlsa, lsaChecksumPos1,
+                                                          lsaChecksumPos2), is(true));
+
+    }
+
+    /**
+     * Tests validateOspfCheckSum() method.
+     */
+    @Test
+    public void testValidateOspfCheckSum() throws Exception {
+        assertThat(checksumCalculator.validateOspfCheckSum(helloPacket, ospfChecksumPos1,
+                                                           ospfChecksumPos2), is(true));
+    }
+
+    /**
+     * Tests calculateLsaChecksum() method.
+     */
+    @Test
+    public void testCalculateLsaChecksum() throws Exception {
+        result = checksumCalculator.calculateLsaChecksum(rlsa, lsaChecksumPos1, lsaChecksumPos2);
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests calculateOspfCheckSum() method.
+     */
+    @Test
+    public void testCalculateOspfCheckSum() throws Exception {
+        result = checksumCalculator.calculateOspfCheckSum(helloPacket, ospfChecksumPos1,
+                                                          ospfChecksumPos2);
+        assertThat(result, is(notNullValue()));
+        result = checksumCalculator.calculateOspfCheckSum(updatePacket, ospfChecksumPos1,
+                                                          ospfChecksumPos2);
+        assertThat(result, is(notNullValue()));
+    }
+}
\ No newline at end of file
