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;
+    }
 }
