diff --git a/test/fw-per-fib-limits.cc b/test/fw-per-fib-limits.cc
deleted file mode 100644
index 555aca6..0000000
--- a/test/fw-per-fib-limits.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011,2012 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "fw-per-fib-limits.h"
-#include "ns3/core-module.h"
-#include "ns3/ndnSIM-module.h"
-#include "ns3/point-to-point-module.h"
-
-#include <boost/lexical_cast.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.test.fw.PerFibLimits");
-
-namespace ns3 {
-namespace ndn {
-
-void Decay (Ptr<fib::Entry> entry)
-{
-  entry->GetLimits ().DecayCurrentLimit ();
-}
-
-
-template<class T>
-void
-PrintTracedValue (std::string context, T oldValue, T newValue)
-{
-  NS_LOG_DEBUG (context << ": " <<
-                oldValue << " => " << newValue);
-}
-
-void
-Test1 (Ptr<fib::Entry> entry)
-{
-  entry->GetLimits ().IsBelowLimit ();
-  entry->GetLimits ().DecreaseLimit ();
-}
-
-void
-Test2 (Ptr<fib::Entry> entry)
-{
-  entry->GetLimits ().RemoveOutstanding ();
-  for (uint32_t i = 0; i < 40; i++)
-    entry->GetLimits ().IncreaseLimit ();
-}
-
-void
-FwPerFibLimits::CheckCurMaxLimit (Ptr<fib::Entry> entry, double amount)
-{
-  NS_TEST_ASSERT_MSG_EQ_TOL ((double)entry->GetLimits ().m_curMaxLimit, amount, 0.1, "");
-}
-
-void
-FwPerFibLimits::CheckOutstanding (Ptr<fib::Entry> entry, uint32_t amount)
-{
-  NS_TEST_ASSERT_MSG_EQ ((double)entry->GetLimits ().m_outstanding, amount, "");
-}
-
-// void 
-// FwPerFibLimits::Check2 (Ptr<fib::Entry> entry)
-// {
-//   NS_TEST_ASSERT_MSG_EQ ((double)entry->GetLimits ().m_outstanding, 0, "");
-// }
-
-void
-FwPerFibLimits::DoRun ()
-{
-  Simulator::Destroy ();
-
-  NodeContainer nodes;
-  nodes.Create (2);
-
-  PointToPointHelper p2pHelper;
-  p2pHelper.Install (nodes);
-  
-  StackHelper ndn;
-  ndn.SetForwardingStrategy ("ns3::ndn::fw::PerFibLimits");
-  ndn.Install (nodes);
-
-  Ptr<Fib> fib = nodes.Get (0)->GetObject<Fib> ();
-  ndn.AddRoute (nodes.Get (0), "/bla", 0, 10);
-
-  Ptr<fib::Entry> entry = fib->Begin ();
-  
-  bool ok = entry->GetLimits ().TraceConnect ("CurMaxLimit", "fibEntry.curMax", MakeCallback (PrintTracedValue<double>));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "");
-
-  ok = entry->GetLimits ().TraceConnect ("Outstanding", "fibEntry.out", MakeCallback (PrintTracedValue<uint32_t>));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "");
-
-  ok = nodes.Get (0)->GetObject<L3Protocol> ()->GetFace (0)->GetLimits ().TraceConnect ("CurMaxLimit", "face.curMax", MakeCallback (PrintTracedValue<double>));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "");
-  nodes.Get (0)->GetObject<L3Protocol> ()->GetFace (0)->GetLimits ().TraceDisconnect ("CurMaxLimit", "face.curMax", MakeCallback (PrintTracedValue<double>));
-
-  ok = nodes.Get (0)->GetObject<L3Protocol> ()->GetFace (0)->GetLimits ().TraceConnect ("Outstanding", "face.out",    MakeCallback (PrintTracedValue<uint32_t>));
-  NS_TEST_ASSERT_MSG_EQ (ok, true, "");
-  nodes.Get (0)->GetObject<L3Protocol> ()->GetFace (0)->GetLimits ().TraceDisconnect ("Outstanding", "face.out",    MakeCallback (PrintTracedValue<uint32_t>));
-
-  Config::Connect ("/NodeList/0/$ns3::ndn::L3Protocol/FaceList/*/Limits/CurMaxLimit", MakeCallback (PrintTracedValue<double>));
-  Config::Connect ("/NodeList/0/$ns3::ndn::L3Protocol/FaceList/*/Limits/Outstanding", MakeCallback (PrintTracedValue<uint32_t>));
-
-  nodes.Get (0)->GetObject<L3Protocol> ()->GetFace (0)->GetLimits ().SetMaxLimit (100);
-  
-  entry->GetLimits ().SetMaxLimit (100);
-  NS_TEST_ASSERT_MSG_EQ_TOL ((double)entry->GetLimits ().m_curMaxLimit, 100, 0.1, "");
-  
-  entry->GetLimits ().DecreaseLimit ();
-  NS_TEST_ASSERT_MSG_EQ_TOL ((double)entry->GetLimits ().m_curMaxLimit, 50, 0.1, "");
-
-  entry = fib->Begin ();
-
-  NS_LOG_DEBUG (entry);
-  Simulator::Schedule (Seconds (0.1), Decay, entry);
-  Simulator::Schedule (Seconds (25.0), Decay, entry);
-  Simulator::Schedule (Seconds (28.0), Decay, entry);
-  Simulator::Schedule (Seconds (40.0), Decay, entry);
-  Simulator::Schedule (Seconds (60.0), Decay, entry);
-  Simulator::Schedule (Seconds (100.0), Decay, entry);
-
-  Simulator::Schedule (Seconds (100.1), &FwPerFibLimits::CheckCurMaxLimit, this, entry, 81.5);
-
-  Simulator::Schedule (Seconds (100.5), &FwPerFibLimits::CheckOutstanding, this, entry, 0);
-  Simulator::Schedule (Seconds (101.0), Test1, entry);
-  Simulator::Schedule (Seconds (101.5), &FwPerFibLimits::CheckOutstanding, this, entry, 1);
-  Simulator::Schedule (Seconds (101.5), &FwPerFibLimits::CheckCurMaxLimit, this, entry, 40.75);
-
-  Simulator::Schedule (Seconds (102.0), Test2, entry);
-  Simulator::Schedule (Seconds (102.5), &FwPerFibLimits::CheckOutstanding, this, entry, 0);
-  Simulator::Schedule (Seconds (102.5), &FwPerFibLimits::CheckCurMaxLimit, this, entry, 41.75);
-
-  AppHelper consumer ("ns3::ndn::ConsumerBatches");
-  consumer.SetPrefix ("/bla");
-  consumer.SetAttribute ("Batches", StringValue ("105 1"));
-  consumer.SetAttribute ("LifeTime", StringValue ("1s"));
-  consumer.Install (nodes.Get (0))
-    .Stop (Seconds (110.0));
-
-  Simulator::Schedule (Seconds (105.1), &FwPerFibLimits::CheckOutstanding, this, entry, 1);
-  Simulator::Schedule (Seconds (106.7), &FwPerFibLimits::CheckOutstanding, this, entry, 0);
-
-  Simulator::Schedule (Seconds (109.0), &FwPerFibLimits::CheckCurMaxLimit, this, entry, 14.27);
-  Simulator::Schedule (Seconds (119.9), &FwPerFibLimits::CheckCurMaxLimit, this, entry, 16.32);
-  
-  Simulator::Stop (Seconds (120.0));
-  Simulator::Run ();
- 
-  Simulator::Destroy ();
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/test/fw-per-fib-limits.h b/test/fw-per-fib-limits.h
deleted file mode 100644
index 51bd0c4..0000000
--- a/test/fw-per-fib-limits.h
+++ /dev/null
@@ -1,52 +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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDNSIM_TEST_FW_PER_FIB_LIMITS_H
-#define NDNSIM_TEST_FW_PER_FIB_LIMITS_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-namespace ndn {
-
-class Fib;
-namespace fib { class Entry; }
-  
-class FwPerFibLimits : public TestCase
-{
-public:
-  FwPerFibLimits ()
-    : TestCase ("Test for ndn::fw::PerFibLimits")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-
-  void CheckCurMaxLimit (Ptr<fib::Entry> entry, double amount);
-  void CheckOutstanding (Ptr<fib::Entry> entry, uint32_t amount);
-  // void Check2 (Ptr<fib::Entry> entry);
-};
-  
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_TEST_FW_PER_FIB_LIMITS_H
diff --git a/test/generic-tests.cc b/test/generic-tests.cc
deleted file mode 100644
index 6fdc1a7..0000000
--- a/test/generic-tests.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011,2012 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "generic-tests.h"
-#include "ns3/core-module.h"
-#include "ns3/ndnSIM-module.h"
-#include "ns3/point-to-point-module.h"
-
-#include "../model/pit/ndn-pit-impl.h"
-#include "../utils/trie/persistent-policy.h"
-#include "../apps/ndn-producer.h"
-
-#include <boost/lexical_cast.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/make_shared.hpp>
-
-using namespace std;
-using namespace boost;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.test.Generic");
-
-namespace ns3 {
-namespace ndn {
-
-struct Bla {
-};
-
-void
-GenericTests::DoRun ()
-{
-  NodeContainer nodes;
-  nodes.Create (2);
-
-  PointToPointHelper p2p;
-  p2p.Install (nodes);
-  
-  StackHelper ndn;
-  ndn.SetDefaultRoutes (true);
-  ndn.Install (nodes);
-
-  Ptr<Node> node = nodes.Get (0);
-  
-  Ptr<Pit> pit = node->GetObject<Pit> ();
-  
-  Ptr<InterestHeader> header = Create<InterestHeader> ();
-  header->SetName (Create<NameComponents> ("/bla"));
-  header->SetInterestLifetime (Seconds (100));
-
-  Ptr<pit::Entry> e1 = pit->Create (header);
-  NS_ASSERT (e1 != 0);
-
-  header = Create<InterestHeader> ();
-  header->SetName (Create<NameComponents> ("/foo"));
-  header->SetInterestLifetime (Seconds (100));
-
-  Ptr<pit::Entry> e2 = pit->Create (header);
-  NS_ASSERT (e2 != 0);
-
-  list< Ptr< pit::Entry > > l;
-
-  l.push_back (e1);
-  l.push_back (e2);
-
-  BOOST_FOREACH (Ptr<pit::Entry> entry, l)
-    {
-      cout << "* " << entry->GetPrefix () << endl;
-    }
-
-  l.remove (e2);
-  
-  BOOST_FOREACH (Ptr<pit::Entry> entry, l)
-    {
-      cout << "* " << entry->GetPrefix () << endl;
-    }
-
-
-  cerr << "===========\n\n";
-
-  shared_ptr<Bla> p1 = make_shared <Bla> ();
-  shared_ptr<Bla> p2 = make_shared <Bla> ();
-
-  if (p1 < p2)
-    {
-      cerr << "They are equal\n";
-    }
-
-
-  Time x = Seconds (-1);
-  cout << x << endl;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/test/generic-tests.h b/test/generic-tests.h
deleted file mode 100644
index 56b1775..0000000
--- a/test/generic-tests.h
+++ /dev/null
@@ -1,46 +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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef GENERIC_TESTS_H
-#define GENERIC_TESTS_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-namespace ndn {
-
-class GenericTests :
-    public TestCase
-{
-public:
-  GenericTests ()
-    : TestCase ("Generic tests")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-};
-  
-} // namespace ndn
-} // namespace ns3
-
-#endif // GENERIC_TESTS_H
diff --git a/test/ndnSIM-stats-tree.cc b/test/ndnSIM-stats-tree.cc
deleted file mode 100644
index ee7c235..0000000
--- a/test/ndnSIM-stats-tree.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011,2012 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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndnSIM-stats-tree.h"
-#include "ns3/core-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-#include "../utils/stats/stats-tree.h"
-#include "../apps/ndn-producer.h"
-
-#include <boost/lexical_cast.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.StatsTreeTest");
-
-namespace ns3 {
-
-using namespace ndn;
-using namespace ndn::ndnSIM;
-
-void
-StatsTreeTest::DoRun ()
-{
-  BasicTests ();
-  SimpleScenario ();
-}
-
-
-void
-StatsTreeTest::BasicTests ()
-{
-  StackHelper ndn;
-
-  Ptr<Node> node1   = CreateObject<Node> ();
-  Ptr<App> app1 = CreateObject<Producer> ();
-  node1->AddApplication (app1);
-  ndn.Install (node1);
-
-  Ptr<Face> face1 = CreateObject<AppFace> (app1);
-  Ptr<Face> face2 = CreateObject<AppFace> (app1);
-  Ptr<Face> face3 = CreateObject<AppFace> (app1);
-
-  node1->GetObject<L3Protocol> ()->AddFace (face1);
-  node1->GetObject<L3Protocol> ()->AddFace (face2);
-  node1->GetObject<L3Protocol> ()->AddFace (face3);
-
-  // NS_LOG_DEBUG (*face1 << ", " << *face2 << ", " << *face3);
-  
-  NS_TEST_ASSERT_MSG_NE (*face1, *face2, "Face1 should not be equal to Face2");
-  NS_TEST_ASSERT_MSG_NE (face1, face2, "&Face1 should not be equal to &Face2");
-  NS_TEST_ASSERT_MSG_NE (*face2, *face3, "Face2 should not be equal to Face3");
-  NS_TEST_ASSERT_MSG_NE (face2, face3, "&Face2 should not be equal to &Face3");
-
-  // hack
-  face3->SetId (0);
-  NS_TEST_ASSERT_MSG_EQ (*face1, *face3, "Face1 should be now equal to Face3");
-  NS_TEST_ASSERT_MSG_NE (face1, face3, "&Face1 should not be equal to &Face3");
-
-  LoadStatsNode::stats_container bla;
-  bla[face1].Step (); 
-  bla[face2].Step ();
-
-  NS_TEST_ASSERT_MSG_EQ (bla.size (), 2, "Should be two entries in the container");
-
-  bla[face3].Step ();
-  NS_TEST_ASSERT_MSG_EQ (bla.size (), 2, "Should be still two entries in the container");
-
-  LoadStatsNode node;
-  node.AddIncoming (face1);
-  node.AddIncoming (face1);
-  node.AddIncoming (face2);
-  node.AddIncoming (face3);
-
-  NS_TEST_ASSERT_MSG_EQ (node.incoming ().size (), 2, "Incoming should have two entries again");
-  NS_TEST_ASSERT_MSG_EQ (node.outgoing ().size (), 0, "Outgoing should have 0 entries");
-
-  node.Satisfy ();
-  node.Satisfy ();
-  NS_TEST_ASSERT_MSG_EQ (node.incoming ().size (), 2, "Incoming should have two entries again");
-  NS_TEST_ASSERT_MSG_EQ (node.outgoing ().size (), 0, "Outgoing should have 0 entries");
-
-  node.Timeout ();
-  NS_TEST_ASSERT_MSG_EQ (node.incoming ().size (), 2, "Incoming should have two entries again");
-  NS_TEST_ASSERT_MSG_EQ (node.outgoing ().size (), 0, "Outgoing should have 0 entries");
-
-  // NS_LOG_DEBUG ("count:      " << node.incoming ().find (face1)->second.count ());
-  // NS_LOG_DEBUG ("satisfied:  " << node.incoming ().find (face1)->second.satisfied ());
-  // NS_LOG_DEBUG ("unsatisfied:" << node.incoming ().find (face1)->second.unsatisfied ());
-
-  node.Step ();
-  
-  // NS_LOG_DEBUG ("count:      " << node.incoming ().find (face1)->second.count ());
-  // NS_LOG_DEBUG ("satisfied:  " << node.incoming ().find (face1)->second.satisfied ());
-  // NS_LOG_DEBUG ("unsatisfied:" << node.incoming ().find (face1)->second.unsatisfied ());
-  
-  LoadStats::stats_tuple tuple = node.incoming ().find (face1)->second.GetSatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, satisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<0> (), 0.667, 0.01, "Satisfied ratio should be ~ 2/3");
-  NS_TEST_ASSERT_MSG_LT     (tuple.get<1> (), 0,           "Satisfied ratio should be less 0 (invalid)");
-  NS_TEST_ASSERT_MSG_LT     (tuple.get<2> (), 0,           "Satisfied ratio should be less 0 (invalid)");
-  
-  tuple = node.incoming ().find (face1)->second.GetUnsatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, unsatisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<0> (), 0.333, 0.01, "Satisfied ratio should be ~ 1/3");
-  NS_TEST_ASSERT_MSG_LT     (tuple.get<1> (), 0,           "Satisfied ratio should be less 0 (invalid)");
-  NS_TEST_ASSERT_MSG_LT     (tuple.get<2> (), 0,           "Satisfied ratio should be less 0 (invalid)");
-
-  node.AddIncoming (face1);
-  node.Timeout ();
-  node.Step ();
-
-  // NS_LOG_DEBUG ("After decaying");
-  
-  tuple = node.incoming ().find (face1)->second.GetSatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, satisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<0> (), 0.473776, 0.01, "");
-  // NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<1> (), 0.489, 0.01, "");
-  // NS_TEST_ASSERT_MSG_LT     (tuple.get<2> (), 0,           "");
-  
-  tuple = node.incoming ().find (face1)->second.GetUnsatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, unsatisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<0> (), 0.526, 0.01, "");
-  // NS_TEST_ASSERT_MSG_EQ_TOL (tuple.get<1> (), 0.504, 0.01, "");
-  // NS_TEST_ASSERT_MSG_LT     (tuple.get<2> (), 0,           "");  
-
-  for (uint32_t i = 0; i < 10; i++ )
-    node.Step ();
-
-  // NS_LOG_DEBUG ("After more decaying");
-
-  tuple = node.incoming ().find (face1)->second.GetSatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, satisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_LT (tuple.get<0> (), 0, "");
-  // NS_TEST_ASSERT_MSG_LT (tuple.get<1> (), 0, "");
-  // NS_TEST_ASSERT_MSG_LT (tuple.get<2> (), 0, "");
-  
-  tuple = node.incoming ().find (face1)->second.GetUnsatisfiedRatio ();
-  // NS_LOG_DEBUG ("In, face1, unsatisfied ratio: " << tuple.get<0> () << ", " << tuple.get<1> () << ", " << tuple.get<2> ());
-
-  NS_TEST_ASSERT_MSG_LT (tuple.get<0> (), 0, "");
-  // NS_TEST_ASSERT_MSG_LT (tuple.get<1> (), 0, "");
-  // NS_TEST_ASSERT_MSG_LT (tuple.get<2> (), 0, "");
-
-  /////////////////////////////////////////////////////
-  //              Actual tree testing                //
-  /////////////////////////////////////////////////////
-
-  StatsTree tree;
-  tree.NewPitEntry ("/bla/bla/bla");
-  tree.NewPitEntry ("/bla/bla/bla");
-  tree.NewPitEntry ("/bla/bla/bla");
-  tree.NewPitEntry ("/foo/bar");
-  tree.NewPitEntry ("/bar/foo");
-  tree.NewPitEntry ("/tra/la/la");
-
-  tree.Incoming ("/bla/bla/bla", face1);
-  tree.Outgoing ("/foo/bar", face2);
-  tree.Satisfy  ("/bar/foo");
-  tree.Satisfy  ("/tra/la/la");
-  tree.Timeout  ("/tra/la/la");
-
-  tree.Step ();
-
-  // NS_TEST_ASSERT_MSG_EQ (boost::lexical_cast<std::string> (tree ["/"]),
-  //                        // "PIT: 0.479734, 0.0991713, 0.0332409/0.159911, 0.0330571, 0.0110803/0.0799556, 0.0165285, 0.00554015",
-  //                        "PIT: ration satisfied: 0.333333 0.333333 -1 / unsatisfied: 0.166667 0.166667 -1 ",
-  //                        "Something wrong with stats tree");
-  NS_TEST_ASSERT_MSG_EQ (boost::lexical_cast<std::string> (tree ["/"]),
-                         // "PIT: 0.479734, 0.0991713, 0.0332409/0.159911, 0.0330571, 0.0110803/0.0799556, 0.0165285, 0.00554015",
-                         "PIT: ration satisfied: 0.333333 -1 -1 / unsatisfied: 0.166667 -1 -1 ",
-                         "Something wrong with stats tree");
-
-  NS_TEST_ASSERT_MSG_NE (&tree ["/bla/bla/bla"],
-                         &tree ["/"],
-                         "The stats tree should not be empty");
-  for (uint32_t i = 0; i < 9; i++)
-    {
-      tree.Step ();
-    }
-  NS_LOG_DEBUG (tree ["/bla/bla/bla"]);
-  NS_LOG_DEBUG (tree ["/"]);
-  NS_TEST_ASSERT_MSG_EQ (&tree ["/bla/bla/bla"],
-                         &tree ["/"],
-                         "The stats tree should be empty (only root node)");
-}
-
-
-
-void
-StatsTreeTest::SimpleScenario ()
-{
-  NodeContainer nodes;
-  nodes.Create (2);
-  PointToPointHelper p2pHelper;
-  p2pHelper.Install (nodes);
-
-
-  
-}
-
-}
diff --git a/test/ndnSIM-stats-tree.h b/test/ndnSIM-stats-tree.h
deleted file mode 100644
index a98a79f..0000000
--- a/test/ndnSIM-stats-tree.h
+++ /dev/null
@@ -1,50 +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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDNSIM_TEST_STATS_TREE_H
-#define NDNSIM_TEST_STATS_TREE_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3
-{
-
-class StatsTreeTest : public TestCase
-{
-public:
-  StatsTreeTest ()
-    : TestCase ("StatsTree test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-
-  void
-  BasicTests ();
-
-  void
-  SimpleScenario ();
-};
-  
-}
-
-#endif // NDNSIM_TEST_STATS_TREE_H
diff --git a/test/ndnSIM-tests.cc b/test/ndnSIM-tests.cc
index 7242d98..004f761 100644
--- a/test/ndnSIM-tests.cc
+++ b/test/ndnSIM-tests.cc
@@ -23,9 +23,6 @@
 
 #include "ndnSIM-serialization.h"
 #include "ndnSIM-pit.h"
-#include "ndnSIM-stats-tree.h"
-#include "fw-per-fib-limits.h"
-#include "generic-tests.h"
 
 namespace ns3
 {
@@ -38,13 +35,9 @@
   {
     SetDataDir (NS_TEST_SOURCEDIR);
     
-    // AddTestCase (new InterestSerializationTest ());
-    // AddTestCase (new ContentObjectSerializationTest ());
-    // AddTestCase (new PitTest ());
-    // AddTestCase (new StatsTreeTest ());
-
-    // AddTestCase (new ndn::FwPerFibLimits ());
-    AddTestCase (new ndn::GenericTests ());
+    AddTestCase (new InterestSerializationTest ());
+    AddTestCase (new ContentObjectSerializationTest ());
+    AddTestCase (new PitTest ());
   }
 };
 
