diff --git a/model/interest-packet.cc b/model/interest-packet.cc
new file mode 100644
index 0000000..350095a
--- /dev/null
+++ b/model/interest-packet.cc
@@ -0,0 +1,87 @@
+/* -*-  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 "interest-packet.h"
+
+namespace ns3
+{
+namespace NDNabstraction
+{
+  InterestPacket::InterestPacket ()
+  {
+  }
+  // InterestPacket::InterestPacket(const unsigned char *name, uint32_t size)
+  //   :Packet(name,size)
+  // {
+  //   maxNameLength = 10240;
+  // }
+    
+  // uint32_t 
+  // InterestPacket::GetName(unsigned char *name)
+  // {
+  //   //uint32_t Packet::CopyData (uint8_t *buffer, uint32_t size) const
+  //   return CopyData((uint8_t*) name, maxNameLength); 
+  // }
+    
+  // void 
+  // InterestPacket::AddTimeout(uint32_t milliseconds)
+  // {
+  //   TimeoutHeader tHeader (milliseconds);
+  //   AddHeader (tHeader);    
+  // }
+    
+  // uint32_t
+  // InterestPacket::GetTimeout(void)
+  // {
+  //   TimeoutHeader tHeader;
+  //   PeekHeader(tHeader);
+  //   return tHeader.GetValue();
+  // }
+    
+  // void
+  // InterestPacket::RemoveTimeout(void)
+  // {
+  //   TimeoutHeader tHeader;
+  //   RemoveHeader(tHeader);
+  // }
+    
+  // void 
+  // InterestPacket::AddNonce(uint32_t nonce)
+  // {
+  //   NonceHeader tHeader (nonce);
+  //   AddHeader (tHeader);
+  // }
+    
+  // uint32_t
+  // InterestPacket::GetNonce(void)
+  // {
+  //   NonceHeader tHeader;
+  //   PeekHeader(tHeader);
+  //   return tHeader.GetValue();
+  // }
+    
+  // void
+  // InterestPacket::RemoveNonce(void)
+  // {
+  //   NonceHeader tHeader;
+  //   RemoveHeader(tHeader);
+  // }
+}
+}
diff --git a/model/ndn_interestpacket.h b/model/interest-packet.h
similarity index 64%
rename from model/ndn_interestpacket.h
rename to model/interest-packet.h
index 51f2a9a..df04403 100644
--- a/model/ndn_interestpacket.h
+++ b/model/interest-packet.h
@@ -18,42 +18,43 @@
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#ifndef ndn_interestpacket_h
-#define ndn_interestpacket_h
+#ifndef _INTEREST_PACKET_H_
+#define _INTEREST_PACKET_H_
 
 //#define CCN_INTEREST_LIFETIME_SEC 4
 //#define CCN_INTEREST_LIFETIME_MICROSEC (CCN_INTEREST_LIFETIME_SEC * 1000000)
 
-#include "ns3/header.h"
+#include <ns3/header.h>
 #include <ns3/packet.h>
 #include <string>
-#include "ndn_timeoutheader.h"
-#include "ndn_nonceheader.h"
 
 namespace ns3
 {
 namespace NDNabstraction
 {
   
-  class InterestPacket : public Packet 
-  {
-  public: 
-    InterestPacket(const unsigned char *name, uint32_t size);
-            
-    uint32_t GetName(unsigned char *name);
-        
-    void AddTimeout(uint32_t milliseconds);
-    uint32_t GetTimeout(void);
-    void RemoveTimeout(void);
-        
-    void AddNonce(uint32_t nonce);
-    uint32_t GetNonce(void);
-    void RemoveNonce(void);
-        
-    uint32_t maxNameLength;
-  };
+class InterestPacket : public Packet 
+{
+public:
+  InterestPacket( );
+  // InterestPacket (const unsigned char *name, uint32_t size);
+  
+          
+  // uint32_t GetName (unsigned char *name);
+      
+  // void AddTimeout (uint32_t milliseconds);
+  // uint32_t GetTimeout (void);
+  // void RemoveTimeout (void);
+      
+  // void AddNonce (uint32_t nonce);
+  // uint32_t GetNonce (void);
+  // void RemoveNonce (void);
+      
+  // uint32_t maxNameLength;
+  
+};
   
 }
 }
 
-#endif 
+#endif // _NDN_PACKET_H_
diff --git a/model/ndn_namebuilder.cc b/model/name-builder.cc
similarity index 97%
rename from model/ndn_namebuilder.cc
rename to model/name-builder.cc
index e907e01..2ee432a 100644
--- a/model/ndn_namebuilder.cc
+++ b/model/name-builder.cc
@@ -18,7 +18,7 @@
  * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#include "ndn_namebuilder.h"
+#include "name-builder.h"
 #include <ccn/ccn.h>
 
 using namespace std;
diff --git a/model/ndn_namebuilder.h b/model/name-builder.h
similarity index 100%
rename from model/ndn_namebuilder.h
rename to model/name-builder.h
diff --git a/model/ndn_interestpacket.cc b/model/ndn_interestpacket.cc
deleted file mode 100644
index bb3a878..0000000
--- a/model/ndn_interestpacket.cc
+++ /dev/null
@@ -1,84 +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_interestpacket.h"
-
-namespace ns3
-{
-namespace NDNabstraction
-{
-  InterestPacket::InterestPacket(const unsigned char *name, uint32_t size)
-    :Packet(name,size)
-  {
-    maxNameLength = 10240;
-  }
-    
-  uint32_t 
-  InterestPacket::GetName(unsigned char *name)
-  {
-    //uint32_t Packet::CopyData (uint8_t *buffer, uint32_t size) const
-    return CopyData((uint8_t*) name, maxNameLength); 
-  }
-    
-  void 
-  InterestPacket::AddTimeout(uint32_t milliseconds)
-  {
-    TimeoutHeader tHeader (milliseconds);
-    AddHeader (tHeader);    
-  }
-    
-  uint32_t
-  InterestPacket::GetTimeout(void)
-  {
-    TimeoutHeader tHeader;
-    PeekHeader(tHeader);
-    return tHeader.GetValue();
-  }
-    
-  void
-  InterestPacket::RemoveTimeout(void)
-  {
-    TimeoutHeader tHeader;
-    RemoveHeader(tHeader);
-  }
-    
-  void 
-  InterestPacket::AddNonce(uint32_t nonce)
-  {
-    NonceHeader tHeader (nonce);
-    AddHeader (tHeader);
-  }
-    
-  uint32_t
-  InterestPacket::GetNonce(void)
-  {
-    NonceHeader tHeader;
-    PeekHeader(tHeader);
-    return tHeader.GetValue();
-  }
-    
-  void
-  InterestPacket::RemoveNonce(void)
-  {
-    NonceHeader tHeader;
-    RemoveHeader(tHeader);
-  }
-}
-}
diff --git a/model/ndn_stupidinterestgenerator.cc b/model/ndn_stupidinterestgenerator.cc
deleted file mode 100644
index 7c59f6c..0000000
--- a/model/ndn_stupidinterestgenerator.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-//
-//  ndn_stupidinterestgenerator.cpp
-//  Abstraction
-//
-//  Created by Ilya Moiseenko on 05.08.11.
-//  Copyright 2011 UCLA. All rights reserved.
-//
-
-#include "ndn_stupidinterestgenerator.h"
-#include "ns3/socket.h"
-#include "ns3/socket-factory.h"
-#include "ns3/simulator.h"
-#include "ndn_interestpacket.h"
-#include "ndn_namebuilder.h"
-
-#include "ccn/ccn_charbuf.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");
-		
-        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/ndn_stupidinterestgenerator.h b/model/ndn_stupidinterestgenerator.h
deleted file mode 100644
index 0a8f396..0000000
--- a/model/ndn_stupidinterestgenerator.h
+++ /dev/null
@@ -1,78 +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 <ccn/ccn.h>
-#include "ns3/udp-socket-factory.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>);
-
-    };
-//}
-}
