diff --git a/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java b/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java
new file mode 100644
index 0000000..35c8271
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/IPAddressTest.java
@@ -0,0 +1,43 @@
+package org.onlab.packet;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.onlab.packet.IPAddress.Version;
+
+import com.google.common.testing.EqualsTester;
+
+public class IPAddressTest {
+
+    private static final byte [] BYTES1 = new byte [] {0x0, 0x0, 0x0, 0xa};
+    private static final byte [] BYTES2 = new byte [] {0x0, 0x0, 0x0, 0xb};
+    private static final int INTVAL1 = 10;
+    private static final int INTVAL2 = 12;
+    private static final String STRVAL = "0.0.0.11";
+
+    @Test
+    public void testEquality() {
+        IPAddress ip1 = IPAddress.valueOf(BYTES1);
+        IPAddress ip2 = IPAddress.valueOf(BYTES2);
+        IPAddress ip3 = IPAddress.valueOf(INTVAL1);
+        IPAddress ip4 = IPAddress.valueOf(INTVAL2);
+        IPAddress ip5 = IPAddress.valueOf(STRVAL);
+
+        new EqualsTester().addEqualityGroup(ip1, ip3)
+        .addEqualityGroup(ip2, ip5)
+        .addEqualityGroup(ip4)
+        .testEquals();
+    }
+
+    @Test
+    public void basics() {
+        IPAddress ip4 = IPAddress.valueOf(BYTES1);
+        assertEquals("incorrect IP Version", Version.INET, ip4.version());
+        assertEquals("faulty toOctets()", Arrays.equals(
+                new byte [] {0x0, 0x0, 0x0, 0xa}, ip4.toOctets()), true);
+        assertEquals("faulty toInt()", INTVAL1, ip4.toInt());
+        assertEquals("faulty toString()", "0.0.0.10", ip4.toString());
+    }
+}
diff --git a/utils/misc/src/test/java/org/onlab/packet/VLANIDTest.java b/utils/misc/src/test/java/org/onlab/packet/VLANIDTest.java
new file mode 100644
index 0000000..88fb9c8
--- /dev/null
+++ b/utils/misc/src/test/java/org/onlab/packet/VLANIDTest.java
@@ -0,0 +1,38 @@
+package org.onlab.packet;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+public class VLANIDTest {
+
+    @Test
+    public void testEquality() {
+
+        VLANID vlan1 = VLANID.vlanId((short) -1);
+        VLANID vlan2 = VLANID.vlanId((short) 100);
+        VLANID vlan3 = VLANID.vlanId((short) 100);
+
+        new EqualsTester().addEqualityGroup(VLANID.vlanId(), vlan1)
+        .addEqualityGroup(vlan2, vlan3)
+        .addEqualityGroup(VLANID.vlanId((short) 10));
+
+    }
+
+    @Test
+    public void basics() {
+        // purposefully create UNTAGGED VLAN
+        VLANID vlan1 = VLANID.vlanId((short) 10);
+        VLANID vlan2 = VLANID.vlanId((short) -1);
+
+        assertEquals("incorrect VLAN value", 10, vlan1.toShort());
+        assertEquals("invalid untagged value", VLANID.UNTAGGED, vlan2.toShort());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testIllicitVLAN() {
+        VLANID.vlanId((short) 5000);
+    }
+}
