diff --git a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
index 824ed4f..27f1a3c 100644
--- a/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
+++ b/src/main/java/net/onrc/onos/core/flowprogrammer/FlowPusher.java
@@ -739,7 +739,7 @@
                 .setActions(actionList)
                 .setIdleTimeout(0) // hardcoded to zero for now
                 .setHardTimeout(0) // hardcoded to zero for now
-                .setCookie(U64.of(matchAction.getId().value()))
+                .setCookie(U64.of(matchAction.getId().getValue()))
                 .setBufferId(OFBufferId.NO_BUFFER)
                 .setPriority(PRIORITY_DEFAULT)
                 .setOutPort(outp);
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
index fdf1fc7..d7d5d73 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
@@ -42,21 +42,6 @@
     }
 
     /**
-     * Constructor. TEMPORARY
-     *
-     * @param id ID for this MatchAction object
-     * @param port switch port to apply changes to
-     * @param match the Match object as match condition on the port
-     * @param actions the list of Action objects as actions on the switch
-     */
-    public MatchAction(String id, SwitchPort port, Match match, List<Action> actions) {
-        this.id = null;
-        this.port = port;
-        this.match = match;
-        this.actions = actions;
-    }
-
-    /**
      * Gets ID for this object.
      *
      * @return the ID for this object
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionComponent.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionComponent.java
index da24d4d..0307d4c 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionComponent.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionComponent.java
@@ -40,29 +40,33 @@
 public class MatchActionComponent implements MatchActionService, IFloodlightService {
 
     private static final Logger log = LoggerFactory.getLogger(MatchActionService.class);
-    IFlowPusherService pusher;
-    IFloodlightProviderService provider;
+    private final IFlowPusherService pusher;
+    private final IFloodlightProviderService provider;
 
-    private ConcurrentMap<MatchActionId, MatchAction> matchActionMap = new ConcurrentHashMap<>();
-    private ConcurrentMap<MatchActionOperationsId, MatchActionOperations> matchSetMap =
+    private final ConcurrentMap<MatchActionId, MatchAction> matchActionMap = new ConcurrentHashMap<>();
+    private final ConcurrentMap<MatchActionOperationsId, MatchActionOperations> matchSetMap =
             new ConcurrentHashMap<>();
     //  TODO - want something better here for the resolved Queue
-    private BlockingQueue<MatchActionOperationsId> resolvedQueue = new ArrayBlockingQueue<>(100);
-    private BlockingQueue<MatchActionOperations> installationWorkQueue = new ArrayBlockingQueue<>(100);
+    private final BlockingQueue<MatchActionOperationsId> resolvedQueue = new ArrayBlockingQueue<>(100);
+    private final BlockingQueue<MatchActionOperations> installationWorkQueue = new ArrayBlockingQueue<>(100);
 
     private IEventChannel<String, MatchActionOperations> installSetChannel;
     private IEventChannel<String, SwitchResultList> installSetReplyChannel;
 
-    // TODO Single instance for now, should be a work queue of some sort eventually
-    private Thread coordinator;
-    private Thread installer;
-    private Installer installerListener;
     private final IDatagridService datagrid;
-    private IControllerRegistryService registryService;
+    private final IControllerRegistryService registryService;
 
     private MatchActionIdGeneratorWithIdBlockAllocator matchActionIdGenerator;
     private MatchActionOperationsIdGeneratorWithIdBlockAllocator matchActionOperationsIdGenerator;
 
+    /**
+     * Constructs a MatchActionComponent given the services it depends on.
+     *
+     * @param newDatagrid datagrid dependency
+     * @param newPusher flow pusher dependency
+     * @param newProvider provider used for switch queries
+     * @param newRegistryService registry for ID block allocation
+     */
     public MatchActionComponent(final IDatagridService newDatagrid,
                                 final IFlowPusherService newPusher,
                                 final IFloodlightProviderService newProvider,
@@ -73,6 +77,10 @@
         registryService = newRegistryService;
     }
 
+    /**
+     * Starts the component.  Created channels used for communication and
+     * creates producer and consumer threads.
+     */
     public void start() {
         IdBlockAllocator idBlockAllocator = registryService;
         matchActionIdGenerator =
@@ -88,16 +96,23 @@
                 String.class,
                 SwitchResultList.class);
 
