diff --git a/utils/tracers/ndn-cs-imp-tracer.cc b/utils/tracers/ndn-cs-imp-tracer.cc
deleted file mode 100644
index 3016bf4..0000000
--- a/utils/tracers/ndn-cs-imp-tracer.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 UCLA
- *
- * 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 "ndn-cs-imp-tracer.h"
-
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/ndn-app.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-content-object.h"
-#include "ns3/simulator.h"
-#include "ns3/node-list.h"
-#include "ns3/log.h"
-
-#include <fstream>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.CsImpTracer");
-
-namespace ns3 {
-namespace ndn {
-
-boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<CsImpTracer> > >
-CsImpTracer::InstallAll (const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
-{
-  using namespace boost;
-  using namespace std;
-  
-  std::list<Ptr<CsImpTracer> > tracers;
-  boost::shared_ptr<std::ofstream> outputStream (new std::ofstream ());
-  outputStream->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
-
-  if (!outputStream->is_open ())
-    return boost::make_tuple (outputStream, tracers);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      NS_LOG_DEBUG ("Node: " << (*node)->GetId ());
-
-      Ptr<CsImpTracer> trace = Create<CsImpTracer> (outputStream, *node);
-      trace->SetAveragingPeriod (averagingPeriod);
-      tracers.push_back (trace);
-    }
-
-  if (tracers.size () > 0)
-    {
-      // *m_l3RateTrace << "# "; // not necessary for R's read.table
-      tracers.front ()->PrintHeader (*outputStream);
-      *outputStream << "\n";
-    }
-
-  return boost::make_tuple (outputStream, tracers);
-}
-
-
-
-CsImpTracer::CsImpTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
-  : CsTracer (node)
-  , m_os (os)
-{
-  Reset ();
-}
-
-CsImpTracer::CsImpTracer (boost::shared_ptr<std::ostream> os, const std::string &node)
-  : CsTracer (node)
-  , m_os (os)
-{
-  Reset ();
-}
-
-CsImpTracer::~CsImpTracer ()
-{
-};
-
-void
-CsImpTracer::SetAveragingPeriod (const Time &period)
-{
-  m_period = period;
-  m_printEvent.Cancel ();
-  m_printEvent = Simulator::Schedule (m_period, &CsImpTracer::PeriodicPrinter, this);
-}
-
-void
-CsImpTracer::PeriodicPrinter ()
-{
-  Print (*m_os);
-  Reset ();
-  
-  m_printEvent = Simulator::Schedule (m_period, &CsImpTracer::PeriodicPrinter, this);
-}
-
-void
-CsImpTracer::PrintHeader (std::ostream &os) const
-{
-  os << "Time" << "\t"
-
-     << "Node" << "\t"
-//     << "FaceId" << "\t"
- //    << "FaceDescr" << "\t"
-
-     << "Type" << "\t"
-     << "Packets" << "\t";
-//     << "Kilobytes";
-}
-
-void
-CsImpTracer::Reset ()
-{
-	m_stats.Reset();
-}
-
-#define PRINTER(printName, fieldName) \
-  os << time.ToDouble (Time::S) << "\t"                                 \
-  << m_node << "\t"                                                     \
-  << printName << "\t"                                                  \
-  << m_stats.fieldName << "\n";
-
-
-void
-CsImpTracer::Print (std::ostream &os) const
-{
-  Time time = Simulator::Now ();
-
-  PRINTER ("CacheHits",   m_cacheHits);
-  PRINTER ("CacheMisses",  m_cacheMisses);
-}
-
-void 
-CsImpTracer::CacheHits (std::string context,
-			Ptr<const InterestHeader>, Ptr<const ContentObjectHeader>)
-{
-	m_stats.m_cacheHits ++;
-}
-
-void 
-CsImpTracer::CacheMisses (std::string context, 
-			Ptr<const InterestHeader>)
-{
-	m_stats.m_cacheMisses ++;
-}
-
-
-} // namespace ndn
-} // namespace ns3
diff --git a/utils/tracers/ndn-cs-imp-tracer.h b/utils/tracers/ndn-cs-imp-tracer.h
deleted file mode 100644
index bc9c48d..0000000
--- a/utils/tracers/ndn-cs-imp-tracer.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011 UCLA
- *
- * 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 NDN_CS_IMP_TRACER_H
-#define NDN_CS_IMP_TRACER_H
-
-#include "ndn-cs-tracer.h"
-
-#include <ns3/nstime.h>
-#include <ns3/event-id.h>
-
-#include <boost/tuple/tuple.hpp>
-#include <boost/shared_ptr.hpp>
-#include <map>
-#include <list>
-
-namespace ns3 {
-namespace ndn {
-
-/**
- * @ingroup ndn
- * @brief CCNx network-layer tracer for aggregate packet counts
- */
-class CsImpTracer : public CsTracer
-{
-public:
-  /**
-   * @brief Trace constructor that attaches to the node using node pointer
-   * @param os    reference to the output stream
-   * @param node  pointer to the node
-   */
-  CsImpTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node);
-  
-  /**
-   * @brief Trace constructor that attaches to the node using node name
-   * @param os        reference to the output stream
-   * @param nodeName  name of the node registered using Names::Add
-   */
-  CsImpTracer (boost::shared_ptr<std::ostream> os, const std::string &nodeName);
-
-  /**
-   * @brief Destructor
-   */
-  virtual ~CsImpTracer ();
-
-  /**
-   * @brief Helper method to install tracers on all simulation nodes
-   *
-   * @param file File to which traces will be written
-   * @param averagingPeriod How often data will be written into the trace file (default, every half second)
-   *
-   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This tuple needs to be preserved
-   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
-   * 
-   */
-  static boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<CsImpTracer> > >
-  InstallAll (const std::string &file, Time averagingPeriod = Seconds (0.5));
-
-protected: 
-  // from CsTracer
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void 
-  CacheHits (std::string context,
-  Ptr<const InterestHeader>, Ptr<const ContentObjectHeader>);
-  
-  virtual void 
-  CacheMisses (std::string context,
-  Ptr<const InterestHeader>);
-
-protected:
-  void
-  SetAveragingPeriod (const Time &period);
-
-  void
-  Reset ();
-
-  void
-  PeriodicPrinter ();
-  
-protected:
-  boost::shared_ptr<std::ostream> m_os;
-
-  Time m_period;
-  EventId m_printEvent;
-  Stats m_stats;
-  
-//  mutable std::map<Ptr<const Face>, boost::tuple<Stats, Stats> > m_stats;
-};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDN_CS_IMP_TRACER_H
diff --git a/utils/tracers/ndn-cs-tracer.cc b/utils/tracers/ndn-cs-tracer.cc
index 742961f..6cab66f 100644
--- a/utils/tracers/ndn-cs-tracer.cc
+++ b/utils/tracers/ndn-cs-tracer.cc
@@ -15,7 +15,8 @@
  * 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>
+ * Author: Xiaoyan Hu <x......u@gmail.com>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
 #include "ndn-cs-tracer.h"
@@ -25,18 +26,66 @@
 #include "ns3/names.h"
 #include "ns3/callback.h"
 
-#include <boost/lexical_cast.hpp>
-
+#include "ns3/ndn-app.h"
 #include "ns3/ndn-interest.h"
 #include "ns3/ndn-content-object.h"
+#include "ns3/simulator.h"
+#include "ns3/node-list.h"
+#include "ns3/log.h"
+
+#include <boost/lexical_cast.hpp>
+
+#include <fstream>
+
+NS_LOG_COMPONENT_DEFINE ("ndn.CsTracer");
 
 using namespace std;
 
 namespace ns3 {
 namespace ndn {
-    
-CsTracer::CsTracer (Ptr<Node> node)
+
+
+boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<CsTracer> > >
+CsTracer::InstallAll (const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
+{
+  using namespace boost;
+  using namespace std;
+  
+  std::list<Ptr<CsTracer> > tracers;
+  boost::shared_ptr<std::ofstream> outputStream (new std::ofstream ());
+  outputStream->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
+
+  if (!outputStream->is_open ())
+    return boost::make_tuple (outputStream, tracers);
+
+  for (NodeList::Iterator node = NodeList::Begin ();
+       node != NodeList::End ();
+       node++)
+    {
+      NS_LOG_DEBUG ("Node: " << (*node)->GetId ());
+
+      Ptr<CsTracer> trace = Create<CsTracer> (outputStream, *node);
+      trace->SetAveragingPeriod (averagingPeriod);
+      tracers.push_back (trace);
+    }
+
+  if (tracers.size () > 0)
+    {
+      // *m_l3RateTrace << "# "; // not necessary for R's read.table
+      tracers.front ()->PrintHeader (*outputStream);
+      *outputStream << "\n";
+    }
+
+  return boost::make_tuple (outputStream, tracers);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+
+CsTracer::CsTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
 : m_nodePtr (node)
+, m_os (os)
 {
   m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
 
@@ -49,8 +98,9 @@
     }
 }
 
-CsTracer::CsTracer (const std::string &node)
+CsTracer::CsTracer (boost::shared_ptr<std::ostream> os, const std::string &node)
 : m_node (node)
+, m_os (os)
 {
   Connect ();
 }
@@ -67,7 +117,75 @@
                    MakeCallback (&CsTracer::CacheHits, this));
   Config::Connect ("/NodeList/"+m_node+"/$ns3::ndn::ContentStore/CacheMisses",
                    MakeCallback (&CsTracer::CacheMisses, this));
+
+  Reset ();  
 }
 
+
+void
+CsTracer::SetAveragingPeriod (const Time &period)
+{
+  m_period = period;
+  m_printEvent.Cancel ();
+  m_printEvent = Simulator::Schedule (m_period, &CsTracer::PeriodicPrinter, this);
+}
+
+void
+CsTracer::PeriodicPrinter ()
+{
+  Print (*m_os);
+  Reset ();
+  
+  m_printEvent = Simulator::Schedule (m_period, &CsTracer::PeriodicPrinter, this);
+}
+
+void
+CsTracer::PrintHeader (std::ostream &os) const
+{
+  os << "Time" << "\t"
+
+     << "Node" << "\t"
+
+     << "Type" << "\t"
+     << "Packets" << "\t";
+}
+
+void
+CsTracer::Reset ()
+{
+  m_stats.Reset();
+}
+
+#define PRINTER(printName, fieldName)           \
+  os << time.ToDouble (Time::S) << "\t"         \
+  << m_node << "\t"                             \
+  << printName << "\t"                          \
+  << m_stats.fieldName << "\n";
+
+
+void
+CsTracer::Print (std::ostream &os) const
+{
+  Time time = Simulator::Now ();
+
+  PRINTER ("CacheHits",   m_cacheHits);
+  PRINTER ("CacheMisses", m_cacheMisses);
+}
+
+void 
+CsTracer::CacheHits (std::string context,
+                     Ptr<const InterestHeader>, Ptr<const ContentObjectHeader>)
+{
+  m_stats.m_cacheHits ++;
+}
+
+void 
+CsTracer::CacheMisses (std::string context, 
+                       Ptr<const InterestHeader>)
+{
+  m_stats.m_cacheMisses ++;
+}
+
+
 } // namespace ndn
 } // namespace ns3
