diff --git a/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
index 14ee2a0f6f2cfc1cd5626e71c9e06d1ce3700f4a..1207638607366e0818a2c375d8b16f68a2ee760e 100644
--- a/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
+++ b/src/main/java/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule
@@ -6,4 +6,5 @@ net.floodlightcontroller.routing.dijkstra.RoutingImpl
 net.floodlightcontroller.forwarding.Forwarding
 net.floodlightcontroller.core.OFMessageFilterManager
 net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher
-net.floodlightcontroller.perfmon.PktInProcessingTime
\ No newline at end of file
+net.floodlightcontroller.perfmon.PktInProcessingTime
+net.floodlightcontroller.restserver.RestApiServer
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/core/CoreModule.java b/src/main/java/net/floodlightcontroller/core/CoreModule.java
index 5464df7ead839044d9ad293efbe29046d60301b5..be4ebc25e644ca7794cc2930c5125e961f363f82 100644
--- a/src/main/java/net/floodlightcontroller/core/CoreModule.java
+++ b/src/main/java/net/floodlightcontroller/core/CoreModule.java
@@ -9,22 +9,22 @@ import net.floodlightcontroller.core.internal.Controller;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
-import net.floodlightcontroller.core.web.JacksonCustomConverter;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.counter.CounterStore;
 import net.floodlightcontroller.counter.ICounterStoreService;
 import net.floodlightcontroller.perfmon.IPktInProcessingTimeService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.storage.IStorageSourceService;
 
 public class CoreModule implements IFloodlightModule {
     Controller controller;
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> services =
                 new ArrayList<Class<? extends IFloodlightService>>(2);
         services.add(IFloodlightProviderService.class);
         services.add(ICounterStoreService.class);
-        services.add(IRestApiService.class);
         return services;
     }
 
@@ -41,17 +41,17 @@ public class CoreModule implements IFloodlightModule {
                             IFloodlightService>();
         m.put(IFloodlightProviderService.class, controller);
         m.put(ICounterStoreService.class, counterStore);
-        m.put(IRestApiService.class, controller);
         return m;
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> dependencies =
-            new ArrayList<Class<? extends IFloodlightService>>(1);
+            new ArrayList<Class<? extends IFloodlightService>>(4);
         dependencies.add(IStorageSourceService.class);
         dependencies.add(IOFMessageFilterManagerService.class);
         dependencies.add(IPktInProcessingTimeService.class);
+        dependencies.add(IRestApiService.class);
         return dependencies;
     }
 
@@ -64,13 +64,14 @@ public class CoreModule implements IFloodlightModule {
        controller.setCounterStore(
            context.getServiceImpl(ICounterStoreService.class));
        controller.setMessageFilterManagerService(
-           context.getServiceImpl(IOFMessageFilterManagerService.class));                                     
+           context.getServiceImpl(IOFMessageFilterManagerService.class));         
+       controller.setRestApiService(
+           context.getServiceImpl(IRestApiService.class));
        controller.init();
     }
 
     @Override
     public void startUp(FloodlightModuleContext context) {
         controller.startupComponents();
-        JacksonCustomConverter.replaceConverter();
     }
 }
diff --git a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
index 048c19944ad85fcbfe866f3a9b5db96c5b69fecd..c2d5cf433297e7b89af5b95370a70862e2825012 100644
--- a/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
+++ b/src/main/java/net/floodlightcontroller/core/IFloodlightProviderService.java
@@ -22,6 +22,7 @@ import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 
 import net.floodlightcontroller.core.internal.CmdLineSettings;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.packet.Ethernet;
 
 import org.openflow.protocol.OFMessage;
diff --git a/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java b/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java
index df77cdf45543eac46bd4af901eacac711b0dc1ab..58de92ca04d6b7ad519b2fa85b6d2e06d56ecf47 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFMessageFilterManagerService.java
@@ -1,5 +1,7 @@
 package net.floodlightcontroller.core;
 
+import net.floodlightcontroller.core.module.IFloodlightService;
+
 import org.openflow.protocol.OFMessage;
 
 public interface IOFMessageFilterManagerService extends IFloodlightService {
diff --git a/src/main/java/net/floodlightcontroller/core/IRestApiService.java b/src/main/java/net/floodlightcontroller/core/IRestApiService.java
deleted file mode 100644
index 4340e16c2e3155a46eab3a4693ce9e31c6f4c856..0000000000000000000000000000000000000000
--- a/src/main/java/net/floodlightcontroller/core/IRestApiService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package net.floodlightcontroller.core;
-
-import net.floodlightcontroller.core.module.IFloodlightModule;
-import net.floodlightcontroller.core.web.RestletRoutable;
-
-public interface IRestApiService extends IFloodlightService {
-    /**
-     * Adds a REST API
-     * @param routeable
-     */
-    public void addRestApi(RestletRoutable routeable,
-                           Class<? extends IFloodlightService> service,
-                           IFloodlightModule module);
-}
diff --git a/src/main/java/net/floodlightcontroller/core/Main.java b/src/main/java/net/floodlightcontroller/core/Main.java
index 7a90d0c7119338d59a5faee046a77241c4dae866..e35c0b546916e5140df21588fe8fa272a9c8b2b8 100644
--- a/src/main/java/net/floodlightcontroller/core/Main.java
+++ b/src/main/java/net/floodlightcontroller/core/Main.java
@@ -7,6 +7,7 @@ import net.floodlightcontroller.core.internal.CmdLineSettings;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.FloodlightModuleLoader;
 import net.floodlightcontroller.core.module.IFloodlightModuleContext;
+import net.floodlightcontroller.restserver.IRestApiService;
 
 /**
  * Host for the Floodlight main method
@@ -34,6 +35,8 @@ public class Main {
         
         FloodlightModuleLoader fml = new FloodlightModuleLoader();
         IFloodlightModuleContext moduleContext = fml.loadModulesFromConfig();
+        IRestApiService restApi = moduleContext.getServiceImpl(IRestApiService.class);
+        restApi.run();
         IFloodlightProviderService controller =
                 moduleContext.getServiceImpl(IFloodlightProviderService.class);
         controller.setCmdLineOptions(settings);
diff --git a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java
index b9d466cee1bbd5d9ab0c7cfa433eadfde2763ec6..19a2d9d48a13c67330529b1fbb5bd10de72652ab 100644
--- a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java
+++ b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java
@@ -54,6 +54,7 @@ import org.apache.thrift.protocol.TProtocol;
 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.packet.Ethernet;
 import net.floodlightcontroller.packetstreamer.thrift.*;
 
@@ -541,7 +542,7 @@ public class OFMessageFilterManager
     // IFloodlightModule methods
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IOFMessageFilterManagerService.class);
@@ -561,7 +562,7 @@ public class OFMessageFilterManager
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IFloodlightProviderService.class);
diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
index 30578037fcb1ecf1517d73d1e83a9b4c09d98b3d..15b87891eb8ab7f8acb06bcec0342f873f70c198 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
@@ -46,7 +45,6 @@ import java.nio.channels.ClosedChannelException;
 
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFController;
 import net.floodlightcontroller.core.IOFMessageFilterManagerService;
 import net.floodlightcontroller.core.IOFMessageListener;
@@ -54,12 +52,9 @@ import net.floodlightcontroller.core.IOFMessageListener.Command;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.IOFSwitchFilter;
 import net.floodlightcontroller.core.IOFSwitchListener;
-import net.floodlightcontroller.core.IRestApiService;
 import net.floodlightcontroller.core.internal.OFChannelState.HandshakeState;
-import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.util.ListenerDispatcher;
 import net.floodlightcontroller.core.web.CoreWebRoutable;
-import net.floodlightcontroller.core.web.RestletRoutable;
 import static net.floodlightcontroller.counter.CounterValue.CounterType;
 import net.floodlightcontroller.counter.CounterStore;
 import net.floodlightcontroller.counter.ICounter;
@@ -69,6 +64,7 @@ import net.floodlightcontroller.jython.Server;
 import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.packet.IPv4;
 import net.floodlightcontroller.perfmon.IPktInProcessingTimeService;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.storage.IResultSet;
 import net.floodlightcontroller.storage.IStorageExceptionHandler;
 import net.floodlightcontroller.storage.IStorageSourceService;
@@ -119,17 +115,6 @@ import org.openflow.protocol.factory.MessageParseException;
 import org.openflow.util.HexString;
 import org.openflow.util.U16;
 import org.openflow.util.U32;
-import org.restlet.Component;
-import org.restlet.Context;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.Restlet;
-import org.restlet.data.Protocol;
-import org.restlet.data.Reference;
-import org.restlet.routing.Filter;
-import org.restlet.routing.Router;
-import org.restlet.routing.Template;
-import org.restlet.Application;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -138,8 +123,7 @@ import org.slf4j.LoggerFactory;
  * The main controller class.  Handles all setup and network listeners
  */
 public class Controller
-    extends Application
-    implements IFloodlightProviderService, IRestApiService, IOFController {
+    implements IFloodlightProviderService, IOFController {
     
     protected static Logger log = LoggerFactory.getLogger(Controller.class);
     
@@ -151,6 +135,7 @@ public class Controller
     protected Set<IOFSwitchListener> switchListeners;
     protected BlockingQueue<Update> updates;
     protected ICounterStoreService counterStore;
+    protected IRestApiService restApi;
 
     protected ScheduledExecutorService executor = 
             Executors.newScheduledThreadPool(5);
@@ -160,11 +145,7 @@ public class Controller
     protected IPktInProcessingTimeService pktinProcTime;
     protected long ptWarningThresholdInNano;
     
-    protected List<RestletRoutable> restlets;
-    protected Context context;
-    
     // Configuration options
-    protected int restPort = 8080;
     protected int openFlowPort = 6633;
 
     // Storage table names
@@ -207,11 +188,6 @@ public class Controller
         }
     }
     
-    public Controller() {
-        super(new Context());
-        this.context = getContext();
-    }
-    
     // ***************
     // Getters/Setters
     // ***************
@@ -232,6 +208,10 @@ public class Controller
         this.pktinProcTime = pits;
     }
     
