diff --git a/src/main/java/net/onrc/onos/core/intent/Match.java b/src/main/java/net/onrc/onos/core/intent/Match.java
index 5f92254..f7a2167 100644
--- a/src/main/java/net/onrc/onos/core/intent/Match.java
+++ b/src/main/java/net/onrc/onos/core/intent/Match.java
@@ -8,59 +8,56 @@
 import net.onrc.onos.core.util.FlowEntryMatch;
 
 /**
- *
  * @author Brian O'Connor <bocon@onlab.us>
- *
  */
 
 public class Match {
-	protected long sw;
-	protected MACAddress srcMac;
-	protected MACAddress dstMac;
-	protected long srcPort;
-	
-	public Match(long sw, long srcPort, 
-		     MACAddress srcMac, MACAddress dstMac) {
-		this.sw = sw;
-		this.srcPort = srcPort;
-		this.srcMac = srcMac;
-		this.dstMac = dstMac;
-	}
+    protected long sw;
+    protected MACAddress srcMac;
+    protected MACAddress dstMac;
+    protected long srcPort;
 
-	@Override
-	public boolean equals(Object obj) {
-		if(obj instanceof Match) {
-			Match other = (Match) obj;
-			return this.sw == other.sw &&
-			       this.srcMac.equals(other.srcMac) &&
-			       this.dstMac.equals(other.dstMac) &&
-			       this.srcPort == other.srcPort;
-		}
-		else {
-			return false;
-		}
-	}
+    public Match(long sw, long srcPort,
+                 MACAddress srcMac, MACAddress dstMac) {
+        this.sw = sw;
+        this.srcPort = srcPort;
+        this.srcMac = srcMac;
+        this.dstMac = dstMac;
+    }
 
-	public FlowEntryMatch getFlowEntryMatch(){
-	    FlowEntryMatch match = new FlowEntryMatch();
-	    match.enableSrcMac(srcMac);
-	    match.enableDstMac(dstMac);
-	    match.enableInPort(new net.onrc.onos.core.util.Port((short) srcPort));
-	    return match;
-	}
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof Match) {
+            Match other = (Match) obj;
+            return this.sw == other.sw &&
+                    this.srcMac.equals(other.srcMac) &&
+                    this.dstMac.equals(other.dstMac) &&
+                    this.srcPort == other.srcPort;
+        } else {
+            return false;
+        }
+    }
 
-	@Override
-	public String toString() {
-		return "Sw:" + sw + " (" + srcPort + "," + srcMac + "," + dstMac + ")";
-	}
-	
-	@Override
-	public int hashCode() {
-	    long[] nums = new long[4];
-	    nums[0] = sw;
-	    nums[1] = srcPort;
-	    nums[2] = srcMac.toLong();
-	    nums[3] = dstMac.toLong();
-	    return Arrays.hashCode(nums);
-	}
+    public FlowEntryMatch getFlowEntryMatch() {
+        FlowEntryMatch match = new FlowEntryMatch();
+        match.enableSrcMac(srcMac);
+        match.enableDstMac(dstMac);
+        match.enableInPort(new net.onrc.onos.core.util.Port((short) srcPort));
+        return match;
+    }
+
+    @Override
+    public String toString() {
+        return "Sw:" + sw + " (" + srcPort + "," + srcMac + "," + dstMac + ")";
+    }
+
+    @Override
+    public int hashCode() {
+        long[] nums = new long[4];
+        nums[0] = sw;
+        nums[1] = srcPort;
+        nums[2] = srcMac.toLong();
+        nums[3] = dstMac.toLong();
+        return Arrays.hashCode(nums);
+    }
 }
