diff --git a/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerType.java b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerType.java
new file mode 100644
index 0000000..c327cc1
--- /dev/null
+++ b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerType.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2024-present Open Networking Foundation
+ *
+ * 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.bgpmonitoring;
+
+import org.onlab.packet.DeserializationException;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Enum to Provide the Different types of BMP peer type.
+ *
+ * Peer Type = 0: Global Instance Peer
+ * Peer Type = 1: RD Instance Peer
+ * Peer Type = 2: Local Instance Peer
+ */
+public enum PeerType {
+
+    GLOBAL_INSTANCE_PEER(0),
+
+    RD_INSTANCE_PEER(1),
+
+    LOCAL_INSTANCE_PEER(2);
+
+    private final int value;
+
+    /**
+     * Assign value with the value val as the types of BMP per peer type.
+     *
+     * @param val type of BMP per peer type
+     */
+    PeerType(int val) {
+        value = val;
+    }
+
+    /**
+     * Returns value as type of BMP per peer type.
+     *
+     * @return value type of BMP per peer type
+     */
+    public int getType() {
+        return value;
+    }
+
+
+    private static Map<Integer, PeerType> parser = new ConcurrentHashMap<>();
+
+    static {
+        Arrays.stream(PeerType.values()).forEach(v -> parser.put(v.value, v));
+    }
+
+    public static PeerType getType(int type) throws DeserializationException {
+        if (type > 2) {
+            throw new DeserializationException("Invalid bmp per peer type");
+        }
+        return Optional.of(type)
+                .filter(id -> parser.containsKey(id))
+                .map(id -> parser.get(id))
+                .orElse(GLOBAL_INSTANCE_PEER);
+    }
+}
diff --git a/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerUpNotificationMessage.java b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerUpNotificationMessage.java
new file mode 100644
index 0000000..d591da9
--- /dev/null
+++ b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PeerUpNotificationMessage.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2024-present Open Networking Foundation
+ *
+ * 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.bgpmonitoring;
+
+import org.onosproject.bgpio.protocol.BgpMessage;
+import java.net.InetAddress;
+
+/**
+ * Abstraction of an BMP peer up notification message.
+ */
+public abstract class PeerUpNotificationMessage extends BmpMessage {
+
+    public static final int PEERUP_NOTIFICATION_HEADER_MIN_LENGTH = 40;
+
+    public static final int PADDING_BYTES = 16;
+
+    public static final int IPV4_ADDRS = 4;
+
+    public static final int IPV6_ADDRS = 16;
+
+    public static final int BGP_LENGTH_FIELD = 16;
+
+    /**
+     * Returns BMP per peer header of BMP message.
+     *
+     * @return BMP per peer header of BMP message
+     */
+    public abstract PerPeer getPerPeer();
+
+    /**
+     * Returns local ip address.
+     *
+     * @return local ip address
+     */
+    public abstract InetAddress getLocalAddress();
+
+    /**
+     * Returns local port number.
+     *
+     * @return local port number
+     */
+    public abstract int getLocalPort();
+
+    /**
+     * Returns remote port number.
+     *
+     * @return remote port number
+     */
+    public abstract int getRemotePort();
+
+    /**
+     * Returns Bgp sent open message.
+     *
+     * @return Bgp sent open message
+     */
+    public abstract BgpMessage getSentOpenMsg();
+
+    /**
+     * Returns Bgp received open message.
+     *
+     * @return Bgp received open message
+     */
+    public abstract BgpMessage getReceivedOpenMsg();
+
+    /**
+     * Returns BMP peer information.
+     *
+     * @return BMP peer information
+     */
+    public abstract byte[] getInformation();
+
+}
\ No newline at end of file
diff --git a/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PerPeer.java b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PerPeer.java
new file mode 100644
index 0000000..e725ad2
--- /dev/null
+++ b/apps/bgpmonitoring/api/src/main/java/org/onosproject/bgpmonitoring/PerPeer.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2024-present Open Networking Foundation
+ *
+ * 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.bgpmonitoring;
+
+import java.net.InetAddress;
+
+/**
+ * Abstraction of an BMP Per Peer header.
+ */
+public interface PerPeer {
+
+    /**
+     * Returns BMP per peer header of BMP message.
+     *
+     * @return BMP per peer header of BMP message
+     */
+    PeerType getType();
+
+    /**
+     * Returns BMP per peer flag.
+     *
+     * @return BMP BMP per peer flag
+     */
+    byte getFlag();
+
+    /**
+     * Returns BMP per peer distinguisher.
+     *
+     * @return BMP per peer distinguisher
+     */
+    byte[] getPeerDistinguisher();
+
+    /**
+     * Returns BMP per peer inet address.
+     *
+     * @return BMP per peer inet address
+     */
+    InetAddress getIntAddress();
+
+    /**
+     * Returns BMP per peer bgp AS.
+     *
+     * @return BMP per peer bgp AS
+     */
+    int getPeerAs();
+
+    /**
+     * Returns BMP per peer bgp ID.
+     *
+     * @return BMP per peer bgp ID
+     */
+    String getPeerBgpId();
+
+    /**
+     * Returns BMP per peer message sent time in seconds.
+     *
+     * @return BMP per peer message sent time in seconds
+     */
+    int getSeconds();
+
+    /**
+     * Returns BMP per peer message sent time in micro seconds.
+     *
+     * @return BMP per peer message sent time in micro seconds
+     */
+    int getMicroseconds();
+
+    /**
+     * Returns BMP per peer header has ipv6 address or not.
+     *
+     * @return BMP per peer header has ipv6 address or not
+     */
+    boolean isIpv6();
+}
\ No newline at end of file