-        coordinator = new Coordinator();
+        final Thread coordinator = new Coordinator();
         coordinator.start();
 
-        installer = new InstallerWorker();
+        // TODO Single instance for now, should be a work queue of some sort eventually
+        final Thread installer = new InstallerWorker();
         installer.start();
 
-        installerListener = new Installer();
+        final Installer installerListener = new Installer();
         installerListener.start();
     }
 
+    /**
+     * Installs a set of MatchActionOperations.
+     *
+     * @param matchSet the set of MatchActions to install
+     * @return identifier of the installed operations
+     */
     public MatchActionOperationsId installMatchActionOperations(MatchActionOperations matchSet) {
         if (checkResolved(matchSet)) {
             matchSet.setState(MatchActionOperationsState.RESOLVED);
@@ -115,12 +130,24 @@
         return matchSet.getOperationsId();
     }
 
+    /**
+     * Returns the state of a set of operations.
+     *
+     * @param matchSetId identifier of the MatchActionOperations being queried.
+     * @return state of the given operations
+     */
     public MatchActionOperationsState getMatchActionOperationsState(MatchActionOperationsId matchSetId) {
         MatchActionOperations set = matchSetMap.get(matchSetId);
         return (set == null) ? null : set.getState();
     }
 
-    protected boolean checkResolved(MatchActionOperations matchSet) {
+    /**
+     * Checks if a given set of operations has all of its dependencies resolved.
+     *
+     * @param matchSet Operations set to check
+     * @return true if all dependencies are resolved, false otherwise
+     */
+    private boolean checkResolved(MatchActionOperations matchSet) {
         boolean resolved = true;
         for (MatchActionOperationsId setId : matchSet.getDependencies()) {
             MatchActionOperations set = matchSetMap.get(setId);
@@ -132,17 +159,28 @@
         return resolved;
     }
 
-    class Coordinator extends Thread
+    /**
+     * Producer class for MatchActionOperations.  An instance of this runs on
+     * each ONOS node. Requests come in via the resolved queue, and are
+     * distributed to workers running on each ONOS instance via a channel.
+     */
+    private final class Coordinator extends Thread
             implements IEventChannelListener<String, SwitchResultList> {
 
-        private Map<MatchActionOperationsId, Map<Dpid, SwitchResult>> pendingMatchActionOperations = new HashMap<>();
+        private final Map<MatchActionOperationsId,
+                      Map<Dpid, SwitchResult>>
+                pendingMatchActionOperations = new HashMap<>();
 
-        protected Coordinator() {
+        /**
+         * Default constructor.
+         */
+        Coordinator() {
             installSetReplyChannel.addListener(this);
         }
 
         @Override
         public void run() {
+            //noinspection InfiniteLoopStatement - for IntelliJ
             while (true) {
                 // 1. Remove MatchActionOperations(s) from the Global Resolved Queue
                 try {
@@ -154,6 +192,11 @@
             }
         }
 
+        /**
+         * Processes an inbound MatchActionOperations object.
+         *
+         * @param setId Identifier of the MatchActionOperations object
+         */
         private void processSet(MatchActionOperationsId setId) {
             MatchActionOperations matchSet = matchSetMap.get(setId);
             matchSet.setState(MatchActionOperationsState.PENDING);
@@ -203,6 +246,11 @@
             updateSwitchResults(value);
         }
 
+        /**
+         * Processes the response from a consumer.
+         *
+         * @param results List of switches modified by the consumer
+         */
         private void updateSwitchResults(SwitchResultList results) {
             if (results == null || results.size() == 0) {
                 return;
@@ -262,11 +310,28 @@
         }
     }
 
-    class InstallerWorker extends Thread {
+    /**
+     * Worker thread that pushes MatchActionOperations to the switches via
+     * the FlowPusher.
+     */
+    private class InstallerWorker extends Thread {
+
+        /**
+         * Default constructor.
+         */
+        InstallerWorker() {
+            // nothing to initialize
+        }
 
         // Note: we should consider using an alternative representation for
         // apply sets
-        protected void install(MatchActionOperations matchSet) {
+
+        /**
+         * Installs a set of MatchActionOperations using the Flow Pusher.
+         *
+         * @param matchSet set of MatchActions to install
+         */
+        private void install(MatchActionOperations matchSet) {
             Set<Long> masterDpids = provider.getAllMasterSwitchDpids();
 
             Set<MatchActionOperationEntry> installSet = new HashSet<>();
@@ -320,6 +385,7 @@
 
         @Override
         public void run() {
+            //noinspection InfiniteLoopStatement - for IntelliJ
             while (true) {
                 // 1. Remove MatchActionOperations(s) from the Global Resolved Queue
                 try {
@@ -332,10 +398,19 @@
         }
     }
 
+    /**
+     * Consumer class for MatchActionOperations.  Listens on the MatchAction
+     * channel and places inbound requests on a queue to be handled by the
+     * InstallerWorker threads.
+     */
     class Installer
             implements IEventChannelListener<String, MatchActionOperations> {
 
-        protected void start() {
+        /**
+         * Starts the Installer consumer.  Adds a listener on the MatchActionOperations
+         * channel.
+         */
+        private void start() {
             installSetChannel.addListener(this);
         }
 
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
index bea973e..59579a5 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
@@ -31,7 +31,7 @@
      *
      * @return MatchAction ID
      */
-    public long value() {
+    public long getValue() {
         return value;
     }
 
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
index 4970cf1..9bf1be4 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
@@ -4,7 +4,6 @@
 import java.util.Collection;
 import java.util.EventListener;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -31,7 +30,6 @@
 
 public class MatchActionModule implements MatchActionFloodlightService, IFloodlightModule {
 
-    private final HashSet<MatchAction> currentOperations = new HashSet<>();
     private static final Logger log = LoggerFactory
             .getLogger(MatchActionModule.class);
     private MatchActionComponent matchActionComponent;
@@ -99,7 +97,7 @@
 
     @Override
     public void setConflictDetectionPolicy(ConflictDetectionPolicy policy) {
-
+        throw new UnsupportedOperationException("conflict detection not implemented yet");
     }
 
     @Override
@@ -119,11 +117,11 @@
 
     @Override
     public void addEventListener(EventListener listener) {
-
+        throw new UnsupportedOperationException("events not implemented yet");
     }
 
     @Override
     public void removeEventListener(EventListener listener) {
-
+        throw new UnsupportedOperationException("events not implemented yet");
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
index 73cff28..7d9063f 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
@@ -22,7 +22,10 @@
      * The MatchAction operators.
      */
     public enum Operator {
+        /** Add a new match action. */
         ADD,
+
+        /** Remove an existing match action. */
         REMOVE,
     }
 
@@ -83,6 +86,12 @@
         return dependencies;
     }
 
+    /**
+     * Adds a dependency to this set of Operations.
+     *
+     * @param dependentOperationId Identifier of the Operations that must
+     *                             complete before this one can be installed
+     */
     public void addDependency(MatchActionOperationsId dependentOperationId) {
         dependencies.add(dependentOperationId);
     }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
index 93f2ec7..a05dd90 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
@@ -13,6 +13,8 @@
 
     /**
      * Constructs an Operations identifier and from a unique identifier.
+     *
+     * @param newId unique identifier to use for the new Id object
      */
     public MatchActionOperationsId(final long newId) {
         id = newId;
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsState.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsState.java
index 4ccf668..f0470af 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsState.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsState.java
@@ -1,11 +1,22 @@
 package net.onrc.onos.core.matchaction;
 
-
+/**
+ * States for MatchActionOperations objects.
+ */
 public enum MatchActionOperationsState {
+    /** Being initialized. */
     INIT,
+
+    /** All operations that we depend on are finished. */
     RESOLVED,
+
+    /** Operation is pending waiting for dependencies. */
     PENDING,
+
+    /** Operations successfully installed. */
     INSTALLED,
+
+    /** Operations installation failed. */
     FAILED
 }
 
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionStatus.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionStatus.java
index 0a7c145..a1f46f4 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionStatus.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionStatus.java
@@ -1,5 +1,8 @@
 package net.onrc.onos.core.matchaction;
 
+/**
+ * Placeholder.
+ */
 public interface MatchActionStatus {
 
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/SwitchResult.java b/src/main/java/net/onrc/onos/core/matchaction/SwitchResult.java
index b5db2e8..7f9e18a 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/SwitchResult.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/SwitchResult.java
@@ -2,17 +2,34 @@
 
 import net.onrc.onos.core.util.Dpid;
 
+/**
+ * The result of applying a MatchAction operation to a switch.
+ */
 public class SwitchResult {
     private Dpid sw;
     private Status status;
     private MatchActionOperationsId matchSetId;
 
+    /**
+     * Status of the switch operation.
+     */
     public enum Status {
+        /** Installation of the MatchAction was successful. */
         SUCCESS,
+
+        /** Installation of the MatchAction failed. */
         FAILURE,
+
+        /** No status has been assigned. */
         UNKNOWN
     }
 
+    /**
+     * Creates a new SwitchResult object.
+     *
+     * @param match identifier for MatchActionsOperations that was requested
+     * @param sw Dpid of the switch that the operations were applied to
+     */
     protected SwitchResult(MatchActionOperationsId match, Dpid sw) {
         this.sw = sw;
         this.status = Status.UNKNOWN;
@@ -23,21 +40,41 @@
      * no-arg constructor for Kryo.
      */
     protected SwitchResult() {
-
+        // Needed for Kryo
     }
 
+    /**
+     * Sets the status of the SwitchResult.
+     *
+     * @param newStatus new status
+     */
     protected void setStatus(Status newStatus) {
         this.status = newStatus;
     }
 
+    /**
+     * Gets the status of the SwitchResult.
+     *
+     * @return status
+     */
     protected Status getStatus() {
         return this.status;
     }
 
+    /**
+     * Gets the identifier for the set of operations that was requested.
+     *
+     * @return MatchActionOperationsId of the requested set of operations
+     */
     protected MatchActionOperationsId getMatchActionOperationsId() {
         return this.matchSetId;
     }
 
+    /**
+     * Gets the identifier for the switch that was requested.
+     *
+     * @return Dpid of the requested switch
+     */
     protected Dpid getSwitch() {
         return this.sw;
     }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/SwitchResultList.java b/src/main/java/net/onrc/onos/core/matchaction/SwitchResultList.java
index 2523556..ff68df2 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/SwitchResultList.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/SwitchResultList.java
@@ -9,13 +9,5 @@
 
     static final long serialVersionUID = -4966789015808022563L;
 
-    /**
-     * Add a switch result to the list.
-     *
-     * @param result switch result to add to the list
-     * @return true
-     */
-    public boolean add(SwitchResult result) {
-        return super.add(result);
-    }
+
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/match/OpticalMatch.java b/src/main/java/net/onrc/onos/core/matchaction/match/OpticalMatch.java
index 3cdec64..65c080b 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/match/OpticalMatch.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/match/OpticalMatch.java
@@ -9,7 +9,7 @@
 public class OpticalMatch implements Match {
 
     // Match fields
-    protected Integer srcLambda;
+    private Integer srcLambda;
 
     /**
      * Constructor.
diff --git a/src/main/java/net/onrc/onos/core/matchaction/match/PacketMatchBuilder.java b/src/main/java/net/onrc/onos/core/matchaction/match/PacketMatchBuilder.java
index 1ddc720..7f8be18 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/match/PacketMatchBuilder.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/match/PacketMatchBuilder.java
@@ -8,14 +8,14 @@
  * A builder to instantiate PacketMatch class.
  */
 public class PacketMatchBuilder {
-    private MACAddress srcMac = null;
-    private MACAddress dstMac = null;
-    private Short etherType = null;
-    private IPv4Net srcIp = null;
-    private IPv4Net dstIp = null;
-    private Byte ipProto = null;
-    private Short srcTcpPort = null;
-    private Short dstTcpPort = null;
+    private MACAddress srcMac;
+    private MACAddress dstMac;
+    private Short etherType;
+    private IPv4Net srcIp;
+    private IPv4Net dstIp;
+    private Byte ipProto;
+    private Short srcTcpPort;
+    private Short dstTcpPort;
 
     /**
      * Sets source MAC address.
diff --git a/src/main/java/net/onrc/onos/core/matchaction/web/MatchActionResource.java b/src/main/java/net/onrc/onos/core/matchaction/web/MatchActionResource.java
index 20e68d3..ca3f95e 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/web/MatchActionResource.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/web/MatchActionResource.java
@@ -22,7 +22,7 @@
  */
 public class MatchActionResource extends ServerResource {
 
-    CustomSerializerHelper matchActionSerializers;
+    private final CustomSerializerHelper matchActionSerializers;
 
     /**
      * Constructs a MatchActionResource.
