diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index c1c597f..b3b2348 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -19,147 +19,217 @@
  */
 
 #include "annotated-topology-reader.h"
-#include <fstream>
-#include <cstdlib>
-#include <iostream>
-#include <sstream>
-#include "ns3/log.h"
 
 using namespace std;
 
 namespace ns3 
 {    
-    NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
+
+NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
     
-    NS_OBJECT_ENSURE_REGISTERED (AnnotatedTopologyReader);
+NS_OBJECT_ENSURE_REGISTERED (AnnotatedTopologyReader);
     
-    TypeId AnnotatedTopologyReader::GetTypeId (void)
+TypeId AnnotatedTopologyReader::GetTypeId (void)
+{
+    static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
+    .SetParent<Object> ()
+    ;
+    return tid;
+}
+    
+AnnotatedTopologyReader::AnnotatedTopologyReader ()
+{
+    NS_LOG_FUNCTION (this);
+}
+    
+AnnotatedTopologyReader::~AnnotatedTopologyReader ()
+{
+    NS_LOG_FUNCTION (this);
+}
+    
+NodeContainer
+AnnotatedTopologyReader::Read (void)
+{
+    ifstream topgen;
+    topgen.open (GetFileName ().c_str ());
+    map<string, Ptr<Node> > nodeMap;
+    NodeContainer nodes;
+        
+    if ( !topgen.is_open () )
     {
-        static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
-        .SetParent<Object> ()
-        ;
-        return tid;
-    }
-    
-    AnnotatedTopologyReader::AnnotatedTopologyReader ()
-    {
-        NS_LOG_FUNCTION (this);
-    }
-    
-    AnnotatedTopologyReader::~AnnotatedTopologyReader ()
-    {
-        NS_LOG_FUNCTION (this);
-    }
-    
-    NodeContainer
-    AnnotatedTopologyReader::Read (void)
-    {
-        ifstream topgen;
-        topgen.open (GetFileName ().c_str ());
-        map<string, Ptr<Node> > nodeMap;
-        NodeContainer nodes;
-        
-        if ( !topgen.is_open () )
-        {
-            return nodes;
-        }
-        
-        string from;
-        string to;
-        string linkAttr;
-        
-        int linksNumber = 0;
-        int nodesNumber = 0;
-        
-        int totnode = 0;
-        int totlink = 0;
-        
-        istringstream lineBuffer;
-        string line;
-        
-        getline (topgen,line);
-        lineBuffer.str (line);
-        
-        lineBuffer >> totnode;
-        lineBuffer >> totlink;
-        NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
-        
-        if(!topgen.eof ())
-            NS_LOG_INFO("!EOF");
-        
-        /*for (int i = 0; i <= totnode; i++)
-        {
-            getline (topgen,line);
-        }*/
-        
-        for (int i = 0; i < totlink && !topgen.eof (); i++)
-        {
-            //NS_LOG_INFO("Line #" <<i);
-            getline (topgen,line);
-            lineBuffer.clear ();
-            lineBuffer.str (line);
-            
-            lineBuffer >> from;
-            lineBuffer >> to;
-            
-            
-            if ( (!from.empty ()) && (!to.empty ()) )
-            {
-                NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
-                
-                if ( nodeMap[from] == 0 )
-                {
-                    Ptr<Node> tmpNode = CreateObject<Node> ();
-                    nodeMap[from] = tmpNode;
-                    nodes.Add (tmpNode);
-                    nodesNumber++;
-                }
-                
-                if (nodeMap[to] == 0)
-                {
-                    Ptr<Node> tmpNode = CreateObject<Node> ();
-                    nodeMap[to] = tmpNode;
-                    nodes.Add (tmpNode);
-                    nodesNumber++;
-                }
-                
-                Link link ( nodeMap[from], from, nodeMap[to], to );
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("DataRate", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("Delay", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("QueueSizeNode1", linkAttr);
-                }
-                
-                lineBuffer >> linkAttr;
-                if ( !linkAttr.empty () )
-                {
-                    link.SetAttribute ("QueueSizeNode2", linkAttr);
-                }
-                
-                AddLink (link);
-                
-                linksNumber++;
-            }
-        }
-        
-        NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
-        topgen.close ();
-        
         return nodes;
     }
+        
+    string from;
+    string to;
+    string linkAttr;
+        
+    int linksNumber = 0;
+    int nodesNumber = 0;
+        
+    int totnode = 0;
+    int totlink = 0;
+        
+    istringstream lineBuffer;
+    string line;
+        
+    getline (topgen,line);
+    lineBuffer.str (line);
+        
+    lineBuffer >> totnode;
+    lineBuffer >> totlink;
+    NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
+        
+    if(!topgen.eof ())
+        NS_LOG_INFO("!EOF");
+
+        
+    for (int i = 0; i < totlink && !topgen.eof (); i++)
+    {
+        //NS_LOG_INFO("Line #" <<i);
+        getline (topgen,line);
+        lineBuffer.clear ();
+        lineBuffer.str (line);
+            
+        lineBuffer >> from;
+        lineBuffer >> to;
+            
+            
+        if ( (!from.empty ()) && (!to.empty ()) )
+        {
+            NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
+                
+            if ( nodeMap[from] == 0 )
+            {
+                Ptr<Node> tmpNode = CreateObject<Node> ();
+                nodeMap[from] = tmpNode;
+                nodes.Add (tmpNode);
+                nodesNumber++;
+            }
+                
+            if (nodeMap[to] == 0)
+            {
+                Ptr<Node> tmpNode = CreateObject<Node> ();
+                nodeMap[to] = tmpNode;
+                nodes.Add (tmpNode);
+                nodesNumber++;
+            }
+                
+            Link link ( nodeMap[from], from, nodeMap[to], to );
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("DataRate", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("Delay", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("QueueSizeNode1", linkAttr);
+            }
+                
+            lineBuffer >> linkAttr;
+            if ( !linkAttr.empty () )
+            {
+                link.SetAttribute ("QueueSizeNode2", linkAttr);
+            }
+                
+            AddLink (link);
+                
+            linksNumber++;
+        }
+    }
+        
+    NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
+    topgen.close ();
+        
+    return nodes;
+}
     
-} /* namespace ns3 */
+void
+AnnotatedTopologyReader::ApplySettings(NetDeviceContainer* ndc, NodeContainer* nc)
+{
+    PointToPointHelper p2p;
+    TopologyReader::ConstLinksIterator iter2;
+    int i = 0;
+    for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
+    {
+        /*std::string dataRate = iter2->GetAttribute("DataRate");
+        NS_LOG_INFO("dataRate = "<<dataRate);
+        dataRate += "Kbps";
+        std::string delay = iter2->GetAttribute("Delay");
+        NS_LOG_INFO("delay = "<<delay);
+        delay += "ms";*/
+        
+        p2p.SetDeviceAttribute("DataRate", StringValue(iter2->GetAttribute("DataRate")+"Kbps"));
+        NS_LOG_INFO("DataRate = " + iter2->GetAttribute("DataRate")+"Kbps");
+        p2p.SetChannelAttribute("Delay", StringValue(iter2->GetAttribute("Delay")+"ms"));
+        NS_LOG_INFO("Delay = " + iter2->GetAttribute("Delay")+"ms");
+        p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
+        ndc[i] = p2p.Install(nc[i]);
+        
+        
+        NodeContainer twoNodes = nc[i];
+            
+        Ptr<Node> nd = twoNodes.Get(0);
+        if(nd==NULL)
+            NS_LOG_INFO("nd = null");
+        
+        Ptr<Node> nd2 = twoNodes.Get(1);
+        if(nd2==NULL)
+            NS_LOG_INFO("nd2 = null");
+        
+        //NS_LOG_INFO("1");
+        NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
+        NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
+            
+        Ptr<PointToPointNetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+            
+        if(device==NULL)
+            NS_LOG_INFO("device = 0");
+            
+        //NS_LOG_INFO("2");
+            
+        Ptr<PointToPointNetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
+            
+        if(device2==NULL)
+            NS_LOG_INFO("device2 = 0");
+            
+        PointerValue tmp1;
+        device->GetAttribute ("TxQueue", tmp1);
+        //NS_LOG_INFO("2.5");
+        Ptr<Object> txQueue1 = tmp1.GetObject ();
+            
+        PointerValue tmp2;
+        device2->GetAttribute ("TxQueue", tmp2);
+        Ptr<Object> txQueue2 = tmp2.GetObject ();
+        //NS_LOG_INFO("3");
+        Ptr<DropTailQueue> dtq1 = txQueue1->GetObject <DropTailQueue> ();
+        NS_ASSERT (dtq1 != 0);
+            
+        Ptr<DropTailQueue> dtq2 = txQueue2->GetObject <DropTailQueue> ();
+        NS_ASSERT (dtq2 != 0);
+            
+        std::string queuesize1 = iter2->GetAttribute("QueueSizeNode1");
+        std::string queuesize2 = iter2->GetAttribute("QueueSizeNode2");
+        //NS_LOG_INFO("4");
+        txQueue1->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize1.c_str())));
+        txQueue2->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize2.c_str())));
+            
+        UintegerValue limit;
+        txQueue1->GetAttribute ("MaxPackets", limit);
+        NS_LOG_INFO ("NetDevice #"<< device->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
+            
+        txQueue2->GetAttribute ("MaxPackets", limit);
+        NS_LOG_INFO ("NetDevice #"<< device2->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
+    }
+}
+}
 
