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");
+    }
+}
+}
 
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index f979aba..c99a6a3 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -21,42 +21,62 @@
 #ifndef __ANNOTATED_TOPOLOGY_READER_H__
 #define __ANNOTATED_TOPOLOGY_READER_H__
 
-#include "ns3/nstime.h"
 #include "ns3/topology-reader.h"
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include <string>
+#include <fstream>
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
 
 namespace ns3 
 {
+    
+/**
+* \brief This class reads annotated topology and apply settings to the corresponding nodes and links
+* Input File Format
+* 1st line is     NumberOfNodes    TAB     NumberofLinks
+* Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS    TAB    DelayMiliseconds   TAB   QueueSizeInPacketsNode1     TAB    QueueSizeInPacketsNode2 
+*
+*/
+class AnnotatedTopologyReader : public TopologyReader
+{
+public:
+    typedef std::list< Link >::iterator LinksIterator;
+    static TypeId GetTypeId (void);
+        
+    AnnotatedTopologyReader ();
+    virtual ~AnnotatedTopologyReader ();
+        
+        
     /**
-     * Input File Format
-     * 1st line is     NumberOfNodes    TAB     NumberofLinks
-     * Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS    TAB    DelayMiliseconds   TAB   QueueSizeInPackets1     TAB    QueueSizeInPackets2 
-     *
+    * \brief Main annotated topology reading function.
+    *
+    * This method opens an input stream and reads topology file with annotations.
+    *
+    * \return the container of the nodes created (or empty container if there was an error)
+    */
+    virtual NodeContainer Read (void);
+    
+    /**
+     * \brief This method applies setting to corresponding nodes and links
+     * NetDeviceContainer must be allocated
+     * NodeContainer from Read method
      */
-    class AnnotatedTopologyReader : public TopologyReader
-    {
-    public:
-        typedef std::list< Link >::iterator LinksIterator;
-        static TypeId GetTypeId (void);
+    void ApplySettings(NetDeviceContainer *ndc, NodeContainer* nc);
         
-        AnnotatedTopologyReader ();
-        virtual ~AnnotatedTopologyReader ();
-        
-        /**
-         * \brief Main topology reading function.
-         *
-         * This method opens an input stream and reads the Orbis-format file.
-         * Every row represents a topology link (the ids of a couple of nodes),
-         * so the input file is read line by line to figure out how many links
-         * and nodes are in the topology.
-         *
-         * \return the container of the nodes created (or empty container if there was an error)
-         */
-        virtual NodeContainer Read (void);
-        
-    private:
-        AnnotatedTopologyReader (const AnnotatedTopologyReader&);
-        AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
-    };
+private:
+    AnnotatedTopologyReader (const AnnotatedTopologyReader&);
+    AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
+};
 }
 
 
