diff --git a/conf_parser.py b/conf_parser.py
deleted file mode 100644
index 68792ac..0000000
--- a/conf_parser.py
+++ /dev/null
@@ -1,108 +0,0 @@
-import ConfigParser
-
-class confCCNHost():
-    
-    def __init__(self, name, app='', uri_tuples=''):
-        self.name = name
-        self.app = app
-        self.uri_tuples = uri_tuples
-        
-    def __repr__(self):
-        return 'Name: ' + self.name + ' App: ' + self.app + ' URIS: ' + str(self.uri_tuples) 
-
-class confCCNLink():
-    
-    def __init__(self,h1,h2,linkDict=None):
-        self.h1 = h1
-        self.h2 = h2
-        self.linkDict = linkDict
-        
-    def __repr__(self):
-        return 'h1: ' + self.h1 + ' h2: ' + self.h2 + ' params: ' + str(self.linkDict)
-    
-def extrai_hosts(conf_arq):
-    'Extrai hosts da secao hosts do arquivo de configuracao'
-    config = ConfigParser.RawConfigParser()
-    config.read(conf_arq)
-    
-    hosts = []
-    
-    items = config.items('hosts')
-    
-    for item in items:
-
-        name = item[0]
-  
-        rest = item[1].split()
-
-        app = rest.pop(0)
-        
-        uris = rest
-        uri_list=[]
-        for uri in uris:
-            uri_list.append((uri.split(',')[0],uri.split(',')[1]))
-        
-        hosts.append(confCCNHost(name , app, uri_list))
-    
-    return hosts
-
-def extrai_routers(conf_arq):
-    'Extrai routers da secao routers do arquivo de configuracao'
-    config = ConfigParser.RawConfigParser()
-    config.read(conf_arq)
-
-    routers = []
-    
-    items = config.items('routers')
-    
-    for item in items:
-        name = item[0]
-  
-        rest = item[1].split()
-
-        uris = rest
-        uri_list=[]
-        for uri in uris:
-            uri_list.append((uri.split(',')[0],uri.split(',')[1]))
-        
-        routers.append(confCCNHost(name=name , uri_tuples=uri_list))
-    
-    return routers
-
-def extrai_links(conf_arq):
-    'Extrai links da secao links do arquivo de configuracao'
-    arq = open(conf_arq,'r')
-    
-    links = []
-     
-    while True:
-        line = arq.readline()
-        if line == '[links]\n':
-            break
-    
-    while True:
-        line = arq.readline()
-        if line == '':
-            break
-        
-        args = line.split()
-        h1, h2 = args.pop(0).split(':')
-        
-        link_dict = {}
-        
-        for arg in args:
-            arg_name, arg_value = arg.split('=')
-            key = arg_name
-            value = arg_value
-            if key in ['loss','bw','jitter']:
-                value = int(value)
-            
-            link_dict[key] = value
-            
-        links.append(confCCNLink(h1,h2,link_dict))
-        
-        
-    return links
-        
-        
-    
diff --git a/miniccnx b/miniccnx
index 99ff449..edbbb17 100644
--- a/miniccnx
+++ b/miniccnx
@@ -2,12 +2,11 @@
 
 from mininet.topo import Topo
 from mininet.net import Mininet
-from mininet.util import dumpNodeConnections
 from mininet.log import setLogLevel, output, info
 from mininet.cli import CLI
 from mininet.node import CPULimitedCCNHost, CCNHost
 from mininet.link import TCLink
-from conf_parser import extrai_hosts,extrai_routers, extrai_links
+from mininet.conf_parser import parse_hosts,parse_routers, parse_links
 import os.path
 import optparse
 import datetime
@@ -34,17 +33,22 @@
     def __init__(self, conf_arq, **opts):
         Topo.__init__(self, **opts)
         
-        hosts_conf = extrai_hosts(conf_arq)
-        routers_conf = extrai_routers(conf_arq)
-        links_conf = extrai_links(conf_arq)
+        hosts_conf = parse_hosts(conf_arq)
+        routers_conf = parse_routers(conf_arq)
+        links_conf = parse_links(conf_arq)
 
         self.isTCLink = False
+        self.isLimited = False
         
         for host in hosts_conf:
-            self.addHost(host.name, app=host.app, fib=host.uri_tuples,cpu=.025)
+            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)
             
         for router in routers_conf:
