diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java b/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java
index 7f5406e..bd91daa 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java
@@ -13,76 +13,76 @@
 @JsonDeserialize(using=DpidDeserializer.class)
 @JsonSerialize(using=DpidSerializer.class)
 public class Dpid {
-	static public long UNKNOWN = 0;
+    static public long UNKNOWN = 0;
 
-	private long value;
+    private long value;
 
-	/**
-	 * Default constructor.
-	 */
-	public Dpid() {
-		this.value = Dpid.UNKNOWN;
-	}
+    /**
+     * Default constructor.
+     */
+    public Dpid() {
+	this.value = Dpid.UNKNOWN;
+    }
 
-	/**
-	 * Constructor from a long value.
-	 *
-	 * @param value the value to use.
-	 */
-	public Dpid(long value) {
-		this.value = value;
-	}
+    /**
+     * Constructor from a long value.
+     *
+     * @param value the value to use.
+     */
+    public Dpid(long value) {
+	this.value = value;
+    }
 
-	/**
-	 * Constructor from a string.
-	 *
-	 * @param value the value to use.
-	 */
-	public Dpid(String value) {
-		this.value = HexString.toLong(value);
-	}
+    /**
+     * Constructor from a string.
+     *
+     * @param value the value to use.
+     */
+    public Dpid(String value) {
+	this.value = HexString.toLong(value);
+    }
 
-	/**
-	 * Get the value of the DPID.
-	 *
-	 * @return the value of the DPID.
-	 */
-	public long value() { return value; }
+    /**
+     * Get the value of the DPID.
+     *
+     * @return the value of the DPID.
+     */
+    public long value() { return value; }
 
-	/**
-	 * Set the value of the DPID.
-	 *
-	 * @param value the value to set.
-	 */
-	public void setValue(long value) {
-		this.value = value;
-	}
+    /**
+     * Set the value of the DPID.
+     *
+     * @param value the value to set.
+     */
+    public void setValue(long value) {
+	this.value = value;
+    }
 
-	/**
-	 * Convert the DPID value to a ':' separated hexadecimal string.
-	 *
-	 * @return the DPID value as a ':' separated hexadecimal string.
-	 */
-	@Override
-	public String toString() {
-		return HexString.toHexString(this.value);
-	}
+    /**
+     * Convert the DPID value to a ':' separated hexadecimal string.
+     *
+     * @return the DPID value as a ':' separated hexadecimal string.
+     */
+    @Override
+    public String toString() {
+	return HexString.toHexString(this.value);
+    }
 
-	@Override
-	public boolean equals(Object other) {
-		if (!(other instanceof Dpid)) {
-			return false;
-		}
+    @Override
+    public boolean equals(Object other) {
+    	if (!(other instanceof Dpid)) {
+    		return false;
+    	}
 
-		Dpid otherDpid = (Dpid) other;
+    	Dpid otherDpid = (Dpid) other;
 
-		return value == otherDpid.value;
-	}
+    	return value == otherDpid.value;
+    }
 
-	@Override
-	public int hashCode() {
-		int hash = 17;
-		hash += 31 * hash + (int)(value ^ value >>> 32); 
-		return hash;
-	}
+    @Override
+    public int hashCode() {
+    	int hash = 17;
+    	hash += 31 * hash + (int)(value ^ value >>> 32); 
+    	return hash;
+    }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/Port.java b/src/main/java/net/onrc/onos/ofcontroller/util/Port.java
index 4979e0d..fedc8df 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Port.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/Port.java
@@ -7,148 +7,147 @@
  */
 
 public class Port {
-	/**
-	 * Special port values.
-	 *
-	 * Those values are taken as-is from the OpenFlow-v1.0.0 specification
-	 * (pp 18-19).
-	 */
-	// This is a duplicate of the OFPort enum in OpenflowJ.
-	// TODO Can we remove this?
-	public enum PortValues {
-		/* Maximum number of physical switch ports. */
-		PORT_MAX		((short)0xff00),
+    /**
+     * Special port values.
+     *
+     * Those values are taken as-is from the OpenFlow-v1.0.0 specification
+     * (pp 18-19).
+     */
+    public enum PortValues {
+	/* Maximum number of physical switch ports. */
+	PORT_MAX		((short)0xff00),
 
-		/* Fake output "ports". */
+	/* Fake output "ports". */
 
-		/* Send the packet out the input port. This
+	/* Send the packet out the input port. This
 	   virtual port must be explicitly used
 	   in order to send back out of the input
 	   port. */
-		PORT_IN_PORT		((short)0xfff8),
+	PORT_IN_PORT		((short)0xfff8),
 
-		/* Perform actions in flow table.
+	/* Perform actions in flow table.
 	   NB: This can only be the destination
 	   port for packet-out messages. */
-		PORT_TABLE		((short)0xfff9),
+	PORT_TABLE		((short)0xfff9),
 
-		/* Process with normal L2/L3 switching. */
-		PORT_NORMAL		((short)0xfffa),
+	/* Process with normal L2/L3 switching. */
+	PORT_NORMAL		((short)0xfffa),
 
-		/* All physical ports except input port and
+	/* All physical ports except input port and
 	   those disabled by STP. */
-		PORT_FLOOD		((short)0xfffb),
+	PORT_FLOOD		((short)0xfffb),
 
-		/* All physical ports except input port. */
-		PORT_ALL		((short)0xfffc),
+	/* All physical ports except input port. */
+	PORT_ALL		((short)0xfffc),
 
-		/* Send to controller. */
-		PORT_CONTROLLER		((short)0xfffd),
+	/* Send to controller. */
+	PORT_CONTROLLER		((short)0xfffd),
 
-		/* Local openflow "port". */
-		PORT_LOCAL		((short)0xfffe),
+	/* Local openflow "port". */
+	PORT_LOCAL		((short)0xfffe),
 
-		/* Not associated with a physical port. */
-		PORT_NONE		((short)0xffff);
+	/* Not associated with a physical port. */
+	PORT_NONE		((short)0xffff);
 
-		private final short value;	// The value
-
-		/**
-		 * Constructor for a given value.
-		 *
-		 * @param value the value to use for the initialization.
-		 */
-		private PortValues(short value) {
-			this.value = value;
-		}
-
-		/**
-		 * Get the value as a short integer.
-		 *
-		 * @return the value as a short integer.
-		 */
-		private short value() { return this.value; }
-	}
-
-	private short value;
+	private final short value;	// The value
 
 	/**
-	 * Default constructor.
-	 */
-	public Port() {
-		this.value = 0;
-	}
-
-	/**
-	 * Copy constructor.
+	 * Constructor for a given value.
 	 *
-	 * @param other the object to copy from.
+	 * @param value the value to use for the initialization.
 	 */
-	public Port(Port other) {
-		this.value = other.value();
+	private PortValues(short value) {
+	    this.value = value;
 	}
 
 	/**
-	 * Constructor from a short integer value.
+	 * Get the value as a short integer.
 	 *
-	 * @param value the value to use.
+	 * @return the value as a short integer.
 	 */
-	public Port(short value) {
-		this.value = value;
-	}
+	private short value() { return this.value; }
+    }
 
-	/**
-	 * Constructor from a PortValues enum value.
-	 *
-	 * @param value the value to use.
-	 */
-	public Port(PortValues value) {
-		this.value = value.value();
-	}
+    private short value;
 
-	/**
-	 * Get the value of the port.
-	 *
-	 * @return the value of the port.
-	 */
-	@JsonProperty("value")
-	public short value() { return value; }
+    /**
+     * Default constructor.
+     */
+    public Port() {
+	this.value = 0;
+    }
 
-	/**
-	 * Set the value of the port.
-	 *
-	 * @param value the value to set.
-	 */
-	@JsonProperty("value")
-	public void setValue(short value) {
-		this.value = value;
-	}
+    /**
+     * Copy constructor.
+     *
+     * @param other the object to copy from.
+     */
+    public Port(Port other) {
+	this.value = other.value();
+    }
 
-	/**
-	 * Convert the port value to a string.
-	 *
-	 * @return the port value as a string.
-	 */
-	@Override
-	public String toString() {
-		return Short.toString(this.value);
-	}
+    /**
+     * Constructor from a short integer value.
+     *
+     * @param value the value to use.
+     */
+    public Port(short value) {
+	this.value = value;
+    }
 
-	@Override
-	public boolean equals(Object other) {
-		if (!(other instanceof Port)) {
-			return false;
-		}
+    /**
+     * Constructor from a PortValues enum value.
+     *
+     * @param value the value to use.
+     */
+    public Port(PortValues value) {
+	this.value = value.value();
+    }
 
-		Port otherPort = (Port) other;
+    /**
+     * Get the value of the port.
+     *
+     * @return the value of the port.
+     */
+    @JsonProperty("value")
+    public short value() { return value; }
 
-		return value == otherPort.value;
-	}
+    /**
+     * Set the value of the port.
+     *
+     * @param value the value to set.
+     */
+    @JsonProperty("value")
+    public void setValue(short value) {
+	this.value = value;
+    }
 
-	@Override
-	public int hashCode() {
-		int hash = 17;
-		hash += 31 * hash + (int)value; 
-		return hash;
-	}
+    /**
+     * Convert the port value to a string.
+     *
+     * @return the port value as a string.
+     */
+    @Override
+    public String toString() {
+	return Short.toString(this.value);
+    }
+    
+
+    @Override
+    public boolean equals(Object other) {
+    	if (!(other instanceof Port)) {
+    		return false;
+    	}
+
+    	Port otherPort = (Port) other;
+
+    	return value == otherPort.value;
+    }
+
+    @Override
+    public int hashCode() {
+    	int hash = 17;
+    	hash += 31 * hash + (int)value; 
+    	return hash;
+    }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java b/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java
index 898b9b0..8912803 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java
@@ -6,103 +6,104 @@
  * The class representing a Switch-Port.
  */
 public class SwitchPort {
-	private Dpid dpid;		// The DPID of the switch
-	private Port port;		// The port of the switch
+    private Dpid dpid;		// The DPID of the switch
+    private Port port;		// The port of the switch
 
-	/**
-	 * Default constructor.
-	 */
-	public SwitchPort() {
-	}
+    /**
+     * Default constructor.
+     */
+    public SwitchPort() {
+    }
 
-	/**
-	 * Constructor for a given DPID and a port.
-	 *
-	 * @param dpid the DPID to use.
-	 * @param port the port to use.
-	 */
-	public SwitchPort(Dpid dpid, Port port) {
-		this.dpid = dpid;
-		this.port = port;
-	}
+    /**
+     * Constructor for a given DPID and a port.
+     *
+     * @param dpid the DPID to use.
+     * @param port the port to use.
+     */
+    public SwitchPort(Dpid dpid, Port port) {
+	this.dpid = dpid;
+	this.port = port;
+    }
 
-	/**
-	 * Get the DPID value of the Switch-Port.
-	 *
-	 * @return the DPID value of the Switch-Port.
-	 */
-	@JsonProperty("dpid")
-	public Dpid dpid() { return dpid; }
+    /**
+     * Get the DPID value of the Switch-Port.
+     *
+     * @return the DPID value of the Switch-Port.
+     */
+    @JsonProperty("dpid")
+    public Dpid dpid() { return dpid; }
 
-	/**
-	 * Set the DPID value of the Switch-Port.
-	 *
-	 * @param dpid the DPID to use.
-	 */
-	@JsonProperty("dpid")
-	public void setDpid(Dpid dpid) {
-		this.dpid = dpid;
-	}
+    /**
+     * Set the DPID value of the Switch-Port.
+     *
+     * @param dpid the DPID to use.
+     */
+    @JsonProperty("dpid")
+    public void setDpid(Dpid dpid) {
+	this.dpid = dpid;
+    }
 
-	/**
-	 * Get the port value of the Switch-Port.
-	 *
-	 * @return the port value of the Switch-Port.
-	 */
-	@JsonProperty("port")
-	public Port port() { return port; }
+    /**
+     * Get the port value of the Switch-Port.
+     *
+     * @return the port value of the Switch-Port.
+     */
+    @JsonProperty("port")
+    public Port port() { return port; }
 
-	/**
-	 * Set the port value of the Switch-Port.
-	 *
-	 * @param port the port to use.
-	 */
-	@JsonProperty("port")
-	public void setPort(Port port) {
-		this.port = port;
-	}
+    /**
+     * Set the port value of the Switch-Port.
+     *
+     * @param port the port to use.
+     */
+    @JsonProperty("port")
+    public void setPort(Port port) {
+	this.port = port;
+    }
 
-	/**
-	 * Set the DPID and port values of the Switch-Port.
-	 *
-	 * @param dpid the DPID to use.
-	 * @param port the port to use.
-	 */
-	public void setValue(Dpid dpid, Port port) {
-		this.dpid = dpid;
-		this.port = port;
-	}
+    /**
+     * Set the DPID and port values of the Switch-Port.
+     *
+     * @param dpid the DPID to use.
+     * @param port the port to use.
+     */
+    public void setValue(Dpid dpid, Port port) {
+	this.dpid = dpid;
+	this.port = port;
+    }
 
-	/**
-	 * Convert the Switch-Port value to a string.
-	 *
-	 * The string has the following form:
-	 *  01:02:03:04:05:06:07:08/1234
-	 *
-	 * @return the Switch-Port value as a string.
-	 */
-	@Override
-	public String toString() {
-		return this.dpid.toString() + "/" + this.port;
-	}
+    /**
+     * Convert the Switch-Port value to a string.
+     *
+     * The string has the following form:
+     *  01:02:03:04:05:06:07:08/1234
+     *
+     * @return the Switch-Port value as a string.
+     */
+    @Override
+    public String toString() {
+	return this.dpid.toString() + "/" + this.port;
+    }
+    
 
-	@Override
-	public boolean equals(Object other) {
-		if (!(other instanceof SwitchPort)) {
-			return false;
-		}
+    @Override
+    public boolean equals(Object other) {
+    	if (!(other instanceof SwitchPort)) {
+    		return false;
+    	}
 
-		SwitchPort otherSwitchPort = (SwitchPort) other;
+    	SwitchPort otherSwitchPort = (SwitchPort) other;
 
-		return (dpid.equals(otherSwitchPort.dpid) &&
-				port.equals(otherSwitchPort.port));
-	}
+    	return (dpid.equals(otherSwitchPort.dpid) &&
+    			port.equals(otherSwitchPort.port));
+    }
 
-	@Override
-	public int hashCode() {
-		int hash = 17;
-		hash += 31 * hash + dpid.hashCode();
-		hash += 31 * hash + port.hashCode();
-		return hash;
-	}
+    @Override
+    public int hashCode() {
+    	int hash = 17;
+    	hash += 31 * hash + dpid.hashCode();
+    	hash += 31 * hash + port.hashCode();
+    	return hash;
+    }
 }