+    public void setRestApiService(IRestApiService restApi) {
+        this.restApi = restApi;
+    }
+    
     // **********************
     // ChannelUpstreamHandler
     // **********************
@@ -1066,53 +1046,6 @@ public class Controller
         return "localhost";
     }
     
-    // ***********
-    // Application
-    // ***********
-
-    @Override
-    public Restlet createInboundRoot() {
-        Router baseRouter = new Router(context);
-        baseRouter.setDefaultMatchingMode(Template.MODE_STARTS_WITH);
-        for (RestletRoutable rr : restlets) {
-            baseRouter.attach(rr.basePath(), rr.getRestlet(context));
-        }
-
-        Filter slashFilter = new Filter() {            
-            @Override
-            protected int beforeHandle(Request request, Response response) {
-                Reference ref = request.getResourceRef();
-                String originalPath = ref.getPath();
-                if (originalPath.contains("//"))
-                {
-                    String newPath = originalPath.replaceAll("/+", "/");
-                    ref.setPath(newPath);
-                }
-                return Filter.CONTINUE;
-            }
-
-        };
-        slashFilter.setNext(baseRouter);
-        
-        return slashFilter;
-    }
-    
-    // ***************
-    // IRestApiService
-    // ***************
-    
-    @Override
-    public void addRestApi(RestletRoutable routeable,
-                           Class<? extends IFloodlightService> service,
-                           IFloodlightModule module) {
-        if (log.isDebugEnabled()) {
-            log.debug("Adding REST API for service " + service.getCanonicalName());
-        }
-        restlets.add(routeable);
-        context.getAttributes().put(service.getCanonicalName(),
-                                    module);
-    }
-    
     // **************
     // Initialization
     // **************
