diff --git a/python/tools/benchmark.py b/python/tools/benchmark.py
index c5461ddf5227ef8c223f313d37ce557c09b46a11..3f6b369da41d5d24e797c11f2d7a6b5acf9207be 100755
--- a/python/tools/benchmark.py
+++ b/python/tools/benchmark.py
@@ -11,34 +11,77 @@ from dhtnetwork import DhtNetwork
 sys.path.append('..')
 from opendht import *
 
-def start_cluster(i):
-    global procs
-    cmd = ["python3", "dhtnetwork.py", "-n", str(node_per_loc), '-I', args.ifname+str(i)+'.1']
-    if args.bootstrap:
-        cmd.extend(['-b', args.bootstrap, '-bp', "5000"])
-    else:
-        if not args.disable_ipv4 and bootstrap.ip4:
-            cmd.extend(['-b', bootstrap.ip4])
-        if not args.disable_ipv6 and bootstrap.ip6:
-            cmd.extend(['-b6', bootstrap.ip6])
-    procs[i] = NSPopen('node'+str(i), cmd)
-    #plt.pause(2)
-
-def stop_cluster(i):
-    global procs
-    if procs[i]:
-        try:
-            procs[i].send_signal(signal.SIGINT);
-            procs[i].wait()
-            procs[i].release()
-        except Exception as e:
-            print(e)
-        procs[i] = None
-
-def replace_cluster():
-    n = random.randrange(0, clusters)
-    stop_cluster(n)
-    start_cluster(n)
+class WorkBench():
+    """docstring for WorkBench"""
+    def __init__(self, ifname='ethdht', virtual_locs=8, node_num=32, remote_bootstrap=None, loss=0, delay=0, disable_ipv4=False,
+            disable_ipv6=False):
+        self.ifname       = ifname
+        self.virtual_locs = virtual_locs
+        self.node_num     = node_num
+        self.clusters     = min(virtual_locs, node_num)
+        self.node_per_loc = int(self.node_num / self.clusters)
+        self.loss         = loss
+        self.delay        = delay
+        self.disable_ipv4 = disable_ipv4
+        self.disable_ipv6 = disable_ipv6
+
+        self.remote_bootstrap = remote_bootstrap
+        self.local_bootstrap  = None
+        self.procs            = [None for _ in range(self.clusters)]
+
+    def get_bootstrap(self):
+        if not self.local_bootstrap:
+            self.local_bootstrap = DhtNetwork(iface='br'+self.ifname,
+                    first_bootstrap=False if self.remote_bootstrap else True,
+                    bootstrap=[(self.remote_bootstrap, "5000")] if self.remote_bootstrap else [])
+        return self.local_bootstrap
+
+    def create_virtual_net(self):
+        if self.virtual_locs > 1:
+            cmd = ["python3", "virtual_network_builder.py", "-i", self.ifname, "-n", str(self.clusters), '-l', str(self.loss), '-d', str(self.delay)]
+            if not self.disable_ipv4:
+                cmd.append('-4')
+            if not self.disable_ipv6:
+                cmd.append('-6')
+            print(cmd)
+            p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+            output, err = p.communicate()
+            print(output.decode())
+
+    def destroy_virtual_net(self):
+        print('Shuting down the virtual IP network.')
+        subprocess.call(["python3", "virtual_network_builder.py", "-i", self.ifname, "-n", str(self.clusters), "-r"])
+
+    def start_cluster(self, i):
+        if self.local_bootstrap:
+            cmd = ["python3", "dhtnetwork.py", "-n", str(self.node_per_loc), '-I', self.ifname+str(i)+'.1']
+            if self.remote_bootstrap:
+                cmd.extend(['-b', self.remote_bootstrap, '-bp', "5000"])
+            else:
+                if not self.disable_ipv4 and self.local_bootstrap.ip4:
+                    cmd.extend(['-b', self.local_bootstrap.ip4])
+                if not self.disable_ipv6 and self.local_bootstrap.ip6:
+                    cmd.extend(['-b6', self.local_bootstrap.ip6])
+            self.procs[i] = NSPopen('node'+str(i), cmd)
+        else:
+            raise Exception('First create bootstrap.')
+
+    def stop_cluster(self, i):
+        if self.procs[i]:
+            try:
+                self.procs[i].send_signal(signal.SIGINT);
+                self.procs[i].wait()
+                self.procs[i].release()
+            except Exception as e:
+                print(e)
+            self.procs[i] = None
+
+    def replace_cluster(self):
+        n = random.randrange(0, self.clusters)
+        self.stop_cluster(n)
+        self.start_cluster(n)
+
+
 
 def getsTimesTest():
     """TODO: Docstring for
@@ -102,14 +145,14 @@ def getsTimesTest():
 
     times = []
     for n in range(10):
-        replace_cluster()
+        wb.replace_cluster()
         plt.pause(2)
         print("Getting 50 random hashes succesively.")
         for i in range(50):
             with lock:
                 done += 1
                 start = time.time()
-                bootstrap.front().get(PyInfoHash.getRandom(), getcb, donecb)
+                bootstrap.front().get(InfoHash.getRandom(), getcb, donecb)
                 while done > 0:
                     lock.wait()
                     update_plot()
@@ -140,30 +183,18 @@ if __name__ == '__main__':
         print('No test specified... Quitting.', file=sys.stderr)
         sys.exit(1)
 
-    clusters = min(args.virtual_locs, args.node_num)
-    node_per_loc = int(args.node_num / clusters)
-
-    print("Launching", args.node_num, "nodes (", clusters, "clusters of", node_per_loc, "nodes)")
+    wb = WorkBench(args.ifname, args.virtual_locs, args.node_num, loss=args.loss,
+            delay=args.delay, disable_ipv4=args.disable_ipv4,
+            disable_ipv6=args.disable_ipv6)
+    wb.create_virtual_net()
 
-    if args.virtual_locs > 1:
-        cmd = ["python3", "virtual_network_builder.py", "-i", args.ifname, "-n", str(clusters), '-l', str(args.loss), '-d', str(args.delay)]
-        if not args.disable_ipv4:
-            cmd.append('-4')
-        if not args.disable_ipv6:
-            cmd.append('-6')
-        print(cmd)
-        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-        output, err = p.communicate()
-        print(output.decode())
-
-    bootstrap = DhtNetwork(iface='br'+args.ifname, first_bootstrap=False if args.bootstrap else True, bootstrap=[(args.bootstrap, "5000")] if args.bootstrap else [])
+    bootstrap = wb.get_bootstrap()
     bootstrap.resize(1)
-
-    procs = [None for _ in range(clusters)]
+    print("Launching", wb.node_num, "nodes (", wb.clusters, "clusters of", wb.node_per_loc, "nodes)")
 
     try:
-        for i in range(clusters):
-            start_cluster(i)
+        for i in range(wb.clusters):
+            wb.start_cluster(i)
 
         if args.gets:
             getsTimesTest()
@@ -171,13 +202,12 @@ if __name__ == '__main__':
     except Exception as e:
         print(e)
     finally:
-        for p in procs:
+        for p in wb.procs:
             if p:
                 p.send_signal(signal.SIGINT);
         bootstrap.resize(0)
-        print('Shuting down the virtual IP network.')
-        subprocess.call(["python3", "virtual_network_builder.py", "-i", args.ifname, "-n", str(clusters), "-r"])
-        for p in procs:
+        wb.destroy_virtual_net()
+        for p in wb.procs:
             if p:
                 try:
                     p.wait()