diff --git a/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java b/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
index 9810563..8f99be0 100644
--- a/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
+++ b/src/main/java/net/floodlightcontroller/restserver/CustomSerializerHelper.java
@@ -24,7 +24,6 @@
  * used on the class in different contexts.
  */
 public class CustomSerializerHelper {
-    private final ObjectMapper mapper;
     private final SimpleModule customSerializerModule;
     private CustomSerializerFactory sf;
 
@@ -32,9 +31,7 @@
      * Constructor.
      */
     public CustomSerializerHelper() {
-        mapper = new ObjectMapper();
         customSerializerModule = new SimpleModule("custom-serializers", new Version(1, 0, 0, null));
-        mapper.registerModule(customSerializerModule);
         sf =  new CustomSerializerFactory();
     }
 
@@ -58,9 +55,12 @@
      * @return a representation with the custom serializers applied
      */
     public Representation applySerializers(JacksonRepresentation<?> jacksonRepresentation) {
+        ObjectMapper mapper = jacksonRepresentation.getObjectMapper();
+
         mapper.registerModule(customSerializerModule);
-        jacksonRepresentation.setObjectMapper(mapper);
         mapper.setSerializerFactory(sf);
+        jacksonRepresentation.setObjectMapper(mapper);
+
         return jacksonRepresentation;
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java b/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
index 83092eb..b1bb067 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/FlowManagerModule.java
@@ -11,6 +11,7 @@
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
 import net.onrc.onos.api.flowmanager.Flow;
 import net.onrc.onos.api.flowmanager.FlowBatchHandle;
@@ -20,6 +21,7 @@
 import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.FlowManagerListener;
 import net.onrc.onos.core.datagrid.ISharedCollectionsService;
+import net.onrc.onos.core.flowmanager.web.FlowManagerWebRoutable;
 import net.onrc.onos.core.matchaction.MatchActionFloodlightService;
 import net.onrc.onos.core.matchaction.MatchActionService;
 import net.onrc.onos.core.registry.IControllerRegistryService;
@@ -43,6 +45,7 @@
     private FlowBatchMap flowBatchMap;
     private FlowEventDispatcher flowEventDispatcher;
     private FlowBatchOperationExecutor flowBatchOperationExecutor;
+    private IRestApiService restApi;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -65,7 +68,8 @@
         return Arrays.asList(
                 MatchActionFloodlightService.class,
                 ISharedCollectionsService.class,
-                IControllerRegistryService.class);
+                IControllerRegistryService.class,
+                IRestApiService.class);
     }
 
     @Override
@@ -73,6 +77,7 @@
         matchActionService = context.getServiceImpl(MatchActionFloodlightService.class);
         registryService = context.getServiceImpl(IControllerRegistryService.class);
         sharedCollectionService = context.getServiceImpl(ISharedCollectionsService.class);
+        restApi = context.getServiceImpl(IRestApiService.class);
     }
 
     @Override
@@ -91,6 +96,8 @@
         flowBatchOperationExecutor =
                 new FlowBatchOperationExecutor(matchActionService, flowMap, flowBatchMap);
         flowBatchOperationExecutor.start();
+
+        restApi.addRestletRoutable(new FlowManagerWebRoutable());
     }
 
     /**
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
index e41b023..781b851 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowManagerWebRoutable.java
@@ -13,7 +13,7 @@
 
     @Override
     public Restlet getRestlet(Context context) {
-        Router router = new Router();
+        Router router = new Router(context);
         router.attach("", FlowResource.class);
         return router;
     }
diff --git a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
index 4079687..b1381e0 100644
--- a/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
+++ b/src/main/java/net/onrc/onos/core/flowmanager/web/FlowResource.java
@@ -6,7 +6,7 @@
 import net.floodlightcontroller.restserver.CustomSerializerHelper;
 import net.onrc.onos.api.flowmanager.Flow;
 import net.onrc.onos.api.flowmanager.FlowId;
-import net.onrc.onos.api.flowmanager.FlowManagerService;
+import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.JsonGenerator;
@@ -22,7 +22,7 @@
  */
 public class FlowResource extends ServerResource {
 
-    private final CustomSerializerHelper flowSerializers;
+    private CustomSerializerHelper flowSerializers;
 
     /**
      * Constructs a FlowResource.
@@ -49,13 +49,14 @@
      */
     @Get("json")
     public Representation retrieve() {
-        FlowManagerService flowService =
-                (FlowManagerService) getContext().getAttributes()
-                    .get(FlowManagerService.class.getCanonicalName());
+        FlowManagerFloodlightService flowService =
+                (FlowManagerFloodlightService) getContext().getAttributes()
+                    .get(FlowManagerFloodlightService.class.getCanonicalName());
 
         Collection<Flow> flows = flowService.getFlows();
 
         return flowSerializers.applySerializers(
                 (JacksonRepresentation<?>) toRepresentation(flows, null));
     }
+
 }
diff --git a/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java b/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
index cf0e5e5..3ac9882 100644
--- a/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
+++ b/src/main/java/net/onrc/onos/core/newintent/IntentFloodlightModule.java
@@ -1,9 +1,17 @@
 package net.onrc.onos.core.newintent;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.onrc.onos.api.flowmanager.FlowId;
 import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.FlowManagerService;