-            self.addHost(router.name,fib=router.uri_tuples)
+            if router.cpu != None and self.isLimited != True:
+                self.isLimited = True
+            self.addHost(router.name,fib=router.uri_tuples,cpu=router.cpu)
             
         for link in links_conf:
             if len(link.linkDict) == 0:
@@ -69,8 +73,12 @@
     
     t = datetime.datetime.now()
     
-    if topo.isTCLink == True:
+    if topo.isTCLink == True and topo.isLimited == True:
         net = Mininet(topo,host=CPULimitedCCNHost,link=TCLink)
+    elif topo.isTCLink == True and topo.isLimited == False:
+        net = Mininet(topo,host=CCNHost,link=TCLink)
+    elif topo.isTCLink == False and topo.isLimited == True:
+        net = Mininet(topo,host=CPULimitedCCNHost)
     else:
         net = Mininet(topo,host=CCNHost)
     
diff --git a/mininet/conf_parser.py b/mininet/conf_parser.py
index 68792ac..642b4b1 100644
--- a/mininet/conf_parser.py
+++ b/mininet/conf_parser.py
@@ -1,14 +1,15 @@
-import ConfigParser
+import ConfigParser, re
 
 class confCCNHost():
     
-    def __init__(self, name, app='', uri_tuples=''):
+    def __init__(self, name, app='', uri_tuples='', cpu=None):
         self.name = name
         self.app = app
         self.uri_tuples = uri_tuples
+        self.cpu = cpu
         
     def __repr__(self):
-        return 'Name: ' + self.name + ' App: ' + self.app + ' URIS: ' + str(self.uri_tuples) 
+        return 'Name: ' + self.name + ' App: ' + self.app + ' URIS: ' + str(self.uri_tuples) + ' CPU:' + str(self.cpu)
 
 class confCCNLink():
     
@@ -20,8 +21,8 @@
     def __repr__(self):
         return 'h1: ' + self.h1 + ' h2: ' + self.h2 + ' params: ' + str(self.linkDict)
     
-def extrai_hosts(conf_arq):
-    'Extrai hosts da secao hosts do arquivo de configuracao'
+def parse_hosts(conf_arq):
+    'Parse hosts section from the conf file.'
     config = ConfigParser.RawConfigParser()
     config.read(conf_arq)
     
@@ -39,15 +40,19 @@
         
         uris = rest
         uri_list=[]
+        cpu = None
         for uri in uris:
-            uri_list.append((uri.split(',')[0],uri.split(',')[1]))
+            if re.match("cpu",uri):
+                cpu = float(uri.split('=')[1])
+            else:
+                uri_list.append((uri.split(',')[0],uri.split(',')[1]))
         
-        hosts.append(confCCNHost(name , app, uri_list))
+        hosts.append(confCCNHost(name , app, uri_list,cpu))
     
     return hosts
 
-def extrai_routers(conf_arq):
-    'Extrai routers da secao routers do arquivo de configuracao'
+def parse_routers(conf_arq):
+    'Parse routers section from the conf file.'
     config = ConfigParser.RawConfigParser()
     config.read(conf_arq)
 
@@ -62,15 +67,20 @@
 
         uris = rest
         uri_list=[]
-        for uri in uris:
-            uri_list.append((uri.split(',')[0],uri.split(',')[1]))
+        cpu = None
         
-        routers.append(confCCNHost(name=name , uri_tuples=uri_list))
+        for uri in uris:
+            if re.match("cpu",uri):
+                cpu = float(uri.split('=')[1])
+            else:
+                uri_list.append((uri.split(',')[0],uri.split(',')[1]))
+        
+        routers.append(confCCNHost(name=name , uri_tuples=uri_list, cpu=cpu))
     
     return routers
 
-def extrai_links(conf_arq):
-    'Extrai links da secao links do arquivo de configuracao'
+def parse_links(conf_arq):
+    'Parse links section from the conf file.'
     arq = open(conf_arq,'r')
     
     links = []
diff --git a/mininet/node.py b/mininet/node.py
index 4c54d75..99d2cc5 100644
--- a/mininet/node.py
+++ b/mininet/node.py
@@ -798,7 +798,6 @@
 
         r = CPULimitedHost.config(self,cpu,cores, **params)
         
-        print 'nozess'
         self.setParam( r, 'app', fib=fib )
         self.setParam( r, 'fib', app=app)
         
