diff --git a/model/content-object-header.cc b/model/content-object-header.cc
index 79b5ed0..4399afd 100644
--- a/model/content-object-header.cc
+++ b/model/content-object-header.cc
@@ -18,7 +18,6 @@
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-
 #include "content-object-header.h"
 
 namespace ns3
diff --git a/model/content-object-header.h b/model/content-object-header.h
index 454f8e2..ff2ae26 100644
--- a/model/content-object-header.h
+++ b/model/content-object-header.h
@@ -22,8 +22,8 @@
 #ifndef _CONTENT_OBJECT_HEADER_H_
 #define _CONTENT_OBJECT_HEADER_H_
 
-#include <ns3/integer.h>
-#include <ns3/header.h>
+#include "ns3/integer.h"
+#include "ns3/header.h"
 
 #include <string>
 #include <vector>
diff --git a/model/interest-header.cc b/model/interest-header.cc
index ef974a9..f9300c4 100644
--- a/model/interest-header.cc
+++ b/model/interest-header.cc
@@ -22,7 +22,6 @@
 ///< #CCN_PR_SCOPE1 (0x40) this host,
 ///< #CCN_PR_SCOPE2 (0x80) immediate neighborhood
 
-
 #include "interest-header.h"
 
 namespace ns3
diff --git a/model/interest-header.h b/model/interest-header.h
index 4f2b948..9d9ba4a 100644
--- a/model/interest-header.h
+++ b/model/interest-header.h
@@ -22,8 +22,8 @@
 #ifndef _INTEREST_HEADER_H_
 #define _INTEREST_HEADER_H_
 
-#include <ns3/integer.h>
-#include <ns3/header.h>
+#include "ns3/integer.h"
+#include "ns3/header.h"
 
 #include <string>
 #include <vector>
