diff --git a/dockernetrpc/rpc.py b/dockernetrpc/rpc.py
index c649d77..f145b53 100644
--- a/dockernetrpc/rpc.py
+++ b/dockernetrpc/rpc.py
@@ -6,47 +6,46 @@
 import mininet.log
 import logging
 import os
-import Pyro4
+import zerorpc
 
 
 class RemoteMininetNetwork(object):
 
     def __init__(self):
-        mininet.log.setLogLevel( 'debug' )
+        # set mininet loglevel
+        mininet.log.setLogLevel( 'info' )
         self.net = Mininet( controller=Controller )
         self.net.addController( 'c0' )
 
-    def start(self):
+    def start_net(self):
         self.net.start()
 
     def CLI(self):
         CLI(self.net)
 
-    def stop(self):
+    def stop_net(self):
         try:
             self.net.stop()
         except Exception as e:
             print e
 
+    def addHost(self, name, ip=None):
+        return str(self.net.addHost(name, ip=ip))
 
-    def addHost(self, name, cls=None, **params):
-        return str(self.net.addHost(name, cls=cls, **params))
+    def addDocker(self, name, dimage, ip):
+        return str(self.net.addDocker(name, dimage=dimage, ip=ip))
 
-    def addDocker(self, name, **params):
-        return str(self.net.addDocker(name, **params))
-
-    def addSwitch(self, name, **params):
+    def addSwitch(self, name):
         # we have to use OVSSwitch to be able to do link attachments
         # at runtime (switch.attach) method
-        return str(self.net.addSwitch(name, cls=OVSSwitch, **params))
+        return str(self.net.addSwitch(name, cls=OVSSwitch))
 
-    def addLink(self, node1, node2, port1=None, port2=None,
-                cls=None, **params):
+    def addLink(self, node1, node2, port1=None, port2=None):
         return str(self.net.addLink(node1, node2,
-                                    port1, port2, cls=cls, **params))
+                                    port1, port2))
 
-    def removeHost(self, name, **params):
-        return self.net.removeHost(name, **params)
+    def removeHost(self, name):
+        return self.net.removeHost(name)
 
     def removeLink(self, link=None, node1=None, node2=None):
         n1, n2 = self.net.get(node1), self.net.get(node2)
@@ -54,15 +53,6 @@
 
 
 def start_server():
-    daemon = Pyro4.Daemon()
-    # ATTENTION:
-    # we need a PyroNS instance to be running: pyro4-ns (in new terminal)
-    ns = Pyro4.locateNS()
-    uri = daemon.register(RemoteMininetNetwork())
-    # map object URI to a nice name
-    ns.register("remote.mininet", uri)
-
-    logging.info("Server URI is: %s", uri)
-
-    # Start the server...
-    daemon.requestLoop()
+    s = zerorpc.Server(RemoteMininetNetwork())
+    s.bind("tcp://0.0.0.0:4242")
+    s.run()
