diff --git a/main.py b/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b0472b879d635dbc751ecbb5743a8c6b6aadc55
--- /dev/null
+++ b/main.py
@@ -0,0 +1,85 @@
+from argparse import ArgumentParser
+import sys
+import random
+
+import simpy
+
+from pydyton import Network, NodeFactory
+from pydyton.traces import types as traces
+from pydyton.routers import types as routers
+from pydyton.communities import types as communities
+
+def parse_args(args):
+    parser = ArgumentParser()
+
+    parser.add_argument('--seed', '-s', metavar='seed', type=int,
+                        default=42)
+
+    parser.add_argument('--trace', '-t', metavar='type', default='random',
+                        choices=[t for t in traces])
+    parser.add_argument('--trace-args', '-ta', metavar='arg', nargs='+')
+
+    parser.add_argument('--router', '-r', metavar='type', default='direct',
+                        choices=[t for t in routers])
+    parser.add_argument('--router-args', '-ra', metavar='arg', nargs='+')
+
+    parser.add_argument('--community', '-c', metavar='type', default='none',
+                        choices=[t for t in communities])
+    parser.add_argument('--community-args', '-ca', metavar='arg', nargs='+')
+
+    parser.add_argument('--node-args', '-na', metavar='arg', nargs='+')
+
+    def list_to_args(args):
+        if args is None:
+            return {}
+        else:
+            args = '\n'.join(args).replace('=',': ')
+            return yaml.safe_load(args)
+
+    args = parser.parse_args(args)
+
+    args.trace_args = list_to_args(args.trace_args)
+    args.router_args = list_to_args(args.router_args)
+    args.community_args = list_to_args(args.community_args)
+    args.node_args = list_to_args(args.node_args)
+
+    return args
+
+
+def main(args):
+    args = parse_args(args)
+    print(args)
+
+    random.seed(args.seed)
+    env = simpy.Environment()
+
+    trace = traces[args.trace](**args.trace_args)
+    router = routers[args.router]
+    community = communities[args.community](**args.community_args)
+
+    node_factory = NodeFactory(router, **args.node_args)
+
+    network = Network(env,
+                      node_factory=node_factory,
+                      community=community,
+                      trace=trace)
+
+
+    while True:
+        try:
+            for tick in range(1, 51):
+                t = tick / 50 * trace.duration
+                env.run(until=t)
+                tick = '=' * tick + ' ' * (50 - tick)
+                print('\rRunning [{}] '.format(tick), end='')
+            print(' Done!')
+            print(len([p for p in network.packets if p.recieved]))
+            return 0
+        except KeyboardInterrupt:
+            print('\nBye!')
+            return 0
+
+if __name__ == '__main__':
+    exit(main(sys.argv[1:]))
+
+
diff --git a/pydyton/__init__.py b/pydyton/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5133a3fa4e62d09f6ec43d8c3b1354d1a8a27c05
--- /dev/null
+++ b/pydyton/__init__.py
@@ -0,0 +1,2 @@
+from .network import *
+
diff --git a/pydyton/network.py b/pydyton/network.py
index 7374c9829549ca51fdfd956c7aedad2f0fe80400..d89e4cb7ef1cde8fdfdee4b1c606ed86dbc2a0ff 100644
--- a/pydyton/network.py
+++ b/pydyton/network.py
@@ -9,9 +9,9 @@ import simpy
 import yaml
 import networkx as nx
 
-from communities import types as communities
-from routers import types as routers
-from traces import types as traces
+from .communities import types as communities
+from .routers import types as routers
+from .traces import types as traces
 
 class Network:
     ''''''
@@ -236,77 +236,3 @@ class Packet:
         )
 
 
-def parse_args(args):
-    parser = ArgumentParser()
-
-    parser.add_argument('--seed', '-s', metavar='seed', type=int,
-                        default=42)
-
-    parser.add_argument('--trace', '-t', metavar='type', default='random',
-                        choices=[t for t in traces])
-    parser.add_argument('--trace-args', '-ta', metavar='arg', nargs='+')
-
-    parser.add_argument('--router', '-r', metavar='type', default='direct',
-                        choices=[t for t in routers])
-    parser.add_argument('--router-args', '-ra', metavar='arg', nargs='+')
-
-    parser.add_argument('--community', '-c', metavar='type', default='none',
-                        choices=[t for t in communities])
-    parser.add_argument('--community-args', '-ca', metavar='arg', nargs='+')
-
-    parser.add_argument('--node-args', '-na', metavar='arg', nargs='+')
-
-    def list_to_args(args):
-        if args is None:
-            return {}
-        else:
-            args = '\n'.join(args).replace('=',': ')
-            return yaml.safe_load(args)
-
-    args = parser.parse_args(args)
-
-    args.trace_args = list_to_args(args.trace_args)
-    args.router_args = list_to_args(args.router_args)
-    args.community_args = list_to_args(args.community_args)
-    args.node_args = list_to_args(args.node_args)
-
-    return args
-
-
-def main(args):
-    args = parse_args(args)
-    print(args)
-
-    random.seed(args.seed)
-    env = simpy.Environment()
-
-    trace = traces[args.trace](**args.trace_args)
-    router = routers[args.router]
-    community = communities[args.community](**args.community_args)
-
-    node_factory = NodeFactory(router, **args.node_args)
-
-    network = Network(env,
-                      node_factory=node_factory,
-                      community=community,
-                      trace=trace)
-
-
-    while True:
-        try:
-            for tick in range(1, 51):
-                t = tick / 50 * trace.duration
-                env.run(until=t)
-                tick = '=' * tick + ' ' * (50 - tick)
-                print('\rRunning [{}] '.format(tick), end='')
-            print(' Done!')
-            print(len([p for p in network.packets if p.recieved]))
-            return 0
-        except KeyboardInterrupt:
-            print('\nBye!')
-            return 0
-
-if __name__ == '__main__':
-    exit(main(sys.argv[1:]))
-
-