@@ -1275,20 +1208,6 @@ public class Controller
      */
     public void run() {
         try {            
-            // Start listening for REST requests
-            final Component component = new Component();
-            component.getServers().add(Protocol.HTTP, restPort);
-            component.getDefaultHost().attach(this);
-            
-            component.start();
-
-            // Start listening for switch connections
-            //int threads = 
-            //       Runtime.getRuntime().availableProcessors() * 2 + 1;
-            //int threads = 1;
-            //long maxMem = Runtime.getRuntime().maxMemory() * 1 / 3;
-            //long memPerChannel = 2 * 1024 * 1024;
-
             final ServerBootstrap bootstrap = new ServerBootstrap(
                     new NioServerSocketChannelFactory(
                             Executors.newCachedThreadPool(),
@@ -1298,12 +1217,6 @@ public class Controller
             bootstrap.setOption("child.keepAlive", true);
             bootstrap.setOption("child.tcpNoDelay", true);
 
-            //OrderedMemoryAwareThreadPoolExecutor pipelineExecutor =
-            //        new OrderedMemoryAwareThreadPoolExecutor(
-            //                threads, memPerChannel, maxMem,
-            //                1000, TimeUnit.SECONDS,
-            //                Executors.defaultThreadFactory());
-
             ChannelPipelineFactory pfact = 
                     new OpenflowPipelineFactory(this, null);
             bootstrap.setPipelineFactory(pfact);
@@ -1355,8 +1268,6 @@ public class Controller
                                       ListenerDispatcher<OFType, 
                                                          IOFMessageListener>>();
         this.switchListeners = new CopyOnWriteArraySet<IOFSwitchListener>();
-        this.restlets = new ArrayList<RestletRoutable>();
-        this.context = getContext();
     }
     
     /**
@@ -1367,11 +1278,11 @@ public class Controller
         
         // Our internal data structures
         this.updates = new LinkedBlockingQueue<Update>();
-    
+        this.switches = new ConcurrentHashMap<Long, IOFSwitch>();
+        this.factory = new BasicFactory();
+        
         // Add the core REST API
-        restlets.add(new CoreWebRoutable());
-        context.getAttributes().put(
-                 this.getClass().getCanonicalName(), this);
+        restApi.addRestletRoutable(new CoreWebRoutable());
                 
         // Set floodlight to terminate on a storage exception
         IStorageExceptionHandler handler = 
@@ -1402,12 +1313,7 @@ public class Controller
             }
         }
         log.info("Connected to storage source");
-        
-        
-        // Init our data structures
-        this.switches = new ConcurrentHashMap<Long, IOFSwitch>();
-        this.factory = new BasicFactory();
-        
+                
         // Processing Time Warning Threshold
         ptWarningThresholdInNano = Long.parseLong(System.getProperty(
              "net.floodlightcontroller.core.PTWarningThresholdInMilli", "0")) * 1000000;
@@ -1443,7 +1349,6 @@ public class Controller
     
     @Override
     public void setCmdLineOptions(CmdLineSettings settings) {
-        this.restPort = settings.getRestPort();
         this.openFlowPort = settings.getOpenFlowPort();
     }
 }
diff --git a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java
index 4041cfdc171c28a419e751dcd43ab20a6d36b826..00cf5af9f6716ff4861ae079e664c2310dfabf89 100644
--- a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java
+++ b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleContext.java
@@ -1,8 +1,8 @@
 package net.floodlightcontroller.core.module;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
-import net.floodlightcontroller.core.IFloodlightService;
 
 /**
  * The service registry for an IFloodlightProvider.
@@ -38,4 +38,8 @@ public class FloodlightModuleContext implements IFloodlightModuleContext {
 		return (T)s;
 	}  
 
+	@Override
+	public Collection<Class<? extends IFloodlightService>> getAllServices() {
+	    return serviceMap.keySet();
+	}
  }
diff --git a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java
index a9bb2f4fbb5a85625809a64ee839c61445ed4542..840774b21bfa0567452df7fd3936d7cd898482b9 100644
--- a/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java
+++ b/src/main/java/net/floodlightcontroller/core/module/FloodlightModuleLoader.java
@@ -9,7 +9,6 @@ import java.util.Map.Entry;
 import java.util.ServiceLoader;
 import java.util.Set;
 
-import net.floodlightcontroller.core.IFloodlightService;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -23,55 +22,61 @@ public class FloodlightModuleLoader {
     protected static Logger logger = 
             LoggerFactory.getLogger(FloodlightModuleLoader.class);
 
-    protected FloodlightModuleContext floodlightModuleContext;
-    protected Map<Class<? extends IFloodlightService>,
+    protected static Map<Class<? extends IFloodlightService>,
                   Collection<IFloodlightModule>> serviceMap;
-    protected Map<IFloodlightModule,
+    protected static Map<IFloodlightModule,
                   Collection<Class<? extends 
                                    IFloodlightService>>> moduleServiceMap;
-	protected Map<String, IFloodlightModule> moduleNameMap;
+    protected static Map<String, IFloodlightModule> moduleNameMap;
+    protected static Object lock = new Object();
+    
+    protected FloodlightModuleContext floodlightModuleContext;
 	
 	public FloodlightModuleLoader() {
 	    floodlightModuleContext = new FloodlightModuleContext();
-		serviceMap = 
-		        new HashMap<Class<? extends IFloodlightService>,
-                            Collection<IFloodlightModule>>();
-		moduleServiceMap = 
-		        new HashMap<IFloodlightModule,
-                            Collection<Class<? extends 
-                                       IFloodlightService>>>();
-		moduleNameMap = new HashMap<String, IFloodlightModule>();
 	}
 	
 	/**
 	 * Finds all IFloodlightModule(s) in the classpath.
 	 */
-	protected void findAllModules() throws FloodlightModuleException {
-	    // Get all the current modules in the classpath
-        ServiceLoader<IFloodlightModule> moduleLoader
-            = ServiceLoader.load(IFloodlightModule.class);
-	    // Iterate for each module, iterate through and add it's services
-	    for (IFloodlightModule m : moduleLoader) {
-	        if (logger.isDebugEnabled()) {
-	            logger.debug("Found module " + m.getClass().getName());
-	        }
+	protected static void findAllModules() throws FloodlightModuleException {
+	    synchronized (lock) {
+	        if (serviceMap != null) return;
+	        serviceMap = 
+	                new HashMap<Class<? extends IFloodlightService>,
+	                            Collection<IFloodlightModule>>();
+	        moduleServiceMap = 
+	                new HashMap<IFloodlightModule,
+	                            Collection<Class<? extends 
+	                                       IFloodlightService>>>();
+	        moduleNameMap = new HashMap<String, IFloodlightModule>();
+	        
+	        // Get all the current modules in the classpath
+	        ServiceLoader<IFloodlightModule> moduleLoader
+	        = ServiceLoader.load(IFloodlightModule.class);
+	        // Iterate for each module, iterate through and add it's services
+	        for (IFloodlightModule m : moduleLoader) {
+	            if (logger.isDebugEnabled()) {
+	                logger.debug("Found module " + m.getClass().getName());
+	            }
 
-	        // Set up moduleNameMap
-	        moduleNameMap.put(m.getClass().getCanonicalName(), m);
+	            // Set up moduleNameMap
+	            moduleNameMap.put(m.getClass().getCanonicalName(), m);
 
-	        // Set up serviceMap
-	        Collection<Class<? extends IFloodlightService>> servs =
-	                m.getServices();
-	        if (servs != null) {
-	            moduleServiceMap.put(m, servs);
-	            for (Class<? extends IFloodlightService> s : servs) {
-	                Collection<IFloodlightModule> mods = 
-	                        serviceMap.get(s);
-	                if (mods == null) {
-	                    mods = new ArrayList<IFloodlightModule>();
-	                    serviceMap.put(s, mods);
+	            // Set up serviceMap
+	            Collection<Class<? extends IFloodlightService>> servs =
+	                    m.getModuleServices();
+	            if (servs != null) {
+	                moduleServiceMap.put(m, servs);
+	                for (Class<? extends IFloodlightService> s : servs) {
+	                    Collection<IFloodlightModule> mods = 
+	                            serviceMap.get(s);
+	                    if (mods == null) {
+	                        mods = new ArrayList<IFloodlightModule>();
+	                        serviceMap.put(s, mods);
+	                    }
+	                    mods.add(m);
 	                }
-	                mods.add(m);
 	            }
 	        }
 	    }
@@ -96,6 +101,32 @@ public class FloodlightModuleLoader {
 	    return floodlightModuleContext;
 	}
 	
+	/**
+	 * Loads modules (and their dependencies) specified in the list
+	 * @param mList The array of fully qualified module names
+	 * @return The ModuleContext containing all the loaded modules
+	 * @throws FloodlightModuleException
+	 */
+	public IFloodlightModuleContext loadModulesFromList(String[] mList) 
+            throws FloodlightModuleException {
+        logger.debug("Starting module loader");
+        findAllModules();
+        
+        Set<IFloodlightModule> moduleSet = new HashSet<IFloodlightModule>();
+        Map<Class<? extends IFloodlightService>, IFloodlightModule> moduleMap =
+                new HashMap<Class<? extends IFloodlightService>,
+                            IFloodlightModule>();
+        
+        for (String s : mList) {
+            calculateModuleDeps(moduleMap, moduleSet, s);
+        }
+        
+        initModules(moduleSet);
+        startupModules(moduleSet);
+        
+        return floodlightModuleContext;
+    }
+	
 	/**
 	 * Add a module to the set of modules to load and register its services
 	 * @param moduleMap the module map
@@ -138,7 +169,7 @@ public class FloodlightModuleLoader {
         addModule(moduleMap, moduleSet, module);
         
         Collection<Class<? extends IFloodlightService>> deps = 
-                module.getDependencies();
+                module.getModuleDependencies();
 
         if (deps != null) {
             for (Class<? extends IFloodlightService> c : deps) {
diff --git a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java
index aede7bec902df8e3ef3a1023d92fbe9a8355bdf0..003e0a119d1eeda8abc1a7ee45798e552622956f 100644
--- a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java
+++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModule.java
@@ -3,7 +3,6 @@ package net.floodlightcontroller.core.module;
 import java.util.Collection;
 import java.util.Map;
 
-import net.floodlightcontroller.core.IFloodlightService;
 
 /**
  * Defines an interface for loadable Floodlight modules.
@@ -26,7 +25,7 @@ public interface IFloodlightModule {
 	 * @return
 	 */
 	
-	public Collection<Class<? extends IFloodlightService>> getServices();
+	public Collection<Class<? extends IFloodlightService>> getModuleServices();
 	
 	/**
 	 * Instantiate (as needed) and return objects that implement each
@@ -46,7 +45,7 @@ public interface IFloodlightModule {
 	 *         on.
 	 */
 	
-	public Collection<Class<? extends IFloodlightService>> getDependencies();
+	public Collection<Class<? extends IFloodlightService>> getModuleDependencies();
 	
 	/**
 	 * This is a hook for each module to do its <em>internal</em> initialization, 
diff --git a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java
index 75bcfb1127fb29ebf19b87316b401d53e29cbae0..a22c3807201b42d6db2997e1f54f1357e0296ffb 100644
--- a/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java
+++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightModuleContext.java
@@ -1,6 +1,7 @@
 package net.floodlightcontroller.core.module;
 
-import net.floodlightcontroller.core.IFloodlightService;
+import java.util.Collection;
+
 	
 public interface IFloodlightModuleContext {	
     /**
@@ -11,4 +12,10 @@ public interface IFloodlightModuleContext {
      * or a ClassCastException was encountered.
      */
     public <T extends IFloodlightService> T getServiceImpl(Class<T> service);
+    
+    /**
+     * Returns all loaded services
+     * @return A collection of service classes that have been loaded
+     */
+    public Collection<Class<? extends IFloodlightService>> getAllServices();
 }
diff --git a/src/main/java/net/floodlightcontroller/core/IFloodlightService.java b/src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java
similarity index 86%
rename from src/main/java/net/floodlightcontroller/core/IFloodlightService.java
rename to src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java
index ccf0c3ff554bac16c9235f734e0e79ef444d4d31..8bf26cca38d3d8a8d0ec0b80f23ea19616fb8327 100644
--- a/src/main/java/net/floodlightcontroller/core/IFloodlightService.java
+++ b/src/main/java/net/floodlightcontroller/core/module/IFloodlightService.java
@@ -1,4 +1,4 @@
-package net.floodlightcontroller.core;
+package net.floodlightcontroller.core.module;
 
 /**
  * This is the base interface for any IFloodlightModule package that provides 
diff --git a/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java
index 0c880736bea5de2e5c4bcc72bfb34005acb367b0..f8509d9223e38b3f689edeb16d1be576e50a8c69 100644
--- a/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/AllSwitchStatisticsResource.java
@@ -80,7 +80,9 @@ public class AllSwitchStatisticsResource extends SwitchResourceBase {
             return model;
         }
         
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();        
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());        
         Long[] switchDpids = floodlightProvider.getSwitches().keySet().toArray(new Long[0]);
         List<GetConcurrentStatsThread> activeThreads = new ArrayList<GetConcurrentStatsThread>(switchDpids.length);
         List<GetConcurrentStatsThread> pendingRemovalThreads = new ArrayList<GetConcurrentStatsThread>();
@@ -167,7 +169,9 @@ public class AllSwitchStatisticsResource extends SwitchResourceBase {
         }
         
         public void run() {
-            IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();        
+            IFloodlightProviderService floodlightProvider = 
+                    (IFloodlightProviderService)getContext().getAttributes().
+                        get(IFloodlightProviderService.class.getCanonicalName());      
 
             if ((requestType == REQUESTTYPE.OFSTATS) && (statType != null)) {
                 switchReply = getSwitchStatistics(switchId, statType);
diff --git a/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java b/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java
index 026382a6c5506102e5977e48f107cdb976258787..c8f74860e7369ecb789be974bc3343ba86afcf78 100644
--- a/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/ControllerSwitchesResource.java
@@ -35,9 +35,10 @@ import org.restlet.resource.ServerResource;
 public class ControllerSwitchesResource extends ServerResource {
     @Get("json")
     public List<Map<String, String>> retrieve() {
-        List<Map<String, String>> switchIds = new ArrayList<Map<String, String>>();        
-
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        List<Map<String, String>> switchIds = new ArrayList<Map<String, String>>();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         Map<Long, IOFSwitch> switches = floodlightProvider.getSwitches();
 
         for (IOFSwitch s: switches.values()) {
diff --git a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
index d5ac8cfae64a2b8b0a1cddd082d7a475cf81ba7b..4f10f5e323aec7b376ce0542a97c962f7837a38f 100644
--- a/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/core/web/CoreWebRoutable.java
@@ -17,6 +17,8 @@
 
 package net.floodlightcontroller.core.web;
 
+import net.floodlightcontroller.restserver.RestletRoutable;
+
 import org.restlet.Context;
 import org.restlet.Restlet;
 import org.restlet.routing.Router;
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java
index 2b81663431032116432548aece7a5536e362502b..8ac83ce8f1a6aa3843a0f023fb0550d6cf2c99f2 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchClustersResource.java
@@ -36,7 +36,9 @@ import org.restlet.resource.ServerResource;
 public class SwitchClustersResource extends ServerResource {
     @Get("json")
     public Map<String, List<String>> retrieve() {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         Map<String, List<String>> switchClusterMap = new HashMap<String, List<String>>();
         for (Entry<Long, IOFSwitch> entry : floodlightProvider.getSwitches().entrySet()) {
             Long clusterDpid = entry.getValue().getSwitchClusterId();
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java
index 39d5db5791a1d6c5d01aaa47a664c35f45d16dd0..f14d7062eb658f334f8b11108c5f9dfe6d5e20af 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterCategoriesResource.java
@@ -37,7 +37,9 @@ import net.floodlightcontroller.counter.ICounterStoreService;
 public class SwitchCounterCategoriesResource extends CounterResourceBase {
     @Get("json")
     public Map<String, Object> retrieve() {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         HashMap<String,Object> model = new HashMap<String,Object>();
         
         String switchID = (String) getRequestAttributes().get("switchId");
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java
index e9625fca3d88434f554415489524ca4e142f5313..0af59c42fa5fdb8eb46bcc66cf48395ec90a7383 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchCounterResource.java
@@ -36,7 +36,9 @@ import net.floodlightcontroller.counter.ICounterStoreService;
 public class SwitchCounterResource extends CounterResourceBase {
     @Get("json")
     public Map<String, Object> retrieve() {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         HashMap<String,Object> model = new HashMap<String,Object>();
         
         String switchID = (String) getRequestAttributes().get("switchId");
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
index 3ac4e1e43429695231433e324d07861399373171..baf4ad6e1a8bfc525aa092a9413b3008986e85b1 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchResourceBase.java
@@ -66,7 +66,9 @@ public class SwitchResourceBase extends ServerResource {
     }
     
     protected List<OFStatistics> getSwitchStatistics(long switchId, OFStatisticsType statType) {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         
         IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
         Future<List<OFStatistics>> future;
@@ -132,7 +134,9 @@ public class SwitchResourceBase extends ServerResource {
      * @return A list of switch table entries
      */
     protected List<Map<String, Object>> getSwitchTableJson(long switchId) {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
 
         IOFSwitch sw = floodlightProvider.getSwitches().get(switchId);
         List<Map<String, Object>> switchTableJson = null;
diff --git a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
index 42e5feafe7c90d808f832a0c443105b05be0e165..41c779ba9d1e5641adf6552e613c2202d5097747 100644
--- a/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
+++ b/src/main/java/net/floodlightcontroller/core/web/SwitchStatisticsResource.java
@@ -42,7 +42,9 @@ public class SwitchStatisticsResource extends SwitchResourceBase {
 
     @Get("json")
     public Map<String, Object> retrieve() {
-        IFloodlightProviderService floodlightProvider = (IFloodlightProviderService)getApplication();
+        IFloodlightProviderService floodlightProvider = 
+                (IFloodlightProviderService)getContext().getAttributes().
+                    get(IFloodlightProviderService.class.getCanonicalName());
         
         HashMap<String,Object> result = new HashMap<String,Object>();
         List<OFStatistics> values = null;
diff --git a/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java b/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java
index 3303198f75e5b0fe658c1cad1d6bbd19bc4d7af2..86e71f8d695f148ff38e7415eb9bca2822d9007e 100644
--- a/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java
+++ b/src/main/java/net/floodlightcontroller/counter/ICounterStoreService.java
@@ -3,7 +3,7 @@ package net.floodlightcontroller.counter;
 import java.util.List;
 import java.util.Map;
 
-import net.floodlightcontroller.core.IFloodlightService;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.counter.CounterStore.NetworkLayer;
 
 public interface ICounterStoreService extends IFloodlightService {
diff --git a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java
index 184a289a7324330dc56e42c34334d9f13b388448..effeae4b0da47b46db5b05b36d6361992799fbf0 100755
--- a/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/IDeviceManagerService.java
@@ -25,7 +25,7 @@ package net.floodlightcontroller.devicemanager;
 
 import java.util.List;
 
-import net.floodlightcontroller.core.IFloodlightService;
+import net.floodlightcontroller.core.module.IFloodlightService;
 
 /**
  * Used to interact with DeviceManager implementations
diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
index 2ddc0772db0d51e39099231fa3196469cbb95827..e9cac3dcb721c8451c999bce30f50d74465fe027 100755
--- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
@@ -41,13 +41,13 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFMessageListener;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.IOFSwitchListener;
 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.core.util.SingletonTask;
 import net.floodlightcontroller.devicemanager.Device;
 import net.floodlightcontroller.devicemanager.DeviceAttachmentPoint;
@@ -1928,7 +1928,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
     // IFloodlightModule methods
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IDeviceManagerService.class);
@@ -1948,7 +1948,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IFloodlightProviderService.class);
@@ -1985,8 +1985,10 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
         this.evHistDevMgrPktIn =
                 new EventHistory<OFMatch>("Pakcet-In");
         
-        // Register to get updates from topology
-        topology.addListener(this);
+        if (topology != null) {
+            // Register to get updates from topology
+            topology.addListener(this);
+        }
         
         // Create our database tables
         storageSource.createTable(DEVICE_TABLE_NAME, null);
diff --git a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
index 76d165fd58b6d47a10282c64a526929f3f206912..12908996af83f898ef890376743833f19c0beec9 100644
--- a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java
@@ -26,11 +26,11 @@ import java.util.Map;
 
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
 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.counter.ICounterStoreService;
 import net.floodlightcontroller.devicemanager.Device;
 import net.floodlightcontroller.devicemanager.DeviceAttachmentPoint;
@@ -258,7 +258,7 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule {
     // IFloodlightModule methods
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         // We don't export any services
         return null;
     }
@@ -271,7 +271,7 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule {
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IFloodlightProviderService.class);
diff --git a/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java b/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java
index 9da9e5a41398df14550e72121ce091615095413a..b6bf1dd9e8349e3810b818532715a54f6eed1778 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/IPktInProcessingTimeService.java
@@ -1,6 +1,6 @@
 package net.floodlightcontroller.perfmon;
 
-import net.floodlightcontroller.core.IFloodlightService;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.perfmon.PktInProcessingTime.CircularTimeBucketSet;
 import net.floodlightcontroller.perfmon.PktInProcessingTime.PerfMonConfigs;
 
diff --git a/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java b/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java
index 26ee0bdab3f01fd468edafb0c4190ec07c64bcbf..773ba2e469392c9b42382bfc9035f5935616c7cb 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/PktinProcessingTime.java
@@ -8,11 +8,11 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFMessageListener.FlListenerID;
 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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -433,7 +433,7 @@ public class PktInProcessingTime
     // IFloodlightModule methods
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IPktInProcessingTimeService.class);
@@ -453,7 +453,7 @@ public class PktInProcessingTime
     }
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         // We don't have any dependencies
         return null;
     }
diff --git a/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java b/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java
new file mode 100644
index 0000000000000000000000000000000000000000..d90679580e0adfbc645368dac58c179ef1490846
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/restserver/IRestApiService.java
@@ -0,0 +1,16 @@
+package net.floodlightcontroller.restserver;
+
+import net.floodlightcontroller.core.module.IFloodlightService;
+
+public interface IRestApiService extends IFloodlightService {
+    /**
+     * Adds a REST API
+     * @param routeable
+     */
+    public void addRestletRoutable(RestletRoutable routable);
+
+    /**
+     * Runs the REST API server
+     */
+    public void run();
+}
diff --git a/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..0886fdfc0acc1365c61fc8c3748503d75243c9ed
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java
@@ -0,0 +1,157 @@
+package net.floodlightcontroller.restserver;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.restlet.Application;
+import org.restlet.Component;
+import org.restlet.Context;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.Restlet;
+import org.restlet.data.Protocol;
+import org.restlet.data.Reference;
+import org.restlet.routing.Filter;
+import org.restlet.routing.Router;
+import org.restlet.routing.Template;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+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.core.web.JacksonCustomConverter;
+
+public class RestApiServer
+    implements IFloodlightModule, IRestApiService {
+    protected static Logger logger = LoggerFactory.getLogger(RestApiServer.class);
+    protected List<RestletRoutable> restlets;
+    protected int restPort = 8080;
+    protected FloodlightModuleContext fmlContext;
+    
+    // ***********
+    // Application
+    // ***********
+    
+    protected class RestApplication extends Application {
+        protected Context context;
+        
+        public RestApplication() {
+            super(new Context());
+            this.context = getContext();
+        }
+        
+        @Override
+        public Restlet createInboundRoot() {
+            Router baseRouter = new Router(context);
+            baseRouter.setDefaultMatchingMode(Template.MODE_STARTS_WITH);
+            for (RestletRoutable rr : restlets) {
+                baseRouter.attach(rr.basePath(), rr.getRestlet(context));
+            }
+
+            Filter slashFilter = new Filter() {            
+                @Override
+                protected int beforeHandle(Request request, Response response) {
+                    Reference ref = request.getResourceRef();
+                    String originalPath = ref.getPath();
+                    if (originalPath.contains("//"))
+                    {
+                        String newPath = originalPath.replaceAll("/+", "/");
+                        ref.setPath(newPath);
+                    }
+                    return Filter.CONTINUE;
+                }
+
+            };
+            slashFilter.setNext(baseRouter);
+            
+            return slashFilter;
+        }
+        
+        public void run(FloodlightModuleContext fmlContext) {
+            // Add everything in the module context to the rest
+            for (Class<? extends IFloodlightService> s : fmlContext.getAllServices()) {
+                context.getAttributes().put(s.getCanonicalName(), 
+                                            fmlContext.getServiceImpl(s));
+            }
+            
+            // Use our custom serializers
+            JacksonCustomConverter.replaceConverter();
+            
+            // Start listening for REST requests
+            try {
+                final Component component = new Component();
+                component.getServers().add(Protocol.HTTP, restPort);
+                component.getDefaultHost().attach(this);
+                component.start();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+    
+    // ***************
+    // IRestApiService
+    // ***************
+    
+    @Override
+    public void addRestletRoutable(RestletRoutable routable) {
+        if (logger.isDebugEnabled()) {
+            logger.debug("Adding REST API routable " 
+                    + routable.getClass().getCanonicalName());
+        }
+        restlets.add(routable);
+    }
+    
+    @Override
+    public void run() {
+        RestApplication restApp = new RestApplication();
+        restApp.run(fmlContext);
+    }
+    
+    // *****************
+    // IFloodlightModule
+    // *****************
+    
+    @Override
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
+        Collection<Class<? extends IFloodlightService>> services =
+                new ArrayList<Class<? extends IFloodlightService>>(1);
+        services.add(IRestApiService.class);
+        return services;
+    }
+
+    @Override
+    public Map<Class<? extends IFloodlightService>, IFloodlightService>
+            getServiceImpls() {
+        Map<Class<? extends IFloodlightService>,
+        IFloodlightService> m = 
+            new HashMap<Class<? extends IFloodlightService>,
+                        IFloodlightService>();
+        m.put(IRestApiService.class, this);
+        return m;
+    }
+
+    @Override
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
+        // We don't have any
+        return null;
+    }
+
+    @Override
+    public void init(FloodlightModuleContext context)
+            throws FloodlightModuleException {
+        // This has to be done here since we don't know what order the
+        // startUp methods will be called
+        this.restlets = new ArrayList<RestletRoutable>();
+    }
+
+    @Override
+    public void startUp(FloodlightModuleContext fmlContext) {
+        this.fmlContext = fmlContext;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java b/src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java
similarity index 96%
rename from src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java
rename to src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java
index a0dd751dad4a9b577d80a090dee2528f7919a339..cb7dfce8c26e8aa7eb83a1e6f2cc688345d564ff 100644
--- a/src/main/java/net/floodlightcontroller/core/web/RestletRoutable.java
+++ b/src/main/java/net/floodlightcontroller/restserver/RestletRoutable.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package net.floodlightcontroller.core.web;
+package net.floodlightcontroller.restserver;
 
 import org.restlet.Context;
 import org.restlet.Restlet;
diff --git a/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java b/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java
index 1b5e857f590827000e1fcc63267dd31557b14992..768d242646b8122a0cc2264d4a6723d18184722a 100644
--- a/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java
+++ b/src/main/java/net/floodlightcontroller/routing/IRoutingEngineService.java
@@ -17,8 +17,8 @@
 
 package net.floodlightcontroller.routing;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.routing.Route;
 
 /**
diff --git a/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java b/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java
index fcf2a463fafca9ca198e0e66c9997dd869828561..887fdf666ebe26976301d14b29578e083b5ec0a6 100644
--- a/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java
+++ b/src/main/java/net/floodlightcontroller/routing/dijkstra/RoutingImpl.java
@@ -32,11 +32,11 @@ import org.openflow.protocol.OFPhysicalPort.OFPortState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
 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.routing.BroadcastTree;
 import net.floodlightcontroller.routing.IRoutingEngineService;
 import net.floodlightcontroller.routing.Link;
@@ -329,7 +329,7 @@ public class RoutingImpl
     // IFloodlightModule
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IRoutingEngineService.class);
@@ -349,7 +349,7 @@ public class RoutingImpl
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(ITopologyService.class);
diff --git a/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java b/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java
index e24c7b9cca5ef91324905df725346df6b667915a..4d3e572d802b4d19e1e1f3fce50275d9b64158d9 100644
--- a/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java
+++ b/src/main/java/net/floodlightcontroller/staticflowentry/IStaticFlowEntryPusherService.java
@@ -20,8 +20,9 @@ package net.floodlightcontroller.staticflowentry;
 import java.util.HashMap;
 import java.util.List;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.module.IFloodlightService;
+
 import org.openflow.protocol.OFFlowMod;
 
 /**
diff --git a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
index 32a4f0178da0bc4da9f7d1cca0ea64bbe318d3e0..84e719c0e759d6388e14d57463eae133e8cd0f93 100644
--- a/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
+++ b/src/main/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusher.java
@@ -34,12 +34,12 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.IOFSwitchListener;
 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 org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.JsonParser;
@@ -615,7 +615,7 @@ public class StaticFlowEntryPusher
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IStaticFlowEntryPusherService.class);
@@ -635,7 +635,7 @@ public class StaticFlowEntryPusher
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IFloodlightProviderService.class);
diff --git a/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java b/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java
index 460b0a0b422a85495262db68643de5fb3bb35df2..f3a57cb3f58a9518e8394a4ac538644920b4e179 100644
--- a/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java
+++ b/src/main/java/net/floodlightcontroller/storage/IStorageSourceService.java
@@ -22,7 +22,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Future;
 
-import net.floodlightcontroller.core.IFloodlightService;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.perfmon.IPktInProcessingTimeService;
 
 public interface IStorageSourceService extends IFloodlightService {
diff --git a/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java b/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java
index 955b62d7b83d527699db5f495ebc6766ca5bbec4..493570ce774f08161ea99e5cc9a412060b8dd9de 100644
--- a/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java
+++ b/src/main/java/net/floodlightcontroller/storage/memory/MemoryStorageSource.java
@@ -17,9 +17,9 @@
 
 package net.floodlightcontroller.storage.memory;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
+import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.perfmon.IPktInProcessingTimeService;
 import net.floodlightcontroller.storage.nosql.NoSqlStorageSource;
 import net.floodlightcontroller.storage.IStorageSourceService;
@@ -180,7 +180,7 @@ public class MemoryStorageSource extends NoSqlStorageSource {
     // IFloodlightModule methods
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IStorageSourceService.class);
@@ -199,7 +199,7 @@ public class MemoryStorageSource extends NoSqlStorageSource {
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         // we don't have any depedencies
         return null;
     }
diff --git a/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java b/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java
index 39e2bbe8204c69ca08f59a216c8de0d98a8283c3..fcfa96f40d6b0e27271f48b9a91524d5b6a52a0e 100644
--- a/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java
+++ b/src/main/java/net/floodlightcontroller/storage/web/StorageNotifyResource.java
@@ -43,7 +43,8 @@ public class StorageNotifyResource extends ServerResource {
                     new TypeReference<List<StorageSourceNotification>>(){});
         
         IStorageSourceService storageSource = 
-            (IStorageSourceService)getContext().getAttributes().get("storageSource");
+            (IStorageSourceService)getContext().getAttributes().
+                get(IStorageSourceService.class.getCanonicalName());
         storageSource.notifyListeners(notifications);
         
         HashMap<String, Object> model = new HashMap<String,Object>();
diff --git a/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java b/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java
index 8f25d914b10f303f543bac5c83301d1579291e58..681847d8fa1013ef1a39c299ba2a03f8e710d6b1 100644
--- a/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/storage/web/StorageWebRoutable.java
@@ -21,7 +21,7 @@ import org.restlet.Context;
 import org.restlet.Restlet;
 import org.restlet.routing.Router;
 
-import net.floodlightcontroller.core.web.RestletRoutable;
+import net.floodlightcontroller.restserver.RestletRoutable;
 
 /**
  * Creates a router to handle the storage web URIs
diff --git a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
index 1ac0faa68154d6fe92f5d72c97deeef590415505..849cfaff37ff4d5a0adba06cd5befa6b05cda3e3 100644
--- a/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
+++ b/src/main/java/net/floodlightcontroller/topology/ITopologyService.java
@@ -26,8 +26,8 @@ package net.floodlightcontroller.topology;
 import java.util.Map;
 import java.util.Set;
 
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.module.IFloodlightService;
 
 /**
  *
diff --git a/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java b/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java
index cb97a3b745b4294a61371a76a98b5594105b99ce..5dc733baa4c8636a8bf47372256db8add48c5007 100644
--- a/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java
+++ b/src/main/java/net/floodlightcontroller/topology/internal/TopologyImpl.java
@@ -36,19 +36,19 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IFloodlightService;
 import net.floodlightcontroller.core.IOFMessageListener;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.IOFSwitchListener;
-import net.floodlightcontroller.core.IRestApiService;
 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.core.util.SingletonTask;
 import net.floodlightcontroller.packet.BPDU;
 import net.floodlightcontroller.packet.Ethernet;
 import net.floodlightcontroller.packet.LLDP;
 import net.floodlightcontroller.packet.LLDPTLV;
+import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.routing.BroadcastTree;
 import net.floodlightcontroller.routing.IRoutingEngineService;
 import net.floodlightcontroller.storage.IResultSet;
@@ -1350,7 +1350,7 @@ public class TopologyImpl
     // IFloodlightModule classes
     
     @Override
-    public Collection<Class<? extends IFloodlightService>> getServices() {
+    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(ITopologyService.class);
@@ -1370,7 +1370,7 @@ public class TopologyImpl
     }
 
     @Override
-    public Collection<Class<? extends IFloodlightService>> getDependencies() {
+    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
         Collection<Class<? extends IFloodlightService>> l = 
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(IFloodlightProviderService.class);
@@ -1484,6 +1484,10 @@ public class TopologyImpl
         floodlightProvider.addOFSwitchListener(this);
         
         // init our rest api
-        restApi.addRestApi(new TopologyWebRoutable(), ITopologyService.class, this);
+        if (restApi != null) {
+            restApi.addRestletRoutable(new TopologyWebRoutable());
+        } else {
+            log.error("Could not instantiate REST API");
+        }
     }
 }
diff --git a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
index 81749f577e925f204391ef414da0ce5fe6adee56..fa918c450dbe250d973861db226afa8f26f5ac06 100644
--- a/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
+++ b/src/main/java/net/floodlightcontroller/topology/web/TopologyWebRoutable.java
@@ -4,8 +4,8 @@ import org.restlet.Context;
 import org.restlet.Restlet;
 import org.restlet.routing.Router;
 
-import net.floodlightcontroller.core.web.RestletRoutable;
 import net.floodlightcontroller.core.web.SwitchClustersResource;
+import net.floodlightcontroller.restserver.RestletRoutable;
 
 public class TopologyWebRoutable implements RestletRoutable {
     /**
diff --git a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
index 2ca28981fde23a4559cb87c38ef39568d9bfc430..953caf4c81164457d9d1db5c8762b73211b155c8 100644
--- a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
+++ b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java
@@ -31,10 +31,14 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import net.floodlightcontroller.core.FloodlightContext;
 import net.floodlightcontroller.core.IFloodlightProviderService;
+import net.floodlightcontroller.core.IOFMessageFilterManagerService;
 import net.floodlightcontroller.core.IOFMessageListener;
 import net.floodlightcontroller.core.IOFMessageListener.Command;
 import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.OFMessageFilterManager;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.core.module.FloodlightModuleLoader;
+import net.floodlightcontroller.core.module.IFloodlightModuleContext;
 import net.floodlightcontroller.core.test.MockFloodlightProvider;
 import net.floodlightcontroller.packet.ARP;
 import net.floodlightcontroller.packet.Ethernet;
@@ -67,11 +71,14 @@ public class ControllerTest extends FloodlightTestCase {
     private Controller controller;
 
     @Override
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
-
-        controller = new Controller();
-        controller.init();
+        FloodlightModuleLoader fml = new FloodlightModuleLoader();
+        IFloodlightModuleContext moduleContext = fml.loadModulesFromList(
+            new String[]  {"net.floodlightcontroller.core.CoreModule"});
+        controller = 
+            (Controller) moduleContext.
+                getServiceImpl(IFloodlightProviderService.class);
     }
 
     public Controller getController() {
@@ -281,13 +288,16 @@ public class ControllerTest extends FloodlightTestCase {
 
     @Test
     public void testMessageFilterManager() throws Exception {
-
-        MockFloodlightProvider mbp = new MockFloodlightProvider();
+        FloodlightModuleContext fmCntx = new FloodlightModuleContext();
+        MockFloodlightProvider mfp = new MockFloodlightProvider();
+        OFMessageFilterManager mfm = new OFMessageFilterManager();
+        fmCntx.addService(IOFMessageFilterManagerService.class, mfm);
+        fmCntx.addService(IFloodlightProviderService.class, mfp);
         String sid = null;
 
-        OFMessageFilterManager mfm = new OFMessageFilterManager();
-        mfm.init(mbp);
-        mfm.startUp();
+        
+        mfm.init(fmCntx);
+        mfm.startUp(fmCntx);
 
         ConcurrentHashMap <String, String> filter;
         int i;
@@ -361,15 +371,15 @@ public class ControllerTest extends FloodlightTestCase {
         List <IOFMessageListener> lm; 
 
         // Check to see if all the listeners are active.
-        lm = mbp.getListeners().get(OFType.PACKET_OUT);
+        lm = mfp.getListeners().get(OFType.PACKET_OUT);
         assertTrue(lm.size() == 1);
         assertTrue(lm.get(0).equals(mfm));
 
-        lm = mbp.getListeners().get(OFType.FLOW_MOD);
+        lm = mfp.getListeners().get(OFType.FLOW_MOD);
         assertTrue(lm.size() == 1);
         assertTrue(lm.get(0).equals(mfm));
 
-        lm = mbp.getListeners().get(OFType.PACKET_IN);
+        lm = mfp.getListeners().get(OFType.PACKET_IN);
         assertTrue(lm.size() == 1);
         assertTrue(lm.get(0).equals(mfm));
 
diff --git a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
index 2c6e86c43f853237c7be16dab0e6acd852a351dc..df1d29e1a44d44092f793bcf0f05e430c70396c0 100644
--- a/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
+++ b/src/test/java/net/floodlightcontroller/core/test/MockFloodlightProvider.java
@@ -32,6 +32,7 @@ import net.floodlightcontroller.core.IOFSwitch;
 import net.floodlightcontroller.core.IOFSwitchFilter;
 import net.floodlightcontroller.core.IOFSwitchListener;
 import net.floodlightcontroller.core.IOFMessageListener.Command;
+import net.floodlightcontroller.core.internal.CmdLineSettings;
 import net.floodlightcontroller.packet.Ethernet;
 
 import org.openflow.protocol.OFMessage;
@@ -194,4 +195,14 @@ public class MockFloodlightProvider implements IFloodlightProviderService {
     public BasicFactory getOFMessageFactory() {
         return factory;
     }
+
+    @Override
+    public void run() {
+        // no-op
+    }
+
+    @Override
+    public void setCmdLineOptions(CmdLineSettings settings) {
+        // no-op
+    }
 }
diff --git a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java
index f8aacabe0f1dbb09af9be96d852eaa5aa1a87043..50d11bfc5979e850e6fc37088a71e53e97680599 100644
--- a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java
+++ b/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImplTest.java
@@ -61,13 +61,14 @@ public class DeviceManagerImplTest extends FloodlightTestCase {
     DeviceManagerImpl deviceManager;
     
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
 
         mockFloodlightProvider = getMockFloodlightProvider();
         deviceManager = new DeviceManagerImpl();
         deviceManager.setFloodlightProvider(mockFloodlightProvider);
-        deviceManager.setStorageSource(new MemoryStorageSource());
+        deviceManager.storageSource = new MemoryStorageSource();
+        deviceManager.startUp(null);
         //deviceManager.startUp();
         
         // Build our test packet
diff --git a/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java b/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java
index 13b3ab675fa579440fec0c36dcaac8941990eb00..31ba67ad93417e4c90dfe3f36b5f87181e0f91f5 100644
--- a/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java
+++ b/src/test/java/net/floodlightcontroller/devicemanager/test/MockDeviceManager.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import net.floodlightcontroller.devicemanager.Device;
+import net.floodlightcontroller.devicemanager.IDeviceManagerAware;
 import net.floodlightcontroller.devicemanager.IDeviceManagerService;
 import net.floodlightcontroller.packet.Ethernet;
 
@@ -92,4 +93,10 @@ public class MockDeviceManager implements IDeviceManagerService {
         }
         return devices;
     }
+
+    @Override
+    public void addListener(IDeviceManagerAware listener) {
+        // TODO Auto-generated method stub
+        
+    }
 }
diff --git a/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java b/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java
index 28dcbe70b124ceac9b1b2011124386f947f44fff..9c71bb084b2ba99aa7fd938838ed5a2a13bd01ad 100644
--- a/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java
+++ b/src/test/java/net/floodlightcontroller/forwarding/ForwardingTest.java
@@ -81,7 +81,7 @@ public class ForwardingTest extends FloodlightTestCase {
     protected Date currentDate;
     
     @Override
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
 
         // Mock context
diff --git a/src/test/java/net/floodlightcontroller/hub/HubTest.java b/src/test/java/net/floodlightcontroller/hub/HubTest.java
index 6311b2518e067349f215be66b6775adb375739f1..b4a215cd066a7772fc669683dba47aedeb8e7bca 100644
--- a/src/test/java/net/floodlightcontroller/hub/HubTest.java
+++ b/src/test/java/net/floodlightcontroller/hub/HubTest.java
@@ -60,7 +60,7 @@ public class HubTest extends FloodlightTestCase {
     private Hub hub;
     
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
 
         mockFloodlightProvider = getMockFloodlightProvider();
diff --git a/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java b/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java
index ecbb4d2a2991a54a25276e3ee19c133e27b06bdc..613f8990dacbf0e965b9426b39cebd5b144cf9cd 100644
--- a/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java
+++ b/src/test/java/net/floodlightcontroller/learningswitch/LearningSwitchTest.java
@@ -63,7 +63,7 @@ public class LearningSwitchTest extends FloodlightTestCase {
     private LearningSwitch learningSwitch;
     
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
 
         mockFloodlightProvider = getMockFloodlightProvider();
diff --git a/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java b/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java
index addc9e5555c25e1a2dd8e7e87e1523b76987734b..cc9d82a49708862ce66a6ec7160ba72216970201 100644
--- a/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java
+++ b/src/test/java/net/floodlightcontroller/staticflowentry/StaticFlowEntryPusherTest.java
@@ -27,9 +27,10 @@ import org.openflow.util.HexString;
 public class StaticFlowEntryPusherTest extends FloodlightTestCase {
     String flowMod1, flowMod2;
     static String TestSwitch1DPID = "00:00:00:00:00:00:00:01";
+    StaticFlowEntryPusher staticFlowEntryPusher;
     
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
         flowMod1 = "{\"switch\": \"00:00:00:00:00:00:00:01\", " +
                    "\"name\": \"flow-mod-1\", " +
@@ -46,11 +47,15 @@ public class StaticFlowEntryPusherTest extends FloodlightTestCase {
                    "\"ingress-port\": \"2\"," +
                    "\"active\": \"true\", " +
                    "\"actions\": \"output=3\"}";
-    }
+
+        staticFlowEntryPusher = new StaticFlowEntryPusher();
+        staticFlowEntryPusher.floodlightProvider = 
+                getMockFloodlightProvider();
+        staticFlowEntryPusher.startUp(null);
+}
     
     @Test
     public void testAddAndRemoveEntries() throws Exception {
-        StaticFlowEntryPusher staticFlowEntryPusher = new StaticFlowEntryPusher();
         IOFSwitch mockSwitch = createMock(IOFSwitch.class);
         long dpid = HexString.toLong(TestSwitch1DPID);
         Capture<OFMessage> writeCapture = new Capture<OFMessage>(CaptureType.ALL);
diff --git a/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java b/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java
index 9e8d7c0a82b0f0afe484804208a00d795a93f678..a0f79f1aa183673cf8125a749667626760c35a72 100644
--- a/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java
+++ b/src/test/java/net/floodlightcontroller/storage/memory/tests/MemoryStorageTest.java
@@ -24,7 +24,7 @@ import org.junit.Before;
 public class MemoryStorageTest extends StorageTest {
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         storageSource = new MemoryStorageSource();
         super.setUp();
     }
diff --git a/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java b/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java
index 16056d3cbe0ea8a4aba542ddd9e58c26dc486279..2aa44bd120449e4f3daf2d8ea51dd0f99ad10e38 100644
--- a/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java
+++ b/src/test/java/net/floodlightcontroller/storage/tests/StorageTest.java
@@ -139,7 +139,7 @@ public abstract class StorageTest extends FloodlightTestCase {
         }
     }
     
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
         IPktInProcessingTimeService pktinProcessingTime = new PktInProcessingTime();
         storageSource.setPktinProcessingTime(pktinProcessingTime);
diff --git a/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java b/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java
index 23d649a93cf639e98981c7a74a10421eecf90052..d0fc5c48abcab71dc69512bd74fec22e4573058b 100644
--- a/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java
+++ b/src/test/java/net/floodlightcontroller/test/FloodlightTestCase.java
@@ -64,7 +64,7 @@ public class FloodlightTestCase extends TestCase {
     }
     
     @Override
-    public void setUp() {
+    public void setUp() throws Exception {
         mockFloodlightProvider = new MockFloodlightProvider();
     }
  
diff --git a/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java b/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java
index 8bec5d93fe6882bffab0b44c688c111d8600aad2..bccbcb7a5de118382aad7d8dc6c3074e401dacbc 100644
--- a/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java
+++ b/src/test/java/net/floodlightcontroller/topology/internal/TopologyImplTest.java
@@ -35,10 +35,13 @@ import org.openflow.protocol.OFPortStatus;
 import org.openflow.protocol.OFPhysicalPort;
 
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.module.FloodlightModuleContext;
+import net.floodlightcontroller.routing.IRoutingEngineService;
 import net.floodlightcontroller.routing.dijkstra.RoutingImpl;
 import net.floodlightcontroller.storage.memory.MemoryStorageSource;
 import net.floodlightcontroller.test.FloodlightTestCase;
 import net.floodlightcontroller.topology.ITopologyListener;
+import net.floodlightcontroller.topology.ITopologyService;
 import net.floodlightcontroller.topology.LinkInfo;
 import net.floodlightcontroller.topology.LinkTuple;
 
@@ -60,17 +63,20 @@ public class TopologyImplTest extends FloodlightTestCase {
     }
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         super.setUp();
+        FloodlightModuleContext cntx = new FloodlightModuleContext();
         topology = new TopologyImpl();
-        topology.setFloodlightProvider(getMockFloodlightProvider());
-        topology.setStorageSource(new MemoryStorageSource());
+        topology.floodlightProvider = getMockFloodlightProvider();
+        topology.storageSource = new MemoryStorageSource();
         RoutingImpl routingEngine = new RoutingImpl();
-        topology.setRoutingEngine(routingEngine);
-        HashSet<ITopologyListener> topologyAware = new HashSet<ITopologyListener>();
-        topologyAware.add(routingEngine);
-        topology.setTopologyAware(topologyAware);
-        topology.startUp();
+        topology.routingEngine = routingEngine;
+        topology.topologyAware = new HashSet<ITopologyListener>();
+        cntx.addService(IRoutingEngineService.class, routingEngine);
+        cntx.addService(ITopologyService.class, topology);
+        routingEngine.init(cntx);
+        routingEngine.startUp(cntx); // Doesn't use context
+        topology.startUp(cntx); //Topology doens't use the context here
     }
 
     @Test