diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
new file mode 100644
index 0000000..6ce37c8
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
@@ -0,0 +1,220 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.io.isispacket.pdu;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisNeighborTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of ISIS hello PDU.
+ */
+public abstract class HelloPdu extends IsisHeader {
+
+    protected List<IsisTlv> variableLengths = new ArrayList<>();
+    private byte circuitType;
+    private String sourceId;
+    private int holdingTime;
+    private int pduLength;
+
+    public void addTlv(IsisTlv isisTlv) {
+        variableLengths.add(isisTlv);
+    }
+
+    /**
+     * Returns the variable lengths.
+     *
+     * @return variable lengths
+     */
+    public List<IsisTlv> tlvs() {
+        return variableLengths;
+    }
+
+    /**
+     * Returns the list of area addresses.
+     *
+     * @return areaAddresses area addresses
+     */
+    public List<String> areaAddress() {
+        List<String> areaAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AreaAddressTlv) {
+                areaAddresses = ((AreaAddressTlv) tlv).areaAddress();
+            }
+        }
+        return areaAddresses;
+    }
+
+    /**
+     * Returns the list of interface IP addresses.
+     *
+     * @return interfaceIpAddresses list of interface IP addresses
+     */
+    public List<Ip4Address> interfaceIpAddresses() {
+        List<Ip4Address> interfaceIpAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IpInterfaceAddressTlv) {
+                interfaceIpAddresses = ((IpInterfaceAddressTlv) tlv).interfaceAddress();
+            }
+        }
+        return interfaceIpAddresses;
+    }
+
+    /**
+     * Returns the list of neighbor list.
+     *
+     * @return macAddresses list of neighbor MAC address
+     */
+    public List<MacAddress> neighborList() {
+        List<MacAddress> macAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IsisNeighborTlv) {
+                macAddresses = ((IsisNeighborTlv) tlv).neighbor();
+            }
+        }
+        return macAddresses;
+    }
+
+    /**
+     * Returns the adjacency state.
+     *
+     * @return interfaceState adjacency state
+     */
+    public IsisInterfaceState adjacencyState() {
+        IsisInterfaceState interfaceState = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AdjacencyStateTlv) {
+                interfaceState = IsisInterfaceState.get(((AdjacencyStateTlv) tlv).adjacencyType());
+                break;
+            }
+        }
+        return interfaceState;
+    }
+
+    /**
+     * Returns the source ID.
+     *
+     * @return sourceId source ID
+     */
+    public String sourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets source ID.
+     *
+     * @param sourceId source ID
+     */
+    public void setSourceId(String sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    /**
+     * Returns the PDU length.
+     *
+     * @return pduLength PDU length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the PDU length.
+     *
+     * @param pduLength PDU lenght
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    /**
+     * Returns the holding time.
+     *
+     * @return holdingTime holding time
+     */
+    public int holdingTime() {
+        return holdingTime;
+    }
+
+    /**
+     * Sets the holding time.
+     *
+     * @param holdingTime holding time
+     */
+    public void setHoldingTime(int holdingTime) {
+        this.holdingTime = holdingTime;
+    }
+
+    /**
+     * Returns the circuit type.
+     *
+     * @return circuitType circuit type
+     */
+    public byte circuitType() {
+        return circuitType;
+    }
+
+    /**
+     * Sets the circuit type.
+     *
+     * @param circuitType circuit type
+     */
+    public void setCircuitType(byte circuitType) {
+        this.circuitType = circuitType;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("circuitType", circuitType)
+                .add("sourceId", sourceId)
+                .add("holdingTime", holdingTime)
+                .add("pduLength", pduLength)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        HelloPdu that = (HelloPdu) o;
+        return Objects.equal(circuitType, that.circuitType) &&
+                Objects.equal(sourceId, that.sourceId) &&
+                Objects.equal(holdingTime, that.holdingTime) &&
+                Objects.equal(pduLength, that.pduLength);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(circuitType, sourceId, holdingTime, pduLength);
+    }
+}
\ No newline at end of file
