diff --git a/utils/misc/src/main/java/org/onlab/packet/Ethernet.java b/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
index ee6d0c2..7587a54 100644
--- a/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
+++ b/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
@@ -60,8 +60,8 @@
         Ethernet.etherTypeClassMap.put(Ethernet.TYPE_LLDP, LLDP.class);
     }
 
-    protected MACAddress destinationMACAddress;
-    protected MACAddress sourceMACAddress;
+    protected MacAddress destinationMACAddress;
+    protected MacAddress sourceMACAddress;
     protected byte priorityCode;
     protected short vlanID;
     protected short etherType;
@@ -89,7 +89,7 @@
      *
      * @return the destination MAC
      */
-    public MACAddress getDestinationMAC() {
+    public MacAddress getDestinationMAC() {
         return this.destinationMACAddress;
     }
 
@@ -100,7 +100,7 @@
      * @return the Ethernet frame
      */
     public Ethernet setDestinationMACAddress(final byte[] destMac) {
-        this.destinationMACAddress = MACAddress.valueOf(destMac);
+        this.destinationMACAddress = MacAddress.valueOf(destMac);
         return this;
     }
 
@@ -111,7 +111,7 @@
      * @return the Ethernet frame
      */
     public Ethernet setDestinationMACAddress(final String destMac) {
-        this.destinationMACAddress = MACAddress.valueOf(destMac);
+        this.destinationMACAddress = MacAddress.valueOf(destMac);
         return this;
     }
 
@@ -129,7 +129,7 @@
      *
      * @return the source MACAddress
      */
-    public MACAddress getSourceMAC() {
+    public MacAddress getSourceMAC() {
         return this.sourceMACAddress;
     }
 
@@ -140,7 +140,7 @@
      * @return the Ethernet frame
      */
     public Ethernet setSourceMACAddress(final byte[] sourceMac) {
-        this.sourceMACAddress = MACAddress.valueOf(sourceMac);
+        this.sourceMACAddress = MacAddress.valueOf(sourceMac);
         return this;
     }
 
@@ -151,7 +151,7 @@
      * @return the Ethernet frame
      */
     public Ethernet setSourceMACAddress(final String sourceMac) {
-        this.sourceMACAddress = MACAddress.valueOf(sourceMac);
+        this.sourceMACAddress = MacAddress.valueOf(sourceMac);
         return this;
     }
 
@@ -288,18 +288,18 @@
         }
         final ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         if (this.destinationMACAddress == null) {
-            this.destinationMACAddress = MACAddress.valueOf(new byte[6]);
+            this.destinationMACAddress = MacAddress.valueOf(new byte[6]);
         }
-        final byte[] dstAddr = new byte[MACAddress.MAC_ADDRESS_LENGTH];
+        final byte[] dstAddr = new byte[MacAddress.MAC_ADDRESS_LENGTH];
         bb.get(dstAddr);
-        this.destinationMACAddress = MACAddress.valueOf(dstAddr);
+        this.destinationMACAddress = MacAddress.valueOf(dstAddr);
 
         if (this.sourceMACAddress == null) {
-            this.sourceMACAddress = MACAddress.valueOf(new byte[6]);
+            this.sourceMACAddress = MacAddress.valueOf(new byte[6]);
         }
-        final byte[] srcAddr = new byte[MACAddress.MAC_ADDRESS_LENGTH];
+        final byte[] srcAddr = new byte[MacAddress.MAC_ADDRESS_LENGTH];
         bb.get(srcAddr);
-        this.sourceMACAddress = MACAddress.valueOf(srcAddr);
+        this.sourceMACAddress = MacAddress.valueOf(srcAddr);
 
         short ethType = bb.getShort();
         if (ethType == (short) 0x8100) {
@@ -361,7 +361,7 @@
      * @return The macAddress as a byte array
      */
     public static byte[] toMACAddress(final String macAddress) {
-        return MACAddress.valueOf(macAddress).toBytes();
+        return MacAddress.valueOf(macAddress).toBytes();
     }
 
     /**
@@ -372,7 +372,7 @@
      * @return a long containing the mac address bytes
      */
     public static long toLong(final byte[] macAddress) {
-        return MACAddress.valueOf(macAddress).toLong();
+        return MacAddress.valueOf(macAddress).toLong();
     }
 
     /**
@@ -382,7 +382,7 @@
      * @return the bytes of the mac address
      */
     public static byte[] toByteArray(final long macAddress) {
-        return MACAddress.valueOf(macAddress).toBytes();
+        return MacAddress.valueOf(macAddress).toBytes();
     }
 
     /*
diff --git a/utils/misc/src/main/java/org/onlab/packet/IPAddress.java b/utils/misc/src/main/java/org/onlab/packet/IpAddress.java
similarity index 86%
rename from utils/misc/src/main/java/org/onlab/packet/IPAddress.java
rename to utils/misc/src/main/java/org/onlab/packet/IpAddress.java
index 1131ca4..c664a3a 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IPAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IpAddress.java
@@ -5,7 +5,7 @@
 /**
  * A class representing an IPv4 address.
  */
-public class IPAddress {
+public class IpAddress {
 
     //IP Versions
     public enum Version { INET, INET6 };
@@ -18,7 +18,7 @@
     //does it make more sense to have a integral address?
     protected byte[] octets;
 
-    protected IPAddress(Version ver, byte[] octets) {
+    protected IpAddress(Version ver, byte[] octets) {
         this.version = ver;
         this.octets = Arrays.copyOf(octets, INET_LEN);
     }
@@ -29,8 +29,8 @@
      * @param address a byte array
      * @return an IP address
      */
-    public static IPAddress valueOf(byte [] address) {
-        return new IPAddress(Version.INET, address);
+    public static IpAddress valueOf(byte [] address) {
+        return new IpAddress(Version.INET, address);
     }
 
     /**
@@ -39,13 +39,13 @@
      * @param address an integer representing an IP value
      * @return an IP address
      */
-    public static IPAddress valueOf(int address) {
+    public static IpAddress valueOf(int address) {
         byte [] bytes = new byte [INET_LEN];
         for (int i = 0; i < INET_LEN; i++) {
             bytes[i] = (byte) ((address >> (INET_LEN - (i + 1)) * 8) & 0xff);
         }
 
-        return new IPAddress(Version.INET, bytes);
+        return new IpAddress(Version.INET, bytes);
     }
 
     /**
@@ -55,7 +55,7 @@
      * @param address a string representing an IP address, e.g. "10.0.0.1"
      * @return an IP address
      */
-    public static IPAddress valueOf(String address) {
+    public static IpAddress valueOf(String address) {
         final String [] parts = address.split("\\.");
         if (parts.length != INET_LEN) {
             throw new IllegalArgumentException("Malformed IP address string; "
@@ -65,7 +65,7 @@
         for (int i = 0; i < INET_LEN; i++) {
             bytes[i] = Byte.parseByte(parts[i], 10);
         }
-        return new IPAddress(Version.INET, bytes);
+        return new IpAddress(Version.INET, bytes);
     }
 
     /**
@@ -119,8 +119,8 @@
     @Override
     public boolean equals(Object obj) {
 
-        if (obj instanceof IPAddress) {
-            IPAddress other = (IPAddress) obj;
+        if (obj instanceof IpAddress) {
+            IpAddress other = (IpAddress) obj;
 
             if (this.version.equals(other.version)
                     && (Arrays.equals(this.octets, other.octets))) {
diff --git a/utils/misc/src/main/java/org/onlab/packet/MACAddress.java b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
similarity index 86%
rename from utils/misc/src/main/java/org/onlab/packet/MACAddress.java
rename to utils/misc/src/main/java/org/onlab/packet/MacAddress.java
index c913e1d..33764bb 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MACAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
@@ -21,12 +21,12 @@
  * The class representing MAC address.
  *
  */
-public class MACAddress {
+public class MacAddress {
     public static final int MAC_ADDRESS_LENGTH = 6;
-    private byte[] address = new byte[MACAddress.MAC_ADDRESS_LENGTH];
+    private byte[] address = new byte[MacAddress.MAC_ADDRESS_LENGTH];
 
-    public MACAddress(final byte[] address) {
-        this.address = Arrays.copyOf(address, MACAddress.MAC_ADDRESS_LENGTH);
+    public MacAddress(final byte[] address) {
+        this.address = Arrays.copyOf(address, MacAddress.MAC_ADDRESS_LENGTH);
     }
 
     /**
@@ -40,21 +40,21 @@
      * @throws IllegalArgumentException
      *             if the string cannot be parsed as a MAC address.
      */
-    public static MACAddress valueOf(final String address) {
+    public static MacAddress valueOf(final String address) {
         final String[] elements = address.split(":");
-        if (elements.length != MACAddress.MAC_ADDRESS_LENGTH) {
+        if (elements.length != MacAddress.MAC_ADDRESS_LENGTH) {
             throw new IllegalArgumentException(
                     "Specified MAC Address must contain 12 hex digits"
                             + " separated pairwise by :'s.");
         }
 
-        final byte[] addressInBytes = new byte[MACAddress.MAC_ADDRESS_LENGTH];
-        for (int i = 0; i < MACAddress.MAC_ADDRESS_LENGTH; i++) {
+        final byte[] addressInBytes = new byte[MacAddress.MAC_ADDRESS_LENGTH];
+        for (int i = 0; i < MacAddress.MAC_ADDRESS_LENGTH; i++) {
             final String element = elements[i];
             addressInBytes[i] = (byte) Integer.parseInt(element, 16);
         }
 
-        return new MACAddress(addressInBytes);
+        return new MacAddress(addressInBytes);
     }
 
     /**
@@ -68,13 +68,13 @@
      * @throws IllegalArgumentException
      *             if the byte array cannot be parsed as a MAC address.
      */
-    public static MACAddress valueOf(final byte[] address) {
-        if (address.length != MACAddress.MAC_ADDRESS_LENGTH) {
+    public static MacAddress valueOf(final byte[] address) {
+        if (address.length != MacAddress.MAC_ADDRESS_LENGTH) {
             throw new IllegalArgumentException("the length is not "
-                    + MACAddress.MAC_ADDRESS_LENGTH);
+                    + MacAddress.MAC_ADDRESS_LENGTH);
         }
 
-        return new MACAddress(address);
+        return new MacAddress(address);
     }
 
     /**
@@ -90,13 +90,13 @@
      * @throws IllegalArgumentException
      *             if the long value cannot be parsed as a MAC address.
      */
-    public static MACAddress valueOf(final long address) {
+    public static MacAddress valueOf(final long address) {
         final byte[] addressInBytes = new byte[] {
                 (byte) (address >> 40 & 0xff), (byte) (address >> 32 & 0xff),
                 (byte) (address >> 24 & 0xff), (byte) (address >> 16 & 0xff),
                 (byte) (address >> 8 & 0xff), (byte) (address >> 0 & 0xff) };
 
-        return new MACAddress(addressInBytes);
+        return new MacAddress(addressInBytes);
     }
 
     /**
@@ -165,11 +165,11 @@
             return true;
         }
 
-        if (!(o instanceof MACAddress)) {
+        if (!(o instanceof MacAddress)) {
             return false;
         }
 
-        final MACAddress other = (MACAddress) o;
+        final MacAddress other = (MacAddress) o;
         return Arrays.equals(this.address, other.address);
     }
 
diff --git a/utils/misc/src/main/java/org/onlab/packet/VLANID.java b/utils/misc/src/main/java/org/onlab/packet/VlanId.java
similarity index 77%
rename from utils/misc/src/main/java/org/onlab/packet/VLANID.java
rename to utils/misc/src/main/java/org/onlab/packet/VlanId.java
index fa59a82..60daec7 100644
--- a/utils/misc/src/main/java/org/onlab/packet/VLANID.java
+++ b/utils/misc/src/main/java/org/onlab/packet/VlanId.java
@@ -4,7 +4,7 @@
  * Representation of a VLAN ID.
  */
 // FIXME: This will end-up looking like a constant; we should name it 'VlanId', 'IpAddress', 'MacAddress'.
-public class VLANID {
+public class VlanId {
 
     private final short value;
     // Based on convention used elsewhere? Check and change if needed
@@ -12,28 +12,28 @@
     // A VLAN ID is actually 12 bits of a VLAN tag.
     public static final short MAX_VLAN = 4095;
 
-    protected VLANID() {
+    protected VlanId() {
         this.value = UNTAGGED;
     }
 
-    protected VLANID(short value) {
+    protected VlanId(short value) {
         this.value = value;
     }
 
-    public static VLANID vlanId() {
-        return new VLANID(UNTAGGED);
+    public static VlanId vlanId() {
+        return new VlanId(UNTAGGED);
     }
 
-    public static VLANID vlanId(short value) {
+    public static VlanId vlanId(short value) {
         if (value == UNTAGGED) {
-            return new VLANID();
+            return new VlanId();
         }
 
         if (value > MAX_VLAN) {
             throw new IllegalArgumentException(
                     "value exceeds allowed maximum VLAN ID value (4095)");
         }
-        return new VLANID(value);
+        return new VlanId(value);
     }
 
     public short toShort() {
@@ -46,9 +46,9 @@
             return true;
         }
 
-        if (obj instanceof VLANID) {
+        if (obj instanceof VlanId) {
 
-            VLANID other = (VLANID) obj;
+            VlanId other = (VlanId) obj;
 
              if (this.value == other.value) {
                 return true;