@@ -35,7 +35,7 @@
 {
 namespace NDNabstraction
 {
-
+  
 /**
  * CCNx XML definition of Interest
  * 
diff --git a/model/name-components.cc b/model/name-components.cc
index f356a3b..a6aae87 100644
--- a/model/name-components.cc
+++ b/model/name-components.cc
@@ -19,7 +19,10 @@
  */
 
 #include "name-components.h"
-#include "ccn/ccn.h"
+
+#include "ns3/ccn.h"
+#include "ns3/ccn_charbuf.h"
+
 #include <iostream>
 
 using namespace std;
diff --git a/model/name-components.h b/model/name-components.h
index 5c06bd9..2cdfd99 100644
--- a/model/name-components.h
+++ b/model/name-components.h
@@ -21,11 +21,11 @@
 #ifndef _NDN_NAME_COMPONENTS_H_
 #define _NDN_NAME_COMPONENTS_H_
 
+#include "ns3/simple-ref-count.h"
+
 #include <string>
 #include <list>
 
-#include <ns3/simple-ref-count.h>
-
 namespace ns3 {
 namespace NDNabstraction {
 namespace Name {
diff --git a/model/ndn_contentpacket.cc b/model/ndn_contentpacket.cc
deleted file mode 100644
index 60b4963..0000000
--- a/model/ndn_contentpacket.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ndn_contentpacket.h"
-
-namespace ns3
-{
-namespace NDNabstraction
-{
-    ContentPacket::ContentPacket(const struct ccn_charbuf *Name,const void *data,size_t size)
-    : Packet()
-    {
-        ccn_charbuf *output = ccn_charbuf_create();
-        int result = ccn_encode_ContentObject(output,Name,data,size);
-        
-        if(result>=0)
-        {
-            Ptr<Packet> p = Create<Packet> (output->buf, (uint32_t)output->length);
-            this->AddAtEnd (p);
-        }
-    }
-}
-}
diff --git a/model/ndn_contentpacket.h b/model/ndn_contentpacket.h
deleted file mode 100644
index bd8abd0..0000000
--- a/model/ndn_contentpacket.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef ndn_contentpacket_h
-#define ndn_contentpacket_h
-
-#include "ns3/header.h"
-#include <ns3/packet.h>
-#include "ccn/ccn.h"
-
-namespace ns3
-{
-namespace NDNabstraction
-{
-    class ContentPacket : public Packet 
-    {
-    public: 
-        ContentPacket(const struct ccn_charbuf *Name,const void *data,size_t size);
-
-        
-    };
-}
-}
-
-#endif 
diff --git a/model/ndn_face.cc b/model/ndn_face.cc
deleted file mode 100644
index 14abd6e..0000000
--- a/model/ndn_face.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ndn_face.h"
-
-namespace ns3 
-{
-    
-}
diff --git a/model/ndn_face.h b/model/ndn_face.h
deleted file mode 100644
index 857d88f..0000000
--- a/model/ndn_face.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef ndn_face_h
-#define ndn_face_h
-
-#include "ns3/header.h"
-
-namespace ns3
-{
-    // see http://www.ccnx.org/releases/latest/doc/ccode/html/structface.html
-    class NdnFace
-    {
-        public:
-            NdnFace(int faceID);
-            virtual ~NdnFace();
-        
-        private:
-        int m_faceID;
-        
-    };
-    
-}
-
-#endif
diff --git a/model/ndn_nonceheader.cc b/model/ndn_nonceheader.cc
deleted file mode 100644
index 419b5ab..0000000
--- a/model/ndn_nonceheader.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ndn_nonceheader.h"
-
-
-namespace ns3 
-{
-    namespace NDNabstraction
-    {
-        NS_OBJECT_ENSURE_REGISTERED (NonceHeader);
-        
-        NonceHeader::NonceHeader()
-        {
-            m_value = 0;
-        }
-        
-        NonceHeader::NonceHeader (uint32_t nonce) 
-        {
-            m_value = nonce;
-        }
-        
-        TypeId
-        NonceHeader::GetTypeId ()
-        {
-            static TypeId tid = TypeId ("ns3::NDNabstraction::NonceHeader")
-            .SetParent<Header> ()
-            .AddConstructor<NonceHeader> ()
-            ;
-            return tid;
-        }
-        
-        TypeId
-        NonceHeader::GetInstanceTypeId () const
-        {
-            return GetTypeId ();
-        }
-        
-        uint32_t
-        NonceHeader::GetSerializedSize () const
-        {
-            return 4;
-        }
-        
-        void
-        NonceHeader::Serialize (Buffer::Iterator i) const
-        {
-            i.WriteU32 ((uint32_t) m_value);
-        }
-        
-        uint32_t
-        NonceHeader::Deserialize (Buffer::Iterator start)
-        {
-            Buffer::Iterator i = start;
-            m_value = i.ReadU32 ();
-            
-            uint32_t dist = i.GetDistanceFrom (start);
-            NS_ASSERT (dist == GetSerializedSize ());
-            return dist;
-        }
-        
-        void
-        NonceHeader::Print (std::ostream &os) const
-        {
-            os << m_value;
-        }
-        
-        uint32_t
-        NonceHeader::GetValue()
-        {
-            return m_value;
-        }
-    }    
-}
diff --git a/model/ndn_nonceheader.h b/model/ndn_nonceheader.h
deleted file mode 100644
index ff4b916..0000000
--- a/model/ndn_nonceheader.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ns3/header.h"
-#include <iostream>
-
-namespace ns3
-{
-    namespace NDNabstraction
-    {
-        class NonceHeader: public Header
-        {
-        public:
-            NonceHeader();
-            NonceHeader(uint32_t nonce);
-            uint32_t GetValue();
-            
-            
-            // Header serialization/deserialization
-            static TypeId GetTypeId ();
-            TypeId GetInstanceTypeId () const;
-            uint32_t GetSerializedSize () const;
-            void Serialize (Buffer::Iterator start) const;
-            uint32_t Deserialize (Buffer::Iterator start);
-            void Print (std::ostream &os) const;
-            
-        private:
-            uint32_t m_value;
-        };
-    }
-}
diff --git a/model/ndn_timeoutheader.cc b/model/ndn_timeoutheader.cc
deleted file mode 100644
index 1094a99..0000000
--- a/model/ndn_timeoutheader.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ndn_timeoutheader.h"
-
-namespace ns3 
-{
-namespace NDNabstraction
-{
-    NS_OBJECT_ENSURE_REGISTERED (TimeoutHeader);
-    
-    TimeoutHeader::TimeoutHeader()
-    {
-        m_value = 4000;
-    }
-    
-    TimeoutHeader::TimeoutHeader (uint32_t timeout) 
-    {
-        m_value = timeout;
-    }
-    
-    TypeId
-    TimeoutHeader::GetTypeId ()
-    {
-        static TypeId tid = TypeId ("ns3::NDNabstraction::TimeoutHeader")
-        .SetParent<Header> ()
-        .AddConstructor<TimeoutHeader> ()
-        ;
-        return tid;
-    }
-    
-    TypeId
-    TimeoutHeader::GetInstanceTypeId () const
-    {
-        return GetTypeId ();
-    }
-    
-    uint32_t
-    TimeoutHeader::GetSerializedSize () const
-    {
-        return 4;
-    }
-    
-    void
-    TimeoutHeader::Serialize (Buffer::Iterator i) const
-    {
-        i.WriteU32 ((uint32_t) m_value);
-    }
-    
-    uint32_t
-    TimeoutHeader::Deserialize (Buffer::Iterator start)
-    {
-        Buffer::Iterator i = start;
-        m_value = i.ReadU32 ();
-            
-        uint32_t dist = i.GetDistanceFrom (start);
-        NS_ASSERT (dist == GetSerializedSize ());
-        return dist;
-    }
-
-    void
-    TimeoutHeader::Print (std::ostream &os) const
-    {
-        os << m_value;
-    }
-    
-    uint32_t
-    TimeoutHeader::GetValue()
-    {
-        return m_value;
-    }
-}    
-}
diff --git a/model/ndn_timeoutheader.h b/model/ndn_timeoutheader.h
deleted file mode 100644
index 32e492e..0000000
--- a/model/ndn_timeoutheader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ns3/header.h"
-#include <iostream>
-
-namespace ns3
-{
-namespace NDNabstraction
-{
-        
-    class TimeoutHeader: public Header
-    {
-    public:
-        TimeoutHeader();
-        TimeoutHeader(uint32_t timeout);
-        uint32_t GetValue();
-        
-        
-        // Header serialization/deserialization
-        static TypeId GetTypeId ();
-        TypeId GetInstanceTypeId () const;
-        uint32_t GetSerializedSize () const;
-        void Serialize (Buffer::Iterator start) const;
-        uint32_t Deserialize (Buffer::Iterator start);
-        void Print (std::ostream &os) const;
-        
-    private:
-        uint32_t m_value;
-    };
-}
-}
diff --git a/model/ndnabstraction-header.cc b/model/ndnabstraction-header.cc
index 1b70e9b..a7ea402 100644
--- a/model/ndnabstraction-header.cc
+++ b/model/ndnabstraction-header.cc
@@ -19,4 +19,5 @@
  */
 
 #include "ndnabstraction-header.h"
+
 #include "ns3/assert.h"
diff --git a/model/ndnabstraction-header.h b/model/ndnabstraction-header.h
index 7d652ff..2cbd4a3 100644
--- a/model/ndnabstraction-header.h
+++ b/model/ndnabstraction-header.h
@@ -23,6 +23,7 @@
 
 #include <stdint.h>
 #include <vector>
+
 #include "ns3/header.h"
 #include "ns3/ipv4-address.h"
 #include "ns3/nstime.h"
diff --git a/model/stupid-interest-generator.cc b/model/stupid-interest-generator.cc
deleted file mode 100644
index bd2cb6d..0000000
--- a/model/stupid-interest-generator.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-//
-//  ndn_stupidinterestgenerator.cpp
-//  Abstraction
-//
-//  Created by Ilya Moiseenko on 05.08.11.
-//  Copyright 2011 UCLA. All rights reserved.
-//
-
-#include "stupid-interest-generator.h"
-
-#include "ns3/socket.h"
-#include "ns3/socket-factory.h"
-#include "ns3/simulator.h"
-
-#include "interest-header.h"
-#include "content-object-header.h"
-
-NS_LOG_COMPONENT_DEFINE ("StupidInterestGenerator");
-
-namespace ns3
-{
-//namespace NDNabstraction
-//{
-    using namespace NDNabstraction;
-    
-    NS_OBJECT_ENSURE_REGISTERED (StupidInterestGenerator);
-    
-    TypeId
-    StupidInterestGenerator::GetTypeId (void)
-    {
-        static TypeId tid = TypeId ("ns3::StupidInterestGenerator")
-        .SetParent<Application> ()
-        .AddConstructor<StupidInterestGenerator> ()
-        .AddAttribute ("Remote", "The address of the destination",
-                       AddressValue (),
-                       MakeAddressAccessor (&StupidInterestGenerator::m_peer),
-                       MakeAddressChecker ())
-        .AddAttribute ("OffTime", "Time interval between packets",
-                       TimeValue (Seconds (0.1)),
-                       MakeTimeAccessor (&StupidInterestGenerator::m_offTime),
-                       MakeTimeChecker ())
-        .AddAttribute ("Protocol", "The type of protocol to use.",
-                       TypeIdValue (UdpSocketFactory::GetTypeId ()),
-                       MakeTypeIdAccessor (&StupidInterestGenerator::m_tid),
-                       MakeTypeIdChecker ())
-        ;
-        return tid;
-    }
-
-    StupidInterestGenerator::StupidInterestGenerator ()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        m_socket = 0;
-        //m_connected = false;
-        //m_residualBits = 0;
-        //m_lastStartTime = Seconds (0);
-        //m_totBytes = 0;
-    }
-    
-    StupidInterestGenerator::~StupidInterestGenerator()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-    }
-    
-    void
-    StupidInterestGenerator::DoDispose (void)
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        
-        m_socket = 0;
-        // chain up
-        Application::DoDispose ();
-    }
-    
-    // Application Methods
-    void StupidInterestGenerator::StartApplication () // Called at time specified by Start
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        
-        // Create the socket if not already
-        if (!m_socket)
-        {
-            m_socket = Socket::CreateSocket (GetNode (), m_tid);
-            m_socket->Bind ();
-            m_socket->Connect (m_peer);
-            m_socket->SetAllowBroadcast (true);
-            m_socket->ShutdownRecv ();
-        }
-        // Insure no pending event
-        CancelEvents ();
-        // If we are not yet connected, there is nothing to do here
-        // The ConnectionComplete upcall will start timers at that time
-        //if (!m_connected) return;
-        ScheduleStartEvent ();
-    }
-    
-    void StupidInterestGenerator::StopApplication () // Called at time specified by Stop
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        
-        CancelEvents ();
-        if(m_socket != 0)
-        {
-            m_socket->Close ();
-        }
-        else
-        {
-            NS_LOG_WARN ("OnOffApplication found null socket to close in StopApplication");
-        }
-    }
-    
-    void StupidInterestGenerator::CancelEvents ()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        
-        Simulator::Cancel (m_sendEvent);
-        Simulator::Cancel (m_startStopEvent);
-    }
-
-    void StupidInterestGenerator::ScheduleStartEvent ()
-    {  // Schedules the event to start sending data (switch to the "On" state)
-        NS_LOG_FUNCTION_NOARGS ();
-        
-        Time offInterval = Seconds (m_offTime);
-        NS_LOG_LOGIC ("start at " << offInterval);
-        m_startStopEvent = Simulator::Schedule (offInterval, &StupidInterestGenerator::StartSending, this);
-    }
-    
-    // Event handlers
-    void StupidInterestGenerator::StartSending ()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        //m_lastStartTime = Simulator::Now ();
-        ScheduleNextTx ();  // Schedule the send packet event
-        //ScheduleStopEvent ();
-    }
-    
-    void StupidInterestGenerator::StopSending ()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        CancelEvents ();
-        
-        ScheduleStartEvent ();
-    }
-    
-    // Private helpers
-    void StupidInterestGenerator::ScheduleNextTx ()
-    {
-        NS_LOG_FUNCTION_NOARGS ();
-        
-
-        Time nextTime = Seconds(0.); //send now
-        m_sendEvent = Simulator::Schedule (nextTime,
-                                               &StupidInterestGenerator::SendPacket, this);
-    }
-
-        
-    void StupidInterestGenerator::SendPacket ()
-    {
-        // NS_LOG_FUNCTION_NOARGS ();
-        // NS_LOG_LOGIC ("sending packet at " << Simulator::Now ());
-        // NS_ASSERT (m_sendEvent.IsExpired ());
-        
-        // NameBuilder name;
-		// name("prefix1")("prefix2")("filename");
-		InterestHeader ();
-
-		ContentObjectHeader ();
-		
-        // const ccn_charbuf *output = name.GetName();
-        // Ptr<InterestPacket> packet = Create<InterestPacket>(name,(uint32_t)output->length);
-        // packet->AddTimeout(4000);
-        // UniformVariable var;
-        // packet->AddNonce(var.GetInteger(1,10000));
-        // m_socket->Send(packet);
-        
-        // ScheduleStartEvent();
-    }
-
-//}
-}
diff --git a/model/stupid-interest-generator.h b/model/stupid-interest-generator.h
deleted file mode 100644
index 8d927cd..0000000
--- a/model/stupid-interest-generator.h
+++ /dev/null
@@ -1,79 +0,0 @@
-//
-//  ndn_stupidinterestgenerator.h
-//  Abstraction
-//
-//  Created by Ilya Moiseenko on 05.08.11.
-//  Copyright 2011 UCLA. All rights reserved.
-//
-
-#include <ns3/application.h>
-#include <ns3/log.h>
-#include <ns3/address.h>
-#include <ns3/random-variable.h>
-#include <ns3/nstime.h>
-#include <ns3/event-id.h>
-#include <ns3/ptr.h>
-#include <ns3/udp-socket-factory.h>
-
-#include "ccn/ccn.h"
-
-namespace ns3 
-{
-
-    
-//namespace NDNabstraction
-//{
-    class Socket; //dynamic linking works in a somehow strange way
-    
-    class StupidInterestGenerator: public Application
-    {
-    public: 
-        static TypeId GetTypeId (void);
-        
-        StupidInterestGenerator ();
-        
-        virtual ~StupidInterestGenerator();
-        
-                
-    protected:
-        virtual void DoDispose (void);
-    private:
-        // inherited from Application base class.
-        virtual void StartApplication (void);    // Called at time specified by Start
-        virtual void StopApplication (void);     // Called at time specified by Stop
-        
-        //Time m_onTime;
-        Time m_offTime;
-        
-        Address         m_peer;         // Peer address
-        Ptr<Socket>     m_socket;
-        EventId         m_startStopEvent;     // Event id for next start or stop event
-        EventId         m_sendEvent;    // Eventid of pending "send packet" event
-        TypeId          m_tid;
-        
-        //helpers
-        void CancelEvents ();
-        
-        void Construct (Ptr<Node> n,
-                        const Address &remote,
-                        std::string tid,
-                        const RandomVariable& ontime,
-                        const RandomVariable& offtime,
-                        uint32_t size);
-        
-        // Event handlers
-        void StartSending ();
-        void StopSending ();
-        void SendPacket ();
-        
-    private:
-        void ScheduleNextTx ();
-        void ScheduleStartEvent ();
-        void ScheduleStopEvent ();
-        void ConnectionSucceeded (Ptr<Socket>);
-        void ConnectionFailed (Ptr<Socket>);
-        void Ignore (Ptr<Socket>);
-
-    };
-//}
-}
diff --git a/model/stupid-interest-sink.cc b/model/stupid-interest-sink.cc
deleted file mode 100644
index 757d154..0000000
--- a/model/stupid-interest-sink.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-//
-//  stupid-interest-sink.cpp
-//  Abstraction
-//
-//  Created by Ilya Moiseenko on 10.08.11.
-//  Copyright 2011 UCLA. All rights reserved.
-//
-
-#include "stupid-interest-sink.h"
-#include "ns3/address.h"
-#include "ns3/address-utils.h"
-#include "ns3/log.h"
-#include "ns3/inet-socket-address.h"
-#include "ns3/node.h"
-#include "ns3/socket.h"
-#include "ns3/udp-socket.h"
-#include "ns3/simulator.h"
-#include "ns3/socket-factory.h"
-#include "ns3/packet.h"
-#include "ns3/trace-source-accessor.h"
-#include "ns3/udp-socket-factory.h"
-
-using namespace std;
-
-namespace ns3 {
-    
-    NS_LOG_COMPONENT_DEFINE ("StupidInterestSink");
-    NS_OBJECT_ENSURE_REGISTERED (StupidInterestSink);
-    
-    TypeId 
-    StupidInterestSink::GetTypeId (void)
-    {
-        static TypeId tid = TypeId ("ns3::StupidInterestSink")
-        .SetParent<Application> ()
-        .AddConstructor<StupidInterestSink> ()
-        .AddAttribute ("Local", "The Address on which to Bind the rx socket.",
-                       AddressValue (),
-                       MakeAddressAccessor (&StupidInterestSink::m_local),
-                       MakeAddressChecker ())
-        .AddAttribute ("Protocol", "The type id of the protocol to use for the rx socket.",
-                       TypeIdValue (UdpSocketFactory::GetTypeId ()),
-                       MakeTypeIdAccessor (&StupidInterestSink::m_tid),
-                       MakeTypeIdChecker ())
-        .AddTraceSource ("Rx", "A packet has been received",
-                         MakeTraceSourceAccessor (&StupidInterestSink::m_rxTrace))
-        ;
-        return tid;
-    }
-    
-    StupidInterestSink::StupidInterestSink ()
-    {
-        NS_LOG_FUNCTION (this);
-        m_socket = 0;
-        m_totalRx = 0;
-    }
-    
-    StupidInterestSink::~StupidInterestSink()
-    {
-        NS_LOG_FUNCTION (this);
-    }
-    
-    uint32_t StupidInterestSink::GetTotalRx () const
-    {
-        return m_totalRx;
-    }
-    
-    Ptr<Socket>
-    StupidInterestSink::GetListeningSocket (void) const
-    {
-        NS_LOG_FUNCTION (this);
-        return m_socket;
-    }
-    
-    std::list<Ptr<Socket> >
-    StupidInterestSink::GetAcceptedSockets (void) const
-    {
-        NS_LOG_FUNCTION (this);
-        return m_socketList;
-    }
-    
-    void StupidInterestSink::DoDispose (void)
-    {
-        NS_LOG_FUNCTION (this);
-        m_socket = 0;
-        m_socketList.clear ();
-        
-        // chain up
-        Application::DoDispose ();
-    }
-    
-    
-    // Application Methods
-    void StupidInterestSink::StartApplication ()    // Called at time specified by Start
-    {
-        NS_LOG_FUNCTION (this);
-        // Create the socket if not already
-        if (!m_socket)
-        {
-            m_socket = Socket::CreateSocket (GetNode (), m_tid);
-            m_socket->Bind (m_local);
-            m_socket->Listen ();
-            m_socket->ShutdownSend ();
-            if (addressUtils::IsMulticast (m_local))
-            {
-                Ptr<UdpSocket> udpSocket = DynamicCast<UdpSocket> (m_socket);
-                if (udpSocket)
-                {
-                    // equivalent to setsockopt (MCAST_JOIN_GROUP)
-                    udpSocket->MulticastJoinGroup (0, m_local);
-                }
-                else
-                {
-                    NS_FATAL_ERROR ("Error: joining multicast on a non-UDP socket");
-                }
-            }
-        }
-        
-        m_socket->SetRecvCallback (MakeCallback (&StupidInterestSink::HandleRead, this));
-        m_socket->SetAcceptCallback (
-                                     MakeNullCallback<bool, Ptr<Socket>, const Address &> (),
-                                     MakeCallback (&StupidInterestSink::HandleAccept, this));
-        m_socket->SetCloseCallbacks (
-                                     MakeCallback (&StupidInterestSink::HandlePeerClose, this),
-                                     MakeCallback (&StupidInterestSink::HandlePeerError, this));
-    }
-    
-    void StupidInterestSink::StopApplication ()     // Called at time specified by Stop
-    {
-        NS_LOG_FUNCTION (this);
-        while(!m_socketList.empty ()) //these are accepted sockets, close them
-        {
-            Ptr<Socket> acceptedSocket = m_socketList.front ();
-            m_socketList.pop_front ();
-            acceptedSocket->Close ();
-        }
-        if (m_socket) 
-        {
-            m_socket->Close ();
-            m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
-        }
-    }
-    
-    void StupidInterestSink::HandleRead (Ptr<Socket> socket)
-    {
-        NS_LOG_FUNCTION (this << socket);
-        Ptr<Packet> packet;
-        Address from;
-        while (packet = socket->RecvFrom (from))
-        {
-            if (packet->GetSize () == 0)
-            { //EOF
-                break;
-            }
-            if (InetSocketAddress::IsMatchingType (from))
-            {
-                m_totalRx += packet->GetSize ();
-                InetSocketAddress address = InetSocketAddress::ConvertFrom (from);
-                NS_LOG_INFO ("Received " << packet->GetSize () << " bytes from " <<
-                             address.GetIpv4 () << " [" << address << "]"
-                             << " total Rx " << m_totalRx);
-                //cast address to void , to suppress 'address' set but not used 
-                //compiler warning in optimized builds
-                (void) address;
-            }
-            m_rxTrace (packet, from);
-        }
-    }
-    
-    void StupidInterestSink::HandlePeerClose (Ptr<Socket> socket)
-    {
-        NS_LOG_INFO ("PktSink, peerClose");
-    }
-    
-    void StupidInterestSink::HandlePeerError (Ptr<Socket> socket)
-    {
-        NS_LOG_INFO ("PktSink, peerError");
-    }
-    
-    
-    void StupidInterestSink::HandleAccept (Ptr<Socket> s, const Address& from)
-    {
-        NS_LOG_FUNCTION (this << s << from);
-        s->SetRecvCallback (MakeCallback (&StupidInterestSink::HandleRead, this));
-        m_socketList.push_back (s);
-    }
-    
-} // Namespace ns3
diff --git a/model/stupid-interest-sink.h b/model/stupid-interest-sink.h
deleted file mode 100644
index 66cedd9..0000000
--- a/model/stupid-interest-sink.h
+++ /dev/null
@@ -1,67 +0,0 @@
-//
-//  stupid-interest-sink.h
-//  Abstraction
-//
-//  Created by Ilya Moiseenko on 10.08.11.
-//  Copyright 2011 UCLA. All rights reserved.
-//
-
-#include "ns3/application.h"
-#include "ns3/event-id.h"
-#include "ns3/ptr.h"
-#include "ns3/traced-callback.h"
-#include "ns3/address.h"
-
-namespace ns3 
-{
-    
-    class Address;
-    class Socket;
-    class Packet;
-
-    class StupidInterestSink : public Application
-    {
-    public:
-        static TypeId GetTypeId (void);
-        StupidInterestSink ();
-        
-        virtual ~StupidInterestSink ();
-        
-        /**
-         * \return the total bytes received in this sink app
-         */
-        uint32_t GetTotalRx () const;
-        
-        /**
-         * \return pointer to listening socket
-         */
-        Ptr<Socket> GetListeningSocket (void) const;
-        
-        /**
-         * \return list of pointers to accepted sockets
-         */
-        std::list<Ptr<Socket> > GetAcceptedSockets (void) const;
-        
-    protected:
-        virtual void DoDispose (void);
-    private:
-        // inherited from Application base class.
-        virtual void StartApplication (void);    // Called at time specified by Start
-        virtual void StopApplication (void);     // Called at time specified by Stop
-        
-        void HandleRead (Ptr<Socket>);
-        void HandleAccept (Ptr<Socket>, const Address& from);
-        void HandlePeerClose (Ptr<Socket>);
-        void HandlePeerError (Ptr<Socket>);
-        
-        // In the case of TCP, each socket accept returns a new socket, so the 
-        // listening socket is stored seperately from the accepted sockets
-        Ptr<Socket>     m_socket;       // Listening socket
-        std::list<Ptr<Socket> > m_socketList; //the accepted sockets
-        
-        Address         m_local;        // Local address to bind to
-        uint32_t        m_totalRx;      // Total bytes received
-        TypeId          m_tid;          // Protocol TypeId
-        TracedCallback<Ptr<const Packet>, const Address &> m_rxTrace;
-    };
-}
\ No newline at end of file