diff --git a/utils/tracers/ndn-cs-tracer.h b/utils/tracers/ndn-cs-tracer.h
index 5b057f7..af7419a 100644
--- a/utils/tracers/ndn-cs-tracer.h
+++ b/utils/tracers/ndn-cs-tracer.h
@@ -24,6 +24,13 @@
 
 #include "ns3/ptr.h"
 #include "ns3/simple-ref-count.h"
+#include <ns3/nstime.h>
+#include <ns3/event-id.h>
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/shared_ptr.hpp>
+#include <map>
+#include <list>
 
 namespace ns3 {
 
@@ -35,71 +42,107 @@
 class InterestHeader;
 class ContentObjectHeader;
 
+namespace cs {
+
+struct Stats
+{
+  inline void Reset ()
+  {
+    m_cacheHits   = 0;
+    m_cacheMisses = 0;
+  }
+  double m_cacheHits;
+  double m_cacheMisses;
+};
+
+}  
+
 /**
- * @brief Base class for content store tracers (CacheHits and CacheMisses)
+ * @ingroup ndn
+ * @brief NDN tracer for cache performance (hits and misses)
  */
 class CsTracer : public SimpleRefCount<CsTracer>
 {
 public:
   /**
+   * @brief Helper method to install tracers on all simulation nodes
+   *
+   * @param file File to which traces will be written
+   * @param averagingPeriod How often data will be written into the trace file (default, every half second)
+   *
+   * @returns a tuple of reference to output stream and list of tracers. !!! Attention !!! This tuple needs to be preserved
+   *          for the lifetime of simulation, otherwise SEGFAULTs are inevitable
+   * 
+   */
+  static boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<CsTracer> > >
+  InstallAll (const std::string &file, Time averagingPeriod = Seconds (0.5));
+
+  /**
    * @brief Trace constructor that attaches to the node using node pointer
+   * @param os    reference to the output stream
    * @param node  pointer to the node
    */
-  CsTracer (Ptr<Node> node);
+  CsTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node);
 
   /**
    * @brief Trace constructor that attaches to the node using node name
+   * @param os        reference to the output stream
    * @param nodeName  name of the node registered using Names::Add
    */
-  CsTracer (const std::string &node);
+  CsTracer (boost::shared_ptr<std::ostream> os, const std::string &node);
 
   /**
    * @brief Destructor
    */
-  virtual ~CsTracer ();
+  ~CsTracer ();
 
   /**
    * @brief Print head of the trace (e.g., for post-processing)
    *
    * @param os reference to output stream
    */
-  virtual void
-  PrintHeader (std::ostream &os) const = 0;
+  void
+  PrintHeader (std::ostream &os) const;
 
   /**
    * @brief Print current trace data
    *
    * @param os reference to output stream
    */
-  virtual void
-  Print (std::ostream &os) const = 0;
+  void
+  Print (std::ostream &os) const;
   
-protected:
+private:
   void
   Connect ();
 
-  virtual void 
+  void 
   CacheHits (std::string context,
-  Ptr<const InterestHeader>, Ptr<const ContentObjectHeader>) = 0;
+  Ptr<const InterestHeader>, Ptr<const ContentObjectHeader>);
   
-  virtual void 
+  void 
   CacheMisses (std::string context,
-  Ptr<const InterestHeader>) = 0;
+  Ptr<const InterestHeader>);
 
-protected:
+private:
+  void
+  SetAveragingPeriod (const Time &period);
+
+  void
+  Reset ();
+
+  void
+  PeriodicPrinter ();
+  
+private:
   std::string m_node;
   Ptr<Node> m_nodePtr;
 
-  struct Stats
-  {
-    inline void Reset ()
-    {
-      m_cacheHits   = 0;
-      m_cacheMisses = 0;
-    }
-    double m_cacheHits;
-    double m_cacheMisses;
-  };
+  boost::shared_ptr<std::ostream> m_os;
+
+  Time m_period;
+  EventId m_printEvent;
+  cs::Stats m_stats;  
 };
 
 /**
