diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultInboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultInboundPacket.java
index ddead1d..68e08ad 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultInboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultInboundPacket.java
@@ -26,7 +26,7 @@
 /**
  * Default implementation of an immutable inbound packet.
  */
-public class DefaultInboundPacket implements InboundPacket {
+public final class DefaultInboundPacket implements InboundPacket {
 
     private final ConnectPoint receivedFrom;
     private final Ethernet parsed;
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
index 01ecf96..624f0d8 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
@@ -16,6 +16,7 @@
 package org.onlab.onos.net.packet;
 
 import java.nio.ByteBuffer;
+import java.util.Objects;
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.flow.TrafficTreatment;
@@ -25,7 +26,7 @@
 /**
  * Default implementation of an immutable outbound packet.
  */
-public class DefaultOutboundPacket implements OutboundPacket {
+public final class DefaultOutboundPacket implements OutboundPacket {
     private final DeviceId sendThrough;
     private final TrafficTreatment treatment;
     private final ByteBuffer data;
@@ -61,6 +62,24 @@
     }
 
     @Override
+    public int hashCode() {
+        return Objects.hash(sendThrough, treatment, data);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OutboundPacket) {
+            final DefaultOutboundPacket other = (DefaultOutboundPacket) obj;
+            return Objects.equals(this.sendThrough, other.sendThrough) &&
+                    Objects.equals(this.treatment, other.treatment) &&
+                    Objects.equals(this.data, other.data);
+        }
+        return false;
+    }
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("sendThrough", sendThrough)
diff --git a/core/api/src/test/java/org/onlab/onos/net/packet/DefaultInboundPacketTest.java b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultInboundPacketTest.java
new file mode 100644
index 0000000..f4884e9
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultInboundPacketTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onlab.onos.net.packet;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Test;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onlab.onos.net.NetTestTools.connectPoint;
+
+/**
+ * Unit tests for the DefaultInboundPacket class.
+ */
+public class DefaultInboundPacketTest {
+
+    final Ethernet eth = new Ethernet()
+            .setDestinationMACAddress(MacAddress.BROADCAST)
+            .setSourceMACAddress(MacAddress.BROADCAST);
+    final ByteBuffer byteBuffer = ByteBuffer.wrap(eth.serialize());
+    final DefaultInboundPacket packet1 =
+            new DefaultInboundPacket(connectPoint("d1", 1),
+                    eth,
+                    byteBuffer);
+    final DefaultInboundPacket sameAsPacket1 =
+            new DefaultInboundPacket(connectPoint("d1", 1),
+                    eth,
+                    byteBuffer);
+    final DefaultInboundPacket packet2 =
+            new DefaultInboundPacket(connectPoint("d2", 1),
+                    eth,
+                    byteBuffer);
+    /**
+     * Checks that the DefaultInboundPacket class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultInboundPacket.class);
+    }
+
+    /**
+     * Tests the equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(packet1, sameAsPacket1)
+                .addEqualityGroup(packet2)
+                .testEquals();
+    }
+
+    /**
+     * Tests the object creation through the constructor.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(packet1.receivedFrom(), equalTo(connectPoint("d1", 1)));
+        assertThat(packet1.parsed(), equalTo(eth));
+        assertThat(packet1.unparsed(), notNullValue());
+    }
+}
diff --git a/core/api/src/test/java/org/onlab/onos/net/packet/DefaultOutboundPacketTest.java b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultOutboundPacketTest.java
new file mode 100644
index 0000000..1a34473
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultOutboundPacketTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2014 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onlab.onos.net.packet;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Test;
+import org.onlab.onos.net.flow.TrafficTreatment;
+import org.onlab.onos.net.intent.IntentTestsMocks;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.onlab.onos.net.NetTestTools.did;
+
+/**
+ * Unit tests for the DefaultOutboundPacketTest class.
+ */
+public class DefaultOutboundPacketTest {
+    final Ethernet eth = new Ethernet()
+            .setDestinationMACAddress(MacAddress.BROADCAST)
+            .setSourceMACAddress(MacAddress.BROADCAST);
+    final ByteBuffer byteBuffer = ByteBuffer.wrap(eth.serialize());
+    final TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
+    final DefaultOutboundPacket packet1 =
+            new DefaultOutboundPacket(did("d1"),
+                    treatment,
+                    byteBuffer);
+    final DefaultOutboundPacket sameAsPacket1 =
+            new DefaultOutboundPacket(did("d1"),
+                    treatment,
+                    byteBuffer);
+    final DefaultOutboundPacket packet2 =
+            new DefaultOutboundPacket(did("d2"),
+                    treatment,
+                    byteBuffer);
+    /**
+     * Checks that the DefaultOutboundPacket class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultOutboundPacket.class);
+    }
+
+    /**
+     * Tests the equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(packet1, sameAsPacket1)
+                .addEqualityGroup(packet2)
+                .testEquals();
+    }
+
+    /**
+     * Tests the object creation through the constructor.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(packet1.sendThrough(), equalTo(did("d1")));
+        assertThat(packet1.data(), equalTo(byteBuffer));
+        assertThat(packet1.treatment(), equalTo(treatment));
+    }
+}
diff --git a/core/api/src/test/java/org/onlab/onos/net/packet/DefaultPacketContextTest.java b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultPacketContextTest.java
new file mode 100644
index 0000000..238bcce
--- /dev/null
+++ b/core/api/src/test/java/org/onlab/onos/net/packet/DefaultPacketContextTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2014 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onlab.onos.net.packet;
+
+import java.nio.ByteBuffer;
+
+import org.junit.Test;
+import org.onlab.onos.net.flow.TrafficTreatment;
+import org.onlab.onos.net.intent.IntentTestsMocks;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.MacAddress;
+
+import com.google.common.testing.EqualsTester;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutableBaseClass;
+import static org.onlab.onos.net.NetTestTools.connectPoint;
+import static org.onlab.onos.net.NetTestTools.did;
+
+/**
+ * Unit tests for the DefaultPacketContextTest.
+ */
+public class DefaultPacketContextTest {
+    final Ethernet eth = new Ethernet()
+            .setDestinationMACAddress(MacAddress.BROADCAST)
+            .setSourceMACAddress(MacAddress.BROADCAST);
+    final ByteBuffer byteBuffer = ByteBuffer.wrap(eth.serialize());
+    final DefaultInboundPacket inPacket =
+            new DefaultInboundPacket(connectPoint("d1", 1),
+                    eth,
+                    byteBuffer);
+    final TrafficTreatment treatment = new IntentTestsMocks.MockTreatment();
+    final DefaultOutboundPacket outPacket =
+            new DefaultOutboundPacket(did("d1"),
+                    treatment,
+                    byteBuffer);
+
+    static class MockPacketContext extends DefaultPacketContext {
+
+        protected MockPacketContext(long time, InboundPacket inPkt,
+                                       OutboundPacket outPkt, boolean block) {
+            super(time, inPkt, outPkt, block);
+        }
+
+        @Override
+        public void send() {
+
+        }
+
+        @Override
+        public boolean block() {
+            return super.block();
+        }
+    }
+
+    final DefaultPacketContext context1 =
+            new MockPacketContext(123L, inPacket, outPacket, true);
+    final DefaultPacketContext sameAsContext1 =
+            new MockPacketContext(123L, inPacket, outPacket, true);
+    final DefaultPacketContext context2 =
+            new MockPacketContext(123123L, inPacket, outPacket, true);
+
+    /**
+     * Checks that the DefaultOutboundPacket class is immutable but can be
+     * used as a base class.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutableBaseClass(DefaultPacketContext.class);
+    }
+
+    /**
+     * Tests the equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        // No hashCode() or equals() defined, object comparison is used.
+        new EqualsTester()
+                .addEqualityGroup(context1)
+                .addEqualityGroup(sameAsContext1)
+                .addEqualityGroup(context2)
+                .testEquals();
+    }
+
+    /**
+     * Tests that objects are created properly.
+     */
+    @Test
+    public void testConstruction() {
+        assertThat(context1.block(), is(true));
+        assertThat(context1.inPacket(), is(inPacket));
+        assertThat(context1.isHandled(), is(true));
+        assertThat(context1.outPacket(), is(outPacket));
+        assertThat(context1.time(), is(123L));
+        assertThat(context1.treatmentBuilder(), is(notNullValue()));
+    }
+}
