diff --git a/bin/miniccnx b/bin/miniccnx
index 42be409..36c3938 100644
--- a/bin/miniccnx
+++ b/bin/miniccnx
@@ -7,72 +7,83 @@
 from mininet.node import CPULimitedCCNHost, CCNHost
 from mininet.link import TCLink
 from mininet.conf_parser import parse_hosts,parse_routers, parse_links
-import os.path
+import os.path, time
 import optparse
 import datetime
 
 def parse_args():
-    usage="""Usage: miniccnx [template_file]
-    If no template_file is given, will try to load template 
+    usage="""Usage: miniccnx [template_file] [ -t | --testbed ]
+    If no template_file is given, will try to load template
     from file miniccnx.conf in the current directory.
+    If --testbed is used, miniccnx will run the NDN Project Testbed.
+    This assumes you are in the testbed directory in the miniccnx installation
+    directory.
     """
 
+    testbed = False
     parser = optparse.OptionParser(usage)
 
-    _, arg = parser.parse_args()
-    
-    if len(arg) != 1:
-        arg = ''
+    parser.add_option("-t", "--testbed", action="store_true", dest="testbed",
+    help="instantiates NDN Testbed")
+
+    (options, arg) = parser.parse_args()
+
+    testbed = options.testbed
+
+    if len(arg) == 0 or len(arg) > 2:
+        file = ''
     else:
-        arg = arg[0]
-    
-    return arg
+        file = arg[0]
+
+    return file, testbed
 
 
 class CCNTopo(Topo):
     def __init__(self, conf_arq, **opts):
         Topo.__init__(self, **opts)
-        
+
         hosts_conf = parse_hosts(conf_arq)
         routers_conf = parse_routers(conf_arq)
         links_conf = parse_links(conf_arq)
 
+        print links_conf
+
         self.isTCLink = False
         self.isLimited = False
-        
+
         for host in hosts_conf:
             if host.cpu != None and self.isLimited != True:
                 self.isLimited = True
             self.addHost(host.name, app=host.app, fib=host.uri_tuples,cpu=host.cpu,cores=host.cores)
-            
+
         for router in routers_conf:
             if router.cpu != None and self.isLimited != True:
                 self.isLimited = True
             self.addHost(router.name,fib=router.uri_tuples,cpu=router.cpu,cores=router.cores)
-            
+
         for link in links_conf:
             if len(link.linkDict) == 0:
                 self.addLink(link.h1, link.h2)
             else:
                 self.addLink(link.h1, link.h2, **link.linkDict)
-                self.isTCLink = True        
-                
+                self.isTCLink = True
+
         info('Parse of ' + conf_arq + ' done.\n')
 
-def execute(template_file='miniccnx.conf'):
+def execute(template_file='miniccnx.conf', testbed=False):
     "Create a network based on template_file"
 
     if template_file == '':
         template_file='miniccnx.conf'
-        
+
     if os.path.exists(template_file) == False:
         info('No template file given and default template file miniccnx.conf not found. Exiting...\n')
         quit()
-        
+
     topo = CCNTopo(template_file)
-    
+
     t = datetime.datetime.now()
-    
+
     if topo.isTCLink == True and topo.isLimited == True:
         net = Mininet(topo,host=CPULimitedCCNHost,link=TCLink)
     elif topo.isTCLink == True and topo.isLimited == False:
@@ -81,25 +92,38 @@
         net = Mininet(topo,host=CPULimitedCCNHost)
     else:
         net = Mininet(topo,host=CCNHost)
-    
+
     t2 = datetime.datetime.now()
-    
+
     delta = t2 - t
-    
+
     info('Setup time: ' + str(delta.seconds) + '\n')
-    
+
     net.start()
 
+    if testbed == True:
+        info('Starting OSPFN ...\n')
+        for host in net.hosts:
+            host.cmd("cd {0}".format(host.name))
+            host.cmd("./routing.sh {0}".format(host.name))
+
+        time.sleep(60)
+
+        for host in net.hosts:
+            host.cmd("./ospfn-start.sh {0}".format(host.name))
+
+        info('OSPFN configuration completed!\n')
+
     for host in net.hosts:
         if 'app' in host.params:
             if host.params['app'] != '_':
                 host.cmd(host.params['app'])
-    
+
     CLI(net)
     net.stop()
 
 if __name__ == '__main__':
-    
-    template = parse_args()
+
+    template, testbed = parse_args()
     setLogLevel('info')
-    execute(template)
+    execute(template, testbed)