@@ -21,18 +29,12 @@
 import net.onrc.onos.api.newintent.PathIntent;
 import net.onrc.onos.api.newintent.PointToPointIntent;
 import net.onrc.onos.core.datagrid.ISharedCollectionsService;
+import net.onrc.onos.core.newintent.web.IntentWebRoutable;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.topology.ITopologyService;
 import net.onrc.onos.core.util.IdBlockAllocator;
 import net.onrc.onos.core.util.IdGenerator;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * A Floodlight module for Intent Service.
  */
@@ -49,7 +51,7 @@
     @Override
     public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
         Map<Class<? extends IFloodlightService>, IFloodlightService> impls = new HashMap<>();
-        impls.put(IFloodlightService.class, this);
+        impls.put(IntentFloodlightService.class, this);
         return impls;
     }
 
@@ -88,6 +90,9 @@
 
         registerDefaultCompilers(intentIdGenerator, flowIdGenerator, topologyService);
         registerDefaultInstallers(flowManagerService);
+
+        IRestApiService restApi = context.getServiceImpl(IRestApiService.class);
+        restApi.addRestletRoutable(new IntentWebRoutable());
     }
 
     private void registerDefaultCompilers(IdGenerator<IntentId> intentIdGenerator,
diff --git a/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java b/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
index 4230298..b4cd133 100644
--- a/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
+++ b/src/main/java/net/onrc/onos/core/newintent/web/IntentResource.java
@@ -5,8 +5,8 @@
 
 import net.floodlightcontroller.restserver.CustomSerializerHelper;
 import net.onrc.onos.api.newintent.Intent;
+import net.onrc.onos.api.newintent.IntentFloodlightService;
 import net.onrc.onos.api.newintent.IntentId;
-import net.onrc.onos.api.newintent.IntentService;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.JsonProcessingException;
@@ -50,9 +50,9 @@
      */
     @Get("json")
     public Representation retrieve() {
-        IntentService intentService =
-                (IntentService) getContext().getAttributes()
-                    .get(IntentService.class.getCanonicalName());
+        IntentFloodlightService intentService =
+                (IntentFloodlightService) getContext().getAttributes()
+                    .get(IntentFloodlightService.class.getCanonicalName());
 
         Set<Intent> intents = intentService.getIntents();
 
diff --git a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
index d4743ca..ac2f6a7 100644
--- a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
+++ b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
@@ -24,3 +24,4 @@
 net.onrc.onos.core.metrics.OnosMetricsModule
 net.onrc.onos.core.newintent.IntentFloodlightModule
 net.onrc.onos.core.matchaction.MatchActionModule
+net.onrc.onos.core.flowmanager.FlowManagerModule
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
index 37f6f5a..b112aa6 100644
--- a/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
+++ b/src/test/java/net/onrc/onos/core/flowmanager/web/FlowResourceTest.java
@@ -20,7 +20,7 @@
 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.FlowManagerFloodlightService;
 import net.onrc.onos.api.flowmanager.OpticalPathFlow;
 import net.onrc.onos.api.flowmanager.PacketPathFlow;
 import net.onrc.onos.api.flowmanager.Path;
@@ -53,13 +53,15 @@
         Set<Flow> flowSet = createFlows();
 
         // Create a mock flow manager service that will return the flows
-        FlowManagerService flowManager = createMock(FlowManagerService.class);
+        FlowManagerFloodlightService flowManager =
+                createMock(FlowManagerFloodlightService.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);
+        attributes.put(FlowManagerFloodlightService.class.getCanonicalName(),
+                flowManager);
         Context context = new Context();
         context.setAttributes(attributes);
 
@@ -87,8 +89,8 @@
 
         PacketPathFlow packetFlow = new PacketPathFlow(new FlowId(1L),
                 match, PortNumber.uint32(1), path,
-                Collections.<Action>singletonList(new ModifyDstMacAction(MACAddress.valueOf(4L))),
-                0, 0);
+                Collections.<Action>singletonList(
+                        new ModifyDstMacAction(MACAddress.valueOf(4L))), 0, 0);
 
         OpticalPathFlow opticalFlow = new OpticalPathFlow(new FlowId(2L),
                 PortNumber.uint32(3), path,
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
index 74ba5c1..860b0e1 100644
--- a/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
+++ b/src/test/java/net/onrc/onos/core/newintent/web/IntentResourceTest.java
@@ -15,8 +15,8 @@
 
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.api.newintent.Intent;
+import net.onrc.onos.api.newintent.IntentFloodlightService;
 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;
@@ -45,13 +45,14 @@
         Set<Intent> intentSet = createIntents();
 
         // Create a mock intent service that will return the intents
-        IntentService intentService = createMock(IntentService.class);
+        IntentFloodlightService intentService =
+                createMock(IntentFloodlightService.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);
+        attributes.put(IntentFloodlightService.class.getCanonicalName(), intentService);
         Context context = new Context();
         context.setAttributes(attributes);
 
