diff --git a/core/api/src/main/java/org/onosproject/net/packet/DefaultInboundPacket.java b/core/api/src/main/java/org/onosproject/net/packet/DefaultInboundPacket.java
index 96f872f..3f5f138 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/DefaultInboundPacket.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/DefaultInboundPacket.java
@@ -20,6 +20,7 @@
 
 import java.nio.ByteBuffer;
 import java.util.Objects;
+import java.util.Optional;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
 
@@ -31,6 +32,7 @@
     private final ConnectPoint receivedFrom;
     private final Ethernet parsed;
     private final ByteBuffer unparsed;
+    private final Optional<Long> cookie;
 
     /**
      * Creates an immutable inbound packet.
@@ -39,11 +41,25 @@
      * @param parsed       parsed ethernet frame
      * @param unparsed     unparsed raw bytes
      */
-    public  DefaultInboundPacket(ConnectPoint receivedFrom, Ethernet parsed,
+    public DefaultInboundPacket(ConnectPoint receivedFrom, Ethernet parsed,
                                 ByteBuffer unparsed) {
+        this(receivedFrom, parsed, unparsed, Optional.empty());
+    }
+
+    /**
+     * Creates an immutable inbound packet with cookie.
+     *
+     * @param receivedFrom connection point where received
+     * @param parsed       parsed ethernet frame
+     * @param unparsed     unparsed raw bytes
+     * @param cookie       cookie
+     */
+    public DefaultInboundPacket(ConnectPoint receivedFrom, Ethernet parsed,
+            ByteBuffer unparsed, Optional<Long> cookie) {
         this.receivedFrom = receivedFrom;
         this.parsed = parsed;
         this.unparsed = unparsed;
+        this.cookie = cookie;
     }
 
     @Override
@@ -63,6 +79,11 @@
     }
 
     @Override
+    public Optional<Long> cookie() {
+        return cookie;
+    }
+
+    @Override
     public int hashCode() {
         return Objects.hash(receivedFrom, parsed, unparsed);
     }
diff --git a/core/api/src/main/java/org/onosproject/net/packet/InboundPacket.java b/core/api/src/main/java/org/onosproject/net/packet/InboundPacket.java
index 3fd5814..48fdb20 100644
--- a/core/api/src/main/java/org/onosproject/net/packet/InboundPacket.java
+++ b/core/api/src/main/java/org/onosproject/net/packet/InboundPacket.java
@@ -19,6 +19,7 @@
 import org.onlab.packet.Ethernet;
 
 import java.nio.ByteBuffer;
+import java.util.Optional;
 
 /**
  * Represents a data packet intercepted from an infrastructure device.
@@ -47,4 +48,10 @@
      */
     ByteBuffer unparsed();
 
+    /**
+     * Returns the cookie in the packet in message.
+     *
+     * @return optional flow cookie
+     */
+    Optional<Long> cookie();
 }
diff --git a/core/api/src/test/java/org/onosproject/net/packet/DefaultInboundPacketTest.java b/core/api/src/test/java/org/onosproject/net/packet/DefaultInboundPacketTest.java
index eda6824..b051ad4 100644
--- a/core/api/src/test/java/org/onosproject/net/packet/DefaultInboundPacketTest.java
+++ b/core/api/src/test/java/org/onosproject/net/packet/DefaultInboundPacketTest.java
@@ -16,6 +16,7 @@
 package org.onosproject.net.packet;
 
 import java.nio.ByteBuffer;
+import java.util.Optional;
 
 import org.junit.Test;
 import org.onlab.packet.Ethernet;
@@ -41,15 +42,22 @@
     final DefaultInboundPacket packet1 =
             new DefaultInboundPacket(connectPoint("d1", 1),
                     eth,
-                    byteBuffer);
+                    byteBuffer,
+                    Optional.of(1L));
     final DefaultInboundPacket sameAsPacket1 =
             new DefaultInboundPacket(connectPoint("d1", 1),
                     eth,
-                    byteBuffer);
+                    byteBuffer,
+                    Optional.of(1L));
     final DefaultInboundPacket packet2 =
             new DefaultInboundPacket(connectPoint("d2", 1),
                     eth,
                     byteBuffer);
+    final DefaultInboundPacket sameAsPacket2 =
+            new DefaultInboundPacket(connectPoint("d2", 1),
+                    eth,
+                    byteBuffer,
+                    Optional.empty());
     /**
      * Checks that the DefaultInboundPacket class is immutable.
      */
@@ -65,7 +73,7 @@
     public void testEquals() {
         new EqualsTester()
                 .addEqualityGroup(packet1, sameAsPacket1)
-                .addEqualityGroup(packet2)
+                .addEqualityGroup(packet2, sameAsPacket2)
                 .testEquals();
     }
 
@@ -77,5 +85,6 @@
         assertThat(packet1.receivedFrom(), equalTo(connectPoint("d1", 1)));
         assertThat(packet1.parsed(), equalTo(eth));
         assertThat(packet1.unparsed(), notNullValue());
+        assertThat(packet1.cookie(), equalTo(Optional.of(1L)));
     }
 }
