diff --git a/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java b/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
new file mode 100644
index 0000000..37f6f5a
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
@@ -0,0 +1,124 @@
+package net.onrc.onos.core.flowmanager.web;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.api.flowmanager.Flow;
+import net.onrc.onos.api.flowmanager.FlowId;
+import net.onrc.onos.api.flowmanager.FlowLink;
+import net.onrc.onos.api.flowmanager.FlowManagerService;
+import net.onrc.onos.api.flowmanager.OpticalPathFlow;
+import net.onrc.onos.api.flowmanager.PacketPathFlow;
+import net.onrc.onos.api.flowmanager.Path;
+import net.onrc.onos.core.matchaction.action.Action;
+import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
+import net.onrc.onos.core.matchaction.action.ModifyLambdaAction;
+import net.onrc.onos.core.matchaction.match.PacketMatch;
+import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
+import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.SwitchPort;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.representation.Representation;
+
+/**
+ * Tests for the {@link FlowResource} REST handler.
+ */
+public class FlowResourceTest {
+    FlowResource flowResource;
+
+    /**
+     * Set up the FlowResource for the test.
+     */
+    @Before
+    public void setUp() {
+        // Create some flow data
+        Set<Flow> flowSet = createFlows();
+
+        // Create a mock flow manager service that will return the flows
+        FlowManagerService flowManager = createMock(FlowManagerService.class);
+        expect(flowManager.getFlows()).andReturn(flowSet);
+        replay(flowManager);
+
+        // Inject the flow manager service into a Restlet context
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(FlowManagerService.class.getCanonicalName(), flowManager);
+        Context context = new Context();
+        context.setAttributes(attributes);
+
+        // Create a FlowResource and initialize with the context
+        flowResource = new FlowResource();
+        flowResource.init(context, new Request(), null);
+    }
+
+    /**
+     * Creates some flow data that the REST handler can retrieve.
+     * The data is arbitrary because it is never verified during the test.
+     *
+     * @return a set of dummy Flow objects for the test
+     */
+    private Set<Flow> createFlows() {
+        Set<Flow> flowSet = new HashSet<>();
+
+        PacketMatch match = new PacketMatchBuilder().setDstTcpPort((short) 1).build();
+
+        List<FlowLink> links = new ArrayList<>();
+        links.add(new FlowLink(new SwitchPort(1L, 2L), new SwitchPort(2L, 1L)));
+        links.add(new FlowLink(new SwitchPort(2L, 2L), new SwitchPort(3L, 1L)));
+
+        Path path = new Path(links);
+
+        PacketPathFlow packetFlow = new PacketPathFlow(new FlowId(1L),
+                match, PortNumber.uint32(1), path,
+                Collections.<Action>singletonList(new ModifyDstMacAction(MACAddress.valueOf(4L))),
+                0, 0);
+
+        OpticalPathFlow opticalFlow = new OpticalPathFlow(new FlowId(2L),
+                PortNumber.uint32(3), path,
+                Collections.<Action>singletonList(new ModifyLambdaAction(2)), 4);
+
+        flowSet.add(packetFlow);
+        flowSet.add(opticalFlow);
+
+        return flowSet;
+    }
+
+    /**
+     * Tests the handler method that retrieves all flow resources.
+     *
+     * @throws IOException if there's an error serializing the representation
+     */
+    @Test
+    public void testRetrieve() throws IOException {
+        Representation rep = flowResource.retrieve();
+
+        StringWriter writer = new StringWriter();
+
+        rep.write(writer);
+        String output = writer.toString();
+
+        System.out.println(writer);
+
+        assertNotNull(output);
+        // Output should be a JSON array of JSON objects
+        assertTrue(output.startsWith("[{"));
+    }
+
+}
diff --git a/src/test/java/net/onrc/onos/core/matchaction/web/MatchActionResourceTest.java b/src/test/java/net/onrc/onos/core/matchaction/web/MatchActionResourceTest.java
new file mode 100644
index 0000000..6bea4ff
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/matchaction/web/MatchActionResourceTest.java
@@ -0,0 +1,113 @@
+package net.onrc.onos.core.matchaction.web;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.matchaction.MatchAction;
+import net.onrc.onos.core.matchaction.MatchActionId;
+import net.onrc.onos.core.matchaction.MatchActionService;
+import net.onrc.onos.core.matchaction.action.Action;
+import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
+import net.onrc.onos.core.matchaction.action.OutputAction;
+import net.onrc.onos.core.matchaction.match.Match;
+import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
+import net.onrc.onos.core.util.IPv4;
+import net.onrc.onos.core.util.PortNumber;
+import net.onrc.onos.core.util.SwitchPort;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.representation.Representation;
+
+/**
+ * Tests for the {@link MatchActionResource} REST handler.
+ */
+public class MatchActionResourceTest {
+
+    private MatchActionResource matchActionResource;
+
+    /**
+     * Set up the MatchActionResource for the test.
+     */
+    @Before
+    public void setUp() {
+        // Create some match-action data
+        Set<MatchAction> matchActionSet = createMatchActions();
+
+        // Create a mock match-action service that will return the match-actions
+        MatchActionService matchActionService = createMock(MatchActionService.class);
+        expect(matchActionService.getMatchActions()).andReturn(matchActionSet).anyTimes();
+        replay(matchActionService);
+
+        // Inject the match-action service into a Restlet context
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(MatchActionService.class.getCanonicalName(), matchActionService);
+        Context context = new Context();
+        context.setAttributes(attributes);
+
+        // Create a MatchActionResource and initialize with the context
+        matchActionResource = new MatchActionResource();
+        matchActionResource.init(context, new Request(), null);
+    }
+
+    /**
+     * Creates some match-action data that the REST handler can retrieve.
+     * The data is arbitrary because it is never verified during the test.
+     *
+     * @return a set of dummy MatchAction objects for the test
+     */
+    private Set<MatchAction> createMatchActions() {
+        Set<MatchAction> matchActionSet = new HashSet<>();
+
+        Match match = new PacketMatchBuilder().setDstTcpPort((short) 1)
+                .setDstIp(new IPv4(5)).build();
+
+        List<Action> actions = new ArrayList<>();
+        actions.add(new ModifyDstMacAction(MACAddress.valueOf(10L)));
+        actions.add(new OutputAction(PortNumber.uint32(4)));
+
+        MatchAction ma = new MatchAction(new MatchActionId(1L), new SwitchPort(1L, 1L), match,
+                actions);
+
+        matchActionSet.add(ma);
+
+        return matchActionSet;
+    }
+
+    /**
+     * Tests the handler method that retrieves all match-action resources.
+     *
+     * @throws IOException if there's an error serializing the representation
+     */
+    @Test
+    public void testRetrieve() throws IOException {
+        Representation rep = matchActionResource.retrieve();
+
+        StringWriter writer = new StringWriter();
+
+        rep.write(writer);
+        String output = writer.toString();
+
+        System.out.println(output);
+
+        assertNotNull(output);
+        // Output should be a JSON array of JSON objects
+        assertTrue(output.startsWith("[{"));
+    }
+
+}
diff --git a/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java b/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
new file mode 100644
index 0000000..74ba5c1
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
@@ -0,0 +1,115 @@
+package net.onrc.onos.core.newintent.web;
+
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.api.newintent.Intent;
+import net.onrc.onos.api.newintent.IntentId;
+import net.onrc.onos.api.newintent.IntentService;
+import net.onrc.onos.api.newintent.MultiPointToSinglePointIntent;
+import net.onrc.onos.api.newintent.PointToPointIntent;
+import net.onrc.onos.core.matchaction.action.ModifyDstMacAction;
+import net.onrc.onos.core.matchaction.match.Match;
+import net.onrc.onos.core.matchaction.match.PacketMatchBuilder;
+import net.onrc.onos.core.util.SwitchPort;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.representation.Representation;
+
+/**
+ * Tests for the {@link IntentResource} REST handler.
+ */
+public class IntentResourceTest {
+    private IntentResource intentResource;
+
+    /**
+     * Set up the IntentResource for the test.
+     */
+    @Before
+    public void setUp() {
+        // Create some intent data
+        Set<Intent> intentSet = createIntents();
+
+        // Create a mock intent service that will return the intents
+        IntentService intentService = createMock(IntentService.class);
+        expect(intentService.getIntents()).andReturn(intentSet).anyTimes();
+        replay(intentService);
+
+        // Inject the intent service into a Restlet context
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(IntentService.class.getCanonicalName(), intentService);
+        Context context = new Context();
+        context.setAttributes(attributes);
+
+        // Create an IntentResource and initialize with the context
+        intentResource = new IntentResource();
+        intentResource.init(context, new Request(), null);
+    }
+
+    /**
+     * Creates some intent data that the REST handler can retrieve.
+     * The data is arbitrary because it is never verified during the test.
+     *
+     * @return a set of dummy Intent objects for the test
+     */
+    private Set<Intent> createIntents() {
+        Set<Intent> intentSet = new HashSet<>();
+
+        Match match = new PacketMatchBuilder().setDstTcpPort((short) 1).build();
+
+        Intent pointToPointIntent = new PointToPointIntent(new IntentId(1L), match,
+                new ModifyDstMacAction(MACAddress.valueOf(1L)),
+                new SwitchPort(1L, 1L),
+                new SwitchPort(2L, 2L));
+
+        Set<SwitchPort> inPorts = new HashSet<>();
+        inPorts.add(new SwitchPort(3L, 3L));
+        inPorts.add(new SwitchPort(4L, 4L));
+
+        Intent multiPointToPointIntent = new MultiPointToSinglePointIntent(
+                new IntentId(2L), match,
+                new ModifyDstMacAction(MACAddress.valueOf(2L)),
+                inPorts, new SwitchPort(5L, 5L));
+
+        intentSet.add(pointToPointIntent);
+        intentSet.add(multiPointToPointIntent);
+
+        return intentSet;
+    }
+
+    /**
+     * Tests the handler method that retrieves all intent resources.
+     *
+     * @throws IOException if there's an error serializing the representation
+     */
+    @Test
+    public void testGetAllIntents() throws IOException {
+        Representation rep = intentResource.retrieve();
+
+        StringWriter writer = new StringWriter();
+
+        rep.write(writer);
+        String output = writer.toString();
+
+        System.out.println(output);
+
+        assertNotNull(output);
+        // Output should be a JSON array of JSON objects
+        assertTrue(output.startsWith("[{"));
+    }
+
+}
