diff --git a/helper/ndn_stupidinterestgenerator_helper.cc b/helper/ndn_stupidinterestgenerator_helper.cc
new file mode 100644
index 0000000..982f283
--- /dev/null
+++ b/helper/ndn_stupidinterestgenerator_helper.cc
@@ -0,0 +1,65 @@
+//
+//  ndn_stupidinterestgenerator_helper.cpp
+//  Abstraction
+//
+//  Created by Ilya Moiseenko on 05.08.11.
+//  Copyright 2011 UCLA. All rights reserved.
+//
+
+#include "ndn_stupidinterestgenerator_helper.h"
+#include "ns3/inet-socket-address.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/string.h"
+#include "ns3/names.h"
+
+
+namespace ns3 {
+    
+    StupidInterestGeneratorHelper::StupidInterestGeneratorHelper (std::string protocol, Address address)
+    {
+        m_factory.SetTypeId ("ns3::StupidInterestGenerator");
+        m_factory.Set ("Protocol", StringValue (protocol));
+        m_factory.Set ("Remote", AddressValue (address));
+    }
+    
+    void 
+    StupidInterestGeneratorHelper::SetAttribute (std::string name, const AttributeValue &value)
+    {
+        m_factory.Set (name, value);
+    }
+    
+    ApplicationContainer
+    StupidInterestGeneratorHelper::Install (Ptr<Node> node) const
+    {
+        return ApplicationContainer (InstallPriv (node));
+    }
+    
+    ApplicationContainer
+    StupidInterestGeneratorHelper::Install (std::string nodeName) const
+    {
+        Ptr<Node> node = Names::Find<Node> (nodeName);
+        return ApplicationContainer (InstallPriv (node));
+    }
+    
+    ApplicationContainer
+    StupidInterestGeneratorHelper::Install (NodeContainer c) const
+    {
+        ApplicationContainer apps;
+        for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+        {
+            apps.Add (InstallPriv (*i));
+        }
+        
+        return apps;
+    }
+    
+    Ptr<Application>
+    StupidInterestGeneratorHelper::InstallPriv (Ptr<Node> node) const
+    {
+        Ptr<Application> app = m_factory.Create<Application> ();
+        node->AddApplication (app);
+        
+        return app;
+    }
+    
+} // namespace ns3
diff --git a/helper/ndn_stupidinterestgenerator_helper.h b/helper/ndn_stupidinterestgenerator_helper.h
new file mode 100644
index 0000000..4f9f6bb
--- /dev/null
+++ b/helper/ndn_stupidinterestgenerator_helper.h
@@ -0,0 +1,86 @@
+//
+//  ndn_stupidinterestgenerator_helper.h
+//  Abstraction
+//
+//  Created by Ilya Moiseenko on 05.08.11.
+//  Copyright 2011 UCLA. All rights reserved.
+//
+
+#include "ns3/object-factory.h"
+#include "ns3/ipv4-address.h"
+#include "ns3/node-container.h"
+#include "ns3/application-container.h"
+
+namespace ns3 {
+    
+    /**
+     * \brief A helper to make it easier to instantiate an ns3::OnOffApplication 
+     * on a set of nodes.
+     */
+    class StupidInterestGeneratorHelper
+    {
+    public:
+        /**
+         * Create an OnOffHelper to make it easier to work with OnOffApplications
+         *
+         * \param protocol the name of the protocol to use to send traffic
+         *        by the applications. This string identifies the socket
+         *        factory type used to create sockets for the applications.
+         *        A typical value would be ns3::UdpSocketFactory.
+         * \param address the address of the remote node to send traffic
+         *        to.
+         */
+        StupidInterestGeneratorHelper (std::string protocol, Address address);
+        
+        /**
+         * Helper function used to set the underlying application attributes.
+         *
+         * \param name the name of the application attribute to set
+         * \param value the value of the application attribute to set
+         */
+        void SetAttribute (std::string name, const AttributeValue &value);
+        
+        /**
+         * Install an ns3::OnOffApplication on each node of the input container
+         * configured with all the attributes set with SetAttribute.
+         *
+         * \param c NodeContainer of the set of nodes on which an OnOffApplication 
+         * will be installed.
+         * \returns Container of Ptr to the applications installed.
+         */
+        ApplicationContainer Install (NodeContainer c) const;
+        
+        /**
+         * Install an ns3::OnOffApplication on the node configured with all the 
+         * attributes set with SetAttribute.
+         *
+         * \param node The node on which an OnOffApplication will be installed.
+         * \returns Container of Ptr to the applications installed.
+         */
+        ApplicationContainer Install (Ptr<Node> node) const;
+        
+        /**
+         * Install an ns3::OnOffApplication on the node configured with all the 
+         * attributes set with SetAttribute.
+         *
+         * \param nodeName The node on which an OnOffApplication will be installed.
+         * \returns Container of Ptr to the applications installed.
+         */
+        ApplicationContainer Install (std::string nodeName) const;
+        
+    private:
+        /**
+         * \internal
+         * Install an ns3::OnOffApplication on the node configured with all the 
+         * attributes set with SetAttribute.
+         *
+         * \param node The node on which an OnOffApplication will be installed.
+         * \returns Ptr to the application installed.
+         */
+        Ptr<Application> InstallPriv (Ptr<Node> node) const;
+        std::string m_protocol;
+        Address m_remote;
+        ObjectFactory m_factory;
+    };
+    
+} // namespace ns3
diff --git a/model/ndn_contentpacket.cc b/model/ndn_contentpacket.cc
index 599d175..60b4963 100644
--- a/model/ndn_contentpacket.cc
+++ b/model/ndn_contentpacket.cc
@@ -24,7 +24,8 @@
 {
 namespace NDNabstraction
 {
-    ContentPacket::ContentPacket(const struct ccn_charbuf *Name,const void *data,size_t size):Packet()
+    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);
diff --git a/model/ndn_stupidinterestgenerator.cc b/model/ndn_stupidinterestgenerator.cc
new file mode 100644
index 0000000..629d48f
--- /dev/null
+++ b/model/ndn_stupidinterestgenerator.cc
@@ -0,0 +1,177 @@
+//
+//  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"
+
+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.AddComponent("prefix1");
+        name.AddComponent("prefix2");
+        name.AddComponent("filename");
+        ccn_charbuf *output = name.GetName();
+        Ptr<InterestPacket> packet = Create<InterestPacket>(output->buf,(uint32_t)output->length);
+        packet->AddTimeout(4000);
+        UniformVariable var;
+        packet->AddNonce(var.GetInteger(1,10000));
+        m_socket->Send(packet);
+        
+        ScheduleStartEvent();
+    }
+
+//}
+}
\ No newline at end of file
diff --git a/model/ndn_stupidinterestgenerator.h b/model/ndn_stupidinterestgenerator.h
new file mode 100644
index 0000000..6407d32
--- /dev/null
+++ b/model/ndn_stupidinterestgenerator.h
@@ -0,0 +1,78 @@
+//
+//  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>);
+
+    };
+//}
+}
\ No newline at end of file
diff --git a/wscript b/wscript
index 00d5c32..1747f46 100644
--- a/wscript
+++ b/wscript
@@ -18,7 +18,9 @@
         'model/ndn_timeoutheader.cc',
         'model/ndn_nonceheader.cc',
         'model/ndn_namebuilder.cc',
+        'model/ndn_stupidinterestgenerator.cc',
         'helper/ndnabstraction-helper.cc',
+        'helper/ndn_stupidinterestgenerator_helper.cc',
         ]
 
     module_test = bld.create_ns3_module_test_library('NDNabstraction')
@@ -42,7 +44,9 @@
         'model/ndn_timeoutheader.h',
         'model/ndn_nonceheader.h',
         'model/ndn_namebuilder.h',
+        'model/ndn_stupidinterestgenerator.h',
         'helper/ndnabstraction-helper.h',
+        'helper/ndn_stupidinterestgenerator_helper.h',
         ]
 
 
