diff --git a/PyNDN/Data.py b/PyNDN/Data.py
deleted file mode 100644
index 5369380..0000000
--- a/PyNDN/Data.py
+++ /dev/null
@@ -1,131 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-#
-# GNU 3.0 license, See the LICENSE file for more information
-#
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-#
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.ndnSIM
-from Name import Name
-from SignedInfo import SignedInfo
-
-class DataError (Exception):
-    pass
-
-class Data (object):
-    _data = None
-
-    def __init__(self,
-                 name = None, content = None, signed_info = None,
-                 data = None):
-        if data:
-            if isinstance (data, Data):
-                self._data = data._data
-            elif isinstance (data, ns.ndnSIM.ndn.Data):
-                self._data = data
-            else:
-                raise TypeError ("Invalid type supplied for 'data' parameter [%s]" % type (data))
-
-            self.signedInfo = SignedInfo ()
-            # timestamp
-            self.signedInfo.freshnessSeconds = self._data.GetFreshness ().ToDouble (ns.core.Time.S)
-            if self._data.GetKeyLocator ():
-                self.signedInfo.keyLocator = Name (name = self._data.GetKeyLocator ())
-        else:
-            self._data = ns.ndnSIM.ndn.Data ()
-
-            self.name = name
-            self.content = content
-            self.signedInfo = signed_info or SignedInfo ()
-
-    @staticmethod
-    def fromWire (wire):
-        return Data (data = ns.ndnSIM.ndn.Wire.ToDataStr (bytes (wire)))
-
-    def sign (self, key):
-        """There is no actual signing in ndnSIM for now, but we will assign signature bits based on key"""
-        self._data.SetSignature (key.fakeKey)
-
-    def toWire (self):
-        if self._data.GetSignature () == 0:
-            raise DataError ("Data packet has not been signed, cannot create wire format")
-
-        return ns.ndnSIM.ndn.Wire.FromDataStr (self._data)
-
-    def verify_signature (self, key):
-        """There is no actual signing in ndnSIM for now, but we will check if signature matches the key"""
-        return True
-        # return self._data.GetSignature () == key.fakeKey
-
-    def __getattr__ (self, name):
-        if name == "_data":
-            return object.__getattr__ (self, name)
-
-        elif name == "signedInfo":
-            return object.__getattr__ (self, name)
-        elif name == "name":
-            return Name (self._data.GetName ())
-        elif name == "scope":
-            return self._data.GetScope ()
-        elif name == "interestLifetime":
-            return self._data.GetInterestLifetime ().ToDouble (ns.core.Time.S)
-        elif name == "content":
-            pkt = self._data.GetPayload ()
-            return ns.ndnSIM.ndn.PacketToBuffer (pkt)
-        else:
-            return self._data.__getattribute__ (name)
-
-    def __setattr__(self, name, value):
-        if name == "_data":
-            return object.__setattr__ (self, name, value)
-
-        elif name == 'signedInfo':
-            if value is None:
-                return
-            if isinstance (value, SignedInfo):
-                object.__setattr__ (self, name, value)
-
-                if value.timestamp:
-                    # ?
-                    pass
-                if value.freshnessSeconds:
-                    self._data.SetFreshness (ns.core.Seconds (value.freshnessSeconds))
-                if value.keyLocator:
-                    self._data.SetKeyLocator (value._name)
-            else:
-                raise TypeError ("signedInfo can be assigned either None or SignedInfo object, [%s] supplied" % type (value))
-        elif name == "name":
-            if value is None:
-                return self._data.SetName (ns.ndnSIM.ndn.Name ())
-            elif isinstance (value, Name):
-                return self._data.SetName (value._name)
-            elif isinstance (value, ns.ndnSIM.ndn.Name):
-                return self._data.SetName (value)
-            elif isinstance (value, str):
-                return self._data.SetName (ns.ndnSIM.ndn.Name (value))
-            else:
-                raise ValueError ("Invalid name parameter")
-        elif name == "content":
-            if value is None:
-                pkt = ns.network.Packet ()
-                self._data.SetPayload (pkt)
-            else:
-                pkt = ns.ndnSIM.ndn.BufferToPacket (bytes (value))
-                self._data.SetPayload (pkt)
-        else:
-            raise NameError ("Unknown attribute [%s]" % name)
-
-    def __repr__(self):
-        return "ndn.Data(%s; %s)" % str (self._data, self.signedInfo)
diff --git a/PyNDN/EventLoop.py b/PyNDN/EventLoop.py
deleted file mode 100644
index 93bd8e7..0000000
--- a/PyNDN/EventLoop.py
+++ /dev/null
@@ -1,37 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.core
-
-class EventLoop (object):
-    """
-    Class to provide compatibility with real PyNDN implementation.
-    """
-    
-    def __init__ (self, *handlers):
-        pass
-    
-    def execute (self, event):
-        ns.core.Simulator.ScheduleNow (event)
-
-    def run (self):
-        pass
-
-    def stop (self):
-        pass
diff --git a/PyNDN/Face.py b/PyNDN/Face.py
deleted file mode 100644
index 807fee7..0000000
--- a/PyNDN/Face.py
+++ /dev/null
@@ -1,125 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-#
-# GNU 3.0 license, See the LICENSE file for more information
-#
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-#
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.core
-import ns.network
-import ns.ndnSIM
-from Data import Data
-from Interest import Interest
-from Name import Name
-
-import functools
-import traceback
-
-class Face (object):
-    deleteList = []
-
-    def __init__(self):
-        self.nodeId = ns.core.Simulator.GetContext ()
-        self.node = ns.network.NodeList.GetNode (self.nodeId)
-        self._face = ns.ndnSIM.ndn.ApiFace (self.node)
-        # super(Face, self).__init__ (self.node)
-
-    def connect (self):
-        pass
-
-    def disconnect (self):
-        self._face.Shutdown ()
-
-    def defer_verification (self, deferVerification = True):
-        pass
-
-
-    def expressInterest (self, name, onData, onTimeout, template = None):
-        """
-        onData:    void <interest, name>
-        onTimeout: void <interest>
-        """
-
-        interest = Interest (interest = template)
-        interest.name = name
-
-        converter = ExpressInterestConverter (onData, onTimeout)
-        self._face.ExpressInterest (interest._interest, converter.handleOnData, converter.handleOnTimeout)
-
-    def setInterestFilter (self, name, onInterest, flags = None):
-        """
-        onInterest: void <name, interest>
-        """
-
-        if isinstance (name, Name):
-            name = name._name
-        elif isinstance (name, ns.ndnSIM.ndn.Name):
-            pass
-        else:
-            raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
-
-        self._face.SetInterestFilter (name, OnInterestConvert (onInterest))
-
-    def clearInterestFilter (self, name):
-        if isinstance (name, Name):
-            name = name._name
-        elif isinstance (name, ns.ndnSIM.ndn.Name):
-            pass
-        else:
-            raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
-
-        # @bug: memory leak, deleteList need to remove previosly set callback... but how?
-        self._face.ClearInterestFilter (name)
-
-    def get (self, name, template = None, timeoutms = 3000):
-        raise NotImplementedError ("NS-3 simulation cannot have syncrhonous operations")
-
-    def put (self, data):
-        if isinstance (data, Data):
-            self._face.Put (data._data)
-        elif isinstance (data, ns.ndnSIM.ndn.Data):
-            self._face.Put (data)
-        else:
-            raise TypeError ("Unsupported type to publish data [%s]" % type (data))
-
-class ExpressInterestConverter:
-    def __init__ (self, onData, onTimeout):
-        self.onData = onData
-        self.onTimeout = onTimeout
-
-    def handleOnData (self, interest, data):
-        try:
-            if self.onData:
-                return self.onData (Interest (interest=interest), Data (data = data))
-        except Exception, e:
-            traceback.print_exc()
-
-    def handleOnTimeout (self, interest):
-        try:
-            if self.onTimeout:
-                self.onTimeout (Interest (interest=interest))
-        except Exception, e:
-            traceback.print_exc()
-
-class OnInterestConvert (object):
-    def __init__ (self, onInterest):
-        self.onInterest = onInterest
-
-    def __call__ (self, name, interest):
-        try:
-            if self.onInterest:
-                self.onInterest (Name (name = name), Interest (interest = interest))
-        except Exception, e:
-            traceback.print_exc()
diff --git a/PyNDN/Interest.py b/PyNDN/Interest.py
deleted file mode 100644
index d831bb5..0000000
--- a/PyNDN/Interest.py
+++ /dev/null
@@ -1,97 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.ndnSIM
-import ns.core
-from Name import Name
-
-class Interest (object):
-    _interest = None
-
-    def __init__(self,
-                 name = None, scope = None, interestLifetime = None,
-                 interest = None):
-        if interest:
-            if isinstance (interest, Interest):
-                self._interest = interest._interest
-            elif isinstance (interest, ns.ndnSIM.ndn.Interest):
-                self._interest = interest
-            else:
-                raise TypeError ("Invalid type supplied for 'interest' parameter [%s]" % type (interest))
-        else:
-            self._interest = ns.ndnSIM.ndn.Interest ()
-        
-            self.name = name
-            self.scope = scope
-            self.interestLifetime = interestLifetime
-
-    @staticmethod
-    def fromWire (wire):
-        return Interest (interest = ns.ndnSIM.ndn.Wire.ToInterestStr (wire))
-
-    def toWire (self):
-        return ns.ndnSIM.ndn.Wire.FromInterestStr (self._interest)
-
-    def __getattr__ (self, name):
-        if name == "_interest":
-            return object.__getattr__ (self, name)
-
-        elif name == "name":
-            return Name (self._interest.GetName ())
-        elif name == "scope":
-            return self._interest.GetScope ()
-        elif name == "interestLifetime":
-            return self._interest.GetInterestLifetime ().ToDouble (ns.core.Time.S)
-        else:
-            return self._interest.__getattribute__ (name)
-
-    def __setattr__(self, name, value):
-        if name == "_interest":
-            return object.__setattr__ (self, name, value)
-
-        elif name == "name":
-            if value is None:
-                return self._interest.SetName (ns.ndnSIM.ndn.Name ())
-            elif isinstance (value, Name):
-                return self._interest.SetName (value._name)
-            elif isinstance (value, ns.ndnSIM.ndn.Name):
-                return self._interest.SetName (value)
-            elif isinstance (value, str):
-                return self._interest.SetName (ns.ndnSIM.ndn.Name (value))
-            else:
-                raise ValueError ("Invalid name parameter")
-        elif name == "scope":
-            if value is None:
-                return self._interest.SetScope (-1)
-            elif isinstance (value, int):
-                return self._interest.SetScope (value)
-            else:
-                raise ValueError ("Scope parameter should be int, [%s] supplied" % type (value))
-        elif name == "interestLifetime":
-            if value is None:
-                return self._interest.SetInterestLifetime (ns.core.Time ())
-            elif isinstance (value, float) or isinstance (value, int):
-                return self._interest.SetInterestLifetime (ns.core.Seconds (value))
-            else:
-                raise ValueError ("interestLifetime parameter should be fload or int, [%s] supplied" % type (value))
-        else:
-            raise ValueError ("Unknown or unsupported attribute [%s]" % name)
-
-    def __repr__(self):
-        return "ndnSIM.Interest(%s)" % str (self._interest)
diff --git a/PyNDN/Key.py b/PyNDN/Key.py
deleted file mode 100644
index 842024b..0000000
--- a/PyNDN/Key.py
+++ /dev/null
@@ -1,83 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.core
-import ns.ndnSIM
-from Name import Name
-
-class Key (object):
-    def __init__ (self):
-        self.publicKeyID = None # SHA256 hash
-        self.fakeKey = 0
-
-    def generateRSA(self, numbits):
-        randVar = ns.core.UniformVariable ()
-        self.fakeKey = randVar.GetInteger (0, 2147483647)
-
-    def privateToDER(self):
-        return self.fakeKey
-
-    def publicToDER(self):
-        return self.privateToDER ()
-
-    def privateToPEM(self, filename = None, password = None):
-        if filename:
-            f = open(filename, 'w')
-            f.write (self.fakeKey)
-            f.close()
-        else:
-            return self.fakeKey
-
-    def publicToPEM(self, filename = None):
-        return privateToPEM (filename)
-
-    def fromDER(self, private = None, public = None):
-        if private:
-            self.fakeKey = hash(private)
-        elif public:
-            self.fakeKey = hash(public)
-
-    def fromPEM(self, filename = None, private = None, public = None, password = None):
-        if filename:
-            f = open(filename, 'r')
-            self.fakeKey = hash(f.read ())
-            f.close()
-        elif private:
-            self.fakeKey = hash(private)
-        elif public:
-            self.fakeKey = hash(public)
-
-    @staticmethod
-    def createFromDER (private = None, public = None):
-        key = Key ()
-        key.fromDER (private, public)
-        return key
-
-    @staticmethod
-    def createFromPEM (filename = None, private = None, public = None, password = None):
-        key = Key ()
-        key.fromPEM (filename, private, public, password)
-        return key
-
-    @staticmethod
-    def getDefaultKey ():
-        context = ns.core.Simulator.GetContext ()
-        key = Key ()
-        key.fakeKey = context
-        return key
diff --git a/PyNDN/KeyLocator.py b/PyNDN/KeyLocator.py
deleted file mode 100644
index 331ae63..0000000
--- a/PyNDN/KeyLocator.py
+++ /dev/null
@@ -1,36 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.core
-import ns.ndnSIM
-from Name import Name
-
-class KeyLocator (object):
-    def __init__(self, keyName = None):
-        self.keyName = keyName
-
-    @staticmethod
-    def getDefaultKeyLocator():
-        context = ns.core.Simulator.GetContext ()
-        keyLocator = ns.ndnSIM.ndn.Name ()
-        keyLocator.\
-            append ("default-key").\
-            append (str (context))
-
-        return Name (keyLocator)
diff --git a/PyNDN/Name.py b/PyNDN/Name.py
deleted file mode 100644
index 628b843..0000000
--- a/PyNDN/Name.py
+++ /dev/null
@@ -1,95 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ns.ndnSIM
-
-class Name (object):
-    _name = None
-
-    def __init__ (self, 
-                  value = None,
-                  name = None):
-        if name is not None:
-            if isinstance (name, ns.ndnSIM.ndn.Name):
-                self._name = name
-            elif isinstance (name, Name):
-                self._name = name._name
-            else:
-                raise TypeError ("Incorrect type for 'name' parameter [%s]" % type (name))
-        else:
-            if value is not None:
-                if isinstance (value, Name):
-                    self._name = ns.ndnSIM.ndn.Name (value._name)
-                else:
-                    self._name = ns.ndnSIM.ndn.Name (value)
-            else:
-                self._name = ns.ndnSIM.ndn.Name ()
-
-    @staticmethod
-    def fromWire (wire):
-        return Name (name = ns.ndnSIM.ndn.Wire.ToName (wire))
-
-    def toWire (self):
-        return ns.ndnSIM.ndn.Wire.FromName (self._name)
-
-    def append (self, value):
-        if isinstance (value, Name):
-            self._name.append (value._name)
-        else:
-            self._name.append (value)
-        return self
-    
-    def __getattr__ (self, name):
-        return self._name.__getattribute__ (name)
-
-    def __len__ (self):
-        return self._name.size ()
-
-    def __add__ (self, other):
-        return self._name.append (other)
-
-    def __getitem__(self, key):
-        if isinstance (key, int):
-            if abs(key) < self._name.size ():
-                return self._name.get (key)
-            else:
-                raise IndexError ("index out of range")
-        elif isinstance (key, slice):
-            name = ns.ndnSIM.ndn.Name ()
-            for component in xrange (*key.indices (self.size ())):
-                name.append (self._name.get (component))
-            return name
-        else:
-            raise ValueError("Unknown __getitem__ type: %s" % type (key))
-
-    def __repr__ (self):
-        return "ndn.Name('" + self._name.toUri () + "')"
-
-    def __str__ (self):
-        return self._name.toUri ()
-
-    def __eq__ (self, other):
-        return self._name == other._name
-
-    def isPrefixOf (self, other):
-        return self[:] == other[:len(self)]
-
-    @property
-    def keyName (self):
-        return self
diff --git a/PyNDN/SignedInfo.py b/PyNDN/SignedInfo.py
deleted file mode 100644
index 84941ad..0000000
--- a/PyNDN/SignedInfo.py
+++ /dev/null
@@ -1,56 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-#
-# GNU 3.0 license, See the LICENSE file for more information
-#
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-#
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import utils
-
-class ContentType(utils.Enum):
-    _prefix = "ndn"
-
-CONTENT_DATA = ContentType.new_flag('CONTENT_DATA', 0x0C04C0)
-CONTENT_ENCR = ContentType.new_flag('CONTENT_ENCR', 0x10D091)
-CONTENT_GONE = ContentType.new_flag('CONTENT_GONE', 0x18E344)
-CONTENT_KEY  = ContentType.new_flag('CONTENT_KEY',  0x28463F)
-CONTENT_LINK = ContentType.new_flag('CONTENT_LINK', 0x2C834A)
-CONTENT_NACK = ContentType.new_flag('CONTENT_NACK', 0x34008A)
-
-class SignedInfo (object):
-    def __init__(self, keyLocator = None, freshness = None,
-                 timestamp = None, type = CONTENT_DATA, *kw, **kwargs):
-
-        self.timestamp = timestamp
-        self.freshnessSeconds = freshness
-        self.keyLocator = keyLocator
-        self.type = type
-
-        # all other parameters are silently ignored
-
-    def __repr__(self):
-        args = []
-
-        if self.keyLocator is not None:
-            args += ["keyLocator=%r" % self.keyLocator]
-        if self.freshnessSeconds is not None:
-            args += ["freshness=%r" % self.freshnessSeconds]
-        if self.timestamp is not None:
-            args += ["timestamp=%r" % self.timestamp]
-        if self.type != CONTENT_DATA:
-            args += ["type=%r" % self.type]
-
-        return "ndn.SignedInfo(%s)" % ", ".join(args)
-
diff --git a/PyNDN/__init__.py b/PyNDN/__init__.py
deleted file mode 100644
index 2054d49..0000000
--- a/PyNDN/__init__.py
+++ /dev/null
@@ -1,46 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-#
-# GNU 3.0 license, See the LICENSE file for more information
-#
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-#
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-__all__ = ['Face', 'Name', 'Interest', 'Data', 'Key', 'EventLoop']
-
-VERSION = 0.3
-NDNSIM = True
-
-import sys as _sys
-
-try:
-    from Face import Face
-    from Name import Name
-    from Interest import Interest
-    from Data import Data
-    from Key import Key
-
-    from EventLoop import EventLoop
-    from KeyLocator import KeyLocator
-    from SignedInfo import SignedInfo, CONTENT_DATA, CONTENT_ENCR, CONTENT_GONE, CONTENT_KEY, CONTENT_LINK, CONTENT_NACK
-    # no signature
-
-    # no NameCrypto
-    # no LocalPrefixDiscovery
-
-    import nre
-
-except ImportError:
-    del _sys.modules[__name__]
-    raise
diff --git a/PyNDN/impl/__init__.py b/PyNDN/impl/__init__.py
deleted file mode 100644
index e048223..0000000
--- a/PyNDN/impl/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
diff --git a/PyNDN/impl/ccnb.py b/PyNDN/impl/ccnb.py
deleted file mode 100644
index b95b3fa..0000000
--- a/PyNDN/impl/ccnb.py
+++ /dev/null
@@ -1,129 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-__TT_BITS__ = 3
-__TT_MASK__ = (1 << __TT_BITS__) - 1
-__TT_HBIT__ = (1 << 7)
-__TT_LBIT__ = __TT_HBIT__ - 1
-
-DTAG_NAME       = 14
-DTAG_COLLECTION = 17
-DTAG_LINK       = 31
-
-def blob(value):
-    return _encode(len(value), 5) + value
-
-def dtag(tag, value):
-    return _encode(tag, 2) + value + '\x00'
-
-def _encode(value, tt):
-    global __TT_BITS__, __TT_HBIT__, __TT_LBIT__
-
-    header = (value << __TT_BITS__) | tt
-
-    blocks = []
-    blocks.append((header & __TT_LBIT__) | __TT_HBIT__)
-    header >>= 7
-
-    while header != 0:
-        blocks.append(header & __TT_LBIT__)
-        header >>= 7
-
-    blocks.reverse()
-
-    return bytearray(blocks)
-
-class CCNBDecoder(object):
-    def __init__(self, ccnb_data):
-        self.ccnb_data = ccnb_data
-        self.reset()
-
-    def reset(self):
-        self.position = 0
-        self.decoded = 0
-        self.stack = []
-
-    def _process_next_byte(self):
-        global __TT_HBIT__, __TT_LBIT__
-
-        assert self.position < len(self.ccnb_data)
-
-        char = ord(self.ccnb_data[self.position])
-        self.position += 1
-
-        if self.decoded == 0 and char == 0:
-            return None, True
-
-        decoded = (self.decoded << 7) | (char & __TT_LBIT__)
-        complete = (char & __TT_HBIT__) == __TT_HBIT__
-
-        self.decoded = decoded if not complete else 0
-
-        return decoded, complete
-
-    def print_element(self, tt, value, data = None):
-        if tt == 2:
-            print "DTAG",
-
-            if value == 14:
-                print "Name"
-            elif value == 15:
-                print "Component"
-            elif value == 17:
-                print "Collection"
-            elif value == 31:
-                print "Link"
-            else:
-                print value
-
-        elif tt == 5:
-            print "BLOB",
-            print value,
-            print repr(data)
-        else:
-            print tt,
-            print value,
-            print repr(data)
-
-    def get_tags(self):
-        global __TT_MASK__, __TT_BITS__
-
-        while self.position < len(self.ccnb_data):
-            while True:
-                decoded, complete = self._process_next_byte()
-                if complete:
-                    break
-
-            if decoded is None:
-                tt, value = self.stack.pop()
-                print "Close",
-            else:
-                tt = decoded & __TT_MASK__
-                value = decoded >> __TT_BITS__
-
-            data = None
-            if decoded is not None:
-                if tt == 2:
-                    self.stack.append((tt, value))
-                elif tt == 5:
-                    data = self.ccnb_data[self.position:self.position + value]
-                    self.position += value
-
-            self.print_element(tt, value, data)
-
diff --git a/PyNDN/impl/enumeration.py b/PyNDN/impl/enumeration.py
deleted file mode 100644
index 851e43c..0000000
--- a/PyNDN/impl/enumeration.py
+++ /dev/null
@@ -1,29 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import ndn
-from ndn.impl import ccnb
-
-def ccnb_enumerate(names):
-    out = bytearray()
-
-    for name in names:
-        out += ccnb.dtag(ccnb.DTAG_LINK, name.get_ccnb())
-
-    return ccnb.dtag(ccnb.DTAG_COLLECTION, out)
diff --git a/PyNDN/impl/segmenting.py b/PyNDN/impl/segmenting.py
deleted file mode 100644
index d58b200..0000000
--- a/PyNDN/impl/segmenting.py
+++ /dev/null
@@ -1,55 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import math
-import ndn
-
-class Wrapper(object):
-    def __init__(self, name, key):
-        self.name = name
-        self.key = key
-
-        kl = ndn.KeyLocator(key)
-        self.signed_info = ndn.SignedInfo(key_locator = kl, key_digest = key.publicKeyID)
-
-    def __call__(self, chunk, segment, segments):
-        name = self.name + ndn.Name.num2seg(segment)
-        self.signed_info.finalBlockID = ndn.Name.num2seg(segments - 1)
-
-        co = ndn.Data(name = name, content = chunk, signed_info = self.signed_info)
-        co.sign(self.key)
-
-        return co
-
-def segmenter(data, wrapper = None, chunk_size = 4096):
-    segment = 0
-    segments = math.ceil(len(data) / float(chunk_size))
-
-    while segment < segments:
-        start = segment * chunk_size
-        end = min(start + chunk_size, len(data))
-        chunk = data[start : end]
-
-        if wrapper is not None:
-            chunk = wrapper(chunk, segment, segments)
-
-        yield chunk
-
-        segment += 1
-
diff --git a/PyNDN/nre.py b/PyNDN/nre.py
deleted file mode 100644
index df05e30..0000000
--- a/PyNDN/nre.py
+++ /dev/null
@@ -1,631 +0,0 @@
-# -*- Mode:python; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-#
-# Copyright (c) 2013, Regents of the University of California
-#                     Yingdi Yu, Alexander Afanasyev
-#
-# BSD license, See the doc/LICENSE file for more information
-#
-# Author: Yingdi Yu <yingdi@cs.ucla.edu>
-#         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-#
-
-import sys
-import re
-import logging
-from Name import Name
-
-_LOG = logging.getLogger ("ndn.nre")
-
-class RegexError(Exception):
-    def __init__(self, msg):
-        self.msg = msg
-    def __str__(self):
-        return self.msg
-
-class BaseMatcher(object):
-    def __init__(self, expr, backRef, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-        self.expr    = expr
-        self.backRef = backRef
-        self.exact   = exact
-        self.matchResult = []
-        self.matcherList = []
-
-    def match(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".match(): " + "expr: " + self.expr + " offset: " + str(offset) + " length: " + str(len))
-        self.matchResult = []
-
-        if self._recursiveMatch(0, name, offset, len):
-            for i in range(offset,  offset + len):
-                self.matchResult.append(str (name[i]))
-            return True
-        else:
-            return False
-
-    def _recursiveMatch(self, mId, name, offset, length):
-        _LOG.debug(self.__class__.__name__ + "._recursiveMatch(): " + self.expr)
-        _LOG.debug("mId: " + str(mId) + " name: " +  str(name) + " offset: " + str(offset) + " length: " + str(length) + " matcherListSize: " + str(len(self.matcherList)))
-        tried = 0
-
-        if mId >= len(self.matcherList) :
-            if length != 0 :
-                _LOG.debug("Fail " + self.__class__.__name__ + "._recursiveMatch(): no more matcher, but more components")
-                return False
-            else:
-                _LOG.debug("Succeed " + self.__class__.__name__ + "._recursiveMatch(): no more matcher, no more components")
-                return True
-
-        matcher = self.matcherList[mId]
-
-        while tried <= length:
-            if matcher.match(name, offset, tried) and self._recursiveMatch(mId + 1, name, offset + tried, length - tried) :
-                return True
-            _LOG.debug(self.__class__.__name__ + " expr: " + self.expr + " mId: " + str(mId) + " tried: " + str(tried) + " length: " + str(length))
-            tried += 1
-
-        return False
-
-
-    def aggressiveMatch(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".aggressiveMatch(): " + "expr: " + self.expr + " offset: " + str(offset) + " length: " + str(len))
-        self.matchResult = []
-
-        if self._aRecursiveMatch(0, name, offset, len):
-            for i in range(offset,  offset + len):
-                self.matchResult.append(str (name[i]))
-            return True
-        else:
-            return False
-
-    def _aRecursiveMatch(self, mId, name, offset, length):
-        _LOG.debug(self.__class__.__name__ + "._aRecursiveMatch(): " + self.expr)
-        _LOG.debug("mId: " + str(mId) + " name: " +  str(name) + " offset: " + str(offset) + " length: " + str(length) + " matcherListSize: " + str(len(self.matcherList)))
-
-        tried = length
-
-        if mId >= len(self.matcherList) :
-            if length != 0 :
-                _LOG.debug("Fail " + self.__class__.__name__ + "._recursiveMatch(): no more matcher, but more components")
-                return False
-            else:
-                _LOG.debug("Succeed " + self.__class__.__name__ + "._recursiveMatch(): no more matcher, no more components")
-                return True
-
-        matcher = self.matcherList[mId]
-
-        while tried >= 0:
-            if matcher.aggressiveMatch(name, offset, tried) and self._aRecursiveMatch(mId + 1, name, offset + tried, length - tried):
-                return True
-            _LOG.debug(self.__class__.__name__ + " expr: " + self.expr + " mId: " + str(mId) + " tried: " + str(tried) + " length: " + str(length))
-            tried -= 1
-
-        return False
-
-
-class ComponentMatcher(BaseMatcher):
-    def __init__(self, expr, backRef, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-        _LOG.debug("expr " + expr)
-
-        super(ComponentMatcher, self).__init__(expr, backRef, exact)
-
-        pattern = re.compile(self.expr)
-        self.pseudoBackRefMatcher = []
-        for i in range(0, pattern.groups):
-            pseudoMatcher = BaseMatcher("", self.backRef)
-            self.pseudoBackRefMatcher.append(pseudoMatcher)
-            self.backRef.append(pseudoMatcher)
-
-    def _appendBackRef(self, res):
-        if res and 0 < len(res.groups()):
-
-            group = res.groups()
-            for i in range(0, len(group)):
-                self.pseudoBackRefMatcher[i].matchResult = []
-                self.pseudoBackRefMatcher[i].matchResult.append(group[i])
-
-    def match(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".match(): " + self.expr)
-        _LOG.debug("Name " + str(name) + " offset " +  str(offset) + " len " +str(len))
-
-        self.matchResult = []
-
-        if "" == self.expr:
-            res = self.matchResult.append(str (name[offset]))
-            self._appendBackRef(res)
-            _LOG.debug("Succeed " + self.__class__.__name__ + ".match() ")
-            return True
-
-        matcher = re.compile(self.expr)
-        if self.exact:
-            res = matcher.match(str(name[offset]))
-            if res:
-                self._appendBackRef(res)
-                self.matchResult.append(str (name[offset]))
-                _LOG.debug("Succeed " + self.__class__.__name__ + ".match() ")
-                return True
-        else:
-            res = matcher.search(str(name[offset]))
-            if res:
-                self._appendBackRef(res)
-                self.matchResult.append(str (name[offset]))
-                return True
-
-        return False
-
-    def aggressiveMatch(self, name, offset, len):
-        return self.match(name, offset, len)
-
-
-class ComponentSetMatcher(BaseMatcher):
-    def __init__(self, expr, backRef, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-
-        errMsg = "Error: ComponentSetMatcher.Constructor: "
-        self.include = True
-
-        super(ComponentSetMatcher, self).__init__(expr, backRef, exact)
-
-        if '<' == self.expr[0]:
-            self._compileSingleComponent()
-        elif '[' == self.expr[0]:
-            lastIndex = len(self.expr) - 1
-            if ']' != self.expr[lastIndex]:
-                raise RegexError(errMsg + " No matched ']' " + self.expr)
-            if '^' == self.expr[1]:
-                self.include = False
-
-                self._compileMultipleComponents(2, lastIndex)
-            else:
-                self._compileMultipleComponents(1, lastIndex)
-
-
-    def _compileSingleComponent(self):
-        _LOG.debug(self.__class__.__name__ + "._compileSingleComponent")
-
-        errMsg = "Error: ComponentSetMatcher.CompileSingleComponent(): "
-
-        end = self._extractComponent(1)
-
-        if len(self.expr) != end:
-            raise RegexError(errMsg + "out of bound " + self.expr)
-        else:
-            self.matcherList.append(ComponentMatcher(self.expr[1:end-1], self.backRef))
-
-    def _compileMultipleComponents(self, start, lastIndex):
-        _LOG.debug(self.__class__.__name__ + "._compileMultipleComponents")
-
-        errMsg = "Error: ComponentSetMatcher.CompileMultipleComponents(): "
-
-        index = start
-        tmp_index = start
-
-        while index < lastIndex:
-            if '<' != self.expr[index]:
-                raise RegexError(errMsg + "Component expr error " + self.expr)
-            tmp_index = index + 1
-            index = self._extractComponent(tmp_index)
-            self.matcherList.append(ComponentMatcher(self.expr[tmp_index:index-1], self.backRef))
-
-        if index != lastIndex:
-           raise RegexError(errMsg + "Not sufficient expr to parse " + self.expr)
-
-    def _extractComponent(self, index):
-        _LOG.debug(self.__class__.__name__ + "._extractComponent")
-        lcount = 1
-        rcount = 0
-
-        while lcount > rcount :
-            if len(self.expr) == index:
-                break
-            elif '<' == self.expr[index]:
-                lcount += 1
-            elif '>' == self.expr[index]:
-                rcount += 1
-
-            index += 1
-
-        return index
-
-    def match(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".match(): " + self.expr)
-
-        self.matchResult = []
-
-        matched = False
-
-        if 1 != len:
-            return False
-
-        for matcher in self.matcherList:
-            res = matcher.match(name, offset, len)
-            if True == res:
-                matched = True
-                break
-
-        if(matched if self.include else (not matched)):
-            self.matchResult.append(str (name[offset]))
-            return True
-        else:
-            return False
-
-    def aggressiveMatch(self, name, offset, len):
-        return self.match(name, offset, len)
-
-class BackRefMatcher(BaseMatcher):
-    def __init__(self, expr, backRef, exact=True):
-        _LOG.debug (self.__class__.__name__ + ".Constructor")
-        super(BackRefMatcher, self).__init__(expr, backRef, exact)
-
-        errMsg = "Error: BackRefMatcher Constructor: "
-
-        _LOG.debug ("expr: " +  self.expr);
-        _LOG.debug ("backRefManager " + str(self.backRef) + " size: " + str(len(self.backRef)))
-
-        lastIndex = len(self.expr) - 1
-
-        if '(' == self.expr[0] and ')' == self.expr[lastIndex]:
-            self.backRef.append(self)
-            self.matcherList.append(PatternListMatcher(self.expr[1:lastIndex], self.backRef, self.exact))
-        else:
-            raise RegexError(errMsg + " Unrecognoized format " + self.expr)
-
-
-class PatternListMatcher(BaseMatcher):
-    def __init__(self, expr, backRef, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-        super(PatternListMatcher, self).__init__(expr, backRef, exact)
-        _LOG.debug("expr: " + self.expr)
-
-        exprSize = len(self.expr)
-        index = 0
-        subHead = index
-
-        while index < exprSize:
-            subHead = index
-            (r_res, r_index) = self._extractPattern(subHead, index)
-            index = r_index
-            if not r_res:
-                raise RegexError("Fail to create PatternListMatcher")
-
-
-    def _extractPattern(self, index, next):
-        _LOG.debug(self.__class__.__name__ + "._extractPattern")
-
-        errMsg = "Error: PatternListMatcher._extractPattern: "
-
-        start = index
-        End = index
-        indicator = index
-
-        _LOG.debug ("expr: " + self.expr + " index: " + str(index))
-
-        if '(' == self.expr[index]:
-            index += 1
-            index = self._extractSubPattern('(', ')', index)
-            indicator = index
-            end = self._extractRepetition(index)
-            if indicator == end:
-                self.matcherList.append(BackRefMatcher(self.expr[start:end], self.backRef, self.exact))
-            else:
-                self.matcherList.append(RepeatMatcher(self.expr[start:end], self.backRef, indicator-start, self.exact))
-        elif '<' == self.expr[index]:
-            index += 1
-            index = self._extractSubPattern('<', '>', index)
-            indicator = index
-            end = self._extractRepetition(index)
-            self.matcherList.append(RepeatMatcher(self.expr[start:end], self.backRef, indicator-start, self.exact))
-            _LOG.debug("start: " + str(start) + " end: " + str(end) + " indicator: " + str(indicator))
-        elif '[' == self.expr[index]:
-            index += 1
-            index = self._extractSubPattern('[', ']', index)
-            indicator = index
-            end = self._extractRepetition(index)
-            self.matcherList.append(RepeatMatcher(self.expr[start:end], self.backRef, indicator-start, self.exact))
-            _LOG.debug("start: " + str(start) + " end: " + str(end) + " indicator: " + str(indicator))
-        else:
-            raise RegexError(errMsg +"unexpected syntax")
-
-
-
-        return (True, end)
-
-    def _extractSubPattern(self, left, right, index):
-        _LOG.debug(self.__class__.__name__ + "._extractSubPattern")
-
-        lcount = 1
-        rcount = 0
-
-        while lcount > rcount:
-            if index >= len(self.expr):
-                raise RegexError("Error: parenthesis mismatch")
-            if left == self.expr[index]:
-                lcount += 1
-            if right == self.expr[index]:
-                rcount += 1
-            index += 1
-
-        return index
-
-    def _extractRepetition(self, index):
-        _LOG.debug(self.__class__.__name__ + "._extractRepetition")
-
-        exprSize = len(self.expr)
-
-        _LOG.debug("expr: " + self.expr + " index: " + str(index))
-
-        errMsg = "Error: PatternListMatcher._extractRepetition: "
-
-        if index == exprSize:
-            return index
-
-        if '+' == self.expr[index] or '?' == self.expr[index] or '*' == self.expr[index] :
-            index += 1
-            return index
-
-        if '{' == self.expr[index]:
-            while '}' != self.expr[index]:
-                index += 1
-                if index == exprSize:
-                    break
-            if index == exprSize:
-                raise RegexError(errMsg + "Missing right brace bracket")
-            else:
-                index += 1
-                return index
-        else:
-            _LOG.debug ("return index: " + str(index))
-            return index
-
-class RepeatMatcher(BaseMatcher):
-    def __init__(self, expr, backRef, indicator, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-        _LOG.debug("expr: " + expr);
-        super(RepeatMatcher, self).__init__(expr, backRef, exact)
-        self.indicator = indicator
-        if '(' == self.expr[0]:
-            self.matcherList.append(BackRefMatcher(self.expr[0:self.indicator], self.backRef))
-        else:
-            self.matcherList.append(ComponentSetMatcher(self.expr[0:self.indicator], self.backRef))
-
-        self._parseRepetition()
-        _LOG.debug("repeatMin: " + str(self.repeatMin) + " repeatMax: " + str(self.repeatMax))
-
-    def _parseRepetition(self):
-        _LOG.debug(self.__class__.__name__ + "._parseRepetition")
-
-        errMsg = "Error: RepeatMatcher._parseRepetition(): ";
-
-        exprSize = len(self.expr)
-        intMax = sys.maxint
-
-        if exprSize == self.indicator:
-            self.repeatMin = 1
-            self.repeatMax = 1
-            return
-        else:
-            if exprSize == (self.indicator + 1):
-                if '?' == self.expr[self.indicator]:
-                    self.repeatMin = 0
-                    self.repeatMax = 1
-                if '+' == self.expr[self.indicator]:
-                    self.repeatMin = 1
-                    self.repeatMax = intMax
-                if '*' == self.expr[self.indicator]:
-                    self.repeatMin = 0
-                    self.repeatMax = intMax
-                return
-            else:
-                repeatStruct = self.expr[self.indicator:exprSize]
-                min = 0
-                max = 0
-
-        if re.match('{[0-9]+,[0-9]+}$', repeatStruct):
-            repeats = repeatStruct[1:-1].split(',')
-            min = int(repeats[0])
-            max = int(repeats[1])
-        elif re.match('{[0-9]+,}$', repeatStruct):
-            repeats = repeatStruct[1:-1].split(',')
-            min = int(repeats[0])
-            max = intMax
-        elif re.match('{,[0-9]+}$', repeatStruct):
-            repeats = repeatStruct[1:-1].split(',')
-            min = 0
-            max = int(repeats[1])
-        elif re.match('{[0-9]+}$', repeatStruct):
-            min = int(repeatStruct[1:- 1])
-            max = min;
-        else:
-            raise RegexError(errMsg + "Unrecognized format "+ self.expr);
-
-        if min > intMax or max > intMax or min > max:
-            raise RegexError(errMsg + "Wrong number " + self.expr);
-
-        self.repeatMin = min
-        self.repeatMax = max
-
-    def match(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".match(): " + "expr: " + self.expr + " offset: " + str(offset) + " len: " + str(len) + " repeatMin: " + str(self.repeatMin))
-        self.matchResult = []
-
-        if 0 == self.repeatMin:
-            if 0 == len:
-                return True
-
-        if self._recursiveMatch(0, name, offset, len):
-            for i in range(offset, offset+len):
-                self.matchResult.append(str (name[i]))
-            return True
-        else:
-            return False
-
-    def _recursiveMatch(self, repeat, name, offset, len):
-        _LOG.debug (self.__class__.__name__ + "._recursiveMatch()" + " repeat: " + str(repeat) + " offset: " + str(offset) + " len: " + str(len) + " rMin: " + str(self.repeatMin) + " rMax: " + str(self.repeatMax))
-        tried = 0
-        matcher = self.matcherList[0]
-
-        if 0 < len and repeat >= self.repeatMax:
-            _LOG.debug("Match Fail: Reach m_repeatMax && More components")
-            return False
-
-        if 0 == len and repeat < self.repeatMin:
-            _LOG.debug("Match Fail: No more components && have NOT reached m_repeatMin " + str(len) + ", " + str(self.repeatMin))
-            return False
-
-        if 0 == len and repeat >= self.repeatMin:
-            _LOG.debug("Match Succeed: No more components && reach m_repeatMin")
-            return True
-
-        while tried <= len:
-            _LOG.debug("Attempt tried: " + str(tried))
-
-            if matcher.match(name, offset, tried) and self._recursiveMatch(repeat + 1, name, offset + tried, len - tried):
-                return True;
-            _LOG.debug("Failed at tried: " + str(tried));
-            tried += 1
-
-        return False
-
-
-    def aggressiveMatch(self, name, offset, len):
-        _LOG.debug(self.__class__.__name__ + ".aggressiveMatch(): " + "expr: " + self.expr + " offset: " + str(offset) + " len: " + str(len) + " repeatMin: " + str(self.repeatMin))
-        self.matchResult = []
-
-        if 0 == self.repeatMin:
-            if 0 == len:
-                return True
-
-        if self._aRecursiveMatch(0, name, offset, len):
-            for i in range(offset, offset+len):
-                self.matchResult.append(str (name[i]))
-            return True
-        else:
-            return False
-
-    def _aRecursiveMatch(self, repeat, name, offset, len):
-        _LOG.debug (self.__class__.__name__ + "._aRecursiveMatch()" + " repeat: " + str(repeat) + " offset: " + str(offset) + " len: " + str(len) + " rMin: " + str(self.repeatMin) + " rMax: " + str(self.repeatMax))
-        tried = len
-        matcher = self.matcherList[0]
-
-        if 0 < len and repeat >= self.repeatMax:
-            _LOG.debug("Match Fail: Reach m_repeatMax && More components")
-            return False
-
-        if 0 == len and repeat < self.repeatMin:
-            _LOG.debug("Match Fail: No more components && have NOT reached m_repeatMin " + str(len) + ", " + str(self.repeatMin))
-            return False
-
-        if 0 == len and repeat >= self.repeatMin:
-            _LOG.debug("Match Succeed: No more components && reach m_repeatMin")
-            return True
-
-        while tried >= 0:
-            _LOG.debug("Attempt tried: " + str(tried))
-
-            if matcher.aggressiveMatch(name, offset, tried) and self._aRecursiveMatch(repeat + 1, name, offset + tried, len - tried):
-                return True;
-            _LOG.debug("Failed at tried: " + str(tried));
-            tried -= 1
-
-        return False
-
-
-
-class RegexMatcher(BaseMatcher):
-    def __init__(self, expr, exact=True):
-        _LOG.debug(self.__class__.__name__ + ".Constructor")
-        super(RegexMatcher, self).__init__(expr, None, exact)
-
-        self.backRef = []
-        self.second_backRef = []
-
-        self.secondaryMatcher = None
-
-
-        errMsg = "Error: RegexTopMatcher Constructor: "
-        tmp_expr = self.expr
-
-        if '$' != tmp_expr[-1]:
-            tmp_expr = tmp_expr + "<.*>*";
-        else:
-            tmp_expr = tmp_expr[0:-1]
-
-        if '^' != tmp_expr[0]:
-            self.secondaryMatcher = PatternListMatcher("<.*>*" + tmp_expr, self.second_backRef, self.exact)
-        else:
-            tmp_expr = tmp_expr[1:]
-
-        _LOG.debug ("reconstructed expr " + tmp_expr);
-
-        self.primaryMatcher = PatternListMatcher(tmp_expr, self.backRef, self.exact)
-
-
-
-    def firstMatcher():
-        return None
-
-    def matchName(self, name):
-        _LOG.debug(self.__class__.__name__ + ".matchName")
-
-        self.secondaryUsed = False
-
-        res = self.primaryMatcher.match(name, 0, len(name))
-        self.matchResult += self.primaryMatcher.matchResult
-        if False == res and None != self.secondaryMatcher:
-            res = self.secondaryMatcher.match(name, 0, len(name))
-            self.matchResult += self.secondaryMatcher.matchResult
-            self.secondaryUsed = True
-        return res
-
-    def extract(self, rule):
-        _LOG.debug(self.__class__.__name__ + ".extract")
-
-        if not re.match('(\\\\[0-9]+)+$', rule):
-            raise RegexError("Wrong format of rule")
-
-        refs = rule.split('\\')
-        refs.pop(0)
-
-        backRef = self.backRef
-        if self.secondaryUsed:
-            backRef = self.second_backRef
-
-        result = []
-        for index in refs:
-            i = int(index) - 1
-
-            if len(backRef) <= i or 0 > i:
-                raise RegexError("Wrong back reference number!")
-
-            result += backRef[i].matchResult
-
-        return result
-
-    def matchN(self, name):
-        _LOG.debug(self.__class__.__name__ + ".matchN")
-
-        self.secondaryUsed = False
-
-        res = self.primaryMatcher.aggressiveMatch(name, 0, len(name))
-        self.matchResult += self.primaryMatcher.matchResult
-        if False == res and None != self.secondaryMatcher:
-            res = self.secondaryMatcher.aggressiveMatch(name, 0, len(name))
-            self.matchResult += self.secondaryMatcher.matchResult
-            self.secondaryUsed = True
-        return res
-
-    def expand (self, rule):
-        return self.extract (rule)
-
-def match (pattern, name, flags=0):
-    """
-    If zero or more characters at the beginning of string match the regular expression pattern, return a corresponding matches as a list. Return None if the string does not match the pattern.
-"""
-    if not isinstance (name, Name):
-        raise TypeError ("name is not ndn.Name type")
-
-    m = RegexMatcher (pattern)
-    res = m.matchN (Name (name))
-    if not res:
-        return None
-    return m
diff --git a/PyNDN/utils.py b/PyNDN/utils.py
deleted file mode 100644
index 555ce80..0000000
--- a/PyNDN/utils.py
+++ /dev/null
@@ -1,133 +0,0 @@
-## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-# 
-# Copyright (c) 2011-2013, Regents of the University of California
-#                          Alexander Afanasyev
-# 
-# GNU 3.0 license, See the LICENSE file for more information
-# 
-# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-# 
-
-#
-# Based on PyCCN code, copyrighted and licensed as follows
-#
-# Copyright (c) 2011-2013, Regents of the University of California
-# BSD license, See the COPYING file for more information
-# Written by: Derek Kulinski <takeda@takeda.tk>
-#             Jeff Burke <jburke@ucla.edu>
-#
-
-import struct
-
-class Flag(int):
-    __initialized = False
-    _flags = None
-    _prefix = None
-    __flags_values__ = None
-
-    @classmethod
-    def initialize(cls):
-        cls._flags = {}
-        cls.__flags_values__ = {}
-        cls.__initialized = True
-
-    @classmethod
-    def new_flag(cls, name, value):
-        if not cls.__initialized:
-            cls.initialize()
-
-        cls._flags[value] = name
-
-        obj = cls(value)
-        cls.__flags_values__[value] = obj
-
-        return obj
-
-    def __new__(cls, value):
-        if cls.__flags_values__.has_key(value):
-            return cls.__flags_values__[value]
-
-        return super(Flag, cls).__new__(cls, value)
-
-    def generate_repr(self):
-        val = long(self)
-        flags = [name for i, name in self._flags.items() if i & val]
-        return " | ".join(flags)
-
-    def __repr__(self):
-        if self._prefix:
-            return self._prefix + "." + self.generate_repr()
-
-        t = type(self)
-        type_name = "%s.%s" % (t.__module__, t.__name__)
-        return "<flags %s of type %s>" % (self.generate_repr(), type_name)
-
-    def __and__(self, other):
-        cls = type(self)
-        return cls(long(self) & long(other))
-
-    def __xor__(self, other):
-        cls = type(self)
-        return cls(long(self) ^ long(other))
-
-    def __or__(self, other):
-        cls = type(self)
-        return cls(long(self) | long(other))
-
-class Enum(Flag):
-    def __new__(cls, value):
-        if cls.__flags_values__.has_key(value):
-            return cls.__flags_values__[value]
-
-        if cls._flags.has_key(value):
-            return super(Enum, cls).__new__(cls, value)
-
-        raise ValueError("invalid flag value: %d" % value)
-
-    def generate_repr(self):
-        return self._flags[long(self)]
-
-def ccn2py_time(value):
-    bintime = b'\x00' * (8 - len(value)) + value
-    inttime = struct.unpack("!Q", bintime)[0]
-    return inttime / 4096.0
-
-def py2ccn_time(value):
-    inttime = int(value * 4096 + 0.5)
-    bintime = struct.pack("!Q", inttime)
-    return bintime.lstrip(b'\x00')
-
-class Const (object):
-    def __init__ (self, obj):
-        object.__setattr__ (self, "__internal_object", obj)
-        object.__setattr__ (self, "__bases__", type(obj))
-
-    def __getattribute__ (self, name):
-        if name != "__bases__":
-            return object.__getattribute__ (self, "__internal_object").__getattribute__ (name)
-        else:
-            return object.__getattribute__ (self, name)
-
-    def __getitem__(self, key):
-        return object.__getattribute__ (self, "__internal_object").__getitem__ (key)
-
-    def __setattr__ (self, name, value):
-        raise TypeError ("Const %s cannot be modified" % type (object.__getattribute__ (self, "__internal_object")))
-
-    def __repr__ (self):
-        return "const %s" % object.__getattribute__ (self, "__internal_object").__repr__ ()
-
-    def __str__(self):
-       return object.__getattribute__ (self, "__internal_object").__str__ ()
-
-    def __add__(self, other):
-        raise TypeError ("Const %s cannot be modified" % type (object.__getattribute__ (self, "__internal_object")))
-
-    def __delattr__ (self, name, value):
-        raise TypeError ("Const %s cannot be modified" % type (object.__getattribute__ (self, "__internal_object")))
-
-    def __setitem__(self, key, value):
-        raise TypeError ("Const %s cannot be modified" % type (object.__getattribute__ (self, "__internal_object")))
-
-    def __delitem__(self, key):
-        raise TypeError ("Const %s cannot be modified" % type (object.__getattribute__ (self, "__internal_object")))
diff --git a/apps/callback-based-app.cc b/apps/callback-based-app.cc
deleted file mode 100644
index 34c3de6..0000000
--- a/apps/callback-based-app.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "callback-based-app.h"
-
-#include <ns3/log.h>
-
-NS_LOG_COMPONENT_DEFINE ("CallbackBasedApp");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (CallbackBasedApp);
-    
-TypeId
-CallbackBasedApp::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::CallbackBasedApp")
-    .SetGroupName ("Ndn")
-    .SetParent<Application> ()
-    .AddConstructor<CallbackBasedApp> ()
-
-    .AddAttribute ("OnStart", "OnStart callback",
-                   CallbackValue (),
-                   MakeCallbackAccessor (&CallbackBasedApp::m_onStart),
-                   MakeCallbackChecker ())
-
-    .AddAttribute ("OnStop", "OnStop callback",
-                   CallbackValue (),
-                   MakeCallbackAccessor (&CallbackBasedApp::m_onStop),
-                   MakeCallbackChecker ())
-    ;
-  return tid;
-}
-
-CallbackBasedApp::CallbackBasedApp ()
-{
-}
-
-CallbackBasedApp::~CallbackBasedApp ()
-{
-}
-
-void
-CallbackBasedApp::SetOnStartCallback (Callback< void, Ptr<Application> > onStart)
-{
-  m_onStart = onStart;
-}
-
-void
-CallbackBasedApp::SetOnStopCallback (Callback< void, Ptr<Application> > onStop)
-{
-  m_onStop = onStop;
-}
-
-void
-CallbackBasedApp::StartApplication ()
-{
-  NS_LOG_FUNCTION (this);
-  if (!m_onStart.IsNull ())
-    m_onStart (this);
-}
-
-void
-CallbackBasedApp::StopApplication ()
-{
-  NS_LOG_FUNCTION (this);
-  if (!m_onStop.IsNull ())
-    m_onStop (this);
-}
-
-}
diff --git a/apps/callback-based-app.h b/apps/callback-based-app.h
deleted file mode 100644
index 1d7e74d..0000000
--- a/apps/callback-based-app.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_CALLBACK_BASED_APP_H
-#define NDN_CALLBACK_BASED_APP_H
-
-#include "ns3/application.h"
-#include "ns3/ptr.h"
-#include "ns3/callback.h"
-
-namespace ns3 {
-
-/**
- * @ingroup ndn-apps
- * @brief A meta application that can be used to create custom apps within Python bindings 
- */
-class CallbackBasedApp: public Application
-{
-public:
-  static TypeId GetTypeId ();
-
-  /**
-   * @brief Default constructor
-   */
-  CallbackBasedApp ();
-
-  /**
-   * @brief Virtual destructor
-   */
-  virtual
-  ~CallbackBasedApp ();
-
-  /**
-   * @brief Define callback that will be fired when application need to start its work
-   */
-  void
-  SetOnStartCallback (Callback< void, Ptr<Application> > onStart);
-
-  /**
-   * @brief Define callback that will be fired when application need to stop its work
-   */
-  void
-  SetOnStopCallback (Callback< void, Ptr<Application> > onStart);
-
-protected:
-  // inherited from Application base class. Originally they were private
-  virtual void
-  StartApplication ();    ///< @brief Called at time specified by Start
-
-  virtual void
-  StopApplication ();     ///< @brief Called at time specified by Stop
-
-private:
-  Callback< void, Ptr<Application> > m_onStart;
-  Callback< void, Ptr<Application> > m_onStop;
-};
-
-} // ns3
-
-#endif // NDN_CALLBACK_BASED_APP_H
diff --git a/bindings/scan-header.h b/bindings/scan-header.h
deleted file mode 100644
index 72d8771..0000000
--- a/bindings/scan-header.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * GNU 3.0 license, See the LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-using namespace ndn;
-
-static inline void
-__dummy_function_on_interest_callback_instantiation (Ptr<const Name>, Ptr<const Interest>)
-{
-}
-
-static inline void
-__dummy_function_on_data_callback_instantiation (Ptr<const Interest>, Ptr<const Data>)
-{
-}
-
-static inline void
-__dummy_function_on_timeout_callback_instantiation (Ptr<const Interest>)
-{
-}
-
-static inline void
-__dummy_function_to_force_ndn_api_face_callback_instantiations ()
-{
-  ApiFace face (0);
-  Ptr<Interest> interest;
-  Ptr<Name> prefix;
-
-  face.ExpressInterest (interest,
-                        MakeCallback (__dummy_function_on_data_callback_instantiation),
-                        MakeCallback (__dummy_function_on_timeout_callback_instantiation)
-                        );
-
-  face.SetInterestFilter (prefix,
-                          MakeCallback (__dummy_function_on_interest_callback_instantiation));
-
-  std::string tmp ("bla");
-  char &test = tmp[0];
-}
-
-
-// /// @cond include_hidden
-// #ifdef PYTHON_SCAN
-// struct CallbackVoidNameInterest : public Callback<void, Ptr<const Name>, Ptr<const Interest> > { };
-// struct CallbackVoidInterestData : public Callback<void, Ptr<const Interest>, Ptr<const Data> > { };
-// struct CallbackVoidInterest : public Callback<void, Ptr<const Interest> > { };
-// #endif
-// /// @endcond
-
diff --git a/examples/custom-apps/ndn-api-app.cc b/examples/custom-apps/ndn-api-app.cc
deleted file mode 100644
index bb7a9b6..0000000
--- a/examples/custom-apps/ndn-api-app.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013 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 "ndn-api-app.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.ApiApp");
-
-namespace ns3 {
-namespace ndn {
-
-// Necessary if you are planning to use ndn::AppHelper
-NS_OBJECT_ENSURE_REGISTERED (ApiApp);
-
-TypeId
-ApiApp::GetTypeId ()
-{
-  static TypeId tid = TypeId ("ns3::ndn::ApiApp")
-    .SetParent<Application> ()
-    .AddConstructor<ApiApp> ()
-    
-    .AddAttribute ("Prefix","Name of the Interest",
-                   StringValue ("/"),
-                   MakeNameAccessor (&ApiApp::m_name),
-                   MakeNameChecker ())
-    .AddAttribute ("LifeTime", "LifeTime for interest packet",
-                   StringValue ("2s"),
-                   MakeTimeAccessor (&ApiApp::m_interestLifetime),
-                   MakeTimeChecker ())
-    ;
-
-  return tid;
-}
-
-ApiApp::ApiApp ()
-  : m_face (0)
-{
-}
-
-void
-ApiApp::RequestData ()
-{
-  NS_LOG_FUNCTION (this);
-  
-  Ptr<Interest> interest = Create<Interest> ();
-  interest->SetName (m_name);
-  interest->SetInterestLifetime (m_interestLifetime);
-
-  Ptr<Exclude> exclude = Create<Exclude> ();
-  exclude->excludeOne (name::Component ("unique"));
-  interest->SetExclude (exclude);
-  
-  m_face->ExpressInterest (interest,
-                           MakeCallback (&ApiApp::GotData, this),
-                           MakeNullCallback< void, Ptr<const Interest> > ());
-}
-
-void
-ApiApp::GotData (Ptr<const Interest> origInterest, Ptr<const Data> data)
-{
-  NS_LOG_FUNCTION (this << origInterest->GetName () << data->GetName ());
-  // do nothing else
-}
-    
-void
-ApiApp::StartApplication ()
-{
-  m_face = CreateObject<ApiFace> (GetNode ());
-  
-  Simulator::Schedule (Seconds (1), &::ns3::ndn::ApiApp::RequestData, this);
-  Simulator::Schedule (Seconds (10), &::ns3::ndn::ApiApp::RequestData, this);
-}
-
-void
-ApiApp::StopApplication ()
-{
-  NS_LOG_FUNCTION (this);
-  m_face->Shutdown ();
-  m_face = 0;
-}
-
-} // namespace ndn
-} // namespace ns3
-
diff --git a/examples/custom-apps/ndn-api-app.h b/examples/custom-apps/ndn-api-app.h
deleted file mode 100644
index 8345a99..0000000
--- a/examples/custom-apps/ndn-api-app.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013 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 NDN_EXAMPLES_API_APP_H
-#define NDN_EXAMPLES_API_APP_H
-
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/ndnSIM-module.h"
-
-#include "ns3/ndnSIM/ndn.cxx/ndn-api-face.h"
-
-namespace ns3 {
-namespace ndn {
-
-class ApiApp : public Application
-{
-public:
-  static TypeId
-  GetTypeId ();
-
-  ApiApp ();
-
-private:
-  void
-  RequestData ();
-
-  void
-  GotData (Ptr<const Interest> origInterest, Ptr<const Data> data);
-  
-protected:
-  // inherited from Application base class.
-  virtual void
-  StartApplication ();
-
-  virtual void
-  StopApplication ();
-  
-private:
-  Ptr<ApiFace> m_face;
-
-  Name m_name;
-  Time m_interestLifetime;
-};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDN_EXAMPLES_API_APP_H
diff --git a/examples/custom-strategies/custom-strategy.cc b/examples/custom-strategies/custom-strategy.cc
deleted file mode 100644
index b1bb6c2..0000000
--- a/examples/custom-strategies/custom-strategy.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-// custom-strategy.cc
-
-#include "custom-strategy.h"
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-fib-entry.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/ndn-interest.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED(CustomStrategy);
-
-LogComponent CustomStrategy::g_log = LogComponent (CustomStrategy::GetLogName ().c_str ());
-
-std::string
-CustomStrategy::GetLogName ()
-{
-  return "ndn.fw.CustomStrategy";
-}
-
-TypeId
-CustomStrategy::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::CustomStrategy")
-    .SetGroupName ("Ndn")
-    .SetParent <BaseStrategy> ()
-    .AddConstructor <CustomStrategy> ()
-
-    // .AddAttribute ("Attribute", "Attribute spec",
-    //                         StringValue ("DefaultValue"),
-    //                         MakeStringAccessor (&BaseStrategy::m_variable),
-    //                         MakeStringChecker ())
-    ;
-  return tid;
-}
-
-CustomStrategy::CustomStrategy ()
-  : m_counter (0)
-{
-}
-
-bool
-CustomStrategy::DoPropagateInterest (Ptr<Face> inFace,
-                                     Ptr<const Interest> interest,
-                                     Ptr<pit::Entry> pitEntry)
-{
-  typedef fib::FaceMetricContainer::type::index<fib::i_metric>::type FacesByMetric;
-  FacesByMetric &faces = pitEntry->GetFibEntry ()->m_faces.get<fib::i_metric> ();
-  FacesByMetric::iterator faceIterator = faces.begin ();
-
-  int propagatedCount = 0;
-
-  // forward to best-metric face
-  if (faceIterator != faces.end ())
-    {
-      if (TrySendOutInterest (inFace, faceIterator->GetFace (), interest, pitEntry))
-        propagatedCount ++;
-
-      faceIterator ++;
-    }
-
-  // forward to second-best-metric face
-  if (faceIterator != faces.end ())
-    {
-      if (TrySendOutInterest (inFace, faceIterator->GetFace (), interest, pitEntry))
-        propagatedCount ++;
-
-      faceIterator ++;
-    }
-  return propagatedCount > 0;
-}
-
-void
-CustomStrategy::DidSendOutInterest (Ptr<Face> inFace, Ptr<Face> outFace,
-                                    Ptr<const Interest> interest,
-                                    Ptr<pit::Entry> pitEntry)
-{
-  m_counter ++;
-}
-
-void
-CustomStrategy::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
-{
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      m_counter --;
-    }
-
-  BaseStrategy::WillEraseTimedOutPendingInterest (pitEntry);
-}
-
-
-void
-CustomStrategy::WillSatisfyPendingInterest (Ptr<Face> inFace,
-                                            Ptr<pit::Entry> pitEntry)
-{
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      m_counter --;
-    }
-
-  BaseStrategy::WillSatisfyPendingInterest (inFace, pitEntry);
-}
-
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/examples/custom-strategies/custom-strategy.h b/examples/custom-strategies/custom-strategy.h
deleted file mode 100644
index 051901c..0000000
--- a/examples/custom-strategies/custom-strategy.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-
-// custom-strategy.h
-        
-#ifndef CUSTOM_STRATEGY_H
-#define CUSTOM_STRATEGY_H
-
-#include "ns3/log.h"
-#include "ns3/ndn-forwarding-strategy.h"
-#include "ns3/ndn-l3-protocol.h"
-                
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-typedef ForwardingStrategy BaseStrategy;
-
-class CustomStrategy:
-    public BaseStrategy
-{
-public:
-  static TypeId
-  GetTypeId ();
-        
-  static std::string
-  GetLogName ();
-          
-  CustomStrategy ();
-        
-protected:
-  virtual bool
-  DoPropagateInterest (Ptr<Face> incomingFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry);
-
-public:
-  virtual void
-  DidSendOutInterest (Ptr<Face> inFace, Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-
-  virtual void
-  WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
-
-  virtual void
-  WillSatisfyPendingInterest (Ptr<Face> inFace,
-                              Ptr<pit::Entry> pitEntry);
-        
-protected:
-  static LogComponent g_log;
-        
-// private:
-//   std::string m_variable;
-
-private:
-  uint32_t m_counter;
-};
-        
-        
-        
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-                
-#endif // CUSTOM_STRATEGY_H
diff --git a/examples/ndn-grid-topo-plugin-loss.cc b/examples/ndn-grid-topo-plugin-loss.cc
deleted file mode 100644
index 355372d..0000000
--- a/examples/ndn-grid-topo-plugin-loss.cc
+++ /dev/null
@@ -1,100 +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>
- */
-// ndn-grid-topo-plugin.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a grid topology (using topology reader module)
- *
- * (consumer) -- ( ) ----- ( )
- *     |          |         |
- *    ( ) ------ ( ) ----- ( )
- *     |          |         |
- *    ( ) ------ ( ) -- (producer)
- *
- * All links are 1Mbps with propagation 10ms delay. 
- *
- * FIB is populated using NdnGlobalRoutingHelper.
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin
- */
-
-int
-main (int argc, char *argv[])
-{
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  AnnotatedTopologyReader topologyReader ("", 25);
-  topologyReader.SetFileName ("src/ndnSIM/examples/topologies/topo-grid-3x3-loss.txt");
-  topologyReader.Read ();
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
-  ndnHelper.InstallAll ();
-
-  // Installing global routing interface on all nodes
-  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
-  ndnGlobalRoutingHelper.InstallAll ();
-
-  // Getting containers for the consumer/producer
-  Ptr<Node> producer = Names::Find<Node> ("Node8");
-  NodeContainer consumerNodes;
-  consumerNodes.Add (Names::Find<Node> ("Node0"));
-
-  // Install NDN applications
-  std::string prefix = "/prefix";
-
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  consumerHelper.SetPrefix (prefix);
-  consumerHelper.SetAttribute ("Frequency", StringValue ("100")); // 100 interests a second
-  consumerHelper.Install (consumerNodes);
-
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  producerHelper.SetPrefix (prefix);
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (producer);
-
-  // Add /prefix origins to ndn::GlobalRouter
-  ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
-
-  // Calculate and install FIBs
-  ndn::GlobalRoutingHelper::CalculateRoutes ();
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-grid-topo-plugin-red-queues.cc b/examples/ndn-grid-topo-plugin-red-queues.cc
deleted file mode 100644
index d73ad79..0000000
--- a/examples/ndn-grid-topo-plugin-red-queues.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011-2013 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>
- */
-// ndn-grid-topo-plugin.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a grid topology (using topology reader module)
- *
- * (consumer) -- ( ) ----- ( )
- *     |          |         |
- *    ( ) ------ ( ) ----- ( )
- *     |          |         |
- *    ( ) ------ ( ) -- (producer)
- *
- * All links are 1Mbps with propagation 10ms delay. 
- *
- * FIB is populated using ndn::GlobalRoutingHelper.
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-grid-topo-plugin
- */
-
-int
-main (int argc, char *argv[])
-{
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  AnnotatedTopologyReader topologyReader ("", 25);
-  topologyReader.SetFileName ("src/ndnSIM/examples/topologies/topo-grid-3x3-red-queues.txt");
-  topologyReader.Read ();
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
-  ndnHelper.InstallAll ();
-
-  // Installing global routing interface on all nodes
-  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
-  ndnGlobalRoutingHelper.InstallAll ();
-
-  // Getting containers for the consumer/producer
-  Ptr<Node> producer = Names::Find<Node> ("Node8");
-  NodeContainer consumerNodes;
-  consumerNodes.Add (Names::Find<Node> ("Node0"));
-
-  // Install NDN applications
-  std::string prefix = "/prefix";
-
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  consumerHelper.SetPrefix (prefix);
-  consumerHelper.SetAttribute ("Frequency", StringValue ("100")); // 100 interests a second
-  consumerHelper.Install (consumerNodes);
-
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  producerHelper.SetPrefix (prefix);
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (producer);
-
-  // Add /prefix origins to ndn::GlobalRouter
-  ndnGlobalRoutingHelper.AddOrigins (prefix, producer);
-
-  // Calculate and install FIBs
-  ndn::GlobalRoutingHelper::CalculateRoutes ();
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-api.cc b/examples/ndn-simple-api.cc
deleted file mode 100644
index 6580fbe..0000000
--- a/examples/ndn-simple-api.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-// ndn-simple.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple
- */
-
-int 
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes (true);
-  ndnHelper.InstallAll ();
-
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ApiApp");
-  consumerHelper.SetPrefix ("/prefix");
-  ApplicationContainer app = consumerHelper.Install (nodes.Get (0)); // first node
-  app.Stop (Seconds (15.0));
-
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/");
-  producerHelper.SetAttribute ("Postfix", StringValue ("/unique/postfix"));
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-pit-policies.cc b/examples/ndn-simple-pit-policies.cc
deleted file mode 100644
index f18b85a..0000000
--- a/examples/ndn-simple-pit-policies.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-// ndn-simple-pit-policies.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple-pit-policies
- */
-
-int
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetPit ("ns3::ndn::pit::SerializedSize",
-                    "MaxSize", "300"); // 1000 bytes ~ 10 entries
-  ndnHelper.SetDefaultRoutes (true);
-  ndnHelper.InstallAll ();
-
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // Consumer will request /prefix/0, /prefix/1, ...
-  consumerHelper.SetPrefix ("/prefix");
-  consumerHelper.SetAttribute ("LifeTime", StringValue ("2s"));
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)); // first node
-
-  Simulator::Stop (Seconds (5.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-tcp.cc b/examples/ndn-simple-tcp.cc
deleted file mode 100644
index f959dc7..0000000
--- a/examples/ndn-simple-tcp.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-// ndn-simple-tcp.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *           \                                                   /
- *            -------------------- tcp face --------------------
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple-tcp
- */
-
-int 
-main (int argc, char *argv[])
-{
-  Packet::EnablePrinting ();
-  
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  NetDeviceContainer link1 = p2p.Install (nodes.Get (0), nodes.Get (1));
-  NetDeviceContainer link2 = p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes (false);
-  ndnHelper.InstallAll ();
-
-  InternetStackHelper ipStack;
-  ipStack.SetIpv6StackInstall (false);
-  ipStack.InstallAll ();
-
-  Ipv4AddressHelper ipAddressHelper;
-  ipAddressHelper.SetBase (Ipv4Address ("10.1.1.0"), Ipv4Mask ("255.255.255.0"));
-  ipAddressHelper.Assign (link1);
-  
-  ipAddressHelper.SetBase (Ipv4Address ("10.1.2.0"), Ipv4Mask ("255.255.255.0"));
-  ipAddressHelper.Assign (link2);
-
-  Ipv4StaticRoutingHelper ipStaticRouting;
-  ipStaticRouting.GetStaticRouting (nodes.Get (0)->GetObject<Ipv4> ())->
-    AddNetworkRouteTo (Ipv4Address ("10.1.2.0"), Ipv4Mask ("255.255.255.0"),
-                       Ipv4Address ("10.1.1.2"),
-                       1, 1);
-
-  ipStaticRouting.GetStaticRouting (nodes.Get (2)->GetObject<Ipv4> ())->
-    AddNetworkRouteTo (Ipv4Address ("10.1.1.0"), Ipv4Mask ("255.255.255.0"),
-                       Ipv4Address ("10.1.2.1"),
-                       1, 1);
-  
-  ndn::IpFacesHelper::InstallAll ();
-  ndn::IpFacesHelper::CreateTcpFace (Seconds (1.0), nodes.Get (0), Ipv4Address ("10.1.2.2"), "/tcp-route");
-  
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // Consumer will request /tcp-route/0, /tcp-route/1, ...
-  consumerHelper.SetPrefix ("/tcp-route");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)).
-    Start (Seconds (3)); // first node
-
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/tcp-route");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-udp.cc b/examples/ndn-simple-udp.cc
deleted file mode 100644
index 2fa093d..0000000
--- a/examples/ndn-simple-udp.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-// ndn-simple-tcp.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/internet-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *           \                                                   /
- *            -------------------- udp face --------------------
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     NS_LOG=ndn.Consumer:ndn.Producer ./waf --run=ndn-simple-udp
- */
-
-int 
-main (int argc, char *argv[])
-{
-  Packet::EnablePrinting ();
-  
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  NetDeviceContainer link1 = p2p.Install (nodes.Get (0), nodes.Get (1));
-  NetDeviceContainer link2 = p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
-  ndnHelper.SetDefaultRoutes (false);
-  ndnHelper.InstallAll ();
-
-  InternetStackHelper ipStack;
-  ipStack.SetIpv6StackInstall (false);
-  ipStack.InstallAll ();
-
-  Ipv4AddressHelper ipAddressHelper;
-  ipAddressHelper.SetBase (Ipv4Address ("10.1.1.0"), Ipv4Mask ("255.255.255.0"));
-  ipAddressHelper.Assign (link1);
-  
-  ipAddressHelper.SetBase (Ipv4Address ("10.1.2.0"), Ipv4Mask ("255.255.255.0"));
-  ipAddressHelper.Assign (link2);
-
-  Ipv4StaticRoutingHelper ipStaticRouting;
-  ipStaticRouting.GetStaticRouting (nodes.Get (0)->GetObject<Ipv4> ())->
-    AddNetworkRouteTo (Ipv4Address ("10.1.2.0"), Ipv4Mask ("255.255.255.0"),
-                       Ipv4Address ("10.1.1.2"),
-                       1, 1);
-
-  ipStaticRouting.GetStaticRouting (nodes.Get (2)->GetObject<Ipv4> ())->
-    AddNetworkRouteTo (Ipv4Address ("10.1.1.0"), Ipv4Mask ("255.255.255.0"),
-                       Ipv4Address ("10.1.2.1"),
-                       1, 1);
-  
-  ndn::IpFacesHelper::InstallAll ();
-  ndn::IpFacesHelper::CreateUdpFace (Seconds (1.0), nodes.Get (0), Ipv4Address ("10.1.2.2"), "/udp-route1");
-  ndn::IpFacesHelper::CreateUdpFace (Seconds (1.0), nodes.Get (0), Ipv4Address ("10.1.1.2"), "/udp-route2");
-  
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // consumerHelper.SetAttribute ("Randomize", StringValue ("uniform"));
-  // Consumer will request /udp-route1/0, /udp-route1/1, ...
-  consumerHelper.SetPrefix ("/udp-route1");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)).
-    Start (Seconds (3)); // first node
-
-  // Consumer will request /udp-route1/0, /udp-route1/1, ...
-  consumerHelper.SetPrefix ("/udp-route2");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)).
-    Start (Seconds (3)); // first node
-  
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/udp-route1");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  producerHelper.SetPrefix ("/udp-route2");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (1)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-with-content-freshness.cc b/examples/ndn-simple-with-content-freshness.cc
deleted file mode 100644
index 23db4cb..0000000
--- a/examples/ndn-simple-with-content-freshness.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-// ndn-simple.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- * This scenario demonstrates how to use content store that responds to Freshness parameter set in Datas.
- * That is, if producer set Freshness field to 2 seconds, the corresponding content object will not be cached
- * more than 2 seconds (can be cached for a shorter time, if entry is evicted earlier)
- * 
- *     NS_LOG=DumbRequester ./waf --run ndn-simple-with-content-freshness
- */
-
-int 
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install CCNx stack on all nodes
-  ndn::StackHelper ccnxHelper;
-  ccnxHelper.SetDefaultRoutes (true);
-  ccnxHelper.SetContentStore ("ns3::ndn::cs::Freshness::Lru",
-                              "MaxSize", "2"); // allow just 2 entries to be cached
-  ccnxHelper.InstallAll ();
-
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("DumbRequester");
-
-  // /*
-  //   1) at time 1 second requests Data from a producer that does not specify freshness
-  //   2) at time 10 seconds requests the same Data packet as client 1
-
-  //   3) at time 2 seconds requests Data from a producer that specifies freshness set to 2 seconds
-  //   4) at time 12 seconds requests the same Data packet as client 3
-
-  //   Expectation:
-  //   Interests from 1, 3 and 4 will reach producers
-  //   Interset from 2 will be served from cache
-  //  */
-
-  ApplicationContainer apps;
-  
-  consumerHelper.SetPrefix ("/no-freshness");
-  apps = consumerHelper.Install (nodes.Get (0));
-  apps.Start (Seconds (0.1));
-  apps.Stop  (Seconds (10.0));
-
-  consumerHelper.SetPrefix ("/with-freshness");
-  apps = consumerHelper.Install (nodes.Get (0));
-  apps.Start (Seconds (20.1));
-  apps.Stop  (Seconds (30.0));
-  
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-
-  producerHelper.SetAttribute ("Freshness", TimeValue (Seconds (0))); // unlimited freshness
-  producerHelper.SetPrefix ("/no-freshness");
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  producerHelper.SetAttribute ("Freshness", TimeValue (Seconds (2.0))); // freshness 2 seconds (!!! freshness granularity is 1 seconds !!!)
-  producerHelper.SetPrefix ("/with-freshness");
-  producerHelper.Install (nodes.Get (2)); // last node
-                               
-  Simulator::Stop (Seconds (30.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-with-different-sizes-content-store.cc b/examples/ndn-simple-with-different-sizes-content-store.cc
deleted file mode 100644
index d6da309..0000000
--- a/examples/ndn-simple-with-different-sizes-content-store.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012-2013 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>
- */
-// ndn-simple-with-different-sizes-content-store.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- * This scenario demonstrates how to use content store that responds to Freshness parameter set in Datas.
- * That is, if producer set Freshness field to 2 seconds, the corresponding content object will not be cached
- * more than 2 seconds (can be cached for a shorter time, if entry is evicted earlier)
- *
- *     NS_LOG=ndn.Consumer ./waf --run ndn-simple-with-different-sizes-content-store
- */
-
-int
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install CCNx stack on all nodes
-  ndn::StackHelper ccnxHelper;
-  ccnxHelper.SetDefaultRoutes (true);
-  ccnxHelper.SetContentStore ("ns3::ndn::cs::Freshness::Lru"); // don't set up max size here, will use default value = 100
-  ccnxHelper.InstallAll ();
-
-  // set up max sizes, after NDN stack is installed
-  Config::Set ("/NodeList/0/$ns3::ndn::ContentStore/MaxSize", UintegerValue (1)); // number after nodeList is global ID of the node (= node->GetId ())
-  Config::Set ("/NodeList/1/$ns3::ndn::ContentStore/MaxSize", UintegerValue (2));
-  Config::Set ("/NodeList/2/$ns3::ndn::ContentStore/MaxSize", UintegerValue (200));
-
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // Consumer will request /prefix/0, /prefix/1, ...
-  consumerHelper.SetPrefix ("/prefix");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)); // first node
-
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/prefix");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-with-pit-count-stats.cc b/examples/ndn-simple-with-pit-count-stats.cc
deleted file mode 100644
index 725da66..0000000
--- a/examples/ndn-simple-with-pit-count-stats.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012-2013 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>
- */
-// ndn-simple-with-pit-count-stats.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     ./waf --run=ndn-simple-with-pit-count-stats
- */
-
-void
-PeriodicStatsPrinter (Ptr<Node> node, Time next)
-{
-  Ptr<ndn::Pit> pit = node->GetObject<ndn::Pit> ();
-
-  std::cout << Simulator::Now ().ToDouble (Time::S) << "\t"
-            << node->GetId () << "\t"
-            << Names::FindName (node) << "\t"
-            << pit->GetSize () << "\n";
-  
-  Simulator::Schedule (next, PeriodicStatsPrinter, node, next);
-}
-
-int
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // see more http://www.nsnam.org/doxygen/classns3_1_1_names.html
-  Names::Add ("consumer", nodes.Get (0));
-  Names::Add ("router",   nodes.Get (1));
-  Names::Add ("producer", nodes.Get (2));
-
-  // Install CCNx stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes (true);
-  ndnHelper.SetPit ("ns3::ndn::pit::Persistent::AggregateStats");
-  ndnHelper.InstallAll ();
-
-  // set up periodic PIT stats printer on node 1
-  std::cout << "Time" << "\t"
-            << "NodeId" << "\t"
-            << "NodeName" << "\t"
-            << "NumberOfPitEntries" << "\n";
-  Simulator::Schedule (Seconds (1), PeriodicStatsPrinter, nodes.Get (0), Seconds (1));
-  Simulator::Schedule (Seconds (1), PeriodicStatsPrinter, nodes.Get (1), Seconds (1));
-  Simulator::Schedule (Seconds (1), PeriodicStatsPrinter, nodes.Get (2), Seconds (1));
-  
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // Consumer will request /prefix/0, /prefix/1, ...
-  consumerHelper.SetPrefix ("/prefix");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)); // first node
-
-  // // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/prefix");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-simple-with-pit-operation-stats.cc b/examples/ndn-simple-with-pit-operation-stats.cc
deleted file mode 100644
index 26c3f8e..0000000
--- a/examples/ndn-simple-with-pit-operation-stats.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2012-2013 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>
- */
-// ndn-simple-with-pit-operation-stats.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/ndnSIM-module.h"
-
-#include "ns3/ndnSIM/model/pit/ndn-pit-impl.h"
-#include "ns3/ndnSIM/utils/trie/persistent-policy.h"
-// #include "ns3/ndnSIM/utils/trie/random-policy.h"
-// #include "ns3/ndnSIM/utils/trie/lru-policy.h"
-#include "ns3/ndnSIM/utils/trie/multi-policy.h"
-#include "ns3/ndnSIM/utils/trie/aggregate-stats-policy.h"
-
-using namespace ns3;
-
-/**
- * This scenario simulates a very simple network topology:
- *
- *
- *      +----------+     1Mbps      +--------+     1Mbps      +----------+
- *      | consumer | <------------> | router | <------------> | producer |
- *      +----------+         10ms   +--------+          10ms  +----------+
- *
- *
- * Consumer requests data from producer with frequency 10 interests per second
- * (interests contain constantly increasing sequence number).
- *
- * For every received interest, producer replies with a data packet, containing
- * 1024 bytes of virtual payload.
- *
- * To run scenario and see what is happening, use the following command:
- *
- *     ./waf --run=ndn-simple-with-pit-operation-stats
- */
-
-typedef ndn::ndnSIM::multi_policy_traits< boost::mpl::vector2< ndn::ndnSIM::persistent_policy_traits,
-                                                               ndn::ndnSIM::aggregate_stats_policy_traits > > PersistentWithCountsTraits;
-// typedef ndn::ndnSIM::multi_policy_traits< boost::mpl::vector2< ndn::ndnSIM::random_policy_traits,
-//                                                                ndn::ndnSIM::aggregate_stats_policy_traits > > RandomWithCountsTraits;
-// typedef ndn::ndnSIM::multi_policy_traits< boost::mpl::vector2< ndn::ndnSIM::lru_policy_traits,
-//                                                                ndn::ndnSIM::aggregate_stats_policy_traits > > LruWithCountsTraits;
-
-void
-PeriodicStatsPrinter (Ptr<Node> node, Time next)
-{
-  if (DynamicCast<ndn::pit::PitImpl<PersistentWithCountsTraits> > (node->GetObject<ndn::Pit> ()) == 0)
-    {
-      std::cerr << "Invalid PIT class, please correct the scenario" << std::endl;
-      return;
-    }
-  
-  //  "ns3::ndn::pit::Persistent::AggregateStats"
-  ndn::pit::PitImpl<PersistentWithCountsTraits>::super::policy_container &policy =
-    DynamicCast<ndn::pit::PitImpl<PersistentWithCountsTraits> > (node->GetObject<ndn::Pit> ())->GetPolicy ();
-
-  std::cout << Simulator::Now ().ToDouble (Time::S) << "\t"
-            << node->GetId () << "\t"
-            << policy.get<1> ().GetUpdates () << "\t"
-            << policy.get<1> ().GetInserts () << "\t"
-            << policy.get<1> ().GetLookups () << "\t"
-            << policy.get<1> ().GetErases () << "\n";
-
-  policy.get<1> ().ResetStats ();
-  
-  Simulator::Schedule (next, PeriodicStatsPrinter, node, next);
-}
-
-int
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install CCNx stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes (true);
-  ndnHelper.SetPit ("ns3::ndn::pit::Persistent::AggregateStats");
-  ndnHelper.InstallAll ();
-
-  // set up periodic PIT stats printer on node 1
-  std::cout << "Time" << "\t"
-            << "NodeId" << "\t"
-            << "Updates" << "\t"
-            << "Inserts" << "\t"
-            << "Lookups" << "\t"
-            << "Erases" << "\n";
-  Simulator::Schedule (Seconds (1), PeriodicStatsPrinter, nodes.Get (1), Seconds (1));
-  
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::ConsumerCbr");
-  // Consumer will request /prefix/0, /prefix/1, ...
-  consumerHelper.SetPrefix ("/prefix");
-  consumerHelper.SetAttribute ("Frequency", StringValue ("10")); // 10 interests a second
-  consumerHelper.Install (nodes.Get (0)); // first node
-
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/prefix");
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)); // last node
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  return 0;
-}
diff --git a/examples/ndn-triangle-calculate-routes.cc b/examples/ndn-triangle-calculate-routes.cc
deleted file mode 100644
index 04575c8..0000000
--- a/examples/ndn-triangle-calculate-routes.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2013 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>
- */
-// ndn-triangle-calculate-routes.cc
-#include "ns3/core-module.h"
-#include "ns3/network-module.h"
-#include "ns3/ndnSIM-module.h"
-
-using namespace ns3;
-using namespace std;
-
-int 
-main (int argc, char *argv[])
-{
-  // setting default parameters for PointToPoint links and channels
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Read optional command-line parameters (e.g., enable visualizer with ./waf --run=<> --visualize
-  CommandLine cmd;
-  cmd.Parse (argc, argv);
-
-  ofstream file1 ("/tmp/topo1.txt");
-  file1 << "router\n\n"
-        << "#node	city	y	x	mpi-partition\n"
-        << "A1	NA	1	1	1\n"
-        << "B1	NA	80	-40	1\n"
-        << "C1	NA	80	40	1\n"
-        << "A2	NA	1	1	1\n"
-        << "B2	NA	80	-40	1\n"
-        << "C2	NA	80	40	1\n\n"
-        << "link\n\n"
-        << "# from  to  capacity	metric	delay	queue\n"
-        << "A1	    B1	10Mbps		100	1ms	100\n"
-        << "A1	    C1	10Mbps		50	1ms	100\n"
-        << "B1	    C1	10Mbps		1	1ms	100\n"
-        << "A2	    B2	10Mbps		50	1ms	100\n"
-        << "A2	    C2	10Mbps		100	1ms	100\n"
-        << "B2	    C2	10Mbps		1	1ms	100\n";
-  file1.close ();
-
-  AnnotatedTopologyReader topologyReader ("");
-  topologyReader.SetFileName ("/tmp/topo1.txt");
-  topologyReader.Read ();
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.InstallAll ();
-
-  topologyReader.ApplyOspfMetric ();
-
-  ndn::GlobalRoutingHelper ndnGlobalRoutingHelper;
-  ndnGlobalRoutingHelper.InstallAll ();
-
-  ndnGlobalRoutingHelper.AddOrigins ("/test/prefix", Names::Find<Node> ("C1"));
-  ndnGlobalRoutingHelper.AddOrigins ("/test/prefix", Names::Find<Node> ("C2"));
-  ndn::GlobalRoutingHelper::CalculateRoutes ();
-
-  cout << "FIB content on node A1" << endl;
-  Ptr<ndn::Fib> fib = Names::Find<Node> ("A1")->GetObject<ndn::Fib> ();
-  for (Ptr<ndn::fib::Entry> entry = fib->Begin (); entry != fib->End (); entry = fib->Next (entry))
-    {
-      cout << *entry << " (this is towards: ";
-      cout << Names::FindName (DynamicCast<const ndn::NetDeviceFace> (entry->FindBestCandidate (0).GetFace ())->GetNetDevice ()->GetChannel ()->GetDevice (1)->GetNode ());
-      cout << ")" << endl;
-    }
-
-  cout << "FIB content on node A2" << endl;
-  fib = Names::Find<Node> ("A2")->GetObject<ndn::Fib> ();
-  for (Ptr<ndn::fib::Entry> entry = fib->Begin (); entry != fib->End (); entry = fib->Next (entry))
-    {
-      cout << *entry << " (this is towards: ";
-      cout << Names::FindName (DynamicCast<const ndn::NetDeviceFace> (entry->FindBestCandidate (0).GetFace ())->GetNetDevice ()->GetChannel ()->GetDevice (1)->GetNode ());
-      cout << ")" << endl;
-    }
-    
-  Simulator::Stop (Seconds (20.0));
-  Simulator::Run ();
-  Simulator::Destroy ();
-  
-  return 0;
-}
diff --git a/examples/topologies/topo-grid-3x3-red-queues.txt b/examples/topologies/topo-grid-3x3-red-queues.txt
deleted file mode 100644
index b87a0bf..0000000
--- a/examples/topologies/topo-grid-3x3-red-queues.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-# topo-grid-3x3.txt
-
-#   /--------\	    /-\	        /-\
-#   |Consumer|<---->| |<------->| |
-#   \--------/	    \-/	        \-/
-#       ^   	     ^ 	         ^
-#       |            |           |   1Mbps/10ms delay
-#       v            v           v
-#      /-\          /-\         /-\
-#      | |<-------->| |<------->| |
-#      \-/          \-/         \-/
-#       ^   	     ^ 	         ^
-#       |            |           |
-#       v            v           v
-#      /-\	    /-\	     /--------\
-#      | |<-------->| |<---->|Producer|
-#      \-/          \-/      \--------/
-
-# any empty lines and lines starting with '#' symbol is ignored
-#
-# The file should contain exactly two sections: router and link, each starting with the corresponding keyword
-#
-# router section defines topology nodes and their relative positions (e.g., to use in visualizer)
-router
-
-# each line in this section represents one router and should have the following data
-# node  comment     yPos    xPos
-Node0   NA          3       1
-Node1   NA          3       2
-Node2   NA          3       3
-Node3   NA          2       1
-Node4   NA          2       2
-Node5   NA          2       3
-Node6   NA          1       1
-Node7   NA          1       2
-Node8   NA          1       3
-# Note that `node` can be any string. It is possible to access to the node by name using Names::Find, see examples.
-
-# link section defines point-to-point links between nodes and characteristics of these links
-link
-
-# Each line should be in the following format (only first two are required, the rest can be omitted)
-# srcNode   dstNode     bandwidth   metric  delay   queue
-# bandwidth: link bandwidth
-# metric: routing metric
-# delay:  link delay
-# queue:  comma-separated list, specifying class for Queue (on both sides of the link) and necessary attributes
-# error:  comma-separated list, specifying class for ErrorModel and necessary attributes
-Node0       Node1       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node0       Node3       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node1       Node2       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node1       Node4       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node2       Node5       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node3       Node4       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node3       Node6       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node4       Node5       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node4       Node7       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node5       Node8       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node6       Node7       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-Node7       Node8       1Mbps       1       10ms    ns3::RedQueue,MeanPktSize=100
-
diff --git a/helper/ndn-header-helper.cc b/helper/ndn-header-helper.cc
deleted file mode 100644
index edb5af8..0000000
--- a/helper/ndn-header-helper.cc
+++ /dev/null
@@ -1,74 +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>
- */
-
-#include "ndn-header-helper.h"
-
-#include "ns3/log.h"
-#include "ns3/packet.h"
-#include "ns3/header.h"
-#include "ns3/object.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include <iomanip>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.HeaderHelper");
-
-const uint8_t INTEREST_CCNB_BYTES[]       = {0x01, 0xD2};
-const uint8_t CONTENT_OBJECT_CCNB_BYTES[] = {0x04, 0x82};
-
-const uint8_t INTEREST_NDNSIM_BYTES[]       = {0x80, 0x00};
-const uint8_t CONTENT_OBJECT_NDNSIM_BYTES[] = {0x80, 0x01};
-
-namespace ns3 {
-namespace ndn {
-
-HeaderHelper::Type
-HeaderHelper::GetNdnHeaderType (Ptr<const Packet> packet)
-{
-  uint8_t type[2];
-  uint32_t read=packet->CopyData (type,2);
-
-  if (read!=2) throw UnknownHeaderException();
-
-  NS_LOG_DEBUG (*packet);
-  if (type[0] == INTEREST_CCNB_BYTES[0] && type[1] == INTEREST_CCNB_BYTES[1])
-    {
-      return HeaderHelper::INTEREST_CCNB;
-    }
-  else if (type[0] == CONTENT_OBJECT_CCNB_BYTES[0] && type[1] == CONTENT_OBJECT_CCNB_BYTES[1])
-    {
-      return HeaderHelper::CONTENT_OBJECT_CCNB;
-    }
-  else if (type[0] == INTEREST_NDNSIM_BYTES[0] && type[1] == INTEREST_NDNSIM_BYTES[1])
-    {
-      return HeaderHelper::INTEREST_NDNSIM;
-    }
-  else if (type[0] == CONTENT_OBJECT_NDNSIM_BYTES[0] && type[1] == CONTENT_OBJECT_NDNSIM_BYTES[1])
-    {
-      return HeaderHelper::CONTENT_OBJECT_NDNSIM;
-    }
-
-  NS_LOG_DEBUG (*packet);
-  throw UnknownHeaderException();
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/helper/ndn-header-helper.h b/helper/ndn-header-helper.h
deleted file mode 100644
index 376cdb7..0000000
--- a/helper/ndn-header-helper.h
+++ /dev/null
@@ -1,104 +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 _NDN_HEADER_HELPER_H_
-#define _NDN_HEADER_HELPER_H_
-
-#include "ns3/ptr.h"
-
-namespace ns3 {
-
-class Header;
-class Packet;
-
-namespace ndn {
-
-class Name;
-typedef Name NameComponents;
-
-/**
- * @ingroup ndn-helpers
- *
- * \brief Class implementing functionality to detect Ndn packet type and
- * create the corresponding object
- *
- * Ndn doesn't really have a header, so we need this class to
- * determine type of Ndn packet and return corresponent header class,
- * Interest or Data
- *
- * Throws UnknownHeaderException if header type couldn't be determined
- */
-class HeaderHelper
-{
-public:
-  /**
-     @brief enum for Ndn packet types
-   */
-  enum Type {INTEREST_CCNB, CONTENT_OBJECT_CCNB,
-             INTEREST_NDNSIM, CONTENT_OBJECT_NDNSIM};
-
-  /**
-   *	Packet ::= Version
-   *		   PacketType
-   *		   (Interest | Data)
-   *
-   *        0                   1
-   *        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
-   *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-   *        |    Version    |   PacketType  |
-   *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-   *
-   * For ccnb-encoding compatibility, ``Version`` / ``PacketType`` has two reserved values to denote ccnb-encoded packet:
-   *
-   * Version 0x01, PacketType 0xD2 --- ccnb-encoded ``Interest`` packet
-   * Version 0x04, PacketType 0x82 --- ccnb-encoded ``Data`` packet
-   *
-   *
-   * It peeks first 2 bytes of a packet.
-   *
-   *  All interests start with
-   *   +-----------------+  +---+---------+-------+
-   *   | 0 0 0 0 0 0 0 1 |  | 1 | 1 0 1 0 | 0 1 0 |   (0x01 0xD2)
-   *   +-----------------+  +---+---------+-------+
-   *
-   *  All content objects start with
-   *   +-----------------+  +---+---------+-------+
-   *   | 0 0 0 0 0 1 0 0 |  | 1 | 0 0 0 0 | 0 1 0 |   (0x04 0x82)
-   *   +-----------------+  +---+---------+-------+
-   *                          ^             ^^^^^
-   *                          |               |
-   *                      terminator      DTAG (Dictionary TAG)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-
-  static Type
-  GetNdnHeaderType (Ptr<const Packet> packet);
-};
-
-  /**
-   * \brief Exception thrown if NDN stack receives unrecognized message type
-   */
-class UnknownHeaderException {};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_HEADER_HELPER_H_
diff --git a/model/fib/ndn-fib-entry.cc b/model/fib/ndn-fib-entry.cc
deleted file mode 100644
index f05140e..0000000
--- a/model/fib/ndn-fib-entry.cc
+++ /dev/null
@@ -1,209 +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>
- */
-
-#include "ndn-fib-entry.h"
-#include "ndn-fib.h"
-
-#include "ns3/ndn-name.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-
-#define NDN_RTO_ALPHA 0.125
-#define NDN_RTO_BETA 0.25
-#define NDN_RTO_K 4
-
-#include <boost/ref.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.fib.Entry");
-
-namespace ns3 {
-namespace ndn {
-namespace fib {
-
-//////////////////////////////////////////////////////////////////////
-// Helpers
-//////////////////////////////////////////////////////////////////////
-
-struct FaceMetricByFace
-{
-  typedef FaceMetricContainer::type::index<i_face>::type
-  type;
-};
-
-
-void
-FaceMetric::UpdateRtt (const Time &rttSample)
-{
-  // const Time & this->m_rttSample
-
-  //update srtt and rttvar (RFC 2988)
-  if (m_sRtt.IsZero ())
-    {
-      //first RTT measurement
-      NS_ASSERT_MSG (m_rttVar.IsZero (), "SRTT is zero, but variation is not");
-
-      m_sRtt = rttSample;
-      m_rttVar = Time (m_sRtt / 2.0);
-    }
-  else
-    {
-      m_rttVar = Time ((1 - NDN_RTO_BETA) * m_rttVar + 1.0 * NDN_RTO_BETA * Abs(m_sRtt - rttSample));
-      m_sRtt = Time ((1 - NDN_RTO_ALPHA) * m_sRtt + 1.0 * NDN_RTO_ALPHA * rttSample);
-    }
-}
-
-/////////////////////////////////////////////////////////////////////
-
-void
-Entry::UpdateFaceRtt (Ptr<Face> face, const Time &sample)
-{
-  FaceMetricByFace::type::iterator record = m_faces.get<i_face> ().find (face);
-  if (record == m_faces.get<i_face> ().end ())
-    {
-      return;
-    }
-
-  m_faces.modify (record,
-                  ll::bind (&FaceMetric::UpdateRtt, ll::_1, sample));
-
-  // reordering random access index same way as by metric index
-  m_faces.get<i_nth> ().rearrange (m_faces.get<i_metric> ().begin ());
-}
-
-void
-Entry::UpdateStatus (Ptr<Face> face, FaceMetric::Status status)
-{
-  NS_LOG_FUNCTION (this << boost::cref(*face) << status);
-
-  FaceMetricByFace::type::iterator record = m_faces.get<i_face> ().find (face);
-  if (record == m_faces.get<i_face> ().end ())
-    {
-      return;
-    }
-
-  m_faces.modify (record,
-                  ll::bind (&FaceMetric::SetStatus, ll::_1, status));
-
-  // reordering random access index same way as by metric index
-  m_faces.get<i_nth> ().rearrange (m_faces.get<i_metric> ().begin ());
-}
-
-void
-Entry::AddOrUpdateRoutingMetric (Ptr<Face> face, int32_t metric)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT_MSG (face != NULL, "Trying to Add or Update NULL face");
-
-  FaceMetricByFace::type::iterator record = m_faces.get<i_face> ().find (face);
-  if (record == m_faces.get<i_face> ().end ())
-    {
-      m_faces.insert (FaceMetric (face, metric));
-    }
-  else
-  {
-    // don't update metric to higher value
-    if (record->GetRoutingCost () > metric || record->GetStatus () == FaceMetric::NDN_FIB_RED)
-      {
-        m_faces.modify (record,
-                        ll::bind (&FaceMetric::SetRoutingCost, ll::_1, metric));
-
-        m_faces.modify (record,
-                        ll::bind (&FaceMetric::SetStatus, ll::_1, FaceMetric::NDN_FIB_YELLOW));
-      }
-  }
-
-  // reordering random access index same way as by metric index
-  m_faces.get<i_nth> ().rearrange (m_faces.get<i_metric> ().begin ());
-}
-
-void
-Entry::SetRealDelayToProducer (Ptr<Face> face, Time delay)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT_MSG (face != NULL, "Trying to Update NULL face");
-
-  FaceMetricByFace::type::iterator record = m_faces.get<i_face> ().find (face);
-  if (record != m_faces.get<i_face> ().end ())
-    {
-      m_faces.modify (record,
-                      ll::bind (&FaceMetric::SetRealDelay, ll::_1, delay));
-    }
-}
-
-
-void
-Entry::Invalidate ()
-{
-  for (FaceMetricByFace::type::iterator face = m_faces.begin ();
-       face != m_faces.end ();
-       face++)
-    {
-      m_faces.modify (face,
-                      ll::bind (&FaceMetric::SetRoutingCost, ll::_1, std::numeric_limits<uint16_t>::max ()));
-
-      m_faces.modify (face,
-                      ll::bind (&FaceMetric::SetStatus, ll::_1, FaceMetric::NDN_FIB_RED));
-    }
-}
-
-const FaceMetric &
-Entry::FindBestCandidate (uint32_t skip/* = 0*/) const
-{
-  if (m_faces.size () == 0) throw Entry::NoFaces ();
-  skip = skip % m_faces.size();
-  return m_faces.get<i_nth> () [skip];
-}
-
-Ptr<Fib>
-Entry::GetFib ()
-{
-  return m_fib;
-}
-
-
-std::ostream& operator<< (std::ostream& os, const Entry &entry)
-{
-  for (FaceMetricContainer::type::index<i_nth>::type::iterator metric =
-         entry.m_faces.get<i_nth> ().begin ();
-       metric != entry.m_faces.get<i_nth> ().end ();
-       metric++)
-    {
-      if (metric != entry.m_faces.get<i_nth> ().begin ())
-        os << ", ";
-
-      os << *metric;
-    }
-  return os;
-}
-
-std::ostream& operator<< (std::ostream& os, const FaceMetric &metric)
-{
-  static const std::string statusString[] = {"","g","y","r"};
-
-  os << *metric.m_face << "(" << metric.m_routingCost << ","<< statusString [metric.m_status] << "," << metric.m_face->GetMetric () << ")";
-  return os;
-}
-
-} // namespace fib
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fib/ndn-fib-entry.h b/model/fib/ndn-fib-entry.h
deleted file mode 100644
index 655c0cb..0000000
--- a/model/fib/ndn-fib-entry.h
+++ /dev/null
@@ -1,361 +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 _NDN_FIB_ENTRY_H_
-#define	_NDN_FIB_ENTRY_H_
-
-#include "ns3/ptr.h"
-#include "ns3/nstime.h"
-#include "ns3/ndn-face.h"
-#include "ns3/ndn-name.h"
-#include "ns3/ndn-limits.h"
-#include "ns3/traced-value.h"
-
-#include <boost/multi_index_container.hpp>
-#include <boost/multi_index/tag.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-#include <boost/multi_index/composite_key.hpp>
-#include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/random_access_index.hpp>
-#include <boost/multi_index/member.hpp>
-#include <boost/multi_index/mem_fun.hpp>
-
-namespace ns3 {
-namespace ndn {
-
-class Name;
-typedef Name NameComponents;
-
-class Fib;
-
-/**
- * @ingroup ndn-fib
- * @brief Namespace for FIB operations
- */
-namespace fib {
-
-/**
- * @ingroup ndn-fib
- * \brief Structure holding various parameters associated with a (FibEntry, Face) tuple
- */
-class FaceMetric
-{
-public:
-  /**
-   * @brief Color codes for FIB face status
-   */
-  enum Status { NDN_FIB_GREEN = 1,
-                NDN_FIB_YELLOW = 2,
-                NDN_FIB_RED = 3 };
-public:
-  /**
-   * \brief Metric constructor
-   *
-   * \param face Face for which metric
-   * \param cost Initial value for routing cost
-   */
-  FaceMetric (Ptr<Face> face, int32_t cost)
-    : m_face (face)
-    , m_status (NDN_FIB_YELLOW)
-    , m_routingCost (cost)
-    , m_sRtt   (Seconds (0))
-    , m_rttVar (Seconds (0))
-    , m_realDelay (Seconds (0))
-  { }
-
-  /**
-   * \brief Comparison operator used by boost::multi_index::identity<>
-   */
-  bool
-  operator< (const FaceMetric &fm) const { return *m_face < *fm.m_face; } // return identity of the face
-
-  /**
-   * @brief Comparison between FaceMetric and Face
-   */
-  bool
-  operator< (const Ptr<Face> &face) const { return *m_face < *face; }
-
-  /**
-   * @brief Return Face associated with FaceMetric
-   */
-  Ptr<Face>
-  GetFace () const { return m_face; }
-
-  /**
-   * \brief Recalculate smoothed RTT and RTT variation
-   * \param rttSample RTT sample
-   */
-  void
-  UpdateRtt (const Time &rttSample);
-
-  /**
-   * @brief Get current status of FIB entry
-   */
-  Status
-  GetStatus () const
-  {
-    return m_status;
-  }
-
-  /**
-   * @brief Set current status of FIB entry
-   */
-  void
-  SetStatus (Status status)
-  {
-    m_status.Set (status);
-  }
-
-  /**
-   * @brief Get current routing cost
-   */
-  int32_t
-  GetRoutingCost () const
-  {
-    return m_routingCost;
-  }
-
-  /**
-   * @brief Set routing cost
-   */
-  void
-  SetRoutingCost (int32_t routingCost)
-  {
-    m_routingCost = routingCost;
-  }
-
-  /**
-   * @brief Get current estimate for smoothed RTT value
-   */
-  Time
-  GetSRtt () const
-  {
-    return m_sRtt;
-  }
-
-  /**
-   * @brief Get current estimate for the RTT variation
-   */
-  Time
-  GetRttVar () const
-  {
-    return m_rttVar;
-  }
-  
-  /**
-   * @brief Get real propagation delay to the producer, calculated based on NS-3 p2p link delays
-   */
-  Time
-  GetRealDelay () const
-  {
-    return m_realDelay;
-  }
-
-  /**
-   * @brief Set real propagation delay to the producer, calculated based on NS-3 p2p link delays
-   */
-  void
-  SetRealDelay (Time realDelay)
-  {
-    m_realDelay = realDelay;
-  }
-
-  /**
-   * @brief Get direct access to status trace
-   */
-  TracedValue<Status> &
-  GetStatusTrace ()
-  {
-    return m_status;
-  }
-
-private:
-  friend std::ostream& operator<< (std::ostream& os, const FaceMetric &metric);
-
-private:
-  Ptr<Face> m_face; ///< Face
-
-  TracedValue<Status> m_status; ///< \brief Status of the next hop:
-				///<		- NDN_FIB_GREEN
-				///<		- NDN_FIB_YELLOW
-				///<		- NDN_FIB_RED
-
-  int32_t m_routingCost; ///< \brief routing protocol cost (interpretation of the value depends on the underlying routing protocol)
-
-  Time m_sRtt;         ///< \brief smoothed round-trip time
-  Time m_rttVar;       ///< \brief round-trip time variation
-
-  Time m_realDelay;    ///< \brief real propagation delay to the producer, calculated based on NS-3 p2p link delays
-};
-
-/// @cond include_hidden
-class i_face {};
-class i_metric {};
-class i_nth {};
-/// @endcond
-
-
-/**
- * @ingroup ndn-fib
- * @brief Typedef for indexed face container of Entry
- *
- * Currently, there are 2 indexes:
- * - by face (used to find record and update metric)
- * - by metric (face ranking)
- * - random access index (for fast lookup on nth face). Order is
- *   maintained manually to be equal to the 'by metric' order
- */
-struct FaceMetricContainer
-{
-  /// @cond include_hidden
-  typedef boost::multi_index::multi_index_container<
-    FaceMetric,
-    boost::multi_index::indexed_by<
-      // For fast access to elements using Face
-      boost::multi_index::ordered_unique<
-        boost::multi_index::tag<i_face>,
-        boost::multi_index::const_mem_fun<FaceMetric,Ptr<Face>,&FaceMetric::GetFace>
-      >,
-
-      // List of available faces ordered by (status, m_routingCost)
-      boost::multi_index::ordered_non_unique<
-        boost::multi_index::tag<i_metric>,
-        boost::multi_index::composite_key<
-          FaceMetric,
-          boost::multi_index::const_mem_fun<FaceMetric,FaceMetric::Status,&FaceMetric::GetStatus>,
-          boost::multi_index::const_mem_fun<FaceMetric,int32_t,&FaceMetric::GetRoutingCost>
-        >
-      >,
-
-      // To optimize nth candidate selection (sacrifice a little bit space to gain speed)
-      boost::multi_index::random_access<
-        boost::multi_index::tag<i_nth>
-      >
-    >
-   > type;
-  /// @endcond
-};
-
-/**
- * @ingroup ndn-fib
- * \brief Structure for FIB table entry, holding indexed list of
- *        available faces and their respective metrics
- */
-class Entry : public Object
-{
-public:
-  typedef Entry base_type;
-
-public:
-  class NoFaces {}; ///< @brief Exception class for the case when FIB entry is not found
-
-  /**
-   * \brief Constructor
-   * \param prefix smart pointer to the prefix for the FIB entry
-   */
-  Entry (Ptr<Fib> fib, const Ptr<const Name> &prefix)
-  : m_fib (fib)
-  , m_prefix (prefix)
-  , m_needsProbing (false)
-  {
-  }
-
-  /**
-   * \brief Update status of FIB next hop
-   * \param status Status to set on the FIB entry
-   */
-  void UpdateStatus (Ptr<Face> face, FaceMetric::Status status);
-
-  /**
-   * \brief Add or update routing metric of FIB next hop
-   *
-   * Initial status of the next hop is set to YELLOW
-   */
-  void AddOrUpdateRoutingMetric (Ptr<Face> face, int32_t metric);
-
-  /**
-   * \brief Set real delay to the producer
-   */
-  void
-  SetRealDelayToProducer (Ptr<Face> face, Time delay);
-
-  /**
-   * @brief Invalidate face
-   *
-   * Set routing metric on all faces to max and status to RED
-   */
-  void
-  Invalidate ();
-
-  /**
-   * @brief Update RTT averages for the face
-   */
-  void
-  UpdateFaceRtt (Ptr<Face> face, const Time &sample);
-
-  /**
-   * \brief Get prefix for the FIB entry
-   */
-  const Name&
-  GetPrefix () const { return *m_prefix; }
-
-  /**
-   * \brief Find "best route" candidate, skipping `skip' first candidates (modulo # of faces)
-   *
-   * throws Entry::NoFaces if m_faces.size()==0
-   */
-  const FaceMetric &
-  FindBestCandidate (uint32_t skip = 0) const;
-
-  /**
-   * @brief Remove record associated with `face`
-   */
-  void
-  RemoveFace (const Ptr<Face> &face)
-  {
-    m_faces.erase (face);
-  }
-
-  /**
-   * @brief Get pointer to access FIB, to which this entry is added
-   */
-  Ptr<Fib>
-  GetFib ();
-  
-private:
-  friend std::ostream& operator<< (std::ostream& os, const Entry &entry);
-
-public:
-  Ptr<Fib> m_fib; ///< \brief FIB to which entry is added
-
-  Ptr<const Name> m_prefix; ///< \brief Prefix of the FIB entry
-  FaceMetricContainer::type m_faces; ///< \brief Indexed list of faces
-
-  bool m_needsProbing;      ///< \brief flag indicating that probing should be performed
-};
-
-std::ostream& operator<< (std::ostream& os, const Entry &entry);
-std::ostream& operator<< (std::ostream& os, const FaceMetric &metric);
-
-} // namespace fib
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_FIB_ENTRY_H_
diff --git a/model/fib/ndn-fib-impl.cc b/model/fib/ndn-fib-impl.cc
deleted file mode 100644
index cef9306..0000000
--- a/model/fib/ndn-fib-impl.cc
+++ /dev/null
@@ -1,329 +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>
- */
-
-#include "ndn-fib-impl.h"
-
-#include "ns3/ndn-face.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-forwarding-strategy.h"
-
-#include "ns3/node.h"
-#include "ns3/assert.h"
-#include "ns3/names.h"
-#include "ns3/log.h"
-
-#include <boost/ref.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.fib.FibImpl");
-
-namespace ns3 {
-namespace ndn {
-namespace fib {
-
-NS_OBJECT_ENSURE_REGISTERED (FibImpl);
-
-TypeId 
-FibImpl::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fib::Default") // cheating ns3 object system
-    .SetParent<Fib> ()
-    .SetGroupName ("Ndn")
-    .AddConstructor<FibImpl> ()
-  ;
-  return tid;
-}
-
-FibImpl::FibImpl ()
-{
-}
-
-void
-FibImpl::NotifyNewAggregate ()
-{
-  Object::NotifyNewAggregate ();
-}
-
-void 
-FibImpl::DoDispose (void)
-{
-  clear ();
-  Object::DoDispose ();
-}
-
-
-Ptr<Entry>
-FibImpl::LongestPrefixMatch (const Interest &interest)
-{
-  super::iterator item = super::longest_prefix_match (interest.GetName ());
-  // @todo use predicate to search with exclude filters
-
-  if (item == super::end ())
-    return 0;
-  else
-    return item->payload ();
-}
-
-Ptr<fib::Entry>
-FibImpl::Find (const Name &prefix)
-{
-  super::iterator item = super::find_exact (prefix);
-
-  if (item == super::end ())
-    return 0;
-  else
-    return item->payload ();
-}
-
-
-Ptr<Entry>
-FibImpl::Add (const Name &prefix, Ptr<Face> face, int32_t metric)
-{
-  return Add (Create<Name> (prefix), face, metric);
-}
-  
-Ptr<Entry>
-FibImpl::Add (const Ptr<const Name> &prefix, Ptr<Face> face, int32_t metric)
-{
-  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId () << boost::cref(*prefix) << boost::cref(*face) << metric);
-
-  // will add entry if doesn't exists, or just return an iterator to the existing entry
-  std::pair< super::iterator, bool > result = super::insert (*prefix, 0);
-  if (result.first != super::end ())
-    {
-      if (result.second)
-        {
-          Ptr<EntryImpl> newEntry = Create<EntryImpl> (this, prefix);
-          newEntry->SetTrie (result.first);
-          result.first->set_payload (newEntry);
-        }
-  
-      super::modify (result.first,
-                     ll::bind (&Entry::AddOrUpdateRoutingMetric, ll::_1, face, metric));
-
-      if (result.second)
-        {
-          // notify forwarding strategy about new FIB entry
-          NS_ASSERT (this->GetObject<ForwardingStrategy> () != 0);
-          this->GetObject<ForwardingStrategy> ()->DidAddFibEntry (result.first->payload ());
-        }
-      
-      return result.first->payload ();
-    }
-  else
-    return 0;
-}
-
-void
-FibImpl::Remove (const Ptr<const Name> &prefix)
-{
-  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId () << boost::cref(*prefix));
-
-  super::iterator fibEntry = super::find_exact (*prefix);
-  if (fibEntry != super::end ())
-    {
-      // notify forwarding strategy about soon be removed FIB entry
-      NS_ASSERT (this->GetObject<ForwardingStrategy> () != 0);
-      this->GetObject<ForwardingStrategy> ()->WillRemoveFibEntry (fibEntry->payload ());
-
-      super::erase (fibEntry);
-    }
-  // else do nothing
-}
-
-// void
-// FibImpl::Invalidate (const Ptr<const Name> &prefix)
-// {
-//   NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId () << boost::cref(*prefix));
-
-//   super::iterator foundItem, lastItem;
-//   bool reachLast;
-//   boost::tie (foundItem, reachLast, lastItem) = super::getTrie ().find (*prefix);
-  
-//   if (!reachLast || lastItem->payload () == 0)
-//     return; // nothing to invalidate
-
-//   super::modify (lastItem,
-//                  ll::bind (&Entry::Invalidate, ll::_1));
-// }
-
-void
-FibImpl::InvalidateAll ()
-{
-  NS_LOG_FUNCTION (this->GetObject<Node> ()->GetId ());
-
-  super::parent_trie::recursive_iterator item (super::getTrie ());
-  super::parent_trie::recursive_iterator end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-
-      super::modify (&(*item),
-                     ll::bind (&Entry::Invalidate, ll::_1));
-    }
-}
-
-void
-FibImpl::RemoveFace (super::parent_trie &item, Ptr<Face> face)
-{
-  if (item.payload () == 0) return;
-  NS_LOG_FUNCTION (this);
-
-  super::modify (&item,
-                 ll::bind (&Entry::RemoveFace, ll::_1, face));
-}
-
-void
-FibImpl::RemoveFromAll (Ptr<Face> face)
-{
-  NS_LOG_FUNCTION (this);
-
-  Ptr<Entry> entry = Begin ();
-  while (entry != End ())
-    {
-      entry->RemoveFace (face);
-      if (entry->m_faces.size () == 0)
-        {
-          Ptr<Entry> nextEntry = Next (entry);
-
-          // notify forwarding strategy about soon be removed FIB entry
-          NS_ASSERT (this->GetObject<ForwardingStrategy> () != 0);
-          this->GetObject<ForwardingStrategy> ()->WillRemoveFibEntry (entry);
-
-          super::erase (StaticCast<EntryImpl> (entry)->to_iterator ());
-          entry = nextEntry;
-        }
-      else
-        {
-          entry = Next (entry);
-        }
-    }
-}
-
-void
-FibImpl::Print (std::ostream &os) const
-{
-  // !!! unordered_set imposes "random" order of item in the same level !!!
-  super::parent_trie::const_recursive_iterator item (super::getTrie ());
-  super::parent_trie::const_recursive_iterator end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-
-      os << item->payload ()->GetPrefix () << "\t" << *item->payload () << "\n";
-    }
-}
-
-uint32_t
-FibImpl::GetSize () const
-{
-  return super::getPolicy ().size ();
-}
-
-Ptr<const Entry>
-FibImpl::Begin () const
-{
-  super::parent_trie::const_recursive_iterator item (super::getTrie ());
-  super::parent_trie::const_recursive_iterator end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-Ptr<const Entry>
-FibImpl::End () const
-{
-  return 0;
-}
-
-Ptr<const Entry>
-FibImpl::Next (Ptr<const Entry> from) const
-{
-  if (from == 0) return 0;
-  
-  super::parent_trie::const_recursive_iterator item (*StaticCast<const EntryImpl> (from)->to_iterator ());
-  super::parent_trie::const_recursive_iterator end (0);
-  for (item++; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-Ptr<Entry>
-FibImpl::Begin ()
-{
-  super::parent_trie::recursive_iterator item (super::getTrie ());
-  super::parent_trie::recursive_iterator end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-Ptr<Entry>
-FibImpl::End ()
-{
-  return 0;
-}
-
-Ptr<Entry>
-FibImpl::Next (Ptr<Entry> from)
-{
-  if (from == 0) return 0;
-  
-  super::parent_trie::recursive_iterator item (*StaticCast<EntryImpl> (from)->to_iterator ());
-  super::parent_trie::recursive_iterator end (0);
-  for (item++; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-
-} // namespace fib
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fib/ndn-fib-impl.h b/model/fib/ndn-fib-impl.h
deleted file mode 100644
index b221d48..0000000
--- a/model/fib/ndn-fib-impl.h
+++ /dev/null
@@ -1,155 +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 _NDN_FIB_IMPL_H_
-#define	_NDN_FIB_IMPL_H_
-
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-name.h"
-
-#include "../../utils/trie/trie-with-policy.h"
-#include "../../utils/trie/counting-policy.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fib {
-
-/**
- * @ingroup ndn-fib
- * @brief FIB entry implementation with with additional references to the base container
- */
-class EntryImpl : public Entry
-{
-public:
-  typedef ndnSIM::trie_with_policy<
-    Name,
-    ndnSIM::smart_pointer_payload_traits<EntryImpl>,
-    ndnSIM::counting_policy_traits
-    > trie;
-
-  EntryImpl (Ptr<Fib> fib, const Ptr<const Name> &prefix)
-    : Entry (fib, prefix)
-    , item_ (0)
-  {
-  }
-
-  void
-  SetTrie (trie::iterator item)
-  {
-    item_ = item;
-  }
-
-  trie::iterator to_iterator () { return item_; }
-  trie::const_iterator to_iterator () const { return item_; }
-  
-private:
-  trie::iterator item_;
-};
-
-/**
- * @ingroup ndn-fib
- * \brief Class implementing FIB functionality
- */
-class FibImpl : public Fib,
-                protected ndnSIM::trie_with_policy< Name,
-                                                    ndnSIM::smart_pointer_payload_traits< EntryImpl >,
-                                                    ndnSIM::counting_policy_traits >
-{
-public:
-  typedef ndnSIM::trie_with_policy< Name,
-                                    ndnSIM::smart_pointer_payload_traits<EntryImpl>,
-                                    ndnSIM::counting_policy_traits > super;
-  
-  /**
-   * \brief Interface ID
-   *
-   * \return interface ID
-   */
-  static TypeId GetTypeId ();
-
-  /**
-   * \brief Constructor
-   */
-  FibImpl ();
-
-  virtual Ptr<Entry>
-  LongestPrefixMatch (const Interest &interest);
-
-  virtual Ptr<fib::Entry>
-  Find (const Name &prefix);
-  
-  virtual Ptr<Entry>
-  Add (const Name &prefix, Ptr<Face> face, int32_t metric);
-
-  virtual Ptr<Entry>
-  Add (const Ptr<const Name> &prefix, Ptr<Face> face, int32_t metric);
-
-  virtual void
-  Remove (const Ptr<const Name> &prefix);
-
-  virtual void
-  InvalidateAll ();
-  
-  virtual void
-  RemoveFromAll (Ptr<Face> face);
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual uint32_t
-  GetSize () const;
-
-  virtual Ptr<const Entry>
-  Begin () const;
-
-  virtual Ptr<Entry>
-  Begin ();
-
-  virtual Ptr<const Entry>
-  End () const;
-
-  virtual Ptr<Entry>
-  End ();
-
-  virtual Ptr<const Entry>
-  Next (Ptr<const Entry> item) const;
-  
-  virtual Ptr<Entry>
-  Next (Ptr<Entry> item);
-  
-protected:
-  // inherited from Object class
-  virtual void NotifyNewAggregate (); ///< @brief Notify when object is aggregated
-  virtual void DoDispose (); ///< @brief Perform cleanup
-
-private:
-  /**
-   * @brief Remove reference to a face from the entry. If entry had only this face, the whole
-   * entry will be removed
-   */
-  void
-  RemoveFace (super::parent_trie &item, Ptr<Face> face);
-};
-
-} // namespace fib
-} // namespace ndn
-} // namespace ns3
-
-#endif	/* _NDN_FIB_IMPL_H_ */
diff --git a/model/fib/ndn-fib.cc b/model/fib/ndn-fib.cc
deleted file mode 100644
index f63dadf..0000000
--- a/model/fib/ndn-fib.cc
+++ /dev/null
@@ -1,51 +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>
- */
-
-#include "ndn-fib.h"
-
-#include "ns3/node.h"
-#include "ns3/names.h"
-
-namespace ns3 {
-namespace ndn {
-
-TypeId 
-Fib::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Fib") // cheating ns3 object system
-    .SetParent<Object> ()
-    .SetGroupName ("Ndn")
-  ;
-  return tid;
-}
-
-std::ostream&
-operator<< (std::ostream& os, const Fib &fib)
-{
-  os << "Node " << Names::FindName (fib.GetObject<Node>()) << "\n";
-  os << "  Dest prefix      Interfaces(Costs)                  \n";
-  os << "+-------------+--------------------------------------+\n";
-
-  fib.Print (os);
-  return os;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fib/ndn-fib.h b/model/fib/ndn-fib.h
deleted file mode 100644
index f088515..0000000
--- a/model/fib/ndn-fib.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011-2013 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 _NDN_FIB_H_
-#define	_NDN_FIB_H_
-
-#include "ns3/simple-ref-count.h"
-#include "ns3/node.h"
-
-#include "ns3/ndn-fib-entry.h"
-
-namespace ns3 {
-namespace ndn {
-
-class Interest;
-typedef Interest InterestHeader;
-
-/**
- * @ingroup ndn
- * @defgroup ndn-fib FIB
- */
-
-/**
- * @ingroup ndn-fib
- * @brief Class implementing FIB functionality
- */
-class Fib : public Object
-{
-public:
-  /**
-   * \brief Interface ID
-   *
-   * \return interface ID
-   */
-  static TypeId GetTypeId ();
-  /**
-   * @brief Default constructor
-   */
-  Fib () {}
-  
-  /**
-   * @brief Virtual destructor
-   */
-  virtual ~Fib () { };
-  
-  /**
-   * \brief Perform longest prefix match
-   *
-   * \todo Implement exclude filters
-   *
-   * \param interest Interest packet header
-   * \returns If entry found a valid iterator (Ptr<fib::Entry>) will be returned, otherwise End () (==0)
-   */
-  virtual Ptr<fib::Entry>
-  LongestPrefixMatch (const Interest &interest) = 0;
-
-  /**
-   * @brief Get FIB entry for the prefix (exact match)
-   *
-   * @param prefix Name for FIB entry
-   * @returns If entry is found, a valid iterator (Ptr<fib::Entry>) will be returned. Otherwise End () (==0)
-   */
-  virtual Ptr<fib::Entry>
-  Find (const Name &prefix) = 0;
-  
-  /**
-   * \brief Add or update FIB entry
-   *
-   * If the entry exists, metric will be updated. Otherwise, new entry will be created
-   *
-   * @param name	Prefix
-   * @param face	Forwarding face
-   * @param metric	Routing metric
-   */
-  virtual Ptr<fib::Entry>
-  Add (const Name &prefix, Ptr<Face> face, int32_t metric) = 0;
-
-  /**
-   * \brief Add or update FIB entry using smart pointer to prefix
-   *
-   * If the entry exists, metric will be updated. Otherwise, new entry will be created
-   *
-   * @param name	Smart pointer to prefix
-   * @param face	Forwarding face
-   * @param metric	Routing metric
-   */
-  virtual Ptr<fib::Entry>
-  Add (const Ptr<const Name> &prefix, Ptr<Face> face, int32_t metric) = 0;
-
-  /**
-   * @brief Remove FIB entry
-   *
-   * ! ATTENTION ! Use with caution.  All PIT entries referencing the corresponding FIB entry will become invalid.
-   * So, simulation may crash.
-   *
-   * @param name	Smart pointer to prefix
-   */
-  virtual void
-  Remove (const Ptr<const Name> &prefix) = 0;
-
-  /**
-   * @brief Invalidate all FIB entries
-   */
-  virtual void
-  InvalidateAll () = 0;
-  
-  /**
-   * @brief Remove all references to a face from FIB.  If for some enty that face was the only element,
-   * this FIB entry will be removed.
-   */
-  virtual void
-  RemoveFromAll (Ptr<Face> face) = 0;
-
-  /**
-   * @brief Print out entries in FIB
-   */
-  virtual void
-  Print (std::ostream &os) const = 0;
-
-  /**
-   * @brief Get number of entries in FIB
-   */
-  virtual uint32_t
-  GetSize () const = 0;
-
-  /**
-   * @brief Return first element of FIB (no order guaranteed)
-   */
-  virtual Ptr<const fib::Entry>
-  Begin () const = 0;
-
-  /**
-   * @brief Return first element of FIB (no order guaranteed)
-   */
-  virtual Ptr<fib::Entry>
-  Begin () = 0;  
-
-  /**
-   * @brief Return item next after last (no order guaranteed)
-   */
-  virtual Ptr<const fib::Entry>
-  End () const = 0;
-
-  /**
-   * @brief Return item next after last (no order guaranteed)
-   */
-  virtual Ptr<fib::Entry>
-  End () = 0;
-
-  /**
-   * @brief Advance the iterator
-   */
-  virtual Ptr<const fib::Entry>
-  Next (Ptr<const fib::Entry>) const = 0;
-
-  /**
-   * @brief Advance the iterator
-   */
-  virtual Ptr<fib::Entry>
-  Next (Ptr<fib::Entry>) = 0;
-
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-  
-  /**
-   * @brief Static call to cheat python bindings
-   */
-  static inline Ptr<Fib>
-  GetFib (Ptr<Object> node);
-
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-  
-private:
-  Fib (const Fib&) {} ; ///< \brief copy constructor is disabled
-};
-
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-
-std::ostream& operator<< (std::ostream& os, const Fib &fib);
-
-Ptr<Fib>
-Fib::GetFib (Ptr<Object> node)
-{
-  return node->GetObject<Fib> ();
-}
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_FIB_H_
diff --git a/model/fw/best-route.cc b/model/fw/best-route.cc
deleted file mode 100644
index f5ab205..0000000
--- a/model/fw/best-route.cc
+++ /dev/null
@@ -1,104 +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>
- *         Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "best-route.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-
-#include "ns3/assert.h"
-#include "ns3/log.h"
-
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED (BestRoute);
-
-LogComponent BestRoute::g_log = LogComponent (BestRoute::GetLogName ().c_str ());
-
-std::string
-BestRoute::GetLogName ()
-{
-  return super::GetLogName ()+".BestRoute";
-}
-
-
-TypeId
-BestRoute::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::BestRoute")
-    .SetGroupName ("Ndn")
-    .SetParent <super> ()
-    .AddConstructor <BestRoute> ()
-    ;
-  return tid;
-}
-
-BestRoute::BestRoute ()
-{
-}
-
-bool
-BestRoute::DoPropagateInterest (Ptr<Face> inFace,
-                                Ptr<const Interest> interest,
-                                Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << interest->GetName ());
-
-  // No real need to call parent's (green-yellow-red's strategy) method, since it is incorporated
-  // in the logic of the BestRoute strategy
-  //
-  // // Try to work out with just green faces
-  // bool greenOk = super::DoPropagateInterest (inFace, interest, origPacket, pitEntry);
-  // if (greenOk)
-  //   return true;
-
-  int propagatedCount = 0;
-
-  BOOST_FOREACH (const fib::FaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<fib::i_metric> ())
-    {
-      NS_LOG_DEBUG ("Trying " << boost::cref(metricFace));
-      if (metricFace.GetStatus () == fib::FaceMetric::NDN_FIB_RED) // all non-read faces are in front
-        break;
-
-      if (!TrySendOutInterest (inFace, metricFace.GetFace (), interest, pitEntry))
-        {
-          continue;
-        }
-
-      propagatedCount++;
-      break; // do only once
-    }
-
-  NS_LOG_INFO ("Propagated to " << propagatedCount << " faces");
-  return propagatedCount > 0;
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/best-route.h b/model/fw/best-route.h
deleted file mode 100644
index 1939a84..0000000
--- a/model/fw/best-route.h
+++ /dev/null
@@ -1,71 +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>
- *         Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-
-#ifndef NDNSIM_BEST_ROUTE_H
-#define NDNSIM_BEST_ROUTE_H
-
-#include "green-yellow-red.h"
-#include "ns3/log.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Best route strategy
- */
-class BestRoute :
-    public GreenYellowRed
-{
-private:
-  typedef GreenYellowRed super;
-
-public:
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string
-  GetLogName ();
-  
-  /**
-   * @brief Default constructor
-   */
-  BestRoute ();
-        
-  // from super
-  virtual bool
-  DoPropagateInterest (Ptr<Face> incomingFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry);
-protected:
-  static LogComponent g_log;
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_BEST_ROUTE_H
diff --git a/model/fw/flooding.cc b/model/fw/flooding.cc
deleted file mode 100644
index 3d93248..0000000
--- a/model/fw/flooding.cc
+++ /dev/null
@@ -1,96 +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>
- *         Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "flooding.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "ns3/boolean.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED (Flooding);
-
-LogComponent Flooding::g_log = LogComponent (Flooding::GetLogName ().c_str ());
-
-std::string
-Flooding::GetLogName ()
-{
-  return super::GetLogName ()+".Flooding";
-}
-
-TypeId Flooding::GetTypeId ()
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::Flooding")
-    .SetGroupName ("Ndn")
-    .SetParent <Nacks> ()
-    .AddConstructor <Flooding> ()
-    ;
-  return tid;
-}
-
-Flooding::Flooding ()
-{
-}
-
-bool
-Flooding::DoPropagateInterest (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this);
-
-  int propagatedCount = 0;
-
-  BOOST_FOREACH (const fib::FaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<fib::i_metric> ())
-    {
-      NS_LOG_DEBUG ("Trying " << boost::cref(metricFace));
-      if (metricFace.GetStatus () == fib::FaceMetric::NDN_FIB_RED) // all non-read faces are in the front of the list
-        break;
-
-      if (!TrySendOutInterest (inFace, metricFace.GetFace (), interest, pitEntry))
-        {
-          continue;
-        }
-
-      propagatedCount++;
-    }
-
-  NS_LOG_INFO ("Propagated to " << propagatedCount << " faces");
-  return propagatedCount > 0;
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/flooding.h b/model/fw/flooding.h
deleted file mode 100644
index 1aa50b0..0000000
--- a/model/fw/flooding.h
+++ /dev/null
@@ -1,82 +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>
- *         Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#ifndef NDNSIM_FLOODING_H
-#define NDNSIM_FLOODING_H
-
-#include "nacks.h"
-#include "ns3/log.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Simple flooding strategy
- *
- * Interests will be forwarded to all available faces available for a route (FIB entry).
- * If there are no available GREEN or YELLOW faces, interests is dropped.
- *
- * Usage example:
- * @code
- *     ndnHelper.SetForwardingStrategy ("ns3::ndn::fw::Flooding");
- *     ...
- *     ndnHelper.Install (nodes);
- * @endcode
- */
-class Flooding :
-    public Nacks
-{
-private:
-  typedef Nacks super;
-
-public:
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string
-  GetLogName ();
-  
-  /**
-   * @brief Default constructor
-   */
-  Flooding ();
-
-protected:
-  // inherited from  Nacks/ForwardingStrategy
-  virtual bool
-  DoPropagateInterest (Ptr<Face> inFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry);
-
-protected:
-  static LogComponent g_log;
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_FLOODING
diff --git a/model/fw/green-yellow-red.cc b/model/fw/green-yellow-red.cc
deleted file mode 100644
index a2d4e3c..0000000
--- a/model/fw/green-yellow-red.cc
+++ /dev/null
@@ -1,141 +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>
- *          Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "green-yellow-red.h"
-
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-content-store.h"
-
-#include "ns3/assert.h"
-#include "ns3/ptr.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "ns3/boolean.h"
-#include "ns3/string.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/tuple/tuple.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.fw.GreenYellowRed");
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED (GreenYellowRed);
-
-TypeId
-GreenYellowRed::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::GreenYellowRed")
-    .SetGroupName ("Ndn")
-    .SetParent<Nacks> ()
-
-    ;
-  return tid;
-}
-
-bool
-GreenYellowRed::DoPropagateInterest (Ptr<Face> inFace,
-                                     Ptr<const Interest> interest,
-                                     Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this);
-  NS_ASSERT_MSG (m_pit != 0, "PIT should be aggregated with forwarding strategy");
-
-  int propagatedCount = 0;
-
-  BOOST_FOREACH (const fib::FaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<fib::i_metric> ())
-    {
-      if (metricFace.GetStatus () == fib::FaceMetric::NDN_FIB_RED ||
-          metricFace.GetStatus () == fib::FaceMetric::NDN_FIB_YELLOW)
-        break; //propagate only to green faces
-
-      if (!TrySendOutInterest (inFace, metricFace.GetFace (), interest, pitEntry))
-        {
-          continue;
-        }
-
-      propagatedCount++;
-      break; // propagate only one interest
-    }
-
-  return propagatedCount > 0;
-}
-
-void
-GreenYellowRed::WillSatisfyPendingInterest (Ptr<Face> inFace,
-                                            Ptr<pit::Entry> pitEntry)
-{
-  if (inFace != 0)
-    {
-      // Update metric status for the incoming interface in the corresponding FIB entry
-      pitEntry->GetFibEntry ()->UpdateStatus (inFace, fib::FaceMetric::NDN_FIB_GREEN);
-    }
-
-  super::WillSatisfyPendingInterest (inFace, pitEntry);
-}
-
-void
-GreenYellowRed::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_DEBUG ("WillEraseTimedOutPendingInterest for " << pitEntry->GetPrefix ());
-
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      // NS_LOG_DEBUG ("Face: " << face->m_face);
-      pitEntry->GetFibEntry ()->UpdateStatus (face->m_face, fib::FaceMetric::NDN_FIB_YELLOW);
-    }
-
-  super::WillEraseTimedOutPendingInterest (pitEntry);
-}
-
-void
-GreenYellowRed::DidReceiveValidNack (Ptr<Face> inFace,
-                                     uint32_t nackCode,
-                                     Ptr<const Interest> nack,
-                                     Ptr<pit::Entry> pitEntry)
-{
-  super::DidReceiveValidNack (inFace, nackCode, nack, pitEntry);
-
-  if (inFace != 0 &&
-      (nackCode == Interest::NACK_CONGESTION ||
-       nackCode == Interest::NACK_GIVEUP_PIT))
-    {
-      pitEntry->GetFibEntry ()->UpdateStatus (inFace, fib::FaceMetric::NDN_FIB_YELLOW);
-    }
-}
-
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/green-yellow-red.h b/model/fw/green-yellow-red.h
deleted file mode 100644
index 57f17dd..0000000
--- a/model/fw/green-yellow-red.h
+++ /dev/null
@@ -1,67 +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>
- *          Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-#ifndef NDNSIM_GREEN_YELLOW_RED_H
-#define NDNSIM_GREEN_YELLOW_RED_H
-
-#include "nacks.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Forwarding strategy extensions to track simple link status based on data plane performance
- */
-class GreenYellowRed :
-    public Nacks
-{
-public:
-  static TypeId
-  GetTypeId (void);
-
-protected:
-  virtual void
-  WillSatisfyPendingInterest (Ptr<Face> inFace,
-                              Ptr<pit::Entry> pitEntry);
-
-  virtual bool
-  DoPropagateInterest (Ptr<Face> inFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry);
-
-  virtual void
-  WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
-
-  virtual void
-  DidReceiveValidNack (Ptr<Face> incomingFace,
-                       uint32_t nackCode,
-                       Ptr<const Interest> nack,
-                       Ptr<pit::Entry> pitEntry);
-private:
-  typedef Nacks super;
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_GREEN_YELLOW_RED
diff --git a/model/fw/nacks.cc b/model/fw/nacks.cc
deleted file mode 100644
index b035514..0000000
--- a/model/fw/nacks.cc
+++ /dev/null
@@ -1,188 +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>
- */
-
-#include "nacks.h"
-
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-content-store.h"
-#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.h"
-
-#include "ns3/assert.h"
-#include "ns3/ptr.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "ns3/boolean.h"
-#include "ns3/string.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/tuple/tuple.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.fw.Nacks");
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED (Nacks);
-
-TypeId
-Nacks::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::Nacks")
-    .SetGroupName ("Ndn")
-    .SetParent<ForwardingStrategy> ()
-
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("OutNacks",  "OutNacks",  MakeTraceSourceAccessor (&Nacks::m_outNacks))
-    .AddTraceSource ("InNacks",   "InNacks",   MakeTraceSourceAccessor (&Nacks::m_inNacks))
-    .AddTraceSource ("DropNacks", "DropNacks", MakeTraceSourceAccessor (&Nacks::m_dropNacks))
-
-    .AddAttribute ("EnableNACKs", "Enabling support of NACKs",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&Nacks::m_nacksEnabled),
-                   MakeBooleanChecker ())
-    ;
-  return tid;
-}
-
-void
-Nacks::OnInterest (Ptr<Face> inFace,
-                   Ptr<Interest> interest)
-{
-  if (interest->GetNack () > 0)
-    OnNack (inFace, interest);
-  else
-    super::OnInterest (inFace, interest);
-}
-
-void
-Nacks::OnNack (Ptr<Face> inFace,
-               Ptr<Interest> nack)
-{
-  // NS_LOG_FUNCTION (inFace << nack->GetName ());
-  m_inNacks (nack, inFace);
-
-  Ptr<pit::Entry> pitEntry = m_pit->Lookup (*nack);
-  if (pitEntry == 0)
-    {
-      // somebody is doing something bad
-      m_dropNacks (nack, inFace);
-      return;
-    }
-
-  DidReceiveValidNack (inFace, nack->GetNack (), nack, pitEntry);
-}
-
-void
-Nacks::DidReceiveDuplicateInterest (Ptr<Face> inFace,
-                                    Ptr<const Interest> interest,
-                                    Ptr<pit::Entry> pitEntry)
-{
-  super::DidReceiveDuplicateInterest (inFace, interest, pitEntry);
-
-  if (m_nacksEnabled)
-    {
-      NS_LOG_DEBUG ("Sending NACK_LOOP");
-      Ptr<Interest> nack = Create<Interest> (*interest);
-      nack->SetNack (Interest::NACK_LOOP);
-
-      inFace->SendInterest (nack);
-      m_outNacks (nack, inFace);
-    }
-}
-
-void
-Nacks::DidExhaustForwardingOptions (Ptr<Face> inFace,
-                                    Ptr<const Interest> interest,
-                                    Ptr<pit::Entry> pitEntry)
-{
-  if (m_nacksEnabled)
-    {
-      Ptr<Interest> nack = Create<Interest> (*interest);
-      nack->SetNack (Interest::NACK_GIVEUP_PIT);
-
-      BOOST_FOREACH (const pit::IncomingFace &incoming, pitEntry->GetIncoming ())
-        {
-          NS_LOG_DEBUG ("Send NACK for " << boost::cref (nack->GetName ()) << " to " << boost::cref (*incoming.m_face));
-          incoming.m_face->SendInterest (nack);
-          m_outNacks (nack, incoming.m_face);
-        }
-
-      pitEntry->ClearOutgoing (); // to force erasure of the record
-    }
-
-  super::DidExhaustForwardingOptions (inFace, interest, pitEntry);
-}
-
-void
-Nacks::DidReceiveValidNack (Ptr<Face> inFace,
-                            uint32_t nackCode,
-                            Ptr<const Interest> nack,
-                            Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_DEBUG ("nackCode: " << nackCode << " for [" << nack->GetName () << "]");
-
-  // If NACK is NACK_GIVEUP_PIT, then neighbor gave up trying to and removed it's PIT entry.
-  // So, if we had an incoming entry to this neighbor, then we can remove it now
-  if (nackCode == Interest::NACK_GIVEUP_PIT)
-    {
-      pitEntry->RemoveIncoming (inFace);
-    }
-
-  if (nackCode == Interest::NACK_LOOP ||
-      nackCode == Interest::NACK_CONGESTION ||
-      nackCode == Interest::NACK_GIVEUP_PIT)
-    {
-      pitEntry->SetWaitingInVain (inFace);
-
-      if (!pitEntry->AreAllOutgoingInVain ()) // not all ougtoing are in vain
-        {
-          NS_LOG_DEBUG ("Not all outgoing are in vain");
-          // suppress
-          // Don't do anything, we are still expecting data from some other face
-          m_dropNacks (nack, inFace);
-          return;
-        }
-
-      Ptr<Interest> interest = Create<Interest> (*nack);
-      interest->SetNack (Interest::NORMAL_INTEREST);
-
-      bool propagated = DoPropagateInterest (inFace, interest, pitEntry);
-      if (!propagated)
-        {
-          DidExhaustForwardingOptions (inFace, interest, pitEntry);
-        }
-    }
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/nacks.h b/model/fw/nacks.h
deleted file mode 100644
index f9f8bb1..0000000
--- a/model/fw/nacks.h
+++ /dev/null
@@ -1,88 +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_NACKS_H
-#define NDNSIM_NACKS_H
-
-#include "ns3/ndn-forwarding-strategy.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Implementation of experimental NACK messages (enables with EnableNACKs option)
- */
-class Nacks :
-    public ForwardingStrategy
-{
-private:
-  typedef ForwardingStrategy super;
-  
-public:
-  static TypeId
-  GetTypeId ();
-  
-  // from super
-  virtual void
-  OnInterest (Ptr<Face> face,
-              Ptr<Interest> interest);
-
-protected:
-  // from super
-  virtual void
-  DidReceiveDuplicateInterest (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry);
-
-  // from super
-  virtual void
-  DidExhaustForwardingOptions (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry);
-
-  virtual void
-  OnNack (Ptr<Face> inFace,
-          Ptr<Interest> nack);
-
-  virtual void
-  DidReceiveValidNack (Ptr<Face> inFace,
-                       uint32_t nackCode,
-                       Ptr<const Interest> nack,
-                       Ptr<pit::Entry> pitEntry);
-  
-protected:  
-  bool m_nacksEnabled;
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_outNacks; ///< @brief trace of outgoing NACKs
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_inNacks; ///< @brief trace of incoming NACKs
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_dropNacks; ///< @brief trace of dropped NACKs
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_NACKS
diff --git a/model/fw/ndn-forwarding-strategy.cc b/model/fw/ndn-forwarding-strategy.cc
deleted file mode 100644
index 690e3d2..0000000
--- a/model/fw/ndn-forwarding-strategy.cc
+++ /dev/null
@@ -1,597 +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>
- *          Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ndn-forwarding-strategy.h"
-
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-content-store.h"
-#include "ns3/ndn-face.h"
-
-#include "ns3/assert.h"
-#include "ns3/ptr.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "ns3/boolean.h"
-#include "ns3/string.h"
-
-#include "ns3/ndnSIM/utils/ndn-fw-hop-count-tag.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/tuple/tuple.hpp>
-namespace ll = boost::lambda;
-
-namespace ns3 {
-namespace ndn {
-
-NS_OBJECT_ENSURE_REGISTERED (ForwardingStrategy);
-
-NS_LOG_COMPONENT_DEFINE (ForwardingStrategy::GetLogName ().c_str ());
-
-std::string
-ForwardingStrategy::GetLogName ()
-{
-  return "ndn.fw";
-}
-
-TypeId ForwardingStrategy::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::ForwardingStrategy")
-    .SetGroupName ("Ndn")
-    .SetParent<Object> ()
-
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("OutInterests",  "OutInterests",  MakeTraceSourceAccessor (&ForwardingStrategy::m_outInterests))
-    .AddTraceSource ("InInterests",   "InInterests",   MakeTraceSourceAccessor (&ForwardingStrategy::m_inInterests))
-    .AddTraceSource ("DropInterests", "DropInterests", MakeTraceSourceAccessor (&ForwardingStrategy::m_dropInterests))
-
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("OutData",  "OutData",  MakeTraceSourceAccessor (&ForwardingStrategy::m_outData))
-    .AddTraceSource ("InData",   "InData",   MakeTraceSourceAccessor (&ForwardingStrategy::m_inData))
-    .AddTraceSource ("DropData", "DropData", MakeTraceSourceAccessor (&ForwardingStrategy::m_dropData))
-
-    ////////////////////////////////////////////////////////////////////
-    ////////////////////////////////////////////////////////////////////
-
-    .AddTraceSource ("SatisfiedInterests",  "SatisfiedInterests",  MakeTraceSourceAccessor (&ForwardingStrategy::m_satisfiedInterests))
-    .AddTraceSource ("TimedOutInterests",   "TimedOutInterests",   MakeTraceSourceAccessor (&ForwardingStrategy::m_timedOutInterests))
-
-    .AddAttribute ("CacheUnsolicitedDataFromApps", "Cache unsolicited data that has been pushed from applications",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&ForwardingStrategy::m_cacheUnsolicitedDataFromApps),
-                   MakeBooleanChecker ())
-    
-    .AddAttribute ("CacheUnsolicitedData", "Cache overheard data that have not been requested",
-                   BooleanValue (false),
-                   MakeBooleanAccessor (&ForwardingStrategy::m_cacheUnsolicitedData),
-                   MakeBooleanChecker ())
-
-    .AddAttribute ("DetectRetransmissions", "If non-duplicate interest is received on the same face more than once, "
-                                            "it is considered a retransmission",
-                   BooleanValue (true),
-                   MakeBooleanAccessor (&ForwardingStrategy::m_detectRetransmissions),
-                   MakeBooleanChecker ())
-    ;
-  return tid;
-}
-
-ForwardingStrategy::ForwardingStrategy ()
-{
-}
-
-ForwardingStrategy::~ForwardingStrategy ()
-{
-}
-
-void
-ForwardingStrategy::NotifyNewAggregate ()
-{
-  if (m_pit == 0)
-    {
-      m_pit = GetObject<Pit> ();
-    }
-  if (m_fib == 0)
-    {
-      m_fib = GetObject<Fib> ();
-    }
-  if (m_contentStore == 0)
-    {
-      m_contentStore = GetObject<ContentStore> ();
-    }
-
-  Object::NotifyNewAggregate ();
-}
-
-void
-ForwardingStrategy::DoDispose ()
-{
-  m_pit = 0;
-  m_contentStore = 0;
-  m_fib = 0;
-
-  Object::DoDispose ();
-}
-
-void
-ForwardingStrategy::OnInterest (Ptr<Face> inFace,
-                                Ptr<Interest> interest)
-{
-  NS_LOG_FUNCTION (inFace << interest->GetName ());
-  m_inInterests (interest, inFace);
-
-  Ptr<pit::Entry> pitEntry = m_pit->Lookup (*interest);
-  bool similarInterest = true;
-  if (pitEntry == 0)
-    {
-      similarInterest = false;
-      pitEntry = m_pit->Create (interest);
-      if (pitEntry != 0)
-        {
-          DidCreatePitEntry (inFace, interest, pitEntry);
-        }
-      else
-        {
-          FailedToCreatePitEntry (inFace, interest);
-          return;
-        }
-    }
-
-  bool isDuplicated = true;
-  if (!pitEntry->IsNonceSeen (interest->GetNonce ()))
-    {
-      pitEntry->AddSeenNonce (interest->GetNonce ());
-      isDuplicated = false;
-    }
-
-  if (isDuplicated)
-    {
-      DidReceiveDuplicateInterest (inFace, interest, pitEntry);
-      return;
-    }
-
-  Ptr<Data> contentObject;
-  contentObject = m_contentStore->Lookup (interest);
-  if (contentObject != 0)
-    {
-      FwHopCountTag hopCountTag;
-      if (interest->GetPayload ()->PeekPacketTag (hopCountTag))
-        {
-          contentObject->GetPayload ()->AddPacketTag (hopCountTag);
-        }
-
-      pitEntry->AddIncoming (inFace/*, Seconds (1.0)*/);
-
-      // Do data plane performance measurements
-      WillSatisfyPendingInterest (0, pitEntry);
-
-      // Actually satisfy pending interest
-      SatisfyPendingInterest (0, contentObject, pitEntry);
-      return;
-    }
-
-  if (similarInterest && ShouldSuppressIncomingInterest (inFace, interest, pitEntry))
-    {
-      pitEntry->AddIncoming (inFace/*, interest->GetInterestLifetime ()*/);
-      // update PIT entry lifetime
-      pitEntry->UpdateLifetime (interest->GetInterestLifetime ());
-
-      // Suppress this interest if we're still expecting data from some other face
-      NS_LOG_DEBUG ("Suppress interests");
-      m_dropInterests (interest, inFace);
-
-      DidSuppressSimilarInterest (inFace, interest, pitEntry);
-      return;
-    }
-
-  if (similarInterest)
-    {
-      DidForwardSimilarInterest (inFace, interest, pitEntry);
-    }
-
-  PropagateInterest (inFace, interest, pitEntry);
-}
-
-void
-ForwardingStrategy::OnData (Ptr<Face> inFace,
-                            Ptr<Data> data)
-{
-  NS_LOG_FUNCTION (inFace << data->GetName ());
-  m_inData (data, inFace);
-
-  // Lookup PIT entry
-  Ptr<pit::Entry> pitEntry = m_pit->Lookup (*data);
-  if (pitEntry == 0)
-    {
-      bool cached = false;
-
-      if (m_cacheUnsolicitedData || (m_cacheUnsolicitedDataFromApps && (inFace->GetFlags () & Face::APPLICATION)))
-        {
-          // Optimistically add or update entry in the content store
-          cached = m_contentStore->Add (data);
-        }
-      else
-        {
-          // Drop data packet if PIT entry is not found
-          // (unsolicited data packets should not "poison" content store)
-
-          //drop dulicated or not requested data packet
-          m_dropData (data, inFace);
-        }
-
-      DidReceiveUnsolicitedData (inFace, data, cached);
-      return;
-    }
-  else
-    {
-      bool cached = m_contentStore->Add (data);
-      DidReceiveSolicitedData (inFace, data, cached);
-    }
-
-  while (pitEntry != 0)
-    {
-      // Do data plane performance measurements
-      WillSatisfyPendingInterest (inFace, pitEntry);
-
-      // Actually satisfy pending interest
-      SatisfyPendingInterest (inFace, data, pitEntry);
-
-      // Lookup another PIT entry
-      pitEntry = m_pit->Lookup (*data);
-    }
-}
-
-void
-ForwardingStrategy::DidCreatePitEntry (Ptr<Face> inFace,
-                                       Ptr<const Interest> interest,
-                                       Ptr<pit::Entry> pitEntrypitEntry)
-{
-}
-
-void
-ForwardingStrategy::FailedToCreatePitEntry (Ptr<Face> inFace,
-                                            Ptr<const Interest> interest)
-{
-  m_dropInterests (interest, inFace);
-}
-
-void
-ForwardingStrategy::DidReceiveDuplicateInterest (Ptr<Face> inFace,
-                                                 Ptr<const Interest> interest,
-                                                 Ptr<pit::Entry> pitEntry)
-{
-  /////////////////////////////////////////////////////////////////////////////////////////
-  //                                                                                     //
-  // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
-  //                                                                                     //
-  /////////////////////////////////////////////////////////////////////////////////////////
-  pitEntry->AddIncoming (inFace);
-  m_dropInterests (interest, inFace);
-}
-
-void
-ForwardingStrategy::DidSuppressSimilarInterest (Ptr<Face> face,
-                                                Ptr<const Interest> interest,
-                                                Ptr<pit::Entry> pitEntry)
-{
-}
-
-void
-ForwardingStrategy::DidForwardSimilarInterest (Ptr<Face> inFace,
-                                               Ptr<const Interest> interest,
-                                               Ptr<pit::Entry> pitEntry)
-{
-}
-
-void
-ForwardingStrategy::DidExhaustForwardingOptions (Ptr<Face> inFace,
-                                                 Ptr<const Interest> interest,
-                                                 Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << boost::cref (*inFace));
-  if (pitEntry->AreAllOutgoingInVain ())
-    {
-      m_dropInterests (interest, inFace);
-
-      // All incoming interests cannot be satisfied. Remove them
-      pitEntry->ClearIncoming ();
-
-      // Remove also outgoing
-      pitEntry->ClearOutgoing ();
-
-      // Set pruning timout on PIT entry (instead of deleting the record)
-      m_pit->MarkErased (pitEntry);
-    }
-}
-
-
-
-bool
-ForwardingStrategy::DetectRetransmittedInterest (Ptr<Face> inFace,
-                                                 Ptr<const Interest> interest,
-                                                 Ptr<pit::Entry> pitEntry)
-{
-  pit::Entry::in_iterator existingInFace = pitEntry->GetIncoming ().find (inFace);
-
-  bool isRetransmitted = false;
-
-  if (existingInFace != pitEntry->GetIncoming ().end ())
-    {
-      // this is almost definitely a retransmission. But should we trust the user on that?
-      isRetransmitted = true;
-    }
-
-  return isRetransmitted;
-}
-
-void
-ForwardingStrategy::SatisfyPendingInterest (Ptr<Face> inFace,
-                                            Ptr<const Data> data,
-                                            Ptr<pit::Entry> pitEntry)
-{
-  if (inFace != 0)
-    pitEntry->RemoveIncoming (inFace);
-
-  //satisfy all pending incoming Interests
-  BOOST_FOREACH (const pit::IncomingFace &incoming, pitEntry->GetIncoming ())
-    {
-      bool ok = incoming.m_face->SendData (data);
-
-      DidSendOutData (inFace, incoming.m_face, data, pitEntry);
-      NS_LOG_DEBUG ("Satisfy " << *incoming.m_face);
-
-      if (!ok)
-        {
-          m_dropData (data, incoming.m_face);
-          NS_LOG_DEBUG ("Cannot satisfy data to " << *incoming.m_face);
-        }
-    }
-
-  // All incoming interests are satisfied. Remove them
-  pitEntry->ClearIncoming ();
-
-  // Remove all outgoing faces
-  pitEntry->ClearOutgoing ();
-
-  // Set pruning timout on PIT entry (instead of deleting the record)
-  m_pit->MarkErased (pitEntry);
-}
-
-void
-ForwardingStrategy::DidReceiveSolicitedData (Ptr<Face> inFace,
-                                             Ptr<const Data> data,
-                                             bool didCreateCacheEntry)
-{
-  // do nothing
-}
-
-void
-ForwardingStrategy::DidReceiveUnsolicitedData (Ptr<Face> inFace,
-                                               Ptr<const Data> data,
-                                               bool didCreateCacheEntry)
-{
-  // do nothing
-}
-
-void
-ForwardingStrategy::WillSatisfyPendingInterest (Ptr<Face> inFace,
-                                                Ptr<pit::Entry> pitEntry)
-{
-  pit::Entry::out_iterator out = pitEntry->GetOutgoing ().find (inFace);
-
-  // If we have sent interest for this data via this face, then update stats.
-  if (out != pitEntry->GetOutgoing ().end ())
-    {
-      pitEntry->GetFibEntry ()->UpdateFaceRtt (inFace, Simulator::Now () - out->m_sendTime);
-    }
-
-  m_satisfiedInterests (pitEntry);
-}
-
-bool
-ForwardingStrategy::ShouldSuppressIncomingInterest (Ptr<Face> inFace,
-                                                    Ptr<const Interest> interest,
-                                                    Ptr<pit::Entry> pitEntry)
-{
-  bool isNew = pitEntry->GetIncoming ().size () == 0 && pitEntry->GetOutgoing ().size () == 0;
-
-  if (isNew) return false; // never suppress new interests
-
-  bool isRetransmitted = m_detectRetransmissions && // a small guard
-                         DetectRetransmittedInterest (inFace, interest, pitEntry);
-
-  if (pitEntry->GetOutgoing ().find (inFace) != pitEntry->GetOutgoing ().end ())
-    {
-      NS_LOG_DEBUG ("Non duplicate interests from the face we have sent interest to. Don't suppress");
-      // got a non-duplicate interest from the face we have sent interest to
-      // Probably, there is no point in waiting data from that face... Not sure yet
-
-      // If we're expecting data from the interface we got the interest from ("producer" asks us for "his own" data)
-      // Mark interface YELLOW, but keep a small hope that data will come eventually.
-
-      // ?? not sure if we need to do that ?? ...
-
-      // pitEntry->GetFibEntry ()->UpdateStatus (inFace, fib::FaceMetric::NDN_FIB_YELLOW);
-    }
-  else
-    if (!isNew && !isRetransmitted)
-      {
-        return true;
-      }
-
-  return false;
-}
-
-void
-ForwardingStrategy::PropagateInterest (Ptr<Face> inFace,
-                                       Ptr<const Interest> interest,
-                                       Ptr<pit::Entry> pitEntry)
-{
-  bool isRetransmitted = m_detectRetransmissions && // a small guard
-                         DetectRetransmittedInterest (inFace, interest, pitEntry);
-
-  pitEntry->AddIncoming (inFace/*, interest->GetInterestLifetime ()*/);
-  /// @todo Make lifetime per incoming interface
-  pitEntry->UpdateLifetime (interest->GetInterestLifetime ());
-
-  bool propagated = DoPropagateInterest (inFace, interest, pitEntry);
-
-  if (!propagated && isRetransmitted) //give another chance if retransmitted
-    {
-      // increase max number of allowed retransmissions
-      pitEntry->IncreaseAllowedRetxCount ();
-
-      // try again
-      propagated = DoPropagateInterest (inFace, interest, pitEntry);
-    }
-
-  // if (!propagated)
-  //   {
-  //     NS_LOG_DEBUG ("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
-  //     NS_LOG_DEBUG ("+++ Not propagated ["<< interest->GetName () <<"], but number of outgoing faces: " << pitEntry->GetOutgoing ().size ());
-  //     NS_LOG_DEBUG ("++++++++++++++++++++++++++++++++++++++++++++++++++++++");
-  //   }
-
-  // ForwardingStrategy will try its best to forward packet to at least one interface.
-  // If no interests was propagated, then there is not other option for forwarding or
-  // ForwardingStrategy failed to find it.
-  if (!propagated && pitEntry->AreAllOutgoingInVain ())
-    {
-      DidExhaustForwardingOptions (inFace, interest, pitEntry);
-    }
-}
-
-bool
-ForwardingStrategy::CanSendOutInterest (Ptr<Face> inFace,
-                                        Ptr<Face> outFace,
-                                        Ptr<const Interest> interest,
-                                        Ptr<pit::Entry> pitEntry)
-{
-  if (outFace == inFace)
-    {
-      // NS_LOG_DEBUG ("Same as incoming");
-      return false; // same face as incoming, don't forward
-    }
-
-  pit::Entry::out_iterator outgoing =
-    pitEntry->GetOutgoing ().find (outFace);
-
-  if (outgoing != pitEntry->GetOutgoing ().end ())
-    {
-      if (!m_detectRetransmissions)
-        return false; // suppress
-      else if (outgoing->m_retxCount >= pitEntry->GetMaxRetxCount ())
-        {
-          // NS_LOG_DEBUG ("Already forwarded before during this retransmission cycle (" <<outgoing->m_retxCount << " >= " << pitEntry->GetMaxRetxCount () << ")");
-          return false; // already forwarded before during this retransmission cycle
-        }
-   }
-
-  return true;
-}
-
-
-bool
-ForwardingStrategy::TrySendOutInterest (Ptr<Face> inFace,
-                                        Ptr<Face> outFace,
-                                        Ptr<const Interest> interest,
-                                        Ptr<pit::Entry> pitEntry)
-{
-  if (!CanSendOutInterest (inFace, outFace, interest, pitEntry))
-    {
-      return false;
-    }
-
-  pitEntry->AddOutgoing (outFace);
-
-  //transmission
-  bool successSend = outFace->SendInterest (interest);
-  if (!successSend)
-    {
-      m_dropInterests (interest, outFace);
-    }
-
-  DidSendOutInterest (inFace, outFace, interest, pitEntry);
-
-  return true;
-}
-
-void
-ForwardingStrategy::DidSendOutInterest (Ptr<Face> inFace,
-                                        Ptr<Face> outFace,
-                                        Ptr<const Interest> interest,
-                                        Ptr<pit::Entry> pitEntry)
-{
-  m_outInterests (interest, outFace);
-}
-
-void
-ForwardingStrategy::DidSendOutData (Ptr<Face> inFace,
-                                    Ptr<Face> outFace,
-                                    Ptr<const Data> data,
-                                    Ptr<pit::Entry> pitEntry)
-{
-  m_outData (data, inFace == 0, outFace);
-}
-
-void
-ForwardingStrategy::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
-{
-  m_timedOutInterests (pitEntry);
-}
-
-void
-ForwardingStrategy::AddFace (Ptr<Face> face)
-{
-  // do nothing here
-}
-
-void
-ForwardingStrategy::RemoveFace (Ptr<Face> face)
-{
-  // do nothing here
-}
-
-void
-ForwardingStrategy::DidAddFibEntry (Ptr<fib::Entry> fibEntry)
-{
-  // do nothing here
-}
-
-void
-ForwardingStrategy::WillRemoveFibEntry (Ptr<fib::Entry> fibEntry)
-{
-  // do nothing here
-}
-
-
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/ndn-forwarding-strategy.h b/model/fw/ndn-forwarding-strategy.h
deleted file mode 100644
index 05078d6..0000000
--- a/model/fw/ndn-forwarding-strategy.h
+++ /dev/null
@@ -1,479 +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 NDN_FORWARDING_STRATEGY_H
-#define NDN_FORWARDING_STRATEGY_H
-
-#include "ns3/packet.h"
-#include "ns3/callback.h"
-#include "ns3/object.h"
-#include "ns3/traced-callback.h"
-
-namespace ns3 {
-namespace ndn {
-
-/**
- * @ingroup ndn
- * @defgroup ndn-fw NDN forwarding strategies
- */
-
-
-/**
- * @ingroup ndn-fw
- * @brief Namespace for Forwarding Strategy operations
- */
-namespace fw {
-}
-
-class Face;
-
-class Interest;
-class Data;
-
-class Pit;
-namespace pit { class Entry; }
-class FibFaceMetric;
-class Fib;
-namespace fib { class Entry; }
-class ContentStore;
-
-/**
- * @ingroup ndn-fw
- * @brief Abstract base class for Ndn forwarding strategies
- */
-class ForwardingStrategy :
-    public Object
-{
-public:
-  static TypeId GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string GetLogName ();
-
-  /**
-   * @brief Default constructor
-   */
-  ForwardingStrategy ();
-  virtual ~ForwardingStrategy ();
-
-  /**
-   * \brief Actual processing of incoming Ndn interests. Note, interests do not have payload
-   *
-   * Processing Interest packets
-   * @param face     incoming face
-   * @param interest Interest packet
-   */
-  virtual void
-  OnInterest (Ptr<Face> face,
-              Ptr<Interest> interest);
-
-  /**
-   * \brief Actual processing of incoming Ndn content objects
-   *
-   * Processing Data packets
-   * @param face    incoming face
-   * @param data    Data packet
-   */
-  virtual void
-  OnData (Ptr<Face> face,
-          Ptr<Data> data);
-
-  /**
-   * @brief Event fired just before PIT entry is removed by timeout
-   * @param pitEntry PIT entry to be removed
-   */
-  virtual void
-  WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Event fired every time face is added to NDN stack
-   * @param face face to be removed
-   */
-  virtual void
-  AddFace (Ptr<Face> face);
-
-  /**
-   * @brief Event fired every time face is removed from NDN stack
-   * @param face face to be removed
-   *
-   * For example, when an application terminates, AppFace is removed and this method called by NDN stack.
-   */
-  virtual void
-  RemoveFace (Ptr<Face> face);
-
-  /**
-   * @brief Event fired every time a FIB entry is added to FIB
-   * @param fibEntry FIB entry that was added
-   */
-  virtual void
-  DidAddFibEntry (Ptr<fib::Entry> fibEntry);
-
-  /**
-   * @brief Fired just before FIB entry will be removed from FIB
-   * @param fibEntry FIB entry that will be removed
-   */
-  virtual void
-  WillRemoveFibEntry (Ptr<fib::Entry> fibEntry);
-
-protected:
-  /**
-   * @brief An event that is fired every time a new PIT entry is created
-   *
-   * Note that if NDN node is receiving a similar interest (interest for the same name),
-   * then either DidReceiveDuplicateInterest, DidSuppressSimilarInterest, or DidForwardSimilarInterest
-   * will be called
-   *
-   * Suppression of similar Interests is controlled using ShouldSuppressIncomingInterest virtual method
-   *
-   * @param inFace  incoming face
-   * @param header  deserialized Interest header
-   * @param pitEntry created PIT entry (incoming and outgoing face sets are empty)
-   *
-   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
-   */
-  virtual void
-  DidCreatePitEntry (Ptr<Face> inFace,
-                     Ptr<const Interest> interest,
-                     Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief An event that is fired every time a new PIT entry cannot be created (e.g., PIT container imposes a limit)
-   *
-   * Note that this call can be called only for non-similar Interest (i.e., there is an attempt to create a new PIT entry).
-   * For any non-similar Interests, either FailedToCreatePitEntry or DidCreatePitEntry is called.
-   *
-   * @param inFace   incoming face
-   * @param interest Interest packet
-   */
-  virtual void
-  FailedToCreatePitEntry (Ptr<Face> inFace,
-                          Ptr<const Interest> interest);
-
-  /**
-   * @brief An event that is fired every time a duplicated Interest is received
-   *
-   * This even is the last action that is performed before the Interest processing is halted
-   *
-   * @param inFace  incoming face
-   * @param interest Interest packet
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   *
-   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
-   */
-  virtual void
-  DidReceiveDuplicateInterest (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief An event that is fired every time when a similar Interest is received and suppressed (collapsed)
-   *
-   * This even is the last action that is performed before the Interest processing is halted
-   *
-   * @param inFace  incoming face
-   * @param interest Interest packet
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   *
-   * @see DidReceiveDuplicateInterest, DidForwardSimilarInterest, ShouldSuppressIncomingInterest
-   */
-  virtual void
-  DidSuppressSimilarInterest (Ptr<Face> inFace,
-                              Ptr<const Interest> interest,
-                              Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief An event that is fired every time when a similar Interest is received and further forwarded (not suppressed/collapsed)
-   *
-   * This even is fired just before handling the Interest to PropagateInterest method
-   *
-   * @param inFace  incoming face
-   * @param interest Interest packet
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   *
-   * @see DidReceiveDuplicateInterest, DidSuppressSimilarInterest, ShouldSuppressIncomingInterest
-   */
-  virtual void
-  DidForwardSimilarInterest (Ptr<Face> inFace,
-                             Ptr<const Interest> interest,
-                             Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief An even that is fired when Interest cannot be forwarded
-   *
-   * Note that the event will not fire if  retransmission detection is enabled (by default)
-   * and retransmitted Interest cannot by forwarded.  For more details, refer to the implementation.
-   *
-   * @param inFace  incoming face
-   * @param interest Interest header
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   *
-   * @see DetectRetransmittedInterest
-   */
-  virtual void
-  DidExhaustForwardingOptions (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Method that implements logic to distinguish between new and retransmitted interest
-   *
-   * This method is called only when DetectRetransmissions attribute is set true (by default).
-   *
-   * Currently, the retransmission detection logic relies on the fact that list of incoming faces
-   * already has inFace (i.e., a similar interest is received on the same face more than once).
-   *
-   * @param inFace  incoming face
-   * @param interest Interest header
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   * @return true if Interest should be considered as retransmitted
-   */
-  virtual bool
-  DetectRetransmittedInterest (Ptr<Face> inFace,
-                               Ptr<const Interest> interest,
-                               Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Even fired just before Interest will be satisfied
-   *
-   * Note that when Interest is satisfied from the cache, incoming face will be 0
-   *
-   * @param inFace  incoming face
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   */
-  virtual void
-  WillSatisfyPendingInterest (Ptr<Face> inFace,
-                              Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Actual procedure to satisfy Interest
-   *
-   * Note that when Interest is satisfied from the cache, incoming face will be 0
-   *
-   * @param inFace  incoming face
-   * @param data    Data packet
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   */
-  virtual void
-  SatisfyPendingInterest (Ptr<Face> inFace, // 0 allowed (from cache)
-                          Ptr<const Data> data,
-                          Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Event which is fired just after data was send out on the face
-   *
-   * @param inFace   incoming face of the Data
-   * @param outFace  outgoing face
-   * @param data     Data packet
-   * @param pitEntry an existing PIT entry, corresponding to the duplicated Interest
-   */
-  virtual void
-  DidSendOutData (Ptr<Face> inFace,
-                  Ptr<Face> outFace,
-                  Ptr<const Data> data,
-                  Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Event which is fired every time a requested (solicited) DATA packet (there is an active PIT entry) is received
-   *
-   * @param inFace  incoming face
-   * @param data    Data packet
-   * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
-   */
-  virtual void
-  DidReceiveSolicitedData (Ptr<Face> inFace,
-                           Ptr<const Data> data,
-                           bool didCreateCacheEntry);
-
-  /**
-   * @brief Event which is fired every time an unsolicited DATA packet (no active PIT entry) is received
-   *
-   * The current implementation allows ignoring unsolicited DATA (by default), or cache it by setting
-   * attribute CacheUnsolicitedData true
-   *
-   * @param inFace  incoming face
-   * @param data    Data packet
-   * @param didCreateCacheEntry flag indicating whether a cache entry was added for this data packet or not (e.g., packet already exists in cache)
-   */
-  virtual void
-  DidReceiveUnsolicitedData (Ptr<Face> inFace,
-                             Ptr<const Data> data,
-                             bool didCreateCacheEntry);
-
-  /**
-   * @brief Method implementing logic to suppress (collapse) similar Interests
-   *
-   * In the base class implementation this method checks list of incoming/outgoing faces of the PIT entry
-   * (for new Intersets, both lists are empty before this call)
-   *
-   * For more details, refer to the source code.
-   *
-   * @param inFace  incoming face
-   * @param interest Interest packet
-   * @param payload Data payload
-   */
-  virtual bool
-  ShouldSuppressIncomingInterest (Ptr<Face> inFace,
-                                  Ptr<const Interest> interest,
-                                  Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Method to check whether Interest can be send out on the particular face or not
-   *
-   * In the base class, this method perfoms two checks:
-   * 1. If inFace is equal to outFace (when equal, Interest forwarding is prohibited)
-   * 2. Whether Interest should be suppressed (list of outgoing faces include outFace),
-   * considering (if enabled) retransmission logic
-   *
-   * @param inFace     incoming face of the Interest
-   * @param outFace    proposed outgoing face of the Interest
-   * @param interest   Interest packet
-   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
-   *
-   * @see DetectRetransmittedInterest
-   */
-  virtual bool
-  CanSendOutInterest (Ptr<Face> inFace,
-                      Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Method implementing actual interest forwarding, taking into account CanSendOutInterest decision
-   *
-   * If event returns false, then there is some kind of a problem exists
-   *
-   * @param inFace     incoming face of the Interest
-   * @param outFace    proposed outgoing face of the Interest
-   * @param interest Interest packet
-   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
-   *
-   * @see CanSendOutInterest
-   */
-  virtual bool
-  TrySendOutInterest (Ptr<Face> inFace,
-                      Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Event fired just after forwarding the Interest
-   *
-   * @param inFace     incoming face of the Interest
-   * @param outFace    outgoing face of the Interest
-   * @param interest Interest packet
-   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
-   */
-  virtual void
-  DidSendOutInterest (Ptr<Face> inFace,
-                      Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Wrapper method, which performs general tasks and calls DoPropagateInterest method
-   *
-   * General tasks so far are adding face to the list of incoming face, updating
-   * PIT entry lifetime, calling DoPropagateInterest, and retransmissions (enabled by default).
-   *
-   * @param inFace     incoming face
-   * @param interest   Interest packet
-   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
-   *
-   * @see DoPropagateInterest
-   */
-  virtual void
-  PropagateInterest (Ptr<Face> inFace,
-                     Ptr<const Interest> interest,
-                     Ptr<pit::Entry> pitEntry);
-
-  /**
-   * @brief Virtual method to perform Interest propagation according to the forwarding strategy logic
-   *
-   * In most cases, this is the call that needs to be implemented/re-implemented in order
-   * to perform forwarding of Interests according to the desired logic.
-   *
-   * There is also PropagateInterest method (generally, do not require to be overriden)
-   * which performs general tasks (adding face to the list of incoming face, updating
-   * PIT entry lifetime, calling DoPropagateInterest, as well as perform retransmissions (enabled by default).
-   *
-   * @param inFace     incoming face
-   * @param interest   Interest packet
-   * @param pitEntry   reference to PIT entry (reference to corresponding FIB entry inside)
-   *
-   * @return true if interest was successfully propagated, false if all options have failed
-   *
-   * @see PropagateInterest
-   */
-  virtual bool
-  DoPropagateInterest (Ptr<Face> inFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry) = 0;
-
-protected:
-  // inherited from Object class
-  virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
-  virtual void DoDispose (); ///< @brief Do cleanup
-
-protected:
-  Ptr<Pit> m_pit; ///< \brief Reference to PIT to which this forwarding strategy is associated
-  Ptr<Fib> m_fib; ///< \brief FIB
-  Ptr<ContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
-
-  bool m_cacheUnsolicitedDataFromApps;
-  bool m_cacheUnsolicitedData;
-  bool m_detectRetransmissions;
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_outInterests; ///< @brief Transmitted interests trace
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_inInterests; ///< @brief trace of incoming Interests
-
-  TracedCallback<Ptr<const Interest>,
-                 Ptr<const Face> > m_dropInterests; ///< @brief trace of dropped Interests
-
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-
-  TracedCallback<Ptr<const Data>,
-                 bool /*from cache*/,
-                 Ptr<const Face> > m_outData; ///< @brief trace of outgoing Data
-
-  TracedCallback<Ptr<const Data>,
-                 Ptr<const Face> > m_inData; ///< @brief trace of incoming Data
-
-  TracedCallback<Ptr<const Data>,
-                  Ptr<const Face> > m_dropData;  ///< @brief trace of dropped Data
-
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////
-
-  TracedCallback< Ptr<const pit::Entry> > m_satisfiedInterests;
-  TracedCallback< Ptr<const pit::Entry> > m_timedOutInterests;
-};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif /* NDN_FORWARDING_STRATEGY_H */
diff --git a/model/fw/ndn-fw-tag.h b/model/fw/ndn-fw-tag.h
deleted file mode 100644
index 5d02b31..0000000
--- a/model/fw/ndn-fw-tag.h
+++ /dev/null
@@ -1,43 +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_FW_TAG_H
-#define NDNSIM_FW_TAG_H
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Abstract class for the forwarding strategy tag, which can be added to PIT entries
- */
-class Tag
-{
-public:
-  virtual ~Tag () { };
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_FW_TAG_H
diff --git a/model/fw/per-fib-limits.cc b/model/fw/per-fib-limits.cc
deleted file mode 100644
index 87e99fc..0000000
--- a/model/fw/per-fib-limits.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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 "per-fib-limits.h"
-#include "per-out-face-limits.h"
-
-#include "ns3/ndn-l3-protocol.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-#include "best-route.h"
-#include "flooding.h"
-#include "smart-flooding.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-extern template class PerOutFaceLimits<BestRoute>;
-extern template class PerOutFaceLimits<Flooding>;
-extern template class PerOutFaceLimits<SmartFlooding>;
-
-template class PerFibLimits< PerOutFaceLimits<BestRoute> >;
-typedef PerFibLimits< PerOutFaceLimits<BestRoute> > PerFibLimitsPerOutFaceLimitsBestRoute;
-NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsBestRoute);
-
-template class PerFibLimits< PerOutFaceLimits<Flooding> >;
-typedef PerFibLimits< PerOutFaceLimits<Flooding> > PerFibLimitsPerOutFaceLimitsFlooding;
-NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsFlooding);
-
-template class PerFibLimits< PerOutFaceLimits<SmartFlooding> >;
-typedef PerFibLimits< PerOutFaceLimits<SmartFlooding> > PerFibLimitsPerOutFaceLimitsSmartFlooding;
-NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsSmartFlooding);
-
-#ifdef DOXYGEN
-// /**
-//  * \brief Strategy implementing per-fib-per-out-face limits on top of BestRoute strategy
-//  */
-class BestRoute::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<BestRoute> > { };
-
-/**
- * \brief Strategy implementing per-fib-per-out-face limits on top of Flooding strategy
- */
-class Flooding::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<Flooding> > { };
-
-/**
- * \brief Strategy implementing per-fib-per-out-face limits on top of SmartFlooding strategy
- */
-class SmartFlooding::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<SmartFlooding> > { };
-
-#endif
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/per-fib-limits.h b/model/fw/per-fib-limits.h
deleted file mode 100644
index 89ce352..0000000
--- a/model/fw/per-fib-limits.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- */
-
-
-#ifndef NDNSIM_PER_FIB_LIMITS_H
-#define NDNSIM_PER_FIB_LIMITS_H
-
-#include "ns3/event-id.h"
-#include "ns3/log.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/simulator.h"
-#include "ns3/string.h"
-
-#include "ns3/ndn-forwarding-strategy.h"
-
-#include "ns3/ndn-limits.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Strategy implementing per-FIB entry limits
- */
-template<class Parent>
-class PerFibLimits :
-    public Parent
-{
-private:
-  typedef Parent super;
-
-public:
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string
-  GetLogName ();
-
-  /**
-   * @brief Default constructor
-   */
-  PerFibLimits ()
-  { }
-
-  /// \copydoc ForwardingStrategy::WillEraseTimedOutPendingInterest
-  virtual void
-  WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
-
-  /// \copydoc ForwardingStrategy::AddFace
-  virtual void
-  AddFace (Ptr<Face> face)
-  {
-    super::AddFace (face);
-
-    if (face->GetObject<Limits> () == 0)
-      {
-        NS_FATAL_ERROR ("At least per-face limits should be enabled");
-        exit (1);
-      }
-  }
-
-  /// \copydoc ForwardingStrategy::DidAddFibEntry
-  virtual void
-  DidAddFibEntry (Ptr<fib::Entry> fibEntry)
-  {
-    ObjectFactory factory;
-    factory.SetTypeId (fibEntry->m_faces.begin ()->GetFace ()->GetObject<Limits> ()->GetInstanceTypeId ());
-
-    Ptr<Limits> limits = factory.template Create<Limits> ();
-    fibEntry->AggregateObject (limits);
-
-    super::DidAddFibEntry (fibEntry);
-  }
-
-protected:
-  /// \copydoc ForwardingStrategy::CanSendOutInterest
-  virtual bool
-  CanSendOutInterest (Ptr<Face> inFace,
-                      Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-
-  /// \copydoc ForwardingStrategy::WillSatisfyPendingInterest
-  virtual void
-  WillSatisfyPendingInterest (Ptr<Face> inFace,
-                              Ptr<pit::Entry> pitEntry);
-
-protected:
-  static LogComponent g_log; ///< @brief Logging variable
-
-private:
-  std::string m_limitType;
-};
-
-template<class Parent>
-LogComponent PerFibLimits<Parent>::g_log = LogComponent (PerFibLimits<Parent>::GetLogName ().c_str ());
-
-template<class Parent>
-std::string
-PerFibLimits<Parent>::GetLogName ()
-{
-  return super::GetLogName ()+".PerFibLimits";
-}
-
-template<class Parent>
-TypeId
-PerFibLimits<Parent>::GetTypeId (void)
-{
-  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::PerFibLimits").c_str ())
-    .SetGroupName ("Ndn")
-    .template SetParent <super> ()
-    .template AddConstructor <PerFibLimits> ()
-    ;
-  return tid;
-}
-
-template<class Parent>
-bool
-PerFibLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
-                                          Ptr<Face> outFace,
-                                          Ptr<const Interest> interest,
-                                          Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
-  // no checks for the limit here. the check should be somewhere elese
-
-  if (fibLimits->IsBelowLimit ())
-    {
-      if (super::CanSendOutInterest (inFace, outFace, interest, pitEntry))
-        {
-          fibLimits->BorrowLimit ();
-          return true;
-        }
-    }
-
-  return false;
-}
-
-template<class Parent>
-void
-PerFibLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
-
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      for (uint32_t i = 0; i <= face->m_retxCount; i++)
-        fibLimits->ReturnLimit ();
-    }
-
-  super::WillEraseTimedOutPendingInterest (pitEntry);
-}
-
-
-template<class Parent>
-void
-PerFibLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
-                                                  Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
-
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      for (uint32_t i = 0; i <= face->m_retxCount; i++)
-        fibLimits->ReturnLimit ();
-    }
-
-  super::WillSatisfyPendingInterest (inFace, pitEntry);
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_PER_FIB_LIMITS_H
diff --git a/model/fw/per-out-face-limits.cc b/model/fw/per-out-face-limits.cc
deleted file mode 100644
index d07f79b..0000000
--- a/model/fw/per-out-face-limits.cc
+++ /dev/null
@@ -1,67 +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>
- */
-
-#include "per-out-face-limits.h"
-
-#include "ns3/ndn-l3-protocol.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-#include "best-route.h"
-#include "flooding.h"
-#include "smart-flooding.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-template class PerOutFaceLimits<BestRoute>;
-typedef PerOutFaceLimits<BestRoute> PerOutFaceLimitsBestRoute;
-NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsBestRoute);
-
-template class PerOutFaceLimits<Flooding>;
-typedef PerOutFaceLimits<Flooding> PerOutFaceLimitsFlooding;
-NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsFlooding);
-
-template class PerOutFaceLimits<SmartFlooding>;
-typedef PerOutFaceLimits<SmartFlooding> PerOutFaceLimitsSmartFlooding;
-NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsSmartFlooding);
-
-#ifdef DOXYGEN
-// /**
-//  * \brief Strategy implementing per-out-face limits on top of BestRoute strategy
-//  */
-class BestRoute::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<BestRoute> { };
-
-/**
- * \brief Strategy implementing per-out-face limits on top of Flooding strategy
- */
-class Flooding::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<Flooding> { };
-
-/**
- * \brief Strategy implementing per-out-face limits on top of SmartFlooding strategy
- */
-class SmartFlooding::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<SmartFlooding> { };
-#endif
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
diff --git a/model/fw/per-out-face-limits.h b/model/fw/per-out-face-limits.h
deleted file mode 100644
index 2f8f662..0000000
--- a/model/fw/per-out-face-limits.h
+++ /dev/null
@@ -1,196 +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_PER_OUT_FACE_LIMITS_H
-#define NDNSIM_PER_OUT_FACE_LIMITS_H
-
-#include "ns3/event-id.h"
-#include "ns3/log.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-#include "ns3/simulator.h"
-#include "ns3/string.h"
-
-#include "ns3/ndn-forwarding-strategy.h"
-
-#include "ns3/ndn-limits.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Strategy implementing per-outgoing face limits
- */
-template<class Parent>
-class PerOutFaceLimits :
-    public Parent
-{
-private:
-  typedef Parent super;
-
-public:
-  /**
-   * @brief Get TypeId of the class
-   */
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string
-  GetLogName ();
-  
-  /**
-   * @brief Default constructor
-   */
-  PerOutFaceLimits ()
-  { }
-
-  /// \copydoc ForwardingStrategy::WillEraseTimedOutPendingInterest
-  virtual void
-  WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
-
-  /// \copydoc ForwardingStrategy::AddFace
-  virtual void
-  AddFace (Ptr<Face> face)
-  {
-    ObjectFactory factory (m_limitType);
-    Ptr<Limits> limits = factory.template Create<Limits> ();
-    face->AggregateObject (limits);
-
-    super::AddFace (face);
-  }
-  
-protected:
-  /// \copydoc ForwardingStrategy::CanSendOutInterest
-  virtual bool
-  CanSendOutInterest (Ptr<Face> inFace,
-                      Ptr<Face> outFace,
-                      Ptr<const Interest> interest,
-                      Ptr<pit::Entry> pitEntry);
-  
-  /// \copydoc ForwardingStrategy::WillSatisfyPendingInterest
-  virtual void
-  WillSatisfyPendingInterest (Ptr<Face> inFace,
-                              Ptr<pit::Entry> pitEntry);
-
-protected:
-  static LogComponent g_log; ///< @brief Logging variable
-  
-private:
-  std::string m_limitType;
-};
-
-template<class Parent>
-LogComponent PerOutFaceLimits<Parent>::g_log = LogComponent (PerOutFaceLimits<Parent>::GetLogName ().c_str ());
-
-template<class Parent>
-std::string
-PerOutFaceLimits<Parent>::GetLogName ()
-{
-  return super::GetLogName ()+".PerOutFaceLimits";
-}
-
-template<class Parent>
-TypeId
-PerOutFaceLimits<Parent>::GetTypeId (void)
-{
-  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::PerOutFaceLimits").c_str ())
-    .SetGroupName ("Ndn")
-    .template SetParent <super> ()
-    .template AddConstructor <PerOutFaceLimits> ()
-
-    .AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
-                   StringValue ("ns3::ndn::Limits::Window"),
-                   MakeStringAccessor (&PerOutFaceLimits<Parent>::m_limitType),
-                   MakeStringChecker ())    
-    ;
-  return tid;
-}
-
-template<class Parent>
-bool
-PerOutFaceLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
-                                              Ptr<Face> outFace,
-                                              Ptr<const Interest> interest,
-                                              Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-  
-  Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
-  if (faceLimits->IsBelowLimit ())
-    {
-      if (super::CanSendOutInterest (inFace, outFace, interest, pitEntry))
-        {
-          faceLimits->BorrowLimit ();
-          return true;
-        }
-    }
-  
-  return false;
-}
-
-template<class Parent>
-void
-PerOutFaceLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
-      for (uint32_t i = 0; i <= face->m_retxCount; i++)
-        faceLimits->ReturnLimit ();
-    }
-
-  super::WillEraseTimedOutPendingInterest (pitEntry);
-}
-
-
-template<class Parent>
-void
-PerOutFaceLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
-                                                      Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
-      for (uint32_t i = 0; i <= face->m_retxCount; i++)
-        faceLimits->ReturnLimit ();
-    }
-  
-  super::WillSatisfyPendingInterest (inFace, pitEntry);
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_PER_OUT_FACE_LIMITS_H
diff --git a/model/fw/smart-flooding.cc b/model/fw/smart-flooding.cc
deleted file mode 100644
index 86ec8ee..0000000
--- a/model/fw/smart-flooding.cc
+++ /dev/null
@@ -1,101 +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>
- */
-
-#include "smart-flooding.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-pit-entry.h"
-
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-#include "ns3/boolean.h"
-
-#include <boost/ref.hpp>
-#include <boost/foreach.hpp>
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-namespace ll = boost::lambda;
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-NS_OBJECT_ENSURE_REGISTERED (SmartFlooding);
-
-LogComponent SmartFlooding::g_log = LogComponent (SmartFlooding::GetLogName ().c_str ());
-
-std::string
-SmartFlooding::GetLogName ()
-{
-  return super::GetLogName ()+".SmartFlooding";
-}
-
-TypeId
-SmartFlooding::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::fw::SmartFlooding")
-    .SetGroupName ("Ndn")
-    .SetParent <GreenYellowRed> ()
-    .AddConstructor <SmartFlooding> ()
-    ;
-  return tid;
-}
-
-SmartFlooding::SmartFlooding ()
-{
-}
-
-bool
-SmartFlooding::DoPropagateInterest (Ptr<Face> inFace,
-                                    Ptr<const Interest> interest,
-                                    Ptr<pit::Entry> pitEntry)
-{
-  NS_LOG_FUNCTION (this);
-
-  // Try to work out with just green faces
-  bool greenOk = super::DoPropagateInterest (inFace, interest, pitEntry);
-  if (greenOk)
-    return true;
-
-  int propagatedCount = 0;
-
-  BOOST_FOREACH (const fib::FaceMetric &metricFace, pitEntry->GetFibEntry ()->m_faces.get<fib::i_metric> ())
-    {
-      NS_LOG_DEBUG ("Trying " << boost::cref(metricFace));
-      if (metricFace.GetStatus () == fib::FaceMetric::NDN_FIB_RED) // all non-read faces are in the front of the list
-        break;
-
-      if (!TrySendOutInterest (inFace, metricFace.GetFace (), interest, pitEntry))
-        {
-          continue;
-        }
-
-      propagatedCount++;
-    }
-
-  NS_LOG_INFO ("Propagated to " << propagatedCount << " faces");
-  return propagatedCount > 0;
-}
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/smart-flooding.h b/model/fw/smart-flooding.h
deleted file mode 100644
index b764de8..0000000
--- a/model/fw/smart-flooding.h
+++ /dev/null
@@ -1,70 +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_SMART_FLOODING_H
-#define NDNSIM_SMART_FLOODING_H
-
-#include "green-yellow-red.h"
-#include "ns3/log.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-/**
- * @ingroup ndn-fw
- * @brief Smart flooding forwarding strategy
- */
-class SmartFlooding :
-    public GreenYellowRed
-{
-private:
-  typedef GreenYellowRed super;
-
-public:
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Helper function to retrieve logging name for the forwarding strategy
-   */
-  static std::string
-  GetLogName ();
-
-  /**
-   * @brief Default constructor
-   */
-  SmartFlooding ();
-
-  // inherited
-  virtual bool
-  DoPropagateInterest (Ptr<Face> inFace,
-                       Ptr<const Interest> interest,
-                       Ptr<pit::Entry> pitEntry);
-
-protected:
-  static LogComponent g_log;
-};
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDNSIM_SMART_FLOODING_H
diff --git a/model/ndn-content-object.h b/model/ndn-content-object.h
deleted file mode 100644
index e69de29..0000000
--- a/model/ndn-content-object.h
+++ /dev/null
diff --git a/model/ndn-data.cc b/model/ndn-data.cc
deleted file mode 100644
index c6b9778..0000000
--- a/model/ndn-data.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011-2013 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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-data.h"
-
-#include "ns3/log.h"
-
-#include <boost/foreach.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.Data");
-
-namespace ns3 {
-namespace ndn {
-
-Data::Data (Ptr<Packet> payload/* = Create<Packet> ()*/)
-  : m_name (Create<Name> ())
-  , m_signature (0)
-  , m_payload (payload)
-  , m_keyLocator (0)
-  , m_wire (0)
-{
-  if (m_payload == 0) // just in case
-    {
-      m_payload = Create<Packet> ();
-    }
-}
-
-Data::Data (const Data &other)
-  : m_name (Create<Name> (other.GetName ()))
-  , m_freshness (other.GetFreshness ())
-  , m_timestamp (other.GetTimestamp ())
-  , m_signature (other.GetSignature ())
-  , m_payload (other.GetPayload ()->Copy ())
-  , m_wire (0)
-{
-  if (other.GetKeyLocator ())
-    {
-      m_keyLocator = Create<Name> (*other.GetKeyLocator ());
-    }
-}
-
-void
-Data::SetName (Ptr<Name> name)
-{
-  m_name = name;
-  m_wire = 0;
-}
-
-void
-Data::SetName (const Name &name)
-{
-  m_name = Create<Name> (name);
-  m_wire = 0;
-}
-
-const Name&
-Data::GetName () const
-{
-  if (m_name==0) throw DataException();
-  return *m_name;
-}
-
-Ptr<const Name>
-Data::GetNamePtr () const
-{
-  return m_name;
-}
-
-
-void
-Data::SetTimestamp (const Time &timestamp)
-{
-  m_timestamp = timestamp;
-  m_wire = 0;
-}
-
-Time
-Data::GetTimestamp () const
-{
-  return m_timestamp;
-}
-    
-void
-Data::SetFreshness (const Time &freshness)
-{
-  m_freshness = freshness;
-  m_wire = 0;
-}
-
-
-Time
-Data::GetFreshness () const
-{
-  return m_freshness;
-}
-
-void
-Data::SetSignature (uint32_t signature)
-{
-  m_signature = signature;
-  m_wire = 0;
-}
-
-uint32_t
-Data::GetSignature () const
-{
-  return m_signature;
-}
-
-void
-Data::SetKeyLocator (Ptr<Name> keyLocator)
-{
-  m_keyLocator = keyLocator;
-}
-
-Ptr<const Name>
-Data::GetKeyLocator () const
-{
-  return m_keyLocator;
-}
-
-void
-Data::Print (std::ostream &os) const
-{
-  os << "D: " << GetName ();
-  // os << "<Data><Name>" << GetName () << "</Name><Content>";
-}
-
-void
-Data::SetPayload (Ptr<Packet> payload)
-{
-  m_payload = payload;
-  m_wire = 0;
-}
-
-Ptr<const Packet>
-Data::GetPayload () const
-{
-  return m_payload;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/model/ndn-data.h b/model/ndn-data.h
deleted file mode 100644
index 4d51d37..0000000
--- a/model/ndn-data.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011-2013 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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _NDN_CONTENT_OBJECT_HEADER_H_
-#define _NDN_CONTENT_OBJECT_HEADER_H_
-
-#include "ns3/simple-ref-count.h"
-#include "ns3/nstime.h"
-#include "ns3/packet.h"
-#include "ns3/ptr.h"
-
-#include <ns3/ndn-name.h>
-
-namespace ns3 {
-namespace ndn {
-
-/**
- * @ingroup ndn
- * @brief Data header
- */
-class Data : public SimpleRefCount<Data>
-{
-public:
-  /**
-   * @brief Constructor
-   *
-   * Creates a null header
-   **/
-  Data (Ptr<Packet> payload = Create<Packet> ());
-
-  /**
-   * @brief Copy constructor
-   */
-  Data (const Data &other);
-
-  /**
-   * \brief Set content object name
-   *
-   * Sets name of the content object
-   **/
-  void
-  SetName (Ptr<Name> name);
-
-  /**
-   * @brief Another, less efficient, variant of setting content object name
-   *
-   * Sets name of the content object
-   */
-  void
-  SetName (const Name &name);
-  
-  /**
-   * @brief Get name of the content object
-   */
-  const Name&
-  GetName () const;
-
-  /**
-   * @brief Get smart pointer to the interest name (to avoid extra memory usage)
-   */
-  Ptr<const Name>
-  GetNamePtr () const;
-
-  /**
-   * @brief Set content object timestamp
-   * @param timestamp timestamp
-   */
-  void
-  SetTimestamp (const Time &timestamp);
-
-  /**
-   * @brief Get timestamp of the content object
-   */
-  Time
-  GetTimestamp () const;
-
-  /**
-   * @brief Set freshness of the content object
-   * @param freshness Freshness, 0s means infinity
-   */
-  void
-  SetFreshness (const Time &freshness);
-
-  /**
-   * @brief Get freshness of the content object
-   */
-  Time
-  GetFreshness () const;
-
-  /**
-   * @brief Set "fake" signature on the content object
-   * @param signature  uint32_t number, simulating content object signature
-   *
-   * Values for the signature totally depend on the application
-   */
-  void
-  SetSignature (uint32_t signature);
-
-  /**
-   * @brief Get "fake" signature of the content object
-   *
-   * Values for the signature totally depend on the application
-   */
-  uint32_t
-  GetSignature () const;
-
-  /**
-   * @brief Set key locator
-   * @param keyLocator name of the key
-   */
-  void
-  SetKeyLocator (Ptr<Name> keyLocator);
-
-  /**
-   * @brief Get key locator
-   *
-   * Note that only <KeyName> option for the key locator is supported
-   */
-  Ptr<const Name>
-  GetKeyLocator () const;
-  
-  //////////////////////////////////////////////////////////////////
-  /**
-   * @brief Get payload of data packet
-   *
-   * This payload can also carry packet tags
-   */
-  void
-  SetPayload (Ptr<Packet> payload);
-
-  /**
-   * @brief Set payload of data packet
-   *
-   * This payload can also carry packet tags
-   */
-  Ptr<const Packet>
-  GetPayload () const;
-  
-  /**
-   * @brief Get wire formatted packet
-   *
-   * If wire formatted packet has not been set before, 0 will be returned
-   */
-  inline Ptr<const Packet>
-  GetWire () const;
-
-  /**
-   * @brief Set (cache) wire formatted packet
-   */
-  inline void
-  SetWire (Ptr<const Packet> packet) const;
-
-  /**
-   * @brief Print Interest in plain-text to the specified output stream
-   */
-  void
-  Print (std::ostream &os) const;
-  
-private:
-  // NO_ASSIGN
-  Data &
-  operator = (const Data &other) { return *this; }
-  
-private:
-  Ptr<Name> m_name;
-  Time m_freshness;
-  Time m_timestamp;
-  uint32_t m_signature; // 0, means no signature, any other value application dependent (not a real signature)
-  Ptr<Packet> m_payload;
-  Ptr<Name> m_keyLocator;
-
-  mutable Ptr<const Packet> m_wire;
-};
-
-inline std::ostream &
-operator << (std::ostream &os, const Data &d)
-{
-  d.Print (os);
-  return os;
-}
-
-/**
- * @brief Class for Data parsing exception
- */
-class DataException {};
-
-inline Ptr<const Packet>
-Data::GetWire () const
-{
-  return m_wire;
-}
-
-inline void
-Data::SetWire (Ptr<const Packet> packet) const
-{
-  m_wire = packet;
-}
-
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_CONTENT_OBJECT_HEADER_H_
diff --git a/model/ndn-interest.cc b/model/ndn-interest.cc
deleted file mode 100644
index 3b09fde..0000000
--- a/model/ndn-interest.cc
+++ /dev/null
@@ -1,200 +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>
- */
-
-#include "ndn-interest.h"
-
-#include "ns3/log.h"
-#include "ns3/unused.h"
-#include "ns3/packet.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.Interest");
-
-namespace ns3 {
-namespace ndn {
-
-Interest::Interest (Ptr<Packet> payload/* = Create<Packet> ()*/)
-  : m_name ()
-  , m_scope (0xFF)
-  , m_interestLifetime (Seconds (0))
-  , m_nonce (0)
-  , m_nackType (NORMAL_INTEREST)
-  , m_exclude (0)
-  , m_payload (payload)
-  , m_wire (0)
-{
-  if (m_payload == 0) // just in case
-    {
-      m_payload = Create<Packet> ();
-    }
-}
-
-Interest::Interest (const Interest &interest)
-  : m_name             (Create<Name> (interest.GetName ()))
-  , m_scope            (interest.m_scope)
-  , m_interestLifetime (interest.m_interestLifetime)
-  , m_nonce            (interest.m_nonce)
-  , m_nackType         (interest.m_nackType)
-  , m_exclude          (interest.m_exclude ? Create<Exclude> (*interest.GetExclude ()) : 0)
-  , m_payload          (interest.GetPayload ()->Copy ())
-  , m_wire             (0)
-{
-  NS_LOG_FUNCTION ("correct copy constructor");
-}
-
-void
-Interest::SetName (Ptr<Name> name)
-{
-  m_name = name;
-  m_wire = 0;
-}
-
-void
-Interest::SetName (const Name &name)
-{
-  m_name = Create<Name> (name);
-  m_wire = 0;
-}
-
-const Name&
-Interest::GetName () const
-{
-  if (m_name==0) throw InterestException();
-  return *m_name;
-}
-
-Ptr<const Name>
-Interest::GetNamePtr () const
-{
-  return m_name;
-}
-
-void
-Interest::SetScope (int8_t scope)
-{
-  m_scope = scope;
-  m_wire = 0;
-}
-
-int8_t
-Interest::GetScope () const
-{
-  return m_scope;
-}
-
-void
-Interest::SetInterestLifetime (Time lifetime)
-{
-  m_interestLifetime = lifetime;
-  m_wire = 0;
-}
-
-Time
-Interest::GetInterestLifetime () const
-{
-  return m_interestLifetime;
-}
-
-void
-Interest::SetNonce (uint32_t nonce)
-{
-  m_nonce = nonce;
-  m_wire = 0;
-}
-
-uint32_t
-Interest::GetNonce () const
-{
-  return m_nonce;
-}
-
-void
-Interest::SetNack (uint8_t nackType)
-{
-  m_nackType = nackType;
-  m_wire = 0;
-}
-
-uint8_t
-Interest::GetNack () const
-{
-  return m_nackType;
-}
-
-void
-Interest::SetExclude (Ptr<Exclude> exclude)
-{
-  m_exclude = exclude;
-  m_wire = 0;
-}
-
-Ptr<const Exclude>
-Interest::GetExclude () const
-{
-  return m_exclude;
-}
-
-void
-Interest::SetPayload (Ptr<Packet> payload)
-{
-  m_payload = payload;
-  m_wire = 0;
-}
-
-Ptr<const Packet>
-Interest::GetPayload () const
-{
-  return m_payload;
-}
-
-void
-Interest::Print (std::ostream &os) const
-{
-  os << "I: " << GetName ();
-  
-  return;
-  os << "<Interest>\n  <Name>" << GetName () << "</Name>\n";
-  if (GetNack ()>0)
-    {
-      os << "  <NACK>";
-      switch (GetNack ())
-        {
-        case NACK_LOOP:
-          os << "loop";
-          break;
-        case NACK_CONGESTION:
-          os << "congestion";
-          break;
-        default:
-          os << "unknown";
-          break;
-        }
-      os << "</NACK>\n";
-    }
-  os << "  <Scope>" << GetScope () << "</Scope>\n";
-  if ( !GetInterestLifetime ().IsZero() )
-    os << "  <InterestLifetime>" << GetInterestLifetime () << "</InterestLifetime>\n";
-  if (GetNonce ()>0)
-    os << "  <Nonce>" << GetNonce () << "</Nonce>\n";
-  os << "</Interest>";
-}
-
-} // namespace ndn
-} // namespace ns3
-
diff --git a/model/ndn-interest.h b/model/ndn-interest.h
deleted file mode 100644
index d7ab5df..0000000
--- a/model/ndn-interest.h
+++ /dev/null
@@ -1,276 +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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _NDN_INTEREST_HEADER_H_
-#define _NDN_INTEREST_HEADER_H_
-
-#include "ns3/simple-ref-count.h"
-#include "ns3/nstime.h"
-#include "ns3/packet.h"
-#include "ns3/ptr.h"
-
-#include <ns3/ndnSIM/ndn.cxx/name.h>
-#include <ns3/ndnSIM/ndn.cxx/exclude.h>
-
-namespace ns3 {
-
-class Packet;
-
-namespace ndn {
-
-/**
- * @ingroup ndn
- * @brief NDN Interest (wire formats are defined in wire)
- **/
-class Interest : public SimpleRefCount<Interest>
-{
-public:
-  /**
-   * \brief Constructor
-   *
-   * Creates a null header
-   **/
-  Interest (Ptr<Packet> payload = Create<Packet> ());
-
-  /**
-   * @brief Copy constructor
-   */
-  Interest (const Interest &interest);
-
-  /**
-   * \brief Set interest name
-   *
-   * @param name smart pointer to Name
-   *
-   **/
-  void
-  SetName (Ptr<Name> name);
-
-  /**
-   * \brief Another variant to set interest name
-   *
-   * @param name const reference to Name object
-   *
-   **/
-  void
-  SetName (const Name &name);
-  
-  /**
-   * \brief Get interest name
-   *
-   * Gets name of the interest.
-   **/
-  const Name&
-  GetName () const;
-
-  /**
-   * @brief Get smart pointer to the interest name (to avoid extra memory usage)
-   */
-  Ptr<const Name>
-  GetNamePtr () const;
-
-  /**
-   * \brief Set Scope
-   * Scope limits where the Interest may propagate. 
-   * Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host).
-   * Scope 1 limits propagation to the applications on the originating host. 
-   * Scope 2 limits propagation to no further than the next host. 
-   * Other values are not defined, and will cause the Interest message to be dropped.
-   * Note that this is not a hop count - the value is not decremented as the interest is forwarded.
-   * @param[in] scope interest scope
-   */
-  void
-  SetScope (int8_t scope);
-
-  /**
-   * \brief Get Scope value
-   * Scope limits where the Interest may propagate. 
-   * Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host).
-   * Scope 1 limits propagation to the applications on the originating host. 
-   * Scope 2 limits propagation to no further than the next host. 
-   * Other values are not defined, and will cause the Interest message to be dropped.
-   * Note that this is not a hop count - the value is not decremented as the interest is forwarded.
-   */
-  int8_t
-  GetScope () const;
-
-  /**
-   * \brief Set InterestLifetime
-   * InterestLifetime indicates the (approximate) time remaining before the interest times out.
-   * The timeout is relative to the arrival time of the interest at the current node.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   * @param[in] time interest lifetime  
-   */ 
-  void
-  SetInterestLifetime (Time time);
-
-  /**
-   * \brief Get InterestLifetime value
-   * InterestLifetime indicates the (approximate) time remaining before the interest times out.
-   * The timeout is relative to the arrival time of the interest at the current node.
-   * \see http://www.ndn.org/releases/latest/doc/technical/InterestMessage.html for more information.
-   */ 
-  Time
-  GetInterestLifetime () const;
-
-  /**
-   * \brief Set Nonce
-   * Nonce carries a randomly-genenerated bytestring that is used to detect and discard duplicate Interest messages.
-   * @param[in] nonce Unique packet identification number
-   */
-  void
-  SetNonce (uint32_t nonce);
-
-  /**
-   * \brief Get Nonce value
-   * Nonce carries a randomly-genenerated bytestring that is used to detect and discard duplicate Interest messages.
-   *
-   */
-  uint32_t
-  GetNonce () const;
-  
-  /**
-   * @brief NACK Type
-   * Specifies the type of Interest packet
-   */
-  enum
-    {
-      NORMAL_INTEREST = 0,
-      NACK_LOOP = 10,
-      NACK_CONGESTION = 11,
-      NACK_GIVEUP_PIT = 12,
-    };
-
-  /**
-   * \brief Mark the Interest as a Negative Acknowledgement
-   * Three types of NACKs are supported
-   * 1. NACK_LOOP 
-   * 2. NACK_CONGESTION
-   * 3. NACK_GIVEUP_PIT
-   * @param[in] nackType  NACK_LOOP or NACK_CONGESTION or NACK_GIVEUP_PIT or NORMAL_INTEREST
-   */
-  void
-  SetNack (uint8_t nackType); //using reserved field
-    
-  /**
-  * \brief Get NACK type
-  * Returns NACK_LOOP, NACK_CONGESTION or NACK_GIVEUP_PIT. 
-  * Otherwise, in case of normal interest packet, returns NORMAL_INTEREST (equals 0).
-  */
-  uint8_t
-  GetNack () const;
-
-  /**
-   * @brief Set exclude filter of interest packet
-   *
-   * Empty or 0 means no exclude filter
-   */
-  void
-  SetExclude (Ptr<Exclude> exclude);
-
-  /**
-   * @brief Get exclude filter of interest packet
-   */
-  Ptr<const Exclude>
-  GetExclude () const;
-  
-  /**
-   * @brief Set virtual "payload" of interest packet
-   *
-   * This payload can carry packet tags
-   */
-  void
-  SetPayload (Ptr<Packet> payload);
-
-  /**
-   * @brief Get virtual "payload" to interest packet
-   *
-   * This payload can carry packet tags
-   */
-  Ptr<const Packet>
-  GetPayload () const;
-  
-  /**
-   * @brief Get wire formatted packet
-   *
-   * If wire formatted packet has not been set before, 0 will be returned
-   */
-  inline Ptr<const Packet>
-  GetWire () const;
-
-  /**
-   * @brief Set (cache) wire formatted packet
-   */
-  inline void
-  SetWire (Ptr<const Packet> packet) const;
-
-  /**
-   * @brief Print Interest in plain-text to the specified output stream
-   */
-  void
-  Print (std::ostream &os) const;
-  
-private:
-  // NO_ASSIGN
-  Interest &
-  operator = (const Interest &other) { return *this; }
-  
-private:
-  Ptr<Name> m_name;         ///< @brief Interest name
-  uint8_t m_scope;          ///< @brief 0xFF not set, 0 local scope, 1 this host, 2 immediate neighborhood
-  Time  m_interestLifetime; ///< @brief InterestLifetime
-  uint32_t m_nonce;         ///< @brief Nonce. not used if zero
-  uint8_t  m_nackType;      ///< @brief Negative Acknowledgement type
-
-  Ptr<Exclude> m_exclude;   ///< @brief Exclude filter
-  Ptr<Packet> m_payload;    ///< @brief virtual payload
-
-  mutable Ptr<const Packet> m_wire;
-};
-
-inline std::ostream &
-operator << (std::ostream &os, const Interest &i)
-{
-  i.Print (os);
-  return os;
-}
-
-inline Ptr<const Packet>
-Interest::GetWire () const
-{
-  return m_wire;
-}
-
-inline void
-Interest::SetWire (Ptr<const Packet> packet) const
-{
-  m_wire = packet;
-}
-
-/**
- * @brief Class for Interest parsing exception 
- */
-class InterestException {};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_INTEREST_HEADER_H_
diff --git a/model/ndn-name-components.h b/model/ndn-name-components.h
deleted file mode 100644
index 04915df..0000000
--- a/model/ndn-name-components.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 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 NDN_NAME_COMPONENTS_H
-#define NDN_NAME_COMPONENTS_H
-
-// #warning ndn-name-components.h is now deprecated header. Please include ndn-name.h instead
-
-#include "ndn-name.h"
-
-#endif // NDN_NAME_COMPONENTS_H
diff --git a/model/ndn-name.h b/model/ndn-name.h
deleted file mode 100644
index 797de98..0000000
--- a/model/ndn-name.h
+++ /dev/null
@@ -1,2 +0,0 @@
-// backwards compatibility header
-#include "ns3/ndnSIM/ndn.cxx/name.h"
diff --git a/model/pit/custom-policies/serialized-size-policy.h b/model/pit/custom-policies/serialized-size-policy.h
deleted file mode 100644
index 4c2fc81..0000000
--- a/model/pit/custom-policies/serialized-size-policy.h
+++ /dev/null
@@ -1,197 +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 SERIALIZED_POLICY_H_
-#define SERIALIZED_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/set.hpp>
-
-namespace ns3 {
-namespace ndn {
-namespace ndnSIM {
-
-/**
- * @brief Traits for Least Recently Used replacement policy
- */
-struct serialized_size_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
-  static std::string GetName () { return "SerializedSize"; }
-
-  struct policy_hook_type : public boost::intrusive::set_member_hook<> { uint32_t size; };
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy
-  {
-    static uint32_t& get_size (typename Container::iterator item)
-    {
-      return static_cast<typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->size;
-    }
-
-    static const uint32_t& get_size (typename Container::const_iterator item)
-    {
-      return static_cast<const typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->size;
-    }
-
-    template<class Key>
-    struct MemberHookLess
-    {
-      bool operator () (const Key &a, const Key &b) const
-      {
-        return get_size (&a) < get_size (&b);
-      }
-    };
-
-    typedef typename boost::intrusive::multiset< Container,
-                                                 boost::intrusive::compare< MemberHookLess< Container > >,
-                                                 Hook > policy_container;
-
-    // could be just typedef
-    class type : public policy_container
-    {
-    public:
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : base_ (base)
-        , max_size_ (10000) // size in bytes. Default ~10 kilobytes
-        , current_space_used_ (0)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // in case size got changed
-        current_space_used_ -= get_size (item);
-        policy_container::erase (*item);
-
-        if (item->payload ()->GetInterest ()->GetWire ())
-          {
-            policy::get_size (item) = item->payload ()->GetInterest ()->GetWire ()->GetSize ();
-          }
-        else
-          {
-            policy::get_size (item) = 0;
-          }
-        current_space_used_ += get_size (item); // this operation can violate policy constraint, so in some case
-                                                // it may be necessary to remove some other element
-        policy_container::insert (*item);
-      }
-
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        uint32_t interestSize = 0;
-        if (item->payload ()->GetInterest ()->GetWire ())
-          {
-            interestSize = item->payload ()->GetInterest ()->GetWire ()->GetSize ();
-          }
-
-        // can't use logging here
-        NS_LOG_DEBUG ("Number of entries: " << policy_container::size ()
-                      << ", space used: " << current_space_used_
-                      << ", name: " << item->payload ()->GetPrefix ()
-                      << ", interest size: " << interestSize);
-
-        if (max_size_ != 0 && current_space_used_ + interestSize > max_size_)
-          {
-            NS_LOG_DEBUG ("Rejecting PIT entry");
-
-            // the current version just fails to add an element, but it also possible
-            // to remove the largest element (last element in multi_map policy container)
-            return false;
-          }
-
-        policy::get_size (item) = interestSize;
-        current_space_used_ += interestSize;
-
-        policy_container::insert (*item);
-        return true;
-      }
-
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        NS_LOG_DEBUG ("Erasing entry with name: " << item->payload ()->GetPrefix ());
-
-        current_space_used_ -= policy::get_size (item);
-        policy_container::erase (policy_container::s_iterator_to (*item));
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      set_max_size (size_t max_size)
-      {
-        max_size_ = max_size;
-      }
-
-      inline size_t
-      get_max_size () const
-      {
-        return max_size_;
-      }
-
-      inline uint32_t
-      get_current_space_used () const
-      {
-        return current_space_used_;
-      }
-
-    private:
-      type () : base_(*((Base*)0)) { };
-
-    private:
-      Base &base_;
-      uint32_t max_size_;
-      uint32_t current_space_used_;
-    };
-  };
-};
-
-} // ndnSIM
-} // ndn
-} // ns3
-
-#endif
diff --git a/model/pit/ndn-pit-entry-impl.h b/model/pit/ndn-pit-entry-impl.h
deleted file mode 100644
index f3e8c62..0000000
--- a/model/pit/ndn-pit-entry-impl.h
+++ /dev/null
@@ -1,112 +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 _NDN_PIT_ENTRY_IMPL_H_
-#define	_NDN_PIT_ENTRY_IMPL_H_
-
-namespace ns3 {
-namespace ndn {
-
-class Pit;
-
-namespace pit {
-
-/**
- * @ingroup ndn-pit
- * @brief PIT entry implementation with additional pointers to the underlying container
- */
-template<class Pit>
-class EntryImpl : public Entry
-{
-public:
-  typedef Entry base_type;
-
-  typedef Entry super;
-  #define CONTAINER static_cast<Pit&> (m_container)
-  
-public:
-  EntryImpl (Pit &pit,
-                Ptr<const Interest> header,
-                Ptr<fib::Entry> fibEntry)
-  : Entry (pit, header, fibEntry)
-  , item_ (0)
-  {
-    CONTAINER.i_time.insert (*this);
-    CONTAINER.RescheduleCleaning ();
-  }
-  
-  virtual ~EntryImpl ()
-  {
-    CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
-    
-    CONTAINER.RescheduleCleaning ();
-  }
-
-  virtual void
-  UpdateLifetime (const Time &offsetTime)
-  {
-    CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
-    super::UpdateLifetime (offsetTime);
-    CONTAINER.i_time.insert (*this);
-
-    CONTAINER.RescheduleCleaning ();
-  }
-
-  virtual void
-  OffsetLifetime (const Time &offsetTime)
-  {
-    CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
-    super::OffsetLifetime (offsetTime);
-    CONTAINER.i_time.insert (*this);
-
-    CONTAINER.RescheduleCleaning ();
-  }
-  
-  // to make sure policies work
-  void
-  SetTrie (typename Pit::super::iterator item) { item_ = item; }
-
-  typename Pit::super::iterator to_iterator () { return item_; }
-  typename Pit::super::const_iterator to_iterator () const { return item_; }
-
-public:
-  boost::intrusive::set_member_hook<> time_hook_;
-  
-private:
-  typename Pit::super::iterator item_;
-};
-
-/// @cond include_hidden
-template<class T>
-struct TimestampIndex
-{
-  bool
-  operator () (const T &a, const T &b) const
-  {
-    return a.GetExpireTime () < b.GetExpireTime ();
-  }
-};
-/// @endcond
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
-
-#endif 
diff --git a/model/pit/ndn-pit-entry-incoming-face.cc b/model/pit/ndn-pit-entry-incoming-face.cc
deleted file mode 100644
index 5e3adce..0000000
--- a/model/pit/ndn-pit-entry-incoming-face.cc
+++ /dev/null
@@ -1,55 +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>
- */
-
-#include "ndn-pit-entry-incoming-face.h"
-
-#include "ns3/simulator.h"
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-IncomingFace::IncomingFace (Ptr<Face> face)
-  : m_face (face)
-  , m_arrivalTime (Simulator::Now ())
-  // , m_nonce (nonce)
-{
-}
-
-IncomingFace::IncomingFace ()
-  : m_face (0)
-  , m_arrivalTime (0)
-{
-}
-
-/**
- * @brie Copy operator
- */
-IncomingFace &
-IncomingFace::operator = (const IncomingFace &other)
-{
-  m_face = other.m_face;
-  m_arrivalTime = other.m_arrivalTime;
-  return *this;
-}
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
diff --git a/model/pit/ndn-pit-entry-incoming-face.h b/model/pit/ndn-pit-entry-incoming-face.h
deleted file mode 100644
index 14885c8..0000000
--- a/model/pit/ndn-pit-entry-incoming-face.h
+++ /dev/null
@@ -1,81 +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 _NDN_PIT_ENTRY_INCOMING_FACE_H_
-#define	_NDN_PIT_ENTRY_INCOMING_FACE_H_
-
-#include "ns3/nstime.h"
-#include "ns3/ptr.h"
-
-#include "ns3/ndn-face.h"
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-/**
- * @ingroup ndn-pit
- * @brief PIT state component for each incoming interest (not including duplicates)
- */
-struct IncomingFace
-{
-  Ptr< Face > m_face; ///< \brief face of the incoming Interest
-  Time m_arrivalTime;   ///< \brief arrival time of the incoming Interest
-
-public:
-  /**
-   * \brief Constructor
-   * \param face face of the incoming interest
-   * \param lifetime lifetime of the incoming interest
-   */
-  IncomingFace (Ptr<Face> face);
-
-  /**
-   * @brief Default constructor, necessary for Python bindings, but should not be used anywhere else.
-   */
-  IncomingFace ();
-  /**
-   * @brief Copy operator
-   */
-  IncomingFace &
-  operator = (const IncomingFace &other);
-
-  /**
-   * @brief Compare two PitEntryIncomingFace
-   */
-  bool operator== (const IncomingFace &dst) const { return *m_face==*(dst.m_face); }
-
-  /**
-   * @brief Compare PitEntryIncomingFace with Face
-   */
-  bool operator== (Ptr<Face> face) const { return *m_face==*face; }
-
-  /**
-   * \brief Comparison operator used by boost::multi_index::identity<>
-   */
-  bool
-  operator< (const IncomingFace &m) const { return *m_face < *(m.m_face); } // return identity of the face
-};
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
-
-#endif	/* NDN_PIT_ENTRY_INCOMING_FACE_H */
diff --git a/model/pit/ndn-pit-entry-outgoing-face.cc b/model/pit/ndn-pit-entry-outgoing-face.cc
deleted file mode 100644
index 1ddf1d6..0000000
--- a/model/pit/ndn-pit-entry-outgoing-face.cc
+++ /dev/null
@@ -1,67 +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>
- */
-
-#include "ndn-pit-entry-outgoing-face.h"
-
-#include "ns3/simulator.h"
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-OutgoingFace::OutgoingFace (Ptr<Face> face)
-  : m_face (face)
-  , m_sendTime (Simulator::Now ())
-  , m_retxCount (0)
-  , m_waitingInVain (false)
-{
-}
-
-OutgoingFace::OutgoingFace ()
-  : m_face (0)
-  , m_sendTime (0)
-  , m_retxCount (0)
-  , m_waitingInVain (false)
-{
-}
-
-OutgoingFace &
-OutgoingFace::operator = (const OutgoingFace &other)
-{
-  m_face = other.m_face;
-  m_sendTime = other.m_sendTime;
-  m_retxCount = other.m_retxCount;
-  m_waitingInVain = other.m_waitingInVain;
-
-  return *this;
-}
-
-
-void
-OutgoingFace::UpdateOnRetransmit ()
-{
-  m_sendTime = Simulator::Now ();
-  m_retxCount++;
-  m_waitingInVain = false;
-}
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
diff --git a/model/pit/ndn-pit-entry-outgoing-face.h b/model/pit/ndn-pit-entry-outgoing-face.h
deleted file mode 100644
index 6b498a8..0000000
--- a/model/pit/ndn-pit-entry-outgoing-face.h
+++ /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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _NDN_PIT_ENTRY_OUTGOING_FACE_H_
-#define	_NDN_PIT_ENTRY_OUTGOING_FACE_H_
-
-#include "ns3/nstime.h"
-#include "ns3/ptr.h"
-
-#include "ns3/ndn-face.h"
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-/**
- * @ingroup ndn-pit
- * @brief PIT state component for each outgoing interest
- */
-struct OutgoingFace
-{
-  Ptr<Face> m_face;     ///< \brief face of the outgoing Interest
-  Time m_sendTime;          ///< \brief time when the first outgoing interest is sent (for RTT measurements)
-                            ///< \todo handle problem of retransmitted interests... Probably, we should include something similar
-                            ///<       to TimeStamp TCP option for retransmitted (i.e., only lost interests will suffer)
-  uint32_t m_retxCount;     ///< \brief number of retransmission
-  bool m_waitingInVain;     ///< \brief when flag is set, we do not expect data for this interest, only a small hope that it will happen
-	
-public:
-  /**
-   * @brief Constructor to create PitEntryOutgoingFace
-   * \param face face of the outgoing interest
-   */
-  OutgoingFace (Ptr<Face> face);
-
-  /**
-   * @brief Default constructor, necessary for Python bindings, but should not be used anywhere else.
-   */
-  OutgoingFace ();
-
-  /**
-   * @brief Copy operator
-   */
-  OutgoingFace &
-  operator = (const OutgoingFace &other);
-  
-  /**
-   * @brief Update outgoing entry upon retransmission
-   */
-  void
-  UpdateOnRetransmit ();
-
-  /**
-   * @brief Compare to PitEntryOutgoingFace
-   */
-  bool operator== (const OutgoingFace &dst) { return *m_face==*dst.m_face; }
-
-  /**
-   * @brief Compare PitEntryOutgoingFace with Face
-   */
-  bool operator== (Ptr<Face> face) { return *m_face==*face; }
-
-  /**
-   * \brief Comparison operator used by boost::multi_index::identity<>
-   */
-  bool
-  operator< (const OutgoingFace &m) const { return *m_face < *(m.m_face); } // return identity of the face
-};
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
-
-#endif	/* NDN_PIT_ENTRY_OUTGOING_FACE_H */
diff --git a/model/pit/ndn-pit-entry.cc b/model/pit/ndn-pit-entry.cc
deleted file mode 100644
index 1908dd0..0000000
--- a/model/pit/ndn-pit-entry.cc
+++ /dev/null
@@ -1,318 +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>
- */
-
-#include "ndn-pit-entry.h"
-
-#include "ns3/ndn-pit.h"
-#include "ns3/ndn-fib.h"
-#include "ns3/ndn-name.h"
-#include "ns3/ndn-interest.h"
-
-#include "ns3/packet.h"
-#include "ns3/simulator.h"
-#include "ns3/log.h"
-
-#include <boost/lambda/lambda.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/foreach.hpp>
-namespace ll = boost::lambda;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.pit.Entry");
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-Entry::Entry (Pit &container,
-              Ptr<const Interest> header,
-              Ptr<fib::Entry> fibEntry)
-  : m_container (container)
-  , m_interest (header)
-  , m_fibEntry (fibEntry)
-  , m_maxRetxCount (0)
-{
-  NS_LOG_FUNCTION (this);
-
-  // UpdateLifetime is (and should) be called from the forwarding strategy
-
-  UpdateLifetime ((!header->GetInterestLifetime ().IsZero ()?
-                   header->GetInterestLifetime ():
-                   Seconds (1.0)));
-}
-
-Entry::~Entry ()
-{
-  NS_LOG_FUNCTION (GetPrefix ());
-}
-
-void
-Entry::UpdateLifetime (const Time &offsetTime)
-{
-  NS_LOG_FUNCTION (this);
-
-  Time newExpireTime = Simulator::Now () + (m_container.GetMaxPitEntryLifetime ().IsZero () ?
-                                            offsetTime :
-                                            std::min (m_container.GetMaxPitEntryLifetime (), offsetTime));
-  if (newExpireTime > m_expireTime)
-    m_expireTime = newExpireTime;
-
-  NS_LOG_INFO (this->GetPrefix () << ", Updated lifetime to " << m_expireTime.ToDouble (Time::S) << "s, " << (m_expireTime-Simulator::Now ()).ToDouble (Time::S) << "s left");
-}
-
-void
-Entry::OffsetLifetime (const Time &offsetTime)
-{
-  m_expireTime += offsetTime;
-  if (m_expireTime < Simulator::Now ())
-    {
-      m_expireTime = Simulator::Now ();
-    }
-  NS_LOG_INFO (this->GetPrefix () << ", Offsetting lifetime to " << m_expireTime.ToDouble (Time::S) << "s, " << (m_expireTime-Simulator::Now ()).ToDouble (Time::S) << "s left");
-}
-
-
-const Name &
-Entry::GetPrefix () const
-{
-  return m_interest->GetName ();
-}
-
-const Time &
-Entry::GetExpireTime () const
-{
-  return m_expireTime;
-}
-
-bool
-Entry::IsNonceSeen (uint32_t nonce) const
-{
-  return m_seenNonces.find (nonce) != m_seenNonces.end ();
-}
-
-void
-Entry::AddSeenNonce (uint32_t nonce)
-{
-  m_seenNonces.insert (nonce);
-}
-
-
-Entry::in_iterator
-Entry::AddIncoming (Ptr<Face> face)
-{
-  std::pair<in_iterator,bool> ret =
-    m_incoming.insert (IncomingFace (face));
-
-  // NS_ASSERT_MSG (ret.second, "Something is wrong");
-
-  return ret.first;
-}
-
-void
-Entry::RemoveIncoming (Ptr<Face> face)
-{
-  m_incoming.erase (face);
-}
-
-void
-Entry::ClearIncoming ()
-{
-  m_incoming.clear ();
-}
-
-Entry::out_iterator
-Entry::AddOutgoing (Ptr<Face> face)
-{
-  std::pair<out_iterator,bool> ret =
-    m_outgoing.insert (OutgoingFace (face));
-
-  if (!ret.second)
-    { // outgoing face already exists
-      const_cast<OutgoingFace&>(*ret.first).UpdateOnRetransmit ();
-      // m_outgoing.modify (ret.first,
-      //                    ll::bind (&OutgoingFace::UpdateOnRetransmit, ll::_1));
-    }
-
-  return ret.first;
-}
-
-void
-Entry::ClearOutgoing ()
-{
-  m_outgoing.clear ();
-}
-
-void
-Entry::RemoveAllReferencesToFace (Ptr<Face> face)
-{
-  in_iterator incoming = m_incoming.find (face);
-
-  if (incoming != m_incoming.end ())
-    m_incoming.erase (incoming);
-
-  out_iterator outgoing =
-    m_outgoing.find (face);
-
-  if (outgoing != m_outgoing.end ())
-    m_outgoing.erase (outgoing);
-}
-
-// void
-// Entry::SetWaitingInVain (Entry::out_iterator face)
-// {
-//   NS_LOG_DEBUG (boost::cref (*face->m_face));
-
-//   m_outgoing.modify (face,
-//                      (&ll::_1)->*&EntryOutgoingFace::m_waitingInVain = true);
-// }
-
-void
-Entry::SetWaitingInVain (Ptr<Face> face)
-{
-  // NS_LOG_DEBUG (boost::cref (*face->m_face));
-
-  out_iterator item = m_outgoing.find (face);
-  if (item == m_outgoing.end ())
-    return;
-
-  const_cast<OutgoingFace&>(*item).m_waitingInVain = true;
-  // m_outgoing.modify (item,
-  //                    (&ll::_1)->*&OutgoingFace::m_waitingInVain = true);
-}
-
-
-bool
-Entry::AreAllOutgoingInVain () const
-{
-  NS_LOG_DEBUG (m_outgoing.size ());
-
-  bool inVain = true;
-  std::for_each (m_outgoing.begin (), m_outgoing.end (),
-                 ll::var(inVain) &= (&ll::_1)->*&OutgoingFace::m_waitingInVain);
-
-  NS_LOG_DEBUG ("inVain " << inVain);
-  return inVain;
-}
-
-bool
-Entry::AreTherePromisingOutgoingFacesExcept (Ptr<Face> face) const
-{
-  bool inVain = true;
-  std::for_each (m_outgoing.begin (), m_outgoing.end (),
-                 ll::var(inVain) &=
-                 ((&ll::_1)->*&OutgoingFace::m_face == face ||
-                  (&ll::_1)->*&OutgoingFace::m_waitingInVain));
-
-  return !inVain;
-}
-
-void
-Entry::IncreaseAllowedRetxCount ()
-{
-  if (Simulator::Now () - m_lastRetransmission >= MilliSeconds (100))
-    {
-      // cheat:
-      // don't allow retransmission faster than every 100ms
-      m_maxRetxCount++;
-      m_lastRetransmission = Simulator::Now ();
-    }
-}
-
-Ptr<fib::Entry>
-Entry::GetFibEntry ()
-{
-  return m_fibEntry;
-};
-
-const Entry::in_container &
-Entry::GetIncoming () const
-{
-  return m_incoming;
-}
-
-const Entry::out_container &
-Entry::GetOutgoing () const
-{
-  return m_outgoing;
-}
-
-uint32_t
-Entry::GetOutgoingCount () const
-{
-  return m_outgoing.size ();
-}
-
-
-uint32_t
-Entry::GetMaxRetxCount () const
-{
-  return m_maxRetxCount;
-}
-
-Ptr<const Interest>
-Entry::GetInterest () const
-{
-  return m_interest;
-}
-
-std::ostream& operator<< (std::ostream& os, const Entry &entry)
-{
-  os << "Prefix: " << entry.GetPrefix () << "\n";
-  os << "In: ";
-  bool first = true;
-  BOOST_FOREACH (const IncomingFace &face, entry.m_incoming)
-    {
-      if (!first)
-        os << ",";
-      else
-        first = false;
-
-      os << *face.m_face;
-    }
-
-  os << "\nOut: ";
-  first = true;
-  BOOST_FOREACH (const OutgoingFace &face, entry.m_outgoing)
-    {
-      if (!first)
-        os << ",";
-      else
-        first = false;
-
-      os << *face.m_face;
-    }
-  os << "\nNonces: ";
-  first = true;
-  BOOST_FOREACH (uint32_t nonce, entry.m_seenNonces)
-    {
-      if (!first)
-        os << ",";
-      else
-        first = false;
-
-      os << nonce;
-    }
-
-  return os;
-}
-
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
diff --git a/model/pit/ndn-pit-entry.h b/model/pit/ndn-pit-entry.h
deleted file mode 100644
index dd90b9f..0000000
--- a/model/pit/ndn-pit-entry.h
+++ /dev/null
@@ -1,367 +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 _NDN_PIT_ENTRY_H_
-#define _NDN_PIT_ENTRY_H_
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-
-#include "ns3/ndn-fib.h"
-
-#include "ns3/ndn-pit-entry-incoming-face.h"
-#include "ns3/ndn-pit-entry-outgoing-face.h"
-
-#include <boost/multi_index_container.hpp>
-#include <boost/multi_index/tag.hpp>
-#include <boost/multi_index/ordered_index.hpp>
-// #include <boost/multi_index/composite_key.hpp>
-// #include <boost/multi_index/hashed_index.hpp>
-#include <boost/multi_index/member.hpp>
-// #include <boost/multi_index/mem_fun.hpp>
-#include <set>
-#include <boost/shared_ptr.hpp>
-
-namespace ns3 {
-namespace ndn {
-
-class Pit;
-
-namespace fw { class Tag; }
-
-namespace pit {
-
-/**
- * @ingroup ndn-pit
- * @brief structure for PIT entry
- *
- * All set-methods are virtual, in case index rearrangement is necessary in the derived classes
- */
-class Entry : public SimpleRefCount<Entry>
-{
-public:
-  typedef std::set< IncomingFace > in_container; ///< @brief incoming faces container type
-  typedef in_container::iterator in_iterator;                ///< @brief iterator to incoming faces
-
-  // typedef OutgoingFaceContainer::type out_container; ///< @brief outgoing faces container type
-  typedef std::set< OutgoingFace > out_container; ///< @brief outgoing faces container type
-  typedef out_container::iterator out_iterator;              ///< @brief iterator to outgoing faces
-
-  typedef std::set< uint32_t > nonce_container;  ///< @brief nonce container type
-
-  /**
-   * \brief PIT entry constructor
-   * \param prefix Prefix of the PIT entry
-   * \param offsetTime Relative time to the current moment, representing PIT entry lifetime
-   * \param fibEntry A FIB entry associated with the PIT entry
-   */
-  Entry (Pit &container, Ptr<const Interest> header, Ptr<fib::Entry> fibEntry);
-
-  /**
-   * @brief Virtual destructor
-   */
-  virtual ~Entry ();
-
-  /**
-   * @brief Update lifetime of PIT entry
-   *
-   * @param lifetime desired lifetime of the pit entry (relative to the Simulator::Now ())
-   *
-   * This function will update PIT entry lifetime to the maximum of the current lifetime and
-   * the lifetime Simulator::Now () + lifetime
-   */
-  virtual void
-  UpdateLifetime (const Time &lifetime);
-
-  /**
-   * @brief Offset the currently set PIT lifetime (allowed both negative and positive offsets)
-   *
-   * @param offsetTime positive or negative offset for the PIT lifetime.
-   *
-   * If PIT expire time becomes less than Simulator::Now, then it is adjusted to Simulator::Now.
-   */
-  virtual void
-  OffsetLifetime (const Time &offsetTime);
-
-  /**
-   * @brief Get prefix of the PIT entry
-   */
-  const Name &
-  GetPrefix () const;
-
-  /**
-   * @brief Get current expiration time of the record
-   *
-   * @returns current expiration time of the record
-   */
-  const Time &
-  GetExpireTime () const;
-
-  /**
-   * @brief Check if nonce `nonce` for the same prefix has already been seen
-   *
-   * @param nonce Nonce to check
-   */
-  bool
-  IsNonceSeen (uint32_t nonce) const;
-
-  /**
-   * @brief Add `nonce` to the list of seen nonces
-   *
-   * @param nonce nonce to add to the list of seen nonces
-   *
-   * All nonces are stored for the lifetime of the PIT entry
-   */
-  virtual void
-  AddSeenNonce (uint32_t nonce);
-
-  /**
-   * @brief Add `face` to the list of incoming faces
-   *
-   * @param face Face to add to the list of incoming faces
-   * @returns iterator to the added entry
-   */
-  virtual in_iterator
-  AddIncoming (Ptr<Face> face);
-
-  /**
-   * @brief Remove incoming entry for face `face`
-   */
-  virtual void
-  RemoveIncoming (Ptr<Face> face);
-
-  /**
-   * @brief Clear all incoming faces either after all of them were satisfied or NACKed
-   */
-  virtual void
-  ClearIncoming ();
-
-  /**
-   * @brief Add `face` to the list of outgoing faces
-   *
-   * @param face Face to add to the list of outgoing faces
-   * @returns iterator to the added entry
-   */
-  virtual out_iterator
-  AddOutgoing (Ptr<Face> face);
-
-  /**
-   * @brief Clear all incoming faces either after all of them were satisfied or NACKed
-   */
-  virtual void
-  ClearOutgoing ();
-
-  /**
-   * @brief Remove all references to face.
-   *
-   * This method should be called before face is completely removed from the stack.
-   * Face is removed from the lists of incoming and outgoing faces
-   */
-  virtual void
-  RemoveAllReferencesToFace (Ptr<Face> face);
-
-  /**
-   * @brief Flag outgoing face as hopeless
-   */
-  // virtual void
-  // SetWaitingInVain (out_iterator face);
-  virtual void
-  SetWaitingInVain (Ptr<Face> face);
-
-  /**
-   * @brief Check if all outgoing faces are NACKed
-   */
-  bool
-  AreAllOutgoingInVain () const;
-
-  /**
-   * @brief Similar to AreAllOutgoingInVain, but ignores `face`
-   * \see AreAllOutgoingInVain
-   **/
-  bool
-  AreTherePromisingOutgoingFacesExcept (Ptr<Face> face) const;
-
-  /**
-   * @brief Increase maximum limit of allowed retransmission per outgoing face
-   */
-  virtual void
-  IncreaseAllowedRetxCount ();
-
-  /**
-   * @brief Get maximum allowed number of retransmissions via outgoing faces
-   */
-  uint32_t
-  GetMaxRetxCount () const;
-
-  /**
-   * @brief Get associated FIB entry
-   */
-  Ptr<fib::Entry>
-  GetFibEntry ();
-
-  /**
-   * @brief Get associated list (const reference) of incoming faces
-   */
-  const in_container &
-  GetIncoming () const;
-
-  /**
-   * @brief Get associated list (const reference) of outgoing faces
-   */
-  const out_container &
-  GetOutgoing () const;
-
-  /**
-   * @brief Get number of outgoing faces (needed for python bindings)
-   */
-  uint32_t
-  GetOutgoingCount () const;
-
-  /**
-   * @brief Add new forwarding strategy tag
-   */
-  inline void
-  AddFwTag (boost::shared_ptr< fw::Tag > tag);
-
-  /**
-   * @brief Get forwarding strategy tag (tag is not removed)
-   */
-  template<class T>
-  inline boost::shared_ptr< T >
-  GetFwTag ();
-
-  /**
-   * @brief Remove the forwarding strategy tag
-   */
-  template<class T>
-  inline void
-  RemoveFwTag ();
-
-  /**
-   * @brief Get Interest (if several interests are received, then nonce is from the first Interest)
-   */
-  Ptr<const Interest>
-  GetInterest () const;
-
-private:
-  friend std::ostream& operator<< (std::ostream& os, const Entry &entry);
-
-protected:
-  Pit &m_container; ///< @brief Reference to the container (to rearrange indexes, if necessary)
-
-  Ptr<const Interest> m_interest; ///< \brief Interest of the PIT entry (if several interests are received, then nonce is from the first Interest)
-  Ptr<fib::Entry> m_fibEntry;     ///< \brief FIB entry related to this prefix
-
-  nonce_container m_seenNonces;  ///< \brief map of nonces that were seen for this prefix
-  in_container  m_incoming;      ///< \brief container for incoming interests
-  out_container m_outgoing;      ///< \brief container for outgoing interests
-
-  Time m_expireTime;         ///< \brief Time when PIT entry will be removed
-
-  Time m_lastRetransmission; ///< @brief Last time when number of retransmissions were increased
-  uint32_t m_maxRetxCount;   ///< @brief Maximum allowed number of retransmissions via outgoing faces
-
-  std::list< boost::shared_ptr<fw::Tag> > m_fwTags; ///< @brief Forwarding strategy tags
-};
-
-/// @cond include_hidden
-struct EntryIsNotEmpty
-{
-  bool
-  operator () (Ptr<Entry> entry)
-  {
-    return !entry->GetIncoming ().empty ();
-  }
-};
-/// @endcond
-
-std::ostream& operator<< (std::ostream& os, const Entry &entry);
-
-inline void
-Entry::AddFwTag (boost::shared_ptr< fw::Tag > tag)
-{
-  m_fwTags.push_back (tag);
-}
-
-/**
- * @brief Get and remove forwarding strategy tag
- */
-template<class T>
-inline boost::shared_ptr< T >
-Entry::GetFwTag ()
-{
-  for (std::list< boost::shared_ptr<fw::Tag> >::iterator item = m_fwTags.begin ();
-       item != m_fwTags.end ();
-       item ++)
-    {
-      boost::shared_ptr< T > retPtr = boost::dynamic_pointer_cast<T> (*item);
-      if (retPtr != boost::shared_ptr< T > ())
-        {
-          return retPtr;
-        }
-    }
-
-  return boost::shared_ptr< T > ();
-}
-
-// /**
-//  * @brief Peek the forwarding strategy tag
-//  */
-// template<class T>
-// inline boost::shared_ptr< const T >
-// Entry::PeekFwTag () const
-// {
-//   for (std::list< boost::shared_ptr<fw::Tag> >::const_iterator item = m_fwTags.begin ();
-//        item != m_fwTags.end ();
-//        item ++)
-//     {
-//       boost::shared_ptr< const T > retPtr = boost::dynamic_pointer_cast<const T> (*item);
-//       if (retPtr != 0)
-//         {
-//           return retPtr;
-//         }
-//     }
-
-//   return 0;
-// }
-
-template<class T>
-inline void
-Entry::RemoveFwTag ()
-{
-  for (std::list< boost::shared_ptr<fw::Tag> >::iterator item = m_fwTags.begin ();
-       item != m_fwTags.end ();
-       item ++)
-    {
-      boost::shared_ptr< T > retPtr = boost::dynamic_pointer_cast< T > (*item);
-      if (retPtr != boost::shared_ptr< T > ())
-        {
-          m_fwTags.erase (item);
-          return;
-        }
-    }
-}
-
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
-
-#endif // _NDN_PIT_ENTRY_H_
diff --git a/model/pit/ndn-pit-impl.cc b/model/pit/ndn-pit-impl.cc
deleted file mode 100644
index a0d0c3e..0000000
--- a/model/pit/ndn-pit-impl.cc
+++ /dev/null
@@ -1,133 +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>
- */
-
-#include "ndn-pit-impl.h"
-
-#include "../../utils/trie/empty-policy.h"
-#include "../../utils/trie/persistent-policy.h"
-#include "../../utils/trie/random-policy.h"
-#include "../../utils/trie/lru-policy.h"
-#include "../../utils/trie/multi-policy.h"
-#include "../../utils/trie/aggregate-stats-policy.h"
-
-#include "ns3/log.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.pit.PitImpl");
-
-#include "custom-policies/serialized-size-policy.h"
-
-#include "ns3/string.h"
-#include "ns3/uinteger.h"
-#include "ns3/simulator.h"
-
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
-
-using namespace boost::tuples;
-using namespace boost;
-namespace ll = boost::lambda;
-
-#define NS_OBJECT_ENSURE_REGISTERED_TEMPL(type, templ)  \
-  static struct X ## type ## templ ## RegistrationClass \
-  {                                                     \
-    X ## type ## templ ## RegistrationClass () {        \
-      ns3::TypeId tid = type<templ>::GetTypeId ();      \
-      tid.GetParent ();                                 \
-    }                                                   \
-  } x_ ## type ## templ ## RegistrationVariable
-
-namespace ns3 {
-namespace ndn {
-namespace pit {
-
-using namespace ndnSIM;
-
-template<>
-uint32_t
-PitImpl<serialized_size_policy_traits>::GetCurrentSize () const
-{
-  return super::getPolicy ().get_current_space_used ();
-}
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////
-
-// explicit instantiation and registering
-template class PitImpl<persistent_policy_traits>;
-template class PitImpl<random_policy_traits>;
-template class PitImpl<lru_policy_traits>;
-template class PitImpl<serialized_size_policy_traits>;
-
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, persistent_policy_traits);
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, random_policy_traits);
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, lru_policy_traits);
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, serialized_size_policy_traits);
-
-
-typedef multi_policy_traits< boost::mpl::vector2< persistent_policy_traits,
-                                                  aggregate_stats_policy_traits > > PersistentWithCountsTraits;
-typedef multi_policy_traits< boost::mpl::vector2< random_policy_traits,
-                                                  aggregate_stats_policy_traits > > RandomWithCountsTraits;
-typedef multi_policy_traits< boost::mpl::vector2< lru_policy_traits,
-                                                  aggregate_stats_policy_traits > > LruWithCountsTraits;
-typedef multi_policy_traits< boost::mpl::vector2< serialized_size_policy_traits,
-                                                  aggregate_stats_policy_traits > > SerializedSizeWithCountsTraits;
-
-template class PitImpl<PersistentWithCountsTraits>;
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, PersistentWithCountsTraits);
-
-template class PitImpl<RandomWithCountsTraits>;
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, RandomWithCountsTraits);
-
-template class PitImpl<LruWithCountsTraits>;
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, LruWithCountsTraits);
-
-template class PitImpl<SerializedSizeWithCountsTraits>;
-NS_OBJECT_ENSURE_REGISTERED_TEMPL(PitImpl, SerializedSizeWithCountsTraits);
-
-#ifdef DOXYGEN
-// /**
-//  * \brief PIT in which new entries will be rejected if PIT size reached its limit
-//  */
-class Persistent : public PitImpl<persistent_policy_traits> { };
-
-/**
- * \brief PIT in which PIT reaches its limit, random entry (could be the newly created one) will be removed from PIT
- */
-class Random : public PitImpl<random_policy_traits> { };
-
-/**
- * \brief PIT in which  the least recently used entry (the oldest entry with minimum number of incoming faces)
- * will be removed when PIT size reached its limit
- */
-class Lru : public PitImpl<lru_policy_traits> { };
-
-/**
- * @brief A variant of persistent PIT implementation where size of PIT is based on size of interests in bytes (MaxSize parameter)
- */
-class SerializedSize : public PitImpl<serialized_size_policy_traits> { };
-
-#endif
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
diff --git a/model/pit/ndn-pit-impl.h b/model/pit/ndn-pit-impl.h
deleted file mode 100644
index eece4c4..0000000
--- a/model/pit/ndn-pit-impl.h
+++ /dev/null
@@ -1,466 +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 _NDN_PIT_IMPL_H_
-#define	_NDN_PIT_IMPL_H_
-
-#include "ndn-pit.h"
-
-#include "ns3/log.h"
-#include "ns3/simulator.h"
-
-#include "../../utils/trie/trie-with-policy.h"
-#include "ndn-pit-entry-impl.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include "ns3/ndn-forwarding-strategy.h"
-#include "ns3/ndn-name.h"
-
-
-namespace ns3 {
-namespace ndn {
-
-class ForwardingStrategy;
-
-namespace pit {
-
-/**
- * @ingroup ndn-pit
- * @brief Class implementing Pending Interests Table
- */
-template<class Policy>
-class PitImpl : public Pit
-              , protected ndnSIM::trie_with_policy<Name,
-                                                   ndnSIM::smart_pointer_payload_traits< EntryImpl< PitImpl< Policy > > >,
-                                                   // ndnSIM::persistent_policy_traits
-                                                   Policy
-                                                   >
-{
-public:
-  typedef ndnSIM::trie_with_policy<Name,
-                                   ndnSIM::smart_pointer_payload_traits< EntryImpl< PitImpl< Policy > > >,
-                                   // ndnSIM::persistent_policy_traits
-                                   Policy
-                                   > super;
-  typedef EntryImpl< PitImpl< Policy > > entry;
-
-  /**
-   * \brief Interface ID
-   *
-   * \return interface ID
-   */
-  static TypeId GetTypeId ();
-
-  /**
-   * \brief PIT constructor
-   */
-  PitImpl ();
-
-  /**
-   * \brief Destructor
-   */
-  virtual ~PitImpl ();
-
-  // inherited from Pit
-  virtual Ptr<Entry>
-  Lookup (const Data &header);
-
-  virtual Ptr<Entry>
-  Lookup (const Interest &header);
-
-  virtual Ptr<Entry>
-  Find (const Name &prefix);
-
-  virtual Ptr<Entry>
-  Create (Ptr<const Interest> header);
-
-  virtual void
-  MarkErased (Ptr<Entry> entry);
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual uint32_t
-  GetSize () const;
-
-  virtual Ptr<Entry>
-  Begin ();
-
-  virtual Ptr<Entry>
-  End ();
-
-  virtual Ptr<Entry>
-  Next (Ptr<Entry>);
-
-  const typename super::policy_container &
-  GetPolicy () const { return super::getPolicy (); }
-
-  typename super::policy_container &
-  GetPolicy () { return super::getPolicy (); }
-
-protected:
-  void RescheduleCleaning ();
-  void CleanExpired ();
-
-  // inherited from Object class
-  virtual void NotifyNewAggregate (); ///< @brief Even when object is aggregated to another Object
-  virtual void DoDispose (); ///< @brief Do cleanup
-
-private:
-  uint32_t
-  GetMaxSize () const;
-
-  void
-  SetMaxSize (uint32_t maxSize);
-
-  uint32_t
-  GetCurrentSize () const;
-
-private:
-  EventId m_cleanEvent;
-  Ptr<Fib> m_fib; ///< \brief Link to FIB table
-  Ptr<ForwardingStrategy> m_forwardingStrategy;
-
-  static LogComponent g_log; ///< @brief Logging variable
-
-  // indexes
-  typedef
-  boost::intrusive::multiset<entry,
-                        boost::intrusive::compare < TimestampIndex< entry > >,
-                        boost::intrusive::member_hook< entry,
-                                                       boost::intrusive::set_member_hook<>,
-                                                       &entry::time_hook_>
-                        > time_index;
-  time_index i_time;
-
-  friend class EntryImpl< PitImpl >;
-};
-
-//////////////////////////////////////////
-////////// Implementation ////////////////
-//////////////////////////////////////////
-
-template<class Policy>
-LogComponent PitImpl< Policy >::g_log = LogComponent (("ndn.pit." + Policy::GetName ()).c_str ());
-
-
-template<class Policy>
-TypeId
-PitImpl< Policy >::GetTypeId ()
-{
-  static TypeId tid = TypeId (("ns3::ndn::pit::"+Policy::GetName ()).c_str ())
-    .SetGroupName ("Ndn")
-    .SetParent<Pit> ()
-    .AddConstructor< PitImpl< Policy > > ()
-    .AddAttribute ("MaxSize",
-                   "Set maximum size of PIT in bytes. If 0, limit is not enforced",
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&PitImpl< Policy >::GetMaxSize,
-                                         &PitImpl< Policy >::SetMaxSize),
-                   MakeUintegerChecker<uint32_t> ())
-
-    .AddAttribute ("CurrentSize", "Get current size of PIT in bytes",
-                   TypeId::ATTR_GET,
-                   UintegerValue (0),
-                   MakeUintegerAccessor (&PitImpl< Policy >::GetCurrentSize),
-                   MakeUintegerChecker<uint32_t> ())
-    ;
-
-  return tid;
-}
-
-template<class Policy>
-uint32_t
-PitImpl<Policy>::GetCurrentSize () const
-{
-  return super::getPolicy ().size ();
-}
-
-template<class Policy>
-PitImpl<Policy>::PitImpl ()
-{
-}
-
-template<class Policy>
-PitImpl<Policy>::~PitImpl ()
-{
-}
-
-template<class Policy>
-uint32_t
-PitImpl<Policy>::GetMaxSize () const
-{
-  return super::getPolicy ().get_max_size ();
-}
-
-template<class Policy>
-void
-PitImpl<Policy>::SetMaxSize (uint32_t maxSize)
-{
-  super::getPolicy ().set_max_size (maxSize);
-}
-
-template<class Policy>
-void
-PitImpl<Policy>::NotifyNewAggregate ()
-{
-  if (m_fib == 0)
-    {
-      m_fib = GetObject<Fib> ();
-    }
-  if (m_forwardingStrategy == 0)
-    {
-      m_forwardingStrategy = GetObject<ForwardingStrategy> ();
-    }
-
-  Pit::NotifyNewAggregate ();
-}
-
-template<class Policy>
-void
-PitImpl<Policy>::DoDispose ()
-{
-  super::clear ();
-
-  m_forwardingStrategy = 0;
-  m_fib = 0;
-
-  Pit::DoDispose ();
-}
-
-template<class Policy>
-void
-PitImpl<Policy>::RescheduleCleaning ()
-{
-  // m_cleanEvent.Cancel ();
-  Simulator::Remove (m_cleanEvent); // slower, but better for memory
-  if (i_time.empty ())
-    {
-      // NS_LOG_DEBUG ("No items in PIT");
-      return;
-    }
-
-  Time nextEvent = i_time.begin ()->GetExpireTime () - Simulator::Now ();
-  if (nextEvent <= 0) nextEvent = Seconds (0);
-
-  NS_LOG_DEBUG ("Schedule next cleaning in " <<
-                nextEvent.ToDouble (Time::S) << "s (at " <<
-                i_time.begin ()->GetExpireTime () << "s abs time");
-
-  m_cleanEvent = Simulator::Schedule (nextEvent,
-                                      &PitImpl<Policy>::CleanExpired, this);
-}
-
-template<class Policy>
-void
-PitImpl<Policy>::CleanExpired ()
-{
-  NS_LOG_LOGIC ("Cleaning PIT. Total: " << i_time.size ());
-  Time now = Simulator::Now ();
-
-  // uint32_t count = 0;
-  while (!i_time.empty ())
-    {
-      typename time_index::iterator entry = i_time.begin ();
-      if (entry->GetExpireTime () <= now) // is the record stale?
-        {
-          m_forwardingStrategy->WillEraseTimedOutPendingInterest (entry->to_iterator ()->payload ());
-          super::erase (entry->to_iterator ());
-          // count ++;
-        }
-      else
-        break; // nothing else to do. All later records will not be stale
-    }
-
-  if (super::getPolicy ().size ())
-    {
-      NS_LOG_DEBUG ("Size: " << super::getPolicy ().size ());
-      NS_LOG_DEBUG ("i_time size: " << i_time.size ());
-    }
-  RescheduleCleaning ();
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Lookup (const Data &header)
-{
-  /// @todo use predicate to search with exclude filters
-  typename super::iterator item = super::longest_prefix_match_if (header.GetName (), EntryIsNotEmpty ());
-
-  if (item == super::end ())
-    return 0;
-  else
-    return item->payload (); // which could also be 0
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Lookup (const Interest &header)
-{
-  // NS_LOG_FUNCTION (header.GetName ());
-  NS_ASSERT_MSG (m_fib != 0, "FIB should be set");
-  NS_ASSERT_MSG (m_forwardingStrategy != 0, "Forwarding strategy  should be set");
-
-  typename super::iterator foundItem, lastItem;
-  bool reachLast;
-  boost::tie (foundItem, reachLast, lastItem) = super::getTrie ().find (header.GetName ());
-
-  if (!reachLast || lastItem == super::end ())
-    return 0;
-  else
-    return lastItem->payload (); // which could also be 0
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Find (const Name &prefix)
-{
-  typename super::iterator item = super::find_exact (prefix);
-
-  if (item == super::end ())
-    return 0;
-  else
-    return item->payload ();
-}
-
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Create (Ptr<const Interest> header)
-{
-  NS_LOG_DEBUG (header->GetName ());
-  Ptr<fib::Entry> fibEntry = m_fib->LongestPrefixMatch (*header);
-  if (fibEntry == 0)
-    return 0;
-
-  // NS_ASSERT_MSG (fibEntry != 0,
-  //                "There should be at least default route set" <<
-  //                " Prefix = "<< header->GetName() << ", NodeID == " << m_fib->GetObject<Node>()->GetId() << "\n" << *m_fib);
-
-  Ptr< entry > newEntry = ns3::Create< entry > (boost::ref (*this), header, fibEntry);
-  std::pair< typename super::iterator, bool > result = super::insert (header->GetName (), newEntry);
-  if (result.first != super::end ())
-    {
-      if (result.second)
-        {
-          newEntry->SetTrie (result.first);
-          return newEntry;
-        }
-      else
-        {
-          // should we do anything?
-          // update payload? add new payload?
-          return result.first->payload ();
-        }
-    }
-  else
-    return 0;
-}
-
-
-template<class Policy>
-void
-PitImpl<Policy>::MarkErased (Ptr<Entry> item)
-{
-  if (this->m_PitEntryPruningTimout.IsZero ())
-    {
-      super::erase (StaticCast< entry > (item)->to_iterator ());
-    }
-  else
-    {
-      item->OffsetLifetime (this->m_PitEntryPruningTimout - item->GetExpireTime () + Simulator::Now ());
-    }
-}
-
-
-template<class Policy>
-void
-PitImpl<Policy>::Print (std::ostream& os) const
-{
-  // !!! unordered_set imposes "random" order of item in the same level !!!
-  typename super::parent_trie::const_recursive_iterator item (super::getTrie ()), end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-
-      os << item->payload ()->GetPrefix () << "\t" << *item->payload () << "\n";
-    }
-}
-
-template<class Policy>
-uint32_t
-PitImpl<Policy>::GetSize () const
-{
-  return super::getPolicy ().size ();
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Begin ()
-{
-  typename super::parent_trie::recursive_iterator item (super::getTrie ()), end (0);
-  for (; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::End ()
-{
-  return 0;
-}
-
-template<class Policy>
-Ptr<Entry>
-PitImpl<Policy>::Next (Ptr<Entry> from)
-{
-  if (from == 0) return 0;
-
-  typename super::parent_trie::recursive_iterator
-    item (*StaticCast< entry > (from)->to_iterator ()),
-    end (0);
-
-  for (item++; item != end; item++)
-    {
-      if (item->payload () == 0) continue;
-      break;
-    }
-
-  if (item == end)
-    return End ();
-  else
-    return item->payload ();
-}
-
-
-} // namespace pit
-} // namespace ndn
-} // namespace ns3
-
-#endif	/* NDN_PIT_IMPL_H */
diff --git a/model/pit/ndn-pit.cc b/model/pit/ndn-pit.cc
deleted file mode 100644
index 281a8d0..0000000
--- a/model/pit/ndn-pit.cc
+++ /dev/null
@@ -1,75 +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>
- */
-
-#include "ndn-pit.h"
-
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-#include "ns3/log.h"
-#include "ns3/nstime.h"
-#include "ns3/uinteger.h"
-#include "ns3/simulator.h"
-#include "ns3/packet.h"
-
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.Pit");
-
-namespace ns3 {
-namespace ndn {
-
-NS_OBJECT_ENSURE_REGISTERED (Pit);
-
-TypeId
-Pit::GetTypeId ()
-{
-  static TypeId tid = TypeId ("ns3::ndn::Pit")
-    .SetGroupName ("Ndn")
-    .SetParent<Object> ()
-
-    .AddAttribute ("PitEntryPruningTimout",
-                   "Timeout for PIT entry to live after being satisfied. To make sure recently satisfied interest will not be satisfied again",
-                   TimeValue (), // by default, PIT entries are removed instantly
-                   MakeTimeAccessor (&Pit::m_PitEntryPruningTimout),
-                   MakeTimeChecker ())
-
-    .AddAttribute ("MaxPitEntryLifetime",
-                   "Maximum amount of time for which a router is willing to maintain a PIT entry. "
-                   "Actual PIT lifetime should be minimum of MaxPitEntryLifetime and InterestLifetime specified in the Interest packet",
-                   TimeValue (), // by default, PIT entries are kept for the time, specified by the InterestLifetime
-                   MakeTimeAccessor (&Pit::GetMaxPitEntryLifetime, &Pit::SetMaxPitEntryLifetime),
-                   MakeTimeChecker ())
-    ;
-
-  return tid;
-}
-
-Pit::Pit ()
-{
-}
-
-Pit::~Pit ()
-{
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/model/pit/ndn-pit.h b/model/pit/ndn-pit.h
deleted file mode 100644
index 1185892..0000000
--- a/model/pit/ndn-pit.h
+++ /dev/null
@@ -1,226 +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 _NDN_PIT_H_
-#define	_NDN_PIT_H_
-
-#include "ns3/object.h"
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-
-#include "ndn-pit-entry.h"
-
-namespace ns3 {
-namespace ndn {
-
-/**
- * @ingroup ndn
- * @defgroup ndn-pit PIT
- */
-
-/**
- * @ingroup ndn-pit
- * @brief Namespace for PIT operations
- */
-namespace pit {
-}
-
-class L3Protocol;
-class Face;
-class Data;
-class Interest;
-
-typedef Interest InterestHeader;
-typedef Data DataHeader;
-
-////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////
-
-/**
- * @ingroup ndn-pit
- * @brief Class implementing Pending Interests Table
- */
-class Pit : public Object
-{
-public:
-  /**
-   * \brief Interface ID
-   *
-   * \return interface ID
-   */
-  static TypeId GetTypeId ();
-
-  /**
-   * \brief PIT constructor
-   */
-  Pit ();
-
-  /**
-   * \brief Destructor
-   */
-  virtual ~Pit ();
-
-  /**
-   * \brief Find corresponding PIT entry for the given content name
-   *
-   * Not that this call should be repeated enough times until it return 0.
-   * This way all records with shorter or equal prefix as in content object will be found
-   * and satisfied.
-   *
-   * \param prefix Prefix for which to lookup the entry
-   * \returns smart pointer to PIT entry. If record not found,
-   *          returns 0
-   */
-  virtual Ptr<pit::Entry>
-  Lookup (const Data &header) = 0;
-
-  /**
-   * \brief Find a PIT entry for the given content interest
-   * \param header parsed interest header
-   * \returns iterator to Pit entry. If record not found,
-   *          return end() iterator
-   */
-  virtual Ptr<pit::Entry>
-  Lookup (const Interest &header) = 0;
-
-  /**
-   * @brief Get PIT entry for the prefix (exact match)
-   *
-   * @param prefix Name for PIT entry
-   * @returns If entry is found, a valid iterator (Ptr<pit::Entry>) will be returned. Otherwise End () (==0)
-   */
-  virtual Ptr<pit::Entry>
-  Find (const Name &prefix) = 0;
-
-  /**
-   * @brief Creates a PIT entry for the given interest
-   * @param header parsed interest header
-   * @returns iterator to Pit entry. If record could not be created (e.g., limit reached),
-   *          return end() iterator
-   *
-   * Note. This call assumes that the entry does not exist (i.e., there was a Lookup call before)
-   */
-  virtual Ptr<pit::Entry>
-  Create (Ptr<const Interest> header) = 0;
-
-  /**
-   * @brief Mark PIT entry deleted
-   * @param entry PIT entry
-   *
-   * Effectively, this method removes all incoming/outgoing faces and set
-   * lifetime +m_PitEntryDefaultLifetime from Now ()
-   */
-  virtual void
-  MarkErased (Ptr<pit::Entry> entry) = 0;
-
-  /**
-   * @brief Print out PIT contents for debugging purposes
-   *
-   * Note that there is no definite order in which entries are printed out
-   */
-  virtual void
-  Print (std::ostream &os) const = 0;
-
-  /**
-   * @brief Get number of entries in PIT
-   */
-  virtual uint32_t
-  GetSize () const = 0;
-
-  /**
-   * @brief Return first element of FIB (no order guaranteed)
-   */
-  virtual Ptr<pit::Entry>
-  Begin () = 0;
-
-  /**
-   * @brief Return item next after last (no order guaranteed)
-   */
-  virtual Ptr<pit::Entry>
-  End () = 0;
-
-  /**
-   * @brief Advance the iterator
-   */
-  virtual Ptr<pit::Entry>
-  Next (Ptr<pit::Entry>) = 0;
-
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-  ////////////////////////////////////////////////////////////////////////////
-
-  /**
-   * @brief Static call to cheat python bindings
-   */
-  static inline Ptr<Pit>
-  GetPit (Ptr<Object> node);
-
-  /**
-   * @brief Get maximum PIT entry lifetime
-   */
-  inline const Time&
-  GetMaxPitEntryLifetime () const;
-
-  /**
-   * @brief Set maximum PIT entry lifetime
-   */
-  inline void
-  SetMaxPitEntryLifetime (const Time &maxLifetime);
-
-protected:
-  // configuration variables. Check implementation of GetTypeId for more details
-  Time m_PitEntryPruningTimout;
-
-  Time m_maxPitEntryLifetime;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
-
-inline std::ostream&
-operator<< (std::ostream& os, const Pit &pit)
-{
-  pit.Print (os);
-  return os;
-}
-
-inline Ptr<Pit>
-Pit::GetPit (Ptr<Object> node)
-{
-  return node->GetObject<Pit> ();
-}
-
-inline const Time&
-Pit::GetMaxPitEntryLifetime () const
-{
-  return m_maxPitEntryLifetime;
-}
-
-inline void
-Pit::SetMaxPitEntryLifetime (const Time &maxLifetime)
-{
-  m_maxPitEntryLifetime = maxLifetime;
-}
-
-
-} // namespace ndn
-} // namespace ns3
-
-#endif	/* NDN_PIT_H */
diff --git a/model/wire/ccnb.h b/model/wire/ccnb.h
deleted file mode 100644
index eca8707..0000000
--- a/model/wire/ccnb.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * BSD license, See the doc/LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_WIRE_CCNB_H
-#define NDN_WIRE_CCNB_H
-
-#include "ns3/ndn-common.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-
-/**
- * @brief Namespace for CCNb wire format operations
- */
-namespace ccnb {
-
-/**
-  * @brief Routines to serialize/deserialize NDN interest in ccnb format
-  *
-  * @see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-  **/
-class Interest : public Header
-{
-public:
-  Interest ();
-  Interest (Ptr<ndn::Interest> interest);
-
-  Ptr<ndn::Interest>
-  GetInterest ();
-
-  static Ptr<Packet>
-  ToWire (Ptr<const ndn::Interest> interest);
-
-  static Ptr<ndn::Interest>
-  FromWire (Ptr<Packet> packet);
-  
-  //////////////////////////////////////////////////////////////////
-  // from Header
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-  virtual void Print (std::ostream &os) const;
-  virtual uint32_t GetSerializedSize (void) const;
-  virtual void Serialize (Buffer::Iterator start) const;
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-private:
-  Ptr<ndn::Interest> m_interest;
-};
-
-
-/**
-  * @brief Routines to serialize/deserialize NDN Data packet in ccnb format
-  *
-  * @see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-  **/
-class Data : public Header
-{
-public:
-  Data ();
-  Data (Ptr<ndn::Data> data);
-
-  Ptr<ndn::Data>
-  GetData ();
-
-  static Ptr<Packet>
-  ToWire (Ptr<const ndn::Data> data);
-
-  static Ptr<ndn::Data>
-  FromWire (Ptr<Packet> packet);
-  
-  // from Header
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-  virtual void Print (std::ostream &os) const;
-  virtual uint32_t GetSerializedSize (void) const;
-  virtual void Serialize (Buffer::Iterator start) const;
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-private:
-  Ptr<ndn::Data> m_data;  
-};
-
-} // ccnb
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // NDN_WIRE_CCNB_H
diff --git a/model/wire/ccnb/ccnb-parser/common.h b/model/wire/ccnb/ccnb-parser/common.h
deleted file mode 100644
index 1485b96..0000000
--- a/model/wire/ccnb/ccnb-parser/common.h
+++ /dev/null
@@ -1,179 +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 _CCNB_PARSER_COMMON_H_
-#define _CCNB_PARSER_COMMON_H_
-
-#include "ns3/ndn-common.h"
-
-#ifndef NDN_NAMESPACE_BEGIN
-#error "dafaq"
-#endif
-
-NDN_NAMESPACE_BEGIN;
-
-namespace wire {
-
-namespace CcnbParser {
-
-// forward declarations
-class Block;
-class Blob;
-class Udata;
-class Tag;
-class Attr;
-class Dtag;
-class Dattr;
-class Ext;
-
-
-/**
- * \brief Exception thrown if there is a parsing error
- */
-class CcnbDecodingException {};
-
-/**
- * \brief Type tag for a ccnb start marker.
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/DTAG.html
- */
-enum ccn_tt {
-  CCN_EXT,        /**< starts composite extension - numval is subtype */
-  CCN_TAG,        /**< starts composite - numval is tagnamelen-1 */ 
-  CCN_DTAG,       /**< starts composite - numval is tagdict index (enum ccn_dtag) */
-  CCN_ATTR,       /**< attribute - numval is attrnamelen-1, value follows */
-  CCN_DATTR,      /**< attribute numval is attrdict index */
-  CCN_BLOB,       /**< opaque binary data - numval is byte count */
-  CCN_UDATA,      /**< UTF-8 encoded character data - numval is byte count */
-  CCN_NO_TOKEN    /**< should not occur in encoding */
-};
-
-/** \brief CCN_CLOSE terminates composites */
-enum {CCN_CLOSE = 0};
-
-/**
- * \brief DTAG identifies ccnb-encoded elements.
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/DTAG.html
- */
-enum ccn_dtag {
-  CCN_DTAG_Any = 13,
-  CCN_DTAG_Name = 14,
-  CCN_DTAG_Component = 15,
-  CCN_DTAG_Certificate = 16,
-  CCN_DTAG_Collection = 17,
-  CCN_DTAG_CompleteName = 18,
-  CCN_DTAG_Content = 19,
-  CCN_DTAG_SignedInfo = 20,
-  CCN_DTAG_ContentDigest = 21,
-  CCN_DTAG_ContentHash = 22,
-  CCN_DTAG_Count = 24,
-  CCN_DTAG_Header = 25,
-  CCN_DTAG_Interest = 26,	/* 20090915 */
-  CCN_DTAG_Key = 27,
-  CCN_DTAG_KeyLocator = 28,
-  CCN_DTAG_KeyName = 29,
-  CCN_DTAG_Length = 30,
-  CCN_DTAG_Link = 31,
-  CCN_DTAG_LinkAuthenticator = 32,
-  CCN_DTAG_NameComponentCount = 33,	/* DeprecatedInInterest */
-  CCN_DTAG_RootDigest = 36,
-  CCN_DTAG_Signature = 37,
-  CCN_DTAG_Start = 38,
-  CCN_DTAG_Timestamp = 39,
-  CCN_DTAG_Type = 40,
-  CCN_DTAG_Nonce = 41,
-  CCN_DTAG_Scope = 42,
-  CCN_DTAG_Exclude = 43,
-  CCN_DTAG_Bloom = 44,
-  CCN_DTAG_BloomSeed = 45,
-  CCN_DTAG_AnswerOriginKind = 47,
-  CCN_DTAG_InterestLifetime = 48,
-  CCN_DTAG_Witness = 53,
-  CCN_DTAG_SignatureBits = 54,
-  CCN_DTAG_DigestAlgorithm = 55,
-  CCN_DTAG_BlockSize = 56,
-  CCN_DTAG_FreshnessSeconds = 58,
-  CCN_DTAG_FinalBlockID = 59,
-  CCN_DTAG_PublisherPublicKeyDigest = 60,
-  CCN_DTAG_PublisherCertificateDigest = 61,
-  CCN_DTAG_PublisherIssuerKeyDigest = 62,
-  CCN_DTAG_PublisherIssuerCertificateDigest = 63,
-  CCN_DTAG_Data = 64,	/* 20090915 */
-  CCN_DTAG_WrappedKey = 65,
-  CCN_DTAG_WrappingKeyIdentifier = 66,
-  CCN_DTAG_WrapAlgorithm = 67,
-  CCN_DTAG_KeyAlgorithm = 68,
-  CCN_DTAG_Label = 69,
-  CCN_DTAG_EncryptedKey = 70,
-  CCN_DTAG_EncryptedNonceKey = 71,
-  CCN_DTAG_WrappingKeyName = 72,
-  CCN_DTAG_Action = 73,
-  CCN_DTAG_FaceID = 74,
-  CCN_DTAG_IPProto = 75,
-  CCN_DTAG_Host = 76,
-  CCN_DTAG_Port = 77,
-  CCN_DTAG_MulticastInterface = 78,
-  CCN_DTAG_ForwardingFlags = 79,
-  CCN_DTAG_FaceInstance = 80,
-  CCN_DTAG_ForwardingEntry = 81,
-  CCN_DTAG_MulticastTTL = 82,
-  CCN_DTAG_MinSuffixComponents = 83,
-  CCN_DTAG_MaxSuffixComponents = 84,
-  CCN_DTAG_ChildSelector = 85,
-  CCN_DTAG_RepositoryInfo = 86,
-  CCN_DTAG_Version = 87,
-  CCN_DTAG_RepositoryVersion = 88,
-  CCN_DTAG_GlobalPrefix = 89,
-  CCN_DTAG_LocalName = 90,
-  CCN_DTAG_Policy = 91,
-  CCN_DTAG_Namespace = 92,
-  CCN_DTAG_GlobalPrefixName = 93,
-  CCN_DTAG_PolicyVersion = 94,
-  CCN_DTAG_KeyValueSet = 95,
-  CCN_DTAG_KeyValuePair = 96,
-  CCN_DTAG_IntegerValue = 97,
-  CCN_DTAG_DecimalValue = 98,
-  CCN_DTAG_StringValue = 99,
-  CCN_DTAG_BinaryValue = 100,
-  CCN_DTAG_NameValue = 101,
-  CCN_DTAG_Entry = 102,
-  CCN_DTAG_ACL = 103,
-  CCN_DTAG_ParameterizedName = 104,
-  CCN_DTAG_Prefix = 105,
-  CCN_DTAG_Suffix = 106,
-  CCN_DTAG_Root = 107,
-  CCN_DTAG_ProfileName = 108,
-  CCN_DTAG_Parameters = 109,
-  CCN_DTAG_InfoString = 110,
-  CCN_DTAG_StatusResponse = 112,
-  CCN_DTAG_StatusCode = 113,
-  CCN_DTAG_StatusText = 114,
-  CCN_DTAG_Nack = 200,
-  CCN_DTAG_SequenceNumber = 256,
-  CCN_DTAG_CCNProtocolDataUnit = 17702112
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_COMMON_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc
deleted file mode 100644
index f661186..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/attr.cc
+++ /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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "attr.h"
-#include "../common.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-// length length in octets of UTF-8 encoding of tag name - 1 (minimum tag name length is 1) 
-Attr::Attr (Buffer::Iterator &start, uint32_t length)
-{
-  m_attr.reserve (length+2); // extra byte for potential \0 at the end
-  uint32_t i = 0;
-  for (; !start.IsEnd () && i < (length+1); i++)
-    {
-      m_attr.push_back (start.ReadU8 ());
-    }
-  if (i < (length+1) && start.IsEnd ())
-    throw CcnbDecodingException ();
-  m_value = DynamicCast<Udata> (Block::ParseBlock (start));
-  if (m_value == 0)
-    throw CcnbDecodingException (); // "ATTR must be followed by UDATA field"
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/attr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/attr.h
deleted file mode 100644
index 37882ad..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/attr.h
+++ /dev/null
@@ -1,64 +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 _CCNB_PARSER_ATTR_H_
-#define _CCNB_PARSER_ATTR_H_
-
-#include "base-attr.h"
-#include <string>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent ATTR ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Attr : public BaseAttr
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded ATTR block
-   *
-   * \param start  buffer iterator pointing to the first byte of ATTR block name
-   * \param length length of ATTR name (extracted from the value field)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Attr (Buffer::Iterator &start, uint32_t length);
-  
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  std::string m_attr; ///< field holding name of the attribute
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_ATTR_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.h
deleted file mode 100644
index c2b2627..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/base-attr.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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_BASE_ATTR_H_
-#define _CCNB_PARSER_BASE_ATTR_H_
-
-#include "udata.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Virtual base class providing a common storage for ATTR
- * and DATTR ccnb-encoded blocks
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class BaseAttr : public Block
-{
-public:
-  Ptr<Udata> m_value; ///< \brief Value of the attribute
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_BASE_ATTR_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h
deleted file mode 100644
index 1449d9f..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/base-tag.h
+++ /dev/null
@@ -1,58 +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 _CCNB_PARSER_BASE_TAG_H_
-#define _CCNB_PARSER_BASE_TAG_H_
-
-#include "block.h"
-#include <list>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Virtual base class providing a common storage for TAG
- * and DTAG ccnb-encoded blocks
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class BaseTag : public Block
-{
-public:
-  std::list<Ptr<Block> > m_attrs;      ///< \brief List of attributes, associated with this tag
-  std::list<Ptr<Block> > m_nestedTags; ///< \brief List of nested tags
-  
-protected:
-  /**
-   * \brief Default constructor
-   */
-  BaseTag() { }
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_BASE_TAG_H_
-
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc
deleted file mode 100644
index 6c2ab2e..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/blob.cc
+++ /dev/null
@@ -1,53 +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>
- */
-
-#include "blob.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-Blob::Blob (Buffer::Iterator &start, uint32_t length)
-{
-  m_blobSize = length;
-  m_blob = new char[length];
-  if (m_blob == 0 )
-    throw CcnbDecodingException (); // memory problem
-
-  uint32_t i = 0;
-  for (; !start.IsEnd () && i < length; i++)
-    {
-      m_blob[i] = start.ReadU8 ();
-    }
-  if (i < length && start.IsEnd ())
-    throw CcnbDecodingException ();
-  // Block::counter += length;
-}
-
-Blob::~Blob ()
-{
-  delete [] m_blob;
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/blob.h b/model/wire/ccnb/ccnb-parser/syntax-tree/blob.h
deleted file mode 100644
index 2b480ca..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/blob.h
+++ /dev/null
@@ -1,65 +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 _CCNB_PARSER_BLOB_H_
-#define _CCNB_PARSER_BLOB_H_
-
-#include "block.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent BLOB ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Blob : public Block
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded BLOB block
-   *
-   * \param start  buffer iterator pointing to the first byte of BLOB data in ccnb-encoded block 
-   * \param length length of data in BLOB block (extracted from the value field)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Blob (Buffer::Iterator &start, uint32_t length);
-  ~Blob ();
-  
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  char* m_blob; ///< \brief field holding a parsed BLOB value of the block
-  uint32_t  m_blobSize; ///< @brief field representing size of the BLOB field stored
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_BLOB_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc
deleted file mode 100644
index ac0d285..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/block.cc
+++ /dev/null
@@ -1,106 +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>
- */
-
-#include "block.h"
-
-#include "blob.h"
-#include "udata.h"
-#include "tag.h"
-#include "dtag.h"
-#include "attr.h"
-#include "dattr.h"
-#include "ext.h"
-
-#include "ns3/log.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.CcnbParser.Block");
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/// @cond include_hidden
-const uint8_t CCN_TT_BITS = 3;
-const uint8_t CCN_TT_MASK = ((1 << CCN_TT_BITS) - 1);
-const uint8_t CCN_MAX_TINY= ((1 << (7-CCN_TT_BITS)) - 1);
-const uint8_t CCN_TT_HBIT = ((uint8_t)(1 << 7));
-/// @endcond
-
-// int Block::counter = 0;
-
-Ptr<Block> Block::ParseBlock (Buffer::Iterator &start, bool dontParseBlock)
-{
-  // std::cout << "<< pos: " << counter << "\n";
-  uint32_t value = 0;
-
-  // We will have problems if length field is more than 32 bits. Though it's really impossible
-  uint8_t byte = 0;
-  while (!start.IsEnd() && !(byte & CCN_TT_HBIT))
-    {
-      value <<= 7;
-      value += byte;
-      byte = start.ReadU8 ();
-      // Block::counter ++;
-    }
-  if (start.IsEnd())
-    CcnbDecodingException ();
-
-  if (dontParseBlock)
-    {
-      return 0;
-    }
-  
-  value <<= 4;
-  value += ( (byte&(~CCN_TT_HBIT)) >> 3);
-  
-  /**
-   * Huh. After fighting with NS-3, it became apparent that Create<T>(...) construct
-   * doesn't work with references.  Just simply doesn't work.  wtf?
-   */
-  switch (byte & CCN_TT_MASK)
-    {
-    case CCN_BLOB:
-      return Ptr<Blob> (new Blob(start, value), false);
-    case CCN_UDATA:
-      return Ptr<Udata> (new Udata(start, value), false);
-    case CCN_TAG:
-      return Ptr<Tag> (new Tag(start, value), false);
-    case CCN_ATTR:
-      return Ptr<Attr> (new Attr(start, value), false);
-    case CCN_DTAG:
-      return Ptr<Dtag> (new Dtag(start, value), false);
-    case CCN_DATTR:
-      return Ptr<Dattr> (new Dattr(start, value), false);
-    case CCN_EXT:
-      return Ptr<Ext> (new Ext(start, value), false);
-    default:
-      throw CcnbDecodingException ();
-    }
-}
-
-Block::~Block ()
-{
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/block.h b/model/wire/ccnb/ccnb-parser/syntax-tree/block.h
deleted file mode 100644
index dcaadaf..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/block.h
+++ /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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_BLOCK_H_
-#define _CCNB_PARSER_BLOCK_H_
-
-#include "ns3/simple-ref-count.h"
-#include "ns3/buffer.h"
-#include "ns3/ptr.h"
-
-// visitors
-#include "../visitors/void-no-argu-visitor.h"
-#include "../visitors/void-visitor.h"
-#include "../visitors/no-argu-visitor.h"
-#include "../visitors/visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Base class for ccnb-encoded node
- *
- * This class provides a static method to create a new block
- * (recursively) from the stream
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Block : public SimpleRefCount<Block>
-{
-public:
-  // static int counter;
-  /**
-   * \brief Parsing stream (recursively) and creating a parsed BLOCK
-   * object
-   *
-   * \param start buffer iterator pointing to the start position for parsing
-   * \param dontParseBlock parameter to indicate whether the block should not be parsed, just length
-   *                       of the block should be consumed (e.g., in case of "cheating" with content of Data packets)
-   * \returns parsed ccnb-encoded block, that could contain more block inside
-   */
-  static Ptr<Block>
-  ParseBlock (Buffer::Iterator &start, bool dontParseBlock = false);
-
-  virtual ~Block ();
-  
-  virtual void accept( VoidNoArguVisitor &v )               = 0; ///< @brief Accept visitor void(*)()
-  virtual void accept( VoidVisitor &v, boost::any param )   = 0; ///< @brief Accept visitor void(*)(boost::any)
-  virtual boost::any accept( NoArguVisitor &v )             = 0; ///< @brief Accept visitor boost::any(*)()
-  virtual boost::any accept( Visitor &v, boost::any param ) = 0; ///< @brief Accept visitor boost::any(*)(boost::any)
-};
-
-/**
- * @brief Necessary until Buffer::Iterator gets PeekU8 call
- * @param i buffer iterator
- * @return peeked uint8_t value
- */
-inline
-uint8_t
-BufferIteratorPeekU8 (Buffer::Iterator &i)
-{
-  uint8_t ret = i.ReadU8 ();
-  i.Prev ();
-  return ret;
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_BLOCK_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.cc
deleted file mode 100644
index a37db84..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "dattr.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-// dictionary attributes are not used (yet?) in CCNx 
-Dattr::Dattr (Buffer::Iterator &start, uint32_t dattr)
-{
-  m_dattr = dattr;
-  m_value = DynamicCast<Udata> (Block::ParseBlock (start));
-  if (m_value == 0)
-    throw CcnbDecodingException (); // "ATTR must be followed by UDATA field"
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h b/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h
deleted file mode 100644
index 3728d6e..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/dattr.h
+++ /dev/null
@@ -1,63 +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 _CCNB_PARSER_DATTR_H_
-#define _CCNB_PARSER_DATTR_H_
-
-#include "base-attr.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent DATTR ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Dattr : public BaseAttr
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded DATTR block
-   *
-   * \param start buffer iterator pointing to the first byte of attribute value (UDATA block)
-   * \param dattr dictionary code of DATTR (extracted from the value field)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Dattr (Buffer::Iterator &start, uint32_t dattr);
-
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  uint32_t m_dattr; ///< \brief Dictionary code of DATTR
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_DATTR_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
deleted file mode 100644
index 0bf5296..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.cc
+++ /dev/null
@@ -1,94 +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>
- */
-
-#include "dtag.h"
-
-#include "base-attr.h"
-#include "base-tag.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-Dtag::Dtag (Buffer::Iterator &start, uint32_t dtag)
-{
-  m_dtag = dtag;
-  // std::cout << m_dtag << ", position: " << Block::counter << "\n";  
-  /**
-   * Hack
-   *
-   * Stop processing after encountering "Content" dtag.  Actual
-   * content (including virtual payload) will be stored in Packet
-   * buffer
-   */
-  if (dtag == CCN_DTAG_Content)
-    {
-      Block::ParseBlock (start, true); // process length field and ignore it
-      return; // hack #1. Do not process nesting block for <Content>
-    }
-  
-  // parse attributes until first nested block reached
-  while (!start.IsEnd () && BufferIteratorPeekU8 (start)!=CCN_CLOSE)
-    {
-      Ptr<Block> block = Block::ParseBlock (start);
-      if (DynamicCast<BaseAttr> (block)!=0)
-		m_attrs.push_back (block);
-	  else
-		{
-		  m_nestedTags.push_back (block);
-		  break;
-		}
-	}
-
-  // parse the rest of nested blocks
-  while (!start.IsEnd () && BufferIteratorPeekU8 (start)!=CCN_CLOSE)
-    {
-      // hack #2. Stop processing nested blocks if last block was <Content>
-      if (m_dtag == CCN_DTAG_Data && // we are in <Data>
-          DynamicCast<Dtag> (m_nestedTags.back())!=0 && // last block is DTAG
-          DynamicCast<Dtag> (m_nestedTags.back())->m_dtag == CCN_DTAG_Content) 
-        {
-          return; 
-        }
-
-      m_nestedTags.push_back (Block::ParseBlock (start));
-    }
-
-  // hack #3. Stop processing when last tag was <Data>
-  if (m_dtag == CCN_DTAG_Data && // we are in <Data>
-      DynamicCast<Dtag> (m_nestedTags.back())!=0 && // last block is DTAG
-      DynamicCast<Dtag> (m_nestedTags.back())->m_dtag == CCN_DTAG_Content) 
-    {
-      return; 
-    }
-
-  if (start.IsEnd ())
-      throw CcnbDecodingException ();
-
-  start.ReadU8 (); // read CCN_CLOSE
-  // std::cout << "closer, position = " << Block::counter << "\n";
-  // Block::counter ++;
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h
deleted file mode 100644
index 0d00f50..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/dtag.h
+++ /dev/null
@@ -1,68 +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 _CCNB_PARSER_DTAG_H_
-#define _CCNB_PARSER_DTAG_H_
-
-#include "base-tag.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent DTAG ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Dtag : public BaseTag
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded DTAG block
-   *
-   * \param start buffer iterator pointing to the first nesting block or closing tag
-   * \param dtag  dictionary code of DTAG (extracted from the value field)
-   *
-   * DTAG parsing is slightly hacked to provide memory optimization
-   * for NS-3 simulations.  Parsing will be stopped after encountering
-   * "Content" dtag.  Actual content (including virtual payload) will
-   * be stored in Packet buffer
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Dtag (Buffer::Iterator &start, uint32_t dtag);
-
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  uint32_t m_dtag; ///< \brief Dictionary code for DTAG
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_DTAG_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc
deleted file mode 100644
index 79ac738..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/ext.cc
+++ /dev/null
@@ -1,36 +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>
- */
-
-#include "ext.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-Ext::Ext (Buffer::Iterator &start, uint32_t extSubtype)
-{
-  m_extSubtype = extSubtype;
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/ext.h b/model/wire/ccnb/ccnb-parser/syntax-tree/ext.h
deleted file mode 100644
index 532eb87..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/ext.h
+++ /dev/null
@@ -1,63 +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 _CCNB_PARSER_EXT_H_
-#define _CCNB_PARSER_EXT_H_
-
-#include "block.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent EXT ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Ext : public Block
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded DTAG block
-   *
-   * \param start buffer iterator pointing to the next byte past EXT block
-   * \param extSubtype extension type (extracted from the value field)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Ext (Buffer::Iterator &start, uint32_t extSubtype);
-
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  uint64_t m_extSubtype; ///< \brief Extension type
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_EXT_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc
deleted file mode 100644
index 8cd7fd1..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/tag.cc
+++ /dev/null
@@ -1,70 +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>
- */
-
-#include "tag.h"
-
-#include "base-attr.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-Tag::Tag (Buffer::Iterator &start, uint32_t length)
-{
-  m_tag.reserve (length+2); // extra byte for potential \0 at the end
-  uint32_t i = 0;
-  for (; !start.IsEnd () && i < (length+1); i++)
-    {
-      m_tag.push_back (start.ReadU8 ());
-    }
-  if (i < (length+1) && start.IsEnd ())
-    throw CcnbDecodingException ();
-  
-  // parse attributes until first nested block reached
-  while (!start.IsEnd () && BufferIteratorPeekU8 (start)!=CCN_CLOSE)
-    {
-      Ptr<Block> block = Block::ParseBlock (start);
-      if (DynamicCast<BaseAttr> (block)!=0)
-		m_attrs.push_back (block);
-	  else
-		{
-		  m_nestedTags.push_back (block);
-		  break;
-		}
-	}
-
-  // parse the rest of nested blocks
-  while (!start.IsEnd () && BufferIteratorPeekU8 (start)!=CCN_CLOSE)
-    {
-      Ptr<Block> block = Block::ParseBlock (start);
-	  m_nestedTags.push_back (block);
-    }
-  
-  if (start.IsEnd ()) //should not be the end
-      throw CcnbDecodingException ();
-
-  start.ReadU8 (); // read CCN_CLOSE
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/tag.h b/model/wire/ccnb/ccnb-parser/syntax-tree/tag.h
deleted file mode 100644
index 8949119..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/tag.h
+++ /dev/null
@@ -1,64 +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 _CCNB_PARSER_TAG_H_
-#define _CCNB_PARSER_TAG_H_
-
-#include "base-tag.h"
-#include <string>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent TAG ccnb-encoded node
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- */
-class Tag : public BaseTag
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded TAG block
-   *
-   * \param start  buffer iterator pointing to the first byte of TAG block name
-   * \param length length of TAG name - 1 byte (i.e., minimum tag name is 1 byte)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Tag (Buffer::Iterator &start, uint32_t length);
-
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  std::string m_tag; ///< \brief Name of TAG block
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_TAG_H_
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc
deleted file mode 100644
index 9d3c8df..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/udata.cc
+++ /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>
- */
-
-#include "udata.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-Udata::Udata (Buffer::Iterator &start, uint32_t length)
-{
-  // Ideally, the code should look like this. Unfortunately, we don't have normal compatible iterators
-  // Buffer::Iterator realStart = start;
-  // start.Next (length); // advancing forward
-  // m_udata.assign (realStart, start/*actually, it is the end*/);
-
-  m_udata.reserve (length+1); //just in case we will need \0 at the end later
-  // this is actually the way Read method is implemented in network/src/buffer.cc
-  uint32_t i = 0;
-  for (; !start.IsEnd () && i < length; i++)
-    {
-      m_udata.push_back (start.ReadU8 ());
-    }
-
-  if (i < length && start.IsEnd ())
-    throw CcnbDecodingException ();
-}
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/syntax-tree/udata.h b/model/wire/ccnb/ccnb-parser/syntax-tree/udata.h
deleted file mode 100644
index 463898f..0000000
--- a/model/wire/ccnb/ccnb-parser/syntax-tree/udata.h
+++ /dev/null
@@ -1,62 +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 _CCNB_PARSER_UDATA_H_
-#define _CCNB_PARSER_UDATA_H_
-
-#include "block.h"
-#include <string>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Class to represent UDATA ccnb-encoded node
- */
-class Udata : public Block
-{
-public:
-  /**
-   * \brief Constructor that actually parsed ccnb-encoded UDATA block
-   *
-   * \param start  buffer iterator pointing to the first byte of string in ccnb-encoded block 
-   * \param length length of data in UDATA block (extracted from the value field)
-   *
-   * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
-   */
-  Udata (Buffer::Iterator &start, uint32_t length);
-  
-  virtual void accept( VoidNoArguVisitor &v )               { v.visit( *this ); }
-  virtual void accept( VoidVisitor &v, boost::any param )   { v.visit( *this, param ); }
-  virtual boost::any accept( NoArguVisitor &v )             { return v.visit( *this ); }
-  virtual boost::any accept( Visitor &v, boost::any param ) { return v.visit( *this, param ); }
-
-  std::string m_udata; ///< \brief field holding a parsed UDATA value of the block
-};
-
-} // namespace CcnbParser
-} // namespace wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_UDATA_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc
deleted file mode 100644
index 91112da..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.cc
+++ /dev/null
@@ -1,54 +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>
- */
-
-#include "content-type-visitor.h"
-#include "../syntax-tree/blob.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-ContentTypeVisitor::visit (Blob &n) 
-{
-  // Buffer n.m_blob;
-  if (n.m_blobSize != 3)
-    throw CcnbDecodingException ();
-
-  uint32_t type =
-    (n.m_blob [0] << 16) |
-    (n.m_blob [1] << 8 ) |
-    (n.m_blob [2]      );
-    
-  return boost::any (type);
-}
-
-boost::any
-ContentTypeVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  throw CcnbDecodingException ();
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.h
deleted file mode 100644
index aa9abbf..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/content-type-visitor.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 _CCNB_PARSER_CONTENT_TYPE_VISITOR_H_
-#define _CCNB_PARSER_CONTENT_TYPE_VISITOR_H_
-
-#include "no-argu-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain nonce value from BLOB block
- *
- * Note, only first 32 bits will be actually parsed into nonce. If
- * original Nonce contains more, the rest will be ignored
- *
- * Will return empty boost::any() if called on anything except BLOB block
- */
-class ContentTypeVisitor : public NoArguDepthFirstVisitor
-{
-public:
-  virtual boost::any visit (Blob &n); 
-  virtual boost::any visit (Udata &n); ///< Throws parsing error if BLOB object is encountered
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_CONTENT_TYPE_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc
deleted file mode 100644
index b82b140..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.cc
+++ /dev/null
@@ -1,112 +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>
- */
-
-#include "depth-first-visitor.h"
-
-#include "../syntax-tree/blob.h"
-#include "../syntax-tree/udata.h"
-#include "../syntax-tree/tag.h"
-#include "../syntax-tree/dtag.h"
-#include "../syntax-tree/attr.h"
-#include "../syntax-tree/dattr.h"
-#include "../syntax-tree/ext.h"
-
-#include <boost/foreach.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-DepthFirstVisitor::visit (Blob &n, boost::any param)
-{
-  // Buffer n.m_blob;
-  return n.m_blob;
-}
- 
-boost::any
-DepthFirstVisitor::visit (Udata &n, boost::any param)
-{
-  // std::string n.m_udata;
-  return n.m_udata;
-}
- 
-boost::any
-DepthFirstVisitor::visit (Tag &n, boost::any param)
-{
-  // std::string n.m_tag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this, param);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this, param);
-    }
-  return boost::any();
-}
-
-boost::any
-DepthFirstVisitor::visit (Dtag &n, boost::any param)
-{
-  // std::string n.m_tag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this, param);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this, param);
-    }
-  return boost::any ();
-}
-
-boost::any
-DepthFirstVisitor::visit (Attr &n, boost::any param)
-{
-  // std::string n.m_attr;
-  // Ptr<Udata> n.m_value;
-  return boost::any ();
-}
-
-boost::any
-DepthFirstVisitor::visit (Dattr &n, boost::any param)
-{
-  // uint32_t n.m_dattr;
-  // Ptr<Udata> n.m_value;
-  return boost::any ();
-}
- 
-boost::any
-DepthFirstVisitor::visit (Ext &n, boost::any param)
-{
-  // uint64_t n.m_extSubtype;
-  return n.m_extSubtype;
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.h
deleted file mode 100644
index be701b1..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/depth-first-visitor.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 _CCNB_PARSER_DEPTH_FIRST_VISITOR_H_
-#define _CCNB_PARSER_DEPTH_FIRST_VISITOR_H_
-
-#include "visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Depth-first visitor that takes boot::any as argument and returns boost::any value
- */
-class DepthFirstVisitor : public Visitor
-{
-public:
-  virtual boost::any visit (Blob&,  boost::any);
-  virtual boost::any visit (Udata&, boost::any);
-  virtual boost::any visit (Tag&,   boost::any);
-  virtual boost::any visit (Attr&,  boost::any);
-  virtual boost::any visit (Dtag&,  boost::any);
-  virtual boost::any visit (Dattr&, boost::any);
-  virtual boost::any visit (Ext&,   boost::any);
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_DEPTH_FIRST_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
deleted file mode 100644
index 998e4e2..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.cc
+++ /dev/null
@@ -1,61 +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>
- */
-
-#include "name-visitor.h"
-
-#include "string-visitor.h"
-#include "../syntax-tree/dtag.h"
-
-#include "ns3/ndn-name.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-void
-NameVisitor::visit (Dtag &n, boost::any param/*should be Name* */)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  static StringVisitor stringVisitor; 
- 
-  Name &components = *(boost::any_cast<Name*> (param));
-
-  switch (n.m_dtag)
-    {
-    case CCN_DTAG_Component:
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbDecodingException ();
-      components.append (
-                      boost::any_cast<std::string> ((*n.m_nestedTags.begin())->accept(
-                                                                                      stringVisitor
-                                                                                      )));
-      break;
-    default:
-      VoidDepthFirstVisitor::visit (n, param);
-      break;
-    }
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/name-visitor.h
deleted file mode 100644
index f71e202..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/name-visitor.h
+++ /dev/null
@@ -1,47 +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 _CCNB_PARSER_NAME_COMPONENTS_VISITOR_H_
-#define _CCNB_PARSER_NAME_COMPONENTS_VISITOR_H_
-
-#include "void-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain fill CcnxName object with name components
- */
-class NameVisitor : public VoidDepthFirstVisitor
-{
-public:
-  virtual void visit (Dtag &n, boost::any param/*should be Name* */);
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_NAME_COMPONENTS_VISITOR_H_
-
diff --git a/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
deleted file mode 100644
index 6393e7e..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.cc
+++ /dev/null
@@ -1,112 +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>
- */
-
-#include "no-argu-depth-first-visitor.h"
-
-#include "../syntax-tree/blob.h"
-#include "../syntax-tree/udata.h"
-#include "../syntax-tree/tag.h"
-#include "../syntax-tree/dtag.h"
-#include "../syntax-tree/attr.h"
-#include "../syntax-tree/dattr.h"
-#include "../syntax-tree/ext.h"
-
-#include <boost/foreach.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-NoArguDepthFirstVisitor::visit (Blob &n)
-{
-  // Buffer n.m_blob;
-  return n.m_blob;
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  return n.m_udata;
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Tag &n)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this);
-    }
-  return boost::any ();
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Dtag &n)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this);
-    }
-  return boost::any();
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Attr &n)
-{
-  // std::string n.m_attr;
-  // Ptr<Udata> n.m_value;
-  return boost::any ();
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Dattr &n)
-{
-  // uint32_t n.m_dattr;
-  // Ptr<Udata> n.m_value;
-  return boost::any ();
-}
- 
-boost::any
-NoArguDepthFirstVisitor::visit (Ext &n)
-{
-  // uint64_t n.m_extSubtype;
-  return n.m_extSubtype;
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.h
deleted file mode 100644
index c400083..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/no-argu-depth-first-visitor.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 _CCNB_PARSER_NO_ARGU_DEPTH_FIRST_VISITOR_H_
-#define _CCNB_PARSER_NO_ARGU_DEPTH_FIRST_VISITOR_H_
-
-#include "no-argu-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Depth-first visitor that takes no arguments and returns boost::any value
- */
-class NoArguDepthFirstVisitor : public NoArguVisitor
-{
-public:
-  virtual boost::any visit (Blob& );
-  virtual boost::any visit (Udata&);
-  virtual boost::any visit (Tag&  );
-  virtual boost::any visit (Attr& );
-  virtual boost::any visit (Dtag& );
-  virtual boost::any visit (Dattr&);
-  virtual boost::any visit (Ext&  );
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_NO_ARGU_DEPTH_FIRST_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h
deleted file mode 100644
index d603a0a..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/no-argu-visitor.h
+++ /dev/null
@@ -1,58 +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 _CCNB_PARSER_NO_ARGU_VISITOR_H_
-#define _CCNB_PARSER_NO_ARGU_VISITOR_H_
-
-#include "../common.h"
-#include <boost/any.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor interface that takes no arguments and returns boost::any
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- * for ccnb encoding format help
- */
-class NoArguVisitor
-{
-public:
-  virtual boost::any visit (Blob& )=0; ///< \brief Method accepting BLOB block  
-  virtual boost::any visit (Udata&)=0; ///< \brief Method accepting UDATA block 
-  virtual boost::any visit (Tag&  )=0; ///< \brief Method accepting TAG block   
-  virtual boost::any visit (Attr& )=0; ///< \brief Method accepting ATTR block  
-  virtual boost::any visit (Dtag& )=0; ///< \brief Method accepting DTAG block  
-  virtual boost::any visit (Dattr&)=0; ///< \brief Method accepting DATTR block 
-  virtual boost::any visit (Ext&  )=0; ///< \brief Method accepting EXT block
-
-  virtual ~NoArguVisitor () { }
-};
-  
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_NO_ARGU_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc
deleted file mode 100644
index 9c2fee3..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.cc
+++ /dev/null
@@ -1,55 +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>
- */
-
-#include "non-negative-integer-visitor.h"
-
-#include "../syntax-tree/blob.h"
-#include "../syntax-tree/udata.h"
-#include <sstream>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-NonNegativeIntegerVisitor::visit (Blob &n) //to throw parsing error
-{
-  // Buffer n.m_blob;
-  throw CcnbDecodingException ();
-}
-
-boost::any
-NonNegativeIntegerVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  std::istringstream is (n.m_udata);
-  int32_t value;
-  is >> value;
-  if (value<0) // value should be non-negative
-    throw CcnbDecodingException ();
-
-  return static_cast<uint32_t> (value);
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.h
deleted file mode 100644
index 027e0eb..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/non-negative-integer-visitor.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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_NON_NEGATIVE_INTEGER_VISITOR_H_
-#define _CCNB_PARSER_NON_NEGATIVE_INTEGER_VISITOR_H_
-
-#include "no-argu-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain non-negative integer value from UDATA block
- *
- * Will return empty boost::any() if called on anything except UDATA block
- */
-class NonNegativeIntegerVisitor : public NoArguDepthFirstVisitor
-{
-public:
-  virtual boost::any visit (Blob &n); ///< Throws an exception if BLOB object is encountered
-  virtual boost::any visit (Udata &n);
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_NON_NEGATIVE_INTEGER_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc
deleted file mode 100644
index 5c41779..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/string-visitor.cc
+++ /dev/null
@@ -1,47 +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>
- */
-
-#include "string-visitor.h"
-#include "../syntax-tree/udata.h"
-#include "../syntax-tree/blob.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-StringVisitor::visit (Blob &n) 
-{
-  // Buffer n.m_blob;
-  return std::string (n.m_blob, n.m_blobSize);
-}
-
-boost::any
-StringVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  return n.m_udata;
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/string-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/string-visitor.h
deleted file mode 100644
index b6a74fd..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/string-visitor.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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_STRING_VISITOR_H_
-#define _CCNB_PARSER_STRING_VISITOR_H_
-
-#include "no-argu-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain string value from UDATA block
- *
- * Will return empty boost::any() if called on anything except UDATA block
- */
-class StringVisitor : public NoArguDepthFirstVisitor
-{
-public:
-  virtual boost::any visit (Blob &n);
-  virtual boost::any visit (Udata &n);
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_STRING_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc
deleted file mode 100644
index efea82a..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.cc
+++ /dev/null
@@ -1,67 +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>
- */
-
-#include "timestamp-visitor.h"
-#include "../syntax-tree/blob.h"
-
-#include "ns3/nstime.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any/*Time*/
-TimestampVisitor::visit (Blob &n) 
-{
-  // Buffer n.m_blob;
-  if (n.m_blobSize < 2)
-    throw CcnbDecodingException ();
-
-  const char *start = n.m_blob;
-  
-  intmax_t seconds = 0;
-  intmax_t nanoseconds = 0;
-
-  for (uint32_t i=0; i < n.m_blobSize-2; i++)
-    {
-      seconds = (seconds << 8) | (uint8_t)start[i];
-    }
-  uint8_t combo = start[n.m_blobSize-2]; // 4 most significant bits hold 4 least significant bits of number of seconds
-  seconds = (seconds << 4) | (combo >> 4);
-
-  nanoseconds = combo & 0x0F; /*00001111*/ // 4 least significant bits hold 4 most significant bits of number of
-  nanoseconds = (nanoseconds << 8) | start[n.m_blobSize-1];
-  nanoseconds = (intmax_t) ((nanoseconds / 4096.0/*2^12*/) * 1000000 /*up-convert useconds*/);
-
-  return boost::any (Time::FromInteger (seconds, Time::S) + Time::FromInteger (nanoseconds, Time::US));
-}
-
-boost::any
-TimestampVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  throw CcnbDecodingException ();
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.h
deleted file mode 100644
index a5ad224..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/timestamp-visitor.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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef _CCNB_PARSER_TIMESTAMP_VISITOR_H_
-#define _CCNB_PARSER_TIMESTAMP_VISITOR_H_
-
-#include "no-argu-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain timestamp value from BLOB block
- *
- * Will return empty boost::any() if called on anything except BLOB block
- */
-class TimestampVisitor : public NoArguDepthFirstVisitor
-{
-public:
-  virtual boost::any visit (Blob &n); 
-  virtual boost::any/*Time*/ visit (Udata &n); ///< Throws parsing error if UDATA object is encountered
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_TIMESTAMP_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc
deleted file mode 100644
index f5620ae..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.cc
+++ /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: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "uint32t-blob-visitor.h"
-#include "../syntax-tree/blob.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-boost::any
-Uint32tBlobVisitor::visit (Blob &n) 
-{
-  // Buffer n.m_blob;
-  if (n.m_blobSize < 4)
-    throw CcnbDecodingException ();
-     
-  return boost::any (*(reinterpret_cast<uint32_t*> (n.m_blob)));
-}
-
-boost::any
-Uint32tBlobVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-  throw CcnbDecodingException ();
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.h
deleted file mode 100644
index 5d30405..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/uint32t-blob-visitor.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 _CCNB_PARSER_UINT32T_BLOB_VISITOR_H_
-#define _CCNB_PARSER_UINT32T_BLOB_VISITOR_H_
-
-#include "no-argu-depth-first-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor to obtain nonce value from BLOB block
- *
- * Note, only first 32 bits will be actually parsed into nonce. If
- * original Nonce contains more, the rest will be ignored
- *
- * Will return empty boost::any() if called on anything except BLOB block
- */
-class Uint32tBlobVisitor : public NoArguDepthFirstVisitor
-{
-public:
-  virtual boost::any visit (Blob &n); 
-  virtual boost::any visit (Udata &n); ///< Throws parsing error if BLOB object is encountered
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_UINT32T_BLOB_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/visitor.h b/model/wire/ccnb/ccnb-parser/visitors/visitor.h
deleted file mode 100644
index ee9f831..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/visitor.h
+++ /dev/null
@@ -1,58 +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 _CCNB_PARSER_VISITOR_H_
-#define _CCNB_PARSER_VISITOR_H_
-
-#include "../common.h"
-#include <boost/any.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Visitor interface that takes one boost::any argument and returns boost::any
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- * for ccnb encoding format help
- */
-class Visitor
-{
-public:
-  virtual boost::any visit (Blob&,  boost::any)=0; ///< \brief Method accepting BLOB block  
-  virtual boost::any visit (Udata&, boost::any)=0; ///< \brief Method accepting UDATA block 
-  virtual boost::any visit (Tag&,   boost::any)=0; ///< \brief Method accepting TAG block   
-  virtual boost::any visit (Attr&,  boost::any)=0; ///< \brief Method accepting ATTR block  
-  virtual boost::any visit (Dtag&,  boost::any)=0; ///< \brief Method accepting DTAG block  
-  virtual boost::any visit (Dattr&, boost::any)=0; ///< \brief Method accepting DATTR block 
-  virtual boost::any visit (Ext&,   boost::any)=0; ///< \brief Method accepting EXT block
-
-  virtual ~Visitor () { }
-};                                                
-                                                  
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-                                                  
-#endif // _CCNB_PARSER_VISITOR_H_                             
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc
deleted file mode 100644
index 8a8adde..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.cc
+++ /dev/null
@@ -1,105 +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>
- */
-
-#include "void-depth-first-visitor.h"
-
-#include "../syntax-tree/blob.h"
-#include "../syntax-tree/udata.h"
-#include "../syntax-tree/tag.h"
-#include "../syntax-tree/dtag.h"
-#include "../syntax-tree/attr.h"
-#include "../syntax-tree/dattr.h"
-#include "../syntax-tree/ext.h"
-
-#include <boost/foreach.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-void
-VoidDepthFirstVisitor::visit (Blob &n, boost::any param)
-{
-  // Buffer n.m_blob;
-}
- 
-void
-VoidDepthFirstVisitor::visit (Udata &n, boost::any param)
-{
-  // std::string n.m_udata;
-}
- 
-void
-VoidDepthFirstVisitor::visit (Tag &n, boost::any param)
-{
-  // std::string n.m_tag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this, param);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this, param);
-    }
-}
- 
-void
-VoidDepthFirstVisitor::visit (Dtag &n, boost::any param)
-{
-  // std::string n.m_tag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this, param);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this, param);
-    }
-}
- 
-void
-VoidDepthFirstVisitor::visit (Attr &n, boost::any param)
-{
-  // std::string n.m_attr;
-  // Ptr<Udata> n.m_value;
-}
- 
-void
-VoidDepthFirstVisitor::visit (Dattr &n, boost::any param)
-{
-  // uint32_t n.m_dattr;
-  // Ptr<Udata> n.m_value;
-}
- 
-void
-VoidDepthFirstVisitor::visit (Ext &n, boost::any param)
-{
-  // uint64_t n.m_extSubtype;
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.h
deleted file mode 100644
index 96f8b6f..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-depth-first-visitor.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 _CCNB_PARSER_VOID_DEPTH_FIRST_VISITOR_H_
-#define _CCNB_PARSER_VOID_DEPTH_FIRST_VISITOR_H_
-
-#include "void-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Depth-first visitor that takes one argument and returns nothing
- */
-class VoidDepthFirstVisitor : public VoidVisitor
-{
-public:
-  virtual void visit (Blob&,  boost::any);
-  virtual void visit (Udata&, boost::any);
-  virtual void visit (Tag&,   boost::any);
-  virtual void visit (Attr&,  boost::any);
-  virtual void visit (Dtag&,  boost::any);
-  virtual void visit (Dattr&, boost::any);
-  virtual void visit (Ext&,   boost::any);
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_VOID_DEPTH_FIRST_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
deleted file mode 100644
index 5bcecb8..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.cc
+++ /dev/null
@@ -1,105 +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>
- */
-
-#include "void-no-argu-depth-first-visitor.h"
-
-#include "../syntax-tree/blob.h"
-#include "../syntax-tree/udata.h"
-#include "../syntax-tree/tag.h"
-#include "../syntax-tree/dtag.h"
-#include "../syntax-tree/attr.h"
-#include "../syntax-tree/dattr.h"
-#include "../syntax-tree/ext.h"
-
-#include <boost/foreach.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-void
-VoidNoArguDepthFirstVisitor::visit (Blob &n)
-{
-  // Buffer n.m_blob;
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Udata &n)
-{
-  // std::string n.m_udata;
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Tag &n)
-{
-  // std::string n.m_tag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this);
-    }
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Dtag &n)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_attrs;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-  BOOST_FOREACH (Ptr<Block> block, n.m_attrs)
-    {
-      block->accept (*this);
-    }
-  BOOST_FOREACH (Ptr<Block> block, n.m_nestedTags)
-    {
-      block->accept (*this);
-    }
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Attr &n)
-{
-  // std::string n.m_attr;
-  // Ptr<Udata> n.m_value;
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Dattr &n)
-{
-  // uint32_t n.m_dattr;
-  // Ptr<Udata> n.m_value;
-}
- 
-void
-VoidNoArguDepthFirstVisitor::visit (Ext &n)
-{
-  // uint64_t n.m_extSubtype;
-}
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.h
deleted file mode 100644
index 59b59d7..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-depth-first-visitor.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 _CCNB_PARSER_VOID_NO_ARGU_DEPTH_FIRST_VISITOR_H_
-#define _CCNB_PARSER_VOID_NO_ARGU_DEPTH_FIRST_VISITOR_H_
-
-#include "void-no-argu-visitor.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ccnx-ccnb
- * \brief Depth-first visitor that takes no arguments and returns nothing
- */
-class VoidNoArguDepthFirstVisitor : public VoidNoArguVisitor
-{
-public:
-  virtual void visit (Blob& );
-  virtual void visit (Udata&);
-  virtual void visit (Tag&  );
-  virtual void visit (Attr& );
-  virtual void visit (Dtag& );
-  virtual void visit (Dattr&);
-  virtual void visit (Ext&  );
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_VOID_NO_ARGU_DEPTH_FIRST_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h
deleted file mode 100644
index a98d933..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-no-argu-visitor.h
+++ /dev/null
@@ -1,57 +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 _CCNB_PARSER_VOID_NO_ARGU_VISITOR_H_
-#define _CCNB_PARSER_VOID_NO_ARGU_VISITOR_H_
-
-#include "../common.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ndn-ccnb
- * \brief Visitor interface that takes no arguments and returns nothing
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- * for ccnb encoding format help
- */
-class VoidNoArguVisitor
-{
-public:
-  virtual void visit (Blob& )=0; ///< \brief Method accepting BLOB block
-  virtual void visit (Udata&)=0; ///< \brief Method accepting UDATA block
-  virtual void visit (Tag&  )=0; ///< \brief Method accepting TAG block
-  virtual void visit (Attr& )=0; ///< \brief Method accepting ATTR block
-  virtual void visit (Dtag& )=0; ///< \brief Method accepting DTAG block
-  virtual void visit (Dattr&)=0; ///< \brief Method accepting DATTR block
-  virtual void visit (Ext&  )=0; ///< \brief Method accepting EXT block
-
-  virtual ~VoidNoArguVisitor () { }
-};
-  
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_VOID_NO_ARGU_VISITOR_H_
diff --git a/model/wire/ccnb/ccnb-parser/visitors/void-visitor.h b/model/wire/ccnb/ccnb-parser/visitors/void-visitor.h
deleted file mode 100644
index 8c51e21..0000000
--- a/model/wire/ccnb/ccnb-parser/visitors/void-visitor.h
+++ /dev/null
@@ -1,58 +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 _CCNB_PARSER_VOID_VISITOR_H_
-#define _CCNB_PARSER_VOID_VISITOR_H_
-
-#include "../common.h"
-#include <boost/any.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace CcnbParser {
-
-/**
- * \ingroup ndn-ccnb
- * \brief Visitor interface that takes one boost::any argument and returns nothing
- *
- * \see http://www.ccnx.org/releases/latest/doc/technical/BinaryEncoding.html
- * for ccnb encoding format help
- */
-class VoidVisitor
-{
-public:
-  virtual void visit (Blob&,  boost::any)=0; ///< \brief Method accepting BLOB block  
-  virtual void visit (Udata&, boost::any)=0; ///< \brief Method accepting UDATA block 
-  virtual void visit (Tag&,   boost::any)=0; ///< \brief Method accepting TAG block   
-  virtual void visit (Attr&,  boost::any)=0; ///< \brief Method accepting ATTR block  
-  virtual void visit (Dtag&,  boost::any)=0; ///< \brief Method accepting DTAG block  
-  virtual void visit (Dattr&, boost::any)=0; ///< \brief Method accepting DATTR block 
-  virtual void visit (Ext&,   boost::any)=0; ///< \brief Method accepting EXT block
-
-  virtual ~VoidVisitor () { }
-};
-
-} // CcnbParser
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // _CCNB_PARSER_VOID_VISITOR_H_
diff --git a/model/wire/ccnb/wire-ccnb-data.cc b/model/wire/ccnb/wire-ccnb-data.cc
deleted file mode 100644
index 3b18717..0000000
--- a/model/wire/ccnb/wire-ccnb-data.cc
+++ /dev/null
@@ -1,505 +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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "../ccnb.h"
-
-#include "wire-ccnb.h"
-
-#include "ns3/log.h"
-
-#include "ccnb-parser/common.h"
-#include "ccnb-parser/visitors/void-depth-first-visitor.h"
-#include "ccnb-parser/visitors/name-visitor.h"
-#include "ccnb-parser/visitors/non-negative-integer-visitor.h"
-#include "ccnb-parser/visitors/timestamp-visitor.h"
-#include "ccnb-parser/visitors/string-visitor.h"
-#include "ccnb-parser/visitors/uint32t-blob-visitor.h"
-#include "ccnb-parser/visitors/content-type-visitor.h"
-
-#include "ccnb-parser/syntax-tree/block.h"
-#include "ccnb-parser/syntax-tree/dtag.h"
-
-#include <boost/foreach.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.wire.Ccnb.Data");
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace ccnb {
-
-// const std::string DefaultDigestAlgorithm = "2.16.840.1.101.3.4.2.1";
-
-class DataTrailer : public Trailer
-{
-public:
-  DataTrailer ()
-  {
-  }
-
-  static TypeId GetTypeId ()
-  {
-    static TypeId tid = TypeId ("ns3::ndn::Data::Ccnb::Closer")
-      .SetGroupName ("Ndn")
-      .SetParent<Trailer> ()
-      .AddConstructor<DataTrailer> ()
-      ;
-    return tid;
-  }
-
-  virtual TypeId GetInstanceTypeId (void) const
-  {
-    return GetTypeId ();
-  }
-
-  virtual void Print (std::ostream &os) const
-  {
-  }
-
-  virtual uint32_t GetSerializedSize (void) const
-  {
-    return 2;
-  }
-
-  virtual void Serialize (Buffer::Iterator end) const
-  {
-    Buffer::Iterator i = end;
-    i.Prev (2); // Trailer interface requires us to go backwards
-
-    i.WriteU8 (0x00); // </Content>
-    i.WriteU8 (0x00); // </Data>
-  }
-
-  virtual uint32_t Deserialize (Buffer::Iterator end)
-  {
-    Buffer::Iterator i = end;
-    i.Prev (2); // Trailer interface requires us to go backwards
-
-    uint8_t closing_tag_content = i.ReadU8 ();
-    NS_ASSERT_MSG (closing_tag_content==0, "Should be a closing tag </Content> (0x00)");
-
-    uint8_t closing_tag_content_object = i.ReadU8 ();
-    NS_ASSERT_MSG (closing_tag_content_object==0, "Should be a closing tag </Data> (0x00)");
-
-    return 2;
-  }
-};
-
-NS_OBJECT_ENSURE_REGISTERED (Data);
-NS_OBJECT_ENSURE_REGISTERED (DataTrailer);
-
-TypeId
-Data::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Data::Ccnb")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Data> ()
-    ;
-  return tid;
-}
-
-TypeId
-Data::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-Data::Data ()
-  : m_data (Create<ndn::Data> ())
-{
-}
-
-Data::Data (Ptr<ndn::Data> data)
-  : m_data (data)
-{
-}
-
-Ptr<ndn::Data>
-Data::GetData ()
-{
-  return m_data;
-}
-
-Ptr<Packet>
-Data::ToWire (Ptr<const ndn::Data> data)
-{
-  static DataTrailer trailer;
-
-  Ptr<const Packet> p = data->GetWire ();
-  if (!p)
-    {
-      Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
-      Data wireEncoding (ConstCast<ndn::Data> (data));
-      packet->AddHeader (wireEncoding);
-      packet->AddTrailer (trailer);
-      data->SetWire (packet);
-
-      p = packet;
-    }
-
-  return p->Copy ();
-}
-
-Ptr<ndn::Data>
-Data::FromWire (Ptr<Packet> packet)
-{
-  static DataTrailer trailer;
-
-  Ptr<ndn::Data> data = Create<ndn::Data> ();
-  Ptr<Packet> wire = packet->Copy ();
-
-  Data wireEncoding (data);
-  packet->RemoveHeader (wireEncoding);
-  packet->RemoveTrailer (trailer);
-
-  data->SetPayload (packet);
-  data->SetWire (wire);
-
-  return data;
-}
-
-void
-Data::Serialize (Buffer::Iterator start) const
-{
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Data, CcnbParser::CCN_DTAG); // <Data>
-
-  // fake signature
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Signature, CcnbParser::CCN_DTAG); // <Signature>
-  // Signature ::= √DigestAlgorithm?
-  //               Witness?
-  //               √SignatureBits
-  // if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
-  //   {
-  //     Ccnb::AppendString (start, CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
-  //   }
-  Ccnb::AppendString (start, CcnbParser::CCN_DTAG_DigestAlgorithm, "NOP");
-  Ccnb::AppendTaggedBlobWithPadding (start, CcnbParser::CCN_DTAG_SignatureBits, 16, m_data->GetSignature ()); // <SignatureBits />
-  Ccnb::AppendCloser (start);                                    // </Signature>
-
-  // Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);    // <Name>
-  Ccnb::SerializeName (start, m_data->GetName());                                      //   <Component>...</Component>...
-  // Ccnb::AppendCloser (start);                                                          // </Name>
-
-  // fake signature
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_SignedInfo, CcnbParser::CCN_DTAG); // <SignedInfo>
-  // SignedInfo ::= √PublisherPublicKeyDigest
-  //                √Timestamp
-  //                √Type?
-  //                √FreshnessSeconds?
-  //                FinalBlockID?
-  //                KeyLocator?
-  // Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_PublisherPublicKeyDigest,         // <PublisherPublicKeyDigest>...
-  //                         GetSignedInfo ().GetPublisherPublicKeyDigest ());
-
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Timestamp, CcnbParser::CCN_DTAG);            // <Timestamp>...
-  Ccnb::AppendTimestampBlob (start, m_data->GetTimestamp ());
-  Ccnb::AppendCloser (start);
-
-  // if (GetSignedInfo ().GetContentType () != DATA)
-  //   {
-  //     uint8_t type[3];
-  //     type[0] = (GetSignedInfo ().GetContentType () >> 16) & 0xFF;
-  //     type[1] = (GetSignedInfo ().GetContentType () >> 8 ) & 0xFF;
-  //     type[2] = (GetSignedInfo ().GetContentType ()      ) & 0xFF;
-
-  //     Ccnb::AppendTaggedBlob (start, CCN_DTAG_Type, type, 3);
-  //   }
-  if (m_data->GetFreshness () > Seconds(0))
-    {
-      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_FreshnessSeconds, CcnbParser::CCN_DTAG);
-      Ccnb::AppendNumber (start, m_data->GetFreshness ().ToInteger (Time::S));
-      Ccnb::AppendCloser (start);
-    }
-  if (m_data->GetKeyLocator () != 0)
-    {
-      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_KeyLocator, CcnbParser::CCN_DTAG); // <KeyLocator>
-      {
-        Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_KeyName, CcnbParser::CCN_DTAG);    // <KeyName>
-        {
-          // Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);       // <Name>
-          Ccnb::SerializeName (start, *m_data->GetKeyLocator ());         //   <Component>...</Component>...
-          // Ccnb::AppendCloser (start);                                     // </Name>
-        }
-        Ccnb::AppendCloser (start);                                     // </KeyName>
-      }
-      Ccnb::AppendCloser (start);                                     // </KeyLocator>
-    }
-
-  Ccnb::AppendCloser (start);                                     // </SignedInfo>
-
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Content, CcnbParser::CCN_DTAG); // <Content>
-
-  uint32_t payloadSize = m_data->GetPayload ()->GetSize ();
-  if (payloadSize > 0)
-    Ccnb::AppendBlockHeader (start, payloadSize, CcnbParser::CCN_BLOB);
-
-  // there are no closing tags !!!
-  // The closing tag is handled by DataTail
-}
-
-uint32_t
-Data::GetSerializedSize () const
-{
-  size_t written = 0;
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Data); // <Data>
-
-  // fake signature
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Signature); // <Signature>
-  // Signature ::= DigestAlgorithm?
-  //               Witness?
-  //               SignatureBits
-  // if (GetSignature ().GetDigestAlgorithm () != Signature::DefaultDigestAlgorithm)
-  //   {
-  //     written += Ccnb::EstimateString (CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
-  //   }
-  written += Ccnb::EstimateString (CcnbParser::CCN_DTAG_DigestAlgorithm, "NOP");
-  // "signature" will be always padded to 16 octets
-  written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits, 16);      // <SignatureBits />
-  // written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits, sizeof (m_data->GetSignature ()));      // <SignatureBits />
-  written += 1;                                    // </Signature>
-
-  //written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);    // <Name>
-  written += Ccnb::SerializedSizeName (m_data->GetName ()); //   <Component>...</Component>...
-  //written += 1;                                  // </Name>
-
-  // fake signature
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_SignedInfo); // <SignedInfo>
-  // SignedInfo ::= √PublisherPublicKeyDigest
-  //                √Timestamp
-  //                √Type?
-  //                √FreshnessSeconds?
-  //                FinalBlockID?
-  //                KeyLocator?
-
-  // written += Ccnb::EstimateTaggedBlob (CCN_DTAG_PublisherPublicKeyDigest,                          // <PublisherPublicKeyDigest>...
-  //                                      sizeof (GetSignedInfo ().GetPublisherPublicKeyDigest ()));
-
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Timestamp);                  // <Timestamp>...
-  written += Ccnb::EstimateTimestampBlob (m_data->GetTimestamp ());
-  written += 1;
-
-  // if (GetSignedInfo ().GetContentType () != DATA)
-  //   {
-  //     written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_Type, 3);
-  //   }
-  if (m_data->GetFreshness () > Seconds(0))
-    {
-      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_FreshnessSeconds);
-      written += Ccnb::EstimateNumber (m_data->GetFreshness ().ToInteger (Time::S));
-      written += 1;
-    }
-
-  if (m_data->GetKeyLocator () != 0)
-    {
-      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_KeyLocator); // <KeyLocator>
-      {
-        written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_KeyName);    // <KeyName>
-        {
-          //written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);       // <Name>
-          written += Ccnb::SerializedSizeName (*m_data->GetKeyLocator ());        //   <Component>...</Component>...
-          //written += 1;                                               // </Name>
-        }
-        written += 1;                                               // </KeyName>
-      }
-      written += 1;                                               // </KeyLocator>
-    }
-
-  written += 1; // </SignedInfo>
-
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Content); // <Content>
-
-  uint32_t payloadSize = m_data->GetPayload ()->GetSize ();
-  if (payloadSize > 0)
-    written += Ccnb::EstimateBlockHeader (payloadSize);
-
-  // there are no closing tags !!!
-  // The closing tag is handled by DataTail
-  return written;
-}
-
-class DataVisitor : public CcnbParser::VoidDepthFirstVisitor
-{
-public:
-  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be Data* */)
-  {
-    // uint32_t n.m_dtag;
-    // std::list< Ptr<CcnbParser::Block> > n.m_nestedBlocks;
-    static CcnbParser::NameVisitor nameVisitor;
-    static CcnbParser::NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
-    static CcnbParser::TimestampVisitor          timestampVisitor;
-    static CcnbParser::StringVisitor      stringVisitor;
-    static CcnbParser::Uint32tBlobVisitor uint32tBlobVisitor;
-    static CcnbParser::ContentTypeVisitor contentTypeVisitor;
-
-    ndn::Data &contentObject = *(boost::any_cast<ndn::Data*> (param));
-
-    switch (n.m_dtag)
-      {
-      case CcnbParser::CCN_DTAG_Data:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }
-        break;
-      case CcnbParser::CCN_DTAG_Name:
-        {
-          // process name components
-          Ptr<Name> name = Create<Name> ();
-          n.accept (nameVisitor, GetPointer (name));
-          contentObject.SetName (name);
-          break;
-        }
-
-      case CcnbParser::CCN_DTAG_Signature:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }
-        break;
-
-      // case CCN_DTAG_DigestAlgorithm:
-      //   NS_LOG_DEBUG ("DigestAlgorithm");
-      //   if (n.m_nestedTags.size ()!=1) // should be exactly one UDATA inside this tag
-      //     throw CcnbParser::CcnbDecodingException ();
-
-      //   contentObject.GetSignature ().SetDigestAlgorithm
-      //     (boost::any_cast<std::string> ((*n.m_nestedTags.begin())->accept
-      //                                    (stringVisitor)));
-      //   break;
-
-      case CcnbParser::CCN_DTAG_SignatureBits:
-        NS_LOG_DEBUG ("SignatureBits");
-        if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-          throw CcnbParser::CcnbDecodingException ();
-
-        contentObject.SetSignature
-          (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                      (uint32tBlobVisitor)));
-        break;
-
-      case CcnbParser::CCN_DTAG_SignedInfo:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }
-        break;
-
-      // case CCN_DTAG_PublisherPublicKeyDigest:
-      //   NS_LOG_DEBUG ("PublisherPublicKeyDigest");
-      //   if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-      //     throw CcnbParser::CcnbDecodingException ();
-
-      //   contentObject.GetSignedInfo ().SetPublisherPublicKeyDigest
-      //     (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-      //                                 (uint32tBlobVisitor)));
-      //   break;
-
-      case CcnbParser::CCN_DTAG_Timestamp:
-        NS_LOG_DEBUG ("Timestamp");
-        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
-          throw CcnbParser::CcnbDecodingException ();
-
-        contentObject.SetTimestamp
-          (boost::any_cast<Time> ((*n.m_nestedTags.begin())->accept
-                                  (timestampVisitor)));
-        break;
-
-      // case CCN_DTAG_Type:
-      //   NS_LOG_DEBUG ("Type");
-      //   if (n.m_nestedTags.size ()!=1) // should be only one nested tag
-      //     throw CcnbParser::CcnbDecodingException ();
-
-      //   contentObject.GetSignedInfo ().SetContentType
-      //     (static_cast<Data::ContentType>
-      //      (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-      //                                  (contentTypeVisitor))));
-      //   break;
-
-      case CcnbParser::CCN_DTAG_FreshnessSeconds:
-        NS_LOG_DEBUG ("FreshnessSeconds");
-
-        if (n.m_nestedTags.size()!=1) // should be exactly one nested tag
-          throw CcnbParser::CcnbDecodingException ();
-
-        contentObject.SetFreshness
-          (Seconds
-           (boost::any_cast<uint32_t> ((*n.m_nestedTags.begin())->accept
-                                       (nonNegativeIntegerVisitor))));
-        break;
-
-      case CcnbParser::CCN_DTAG_KeyLocator:
-        // process nested blocks
-        BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-          {
-            block->accept (*this, param);
-          }
-        break;
-
-      case CcnbParser::CCN_DTAG_KeyName:
-        {
-          if (n.m_nestedTags.size ()!=1) // should be exactly one nested tag
-            throw CcnbParser::CcnbDecodingException ();
-
-          // process name components
-          Ptr<Name> name = Create<Name> ();
-          n.accept (nameVisitor, GetPointer (name));
-          contentObject.SetKeyLocator (name);
-          break;
-        }
-
-      case CcnbParser::CCN_DTAG_Content: // !!! HACK
-        // This hack was necessary for memory optimizations (i.e., content is virtual payload)
-        NS_ASSERT_MSG (n.m_nestedTags.size() == 0, "Parser should have stopped just after processing <Content> tag");
-        break;
-
-      default: // ignore all other stuff
-        break;
-      }
-  }
-};
-
-uint32_t
-Data::Deserialize (Buffer::Iterator start)
-{
-  static DataVisitor contentObjectVisitor;
-
-  Buffer::Iterator i = start;
-  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
-  root->accept (contentObjectVisitor, GetPointer (m_data));
-
-  return i.GetDistanceFrom (start);
-}
-
-void
-Data::Print (std::ostream &os) const
-{
-  os << "D: " << m_data->GetName ();
-  // os << "<Data><Name>" << GetName () << "</Name><Content>";
-}
-
-} // ccnb
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb-interest.cc b/model/wire/ccnb/wire-ccnb-interest.cc
deleted file mode 100644
index af4fc0f..0000000
--- a/model/wire/ccnb/wire-ccnb-interest.cc
+++ /dev/null
@@ -1,448 +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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "../ccnb.h"
-
-#include "wire-ccnb.h"
-
-#include "ns3/log.h"
-#include "ns3/unused.h"
-#include "ns3/packet.h"
-
-#include "ccnb-parser/visitors/name-visitor.h"
-#include "ccnb-parser/visitors/non-negative-integer-visitor.h"
-#include "ccnb-parser/visitors/timestamp-visitor.h"
-#include "ccnb-parser/visitors/uint32t-blob-visitor.h"
-
-#include "ccnb-parser/syntax-tree/block.h"
-#include "ccnb-parser/syntax-tree/dtag.h"
-
-#include <boost/foreach.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("ndn.wire.Ccnb.Interest");
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace ccnb {
-
-NS_OBJECT_ENSURE_REGISTERED (Interest);
-
-TypeId
-Interest::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Interest::Ccnb")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Interest> ()
-    ;
-  return tid;
-}
-
-TypeId
-Interest::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-Interest::Interest ()
-  : m_interest (Create<ndn::Interest> ())
-{
-}
-
-Interest::Interest (Ptr<ndn::Interest> interest)
-  : m_interest (interest)
-{
-}
-
-Ptr<ndn::Interest>
-Interest::GetInterest ()
-{
-  return m_interest;
-}
-
-Ptr<Packet>
-Interest::ToWire (Ptr<const ndn::Interest> interest)
-{
-  Ptr<const Packet> p = interest->GetWire ();
-  if (!p)
-    {
-      Ptr<Packet> packet = Create<Packet> (*interest->GetPayload ());
-      Interest wireEncoding (ConstCast<ndn::Interest> (interest));
-      packet->AddHeader (wireEncoding);
-      interest->SetWire (packet);
-
-      p = packet;
-    }
-  
-  return p->Copy ();
-}
-
-Ptr<ndn::Interest>
-Interest::FromWire (Ptr<Packet> packet)
-{
-  Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-  Ptr<Packet> wire = packet->Copy ();
-
-  Interest wireEncoding (interest);
-  packet->RemoveHeader (wireEncoding);
-
-  interest->SetPayload (packet);
-  interest->SetWire (wire);
-
-  return interest;
-}
-
-void
-Interest::Serialize (Buffer::Iterator start) const
-{
-  Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Interest, CcnbParser::CCN_DTAG); // <Interest>
-  
-  // Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG); // <Name>
-  Ccnb::SerializeName (start, m_interest->GetName());                // <Component>...</Component>...
-  // Ccnb::AppendCloser (start);                               // </Name>
-
-  // if (m_interest->GetMinSuffixComponents() >= 0)
-  //   {
-  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_MinSuffixComponents, CcnbParser::CCN_DTAG);
-  //     Ccnb::AppendNumber (start, m_interest->GetMinSuffixComponents ());
-  //     Ccnb::AppendCloser (start);
-  //   }
-  // if (m_interest->GetMaxSuffixComponents() >= 0)
-  //   {
-  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_MaxSuffixComponents, CcnbParser::CCN_DTAG);
-  //     Ccnb::AppendNumber (start, m_interest->GetMaxSuffixComponents ());
-  //     Ccnb::AppendCloser (start);
-  //   }
-  // if (m_interest->IsEnabledExclude() && m_interest->GetExclude().size() > 0)
-  //   {
-  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Exclude, CcnbParser::CCN_DTAG); // <Exclude>
-  //     Ccnb::AppendName (start, m_interest->GetExclude());                // <Component>...</Component>...
-  //     Ccnb::AppendCloser (start);                                  // </Exclude>
-  //   }
-  // if (m_interest->IsEnabledChildSelector())
-  //   {
-  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_ChildSelector, CcnbParser::CCN_DTAG);
-  //     Ccnb::AppendNumber (start, 1);
-  //     Ccnb::AppendCloser (start);
-  //   }
-  // if (m_interest->IsEnabledAnswerOriginKind())
-  //   {
-  //     Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_AnswerOriginKind, CcnbParser::CCN_DTAG);
-  //     Ccnb::AppendNumber (start, 1);
-  //     Ccnb::AppendCloser (start);
-  //   }
-  if (m_interest->GetScope() >= 0)
-    {
-      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Scope, CcnbParser::CCN_DTAG);
-      Ccnb::AppendNumber (start, m_interest->GetScope ());
-      Ccnb::AppendCloser (start);
-    }
-  if (!m_interest->GetInterestLifetime().IsZero())
-    {
-      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_InterestLifetime, CcnbParser::CCN_DTAG);
-      Ccnb::AppendTimestampBlob (start, m_interest->GetInterestLifetime ());
-      Ccnb::AppendCloser (start);
-    }
-  if (m_interest->GetNonce()>0)
-    {
-      uint32_t nonce = m_interest->GetNonce();
-      Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Nonce, nonce);
-    }
-    
-  if (m_interest->GetNack ()>0)
-    {
-      Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Nack, CcnbParser::CCN_DTAG);
-      Ccnb::AppendNumber (start, m_interest->GetNack ());
-      Ccnb::AppendCloser (start);
-    }
-  Ccnb::AppendCloser (start); // </Interest>
-}
-
-uint32_t
-Interest::GetSerializedSize () const
-{
-  size_t written = 0;
-  written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Interest); // <Interest>
-  
-  // written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name); // <Name>
-  written += Ccnb::SerializedSizeName (m_interest->GetName()); // <Component>...</Component>...
-  // written += 1; // </Name>
-
-  // if (m_interest->GetMinSuffixComponents() >= 0)
-  //   {
-  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_MinSuffixComponents);
-  //     written += Ccnb::EstimateNumber (m_interest->GetMinSuffixComponents ());
-  //     written += 1;
-  //   }
-  // if (m_interest->GetMaxSuffixComponents() >= 0)
-  //   {
-  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_MaxSuffixComponents);
-  //     written += Ccnb::EstimateNumber (m_interest->GetMaxSuffixComponents ());
-  //     written += 1;
-  //   }
-  // if (m_interest->IsEnabledExclude() && m_interest->GetExclude().size() > 0)
-  //   {
-  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Exclude);
-  //     written += Ccnb::EstimateName (m_interest->GetExclude());                // <Component>...</Component>...
-  //     written += 1;                                  // </Exclude>
-  //   }
-  // if (m_interest->IsEnabledChildSelector())
-  //   {
-  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_ChildSelector);
-  //     written += Ccnb::EstimateNumber (1);
-  //     written += 1;
-  //   }
-  // if (m_interest->IsEnabledAnswerOriginKind())
-  //   {
-  //     written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_AnswerOriginKind);
-  //     written += Ccnb::EstimateNumber (1);
-  //     written += 1;
-  //   }
-  if (m_interest->GetScope() >= 0)
-    {
-      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Scope);
-      written += Ccnb::EstimateNumber (m_interest->GetScope ());
-      written += 1;
-    }
-  if (!m_interest->GetInterestLifetime().IsZero())
-    {
-      written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_InterestLifetime);
-      written += Ccnb::EstimateTimestampBlob (m_interest->GetInterestLifetime());
-      written += 1;
-    }
-  if (m_interest->GetNonce()>0)
-    {
-      written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_Nonce, sizeof(uint32_t));
-    }
-  if (m_interest->GetNack ()>0)
-    {
-        written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Nack);
-        written += Ccnb::EstimateNumber (m_interest->GetNack ());
-        written += 1;
-    }
-
-  written += 1; // </Interest>
-
-  return written;
-}
-
-class InterestVisitor : public CcnbParser::VoidDepthFirstVisitor
-{
-public:
-  virtual void visit (CcnbParser::Dtag &n, boost::any param/*should be CcnxInterest* */);
-};
-
-// We don't care about any other fields
-void
-InterestVisitor::visit (CcnbParser::Dtag &n, boost::any param/*should be Interest* */)
-{
-  // uint32_t n.m_dtag;
-  // std::list<Ptr<Block> > n.m_nestedBlocks;
-
-  static CcnbParser::NonNegativeIntegerVisitor nonNegativeIntegerVisitor;
-  static CcnbParser::NameVisitor               nameVisitor;
-  static CcnbParser::TimestampVisitor          timestampVisitor;
-  static CcnbParser::Uint32tBlobVisitor        nonceVisitor;
-  
-  ndn::Interest &interest = *(boost::any_cast<ndn::Interest*> (param));
-
-  switch (n.m_dtag)
-    {
-    case CcnbParser::CCN_DTAG_Interest:
-      NS_LOG_DEBUG ("Interest");
-  
-      // process nested blocks
-      BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-        {
-          block->accept (*this, param);
-        }
-      break;
-    case CcnbParser::CCN_DTAG_Name:
-      {
-        NS_LOG_DEBUG ("Name");
-
-        // process name components
-        Ptr<Name> name = Create<Name> ();
-        n.accept (nameVisitor, GetPointer (name));
-        interest.SetName (name);
-        break;
-      }
-    // case CcnbParser::CCN_DTAG_MinSuffixComponents:
-    //   NS_LOG_DEBUG ("MinSuffixComponents");
-    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-    //     throw CcnbParser::CcnbDecodingException ();
-    //   interest.SetMinSuffixComponents (
-    //            boost::any_cast<uint32_t> (
-    //                                       (*n.m_nestedTags.begin())->accept(
-    //                                                                        nonNegativeIntegerVisitor
-    //                                                                        )));
-    //   break;
-    // case CcnbParser::CCN_DTAG_MaxSuffixComponents:
-    //   NS_LOG_DEBUG ("MaxSuffixComponents");
-    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-    //     throw CcnbParser::CcnbDecodingException ();
-    //   interest.SetMaxSuffixComponents (
-    //            boost::any_cast<uint32_t> (
-    //                                       (*n.m_nestedTags.begin())->accept(
-    //                                                                        nonNegativeIntegerVisitor
-    //                                                                        )));
-    //   break;
-    // case CcnbParser::CCN_DTAG_Exclude:
-    //   {
-    //     NS_LOG_DEBUG ("Exclude");
-    //     // process exclude components
-    //     Ptr<Name> exclude = Create<Name> ();
-        
-    //     BOOST_FOREACH (Ptr<CcnbParser::Block> block, n.m_nestedTags)
-    //       {
-    //         block->accept (nameVisitor, &(*exclude));
-    //       }
-    //     interest.SetExclude (exclude);
-    //     break;
-    //   }
-    // case CcnbParser::CCN_DTAG_ChildSelector:
-    //   NS_LOG_DEBUG ("ChildSelector");
-    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-    //     throw CcnbParser::CcnbDecodingException ();
-
-    //   interest.SetChildSelector (
-    //            1 == boost::any_cast<uint32_t> (
-    //                                       (*n.m_nestedTags.begin())->accept(
-    //                                                                        nonNegativeIntegerVisitor
-    //                                                                        )));
-    //   break;
-    // case CCN_DTAG_AnswerOriginKind:
-    //   NS_LOG_DEBUG ("AnswerOriginKind");
-    //   if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-    //     throw CcnbParser::CcnbDecodingException ();
-    //   interest.SetAnswerOriginKind (
-    //            1 == boost::any_cast<uint32_t> (
-    //                                       (*n.m_nestedTags.begin())->accept(
-    //                                                                        nonNegativeIntegerVisitor
-    //                                                                        )));
-    //   break;
-    case CcnbParser::CCN_DTAG_Scope: 
-      NS_LOG_DEBUG ("Scope");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbParser::CcnbDecodingException ();
-      interest.SetScope (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonNegativeIntegerVisitor
-                                                                           )));
-      break;
-    case CcnbParser::CCN_DTAG_InterestLifetime:
-      NS_LOG_DEBUG ("InterestLifetime");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbParser::CcnbDecodingException ();
-
-      interest.SetInterestLifetime (
-               boost::any_cast<Time> (
-                                      (*n.m_nestedTags.begin())->accept(
-                                                                        timestampVisitor
-                                                                        )));
-      break;
-    case CcnbParser::CCN_DTAG_Nonce:
-      NS_LOG_DEBUG ("Nonce");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbParser::CcnbDecodingException ();
-
-      interest.SetNonce (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(
-                                                                           nonceVisitor
-                                                                           )));
-      break;
-    
-            
-    case CcnbParser::CCN_DTAG_Nack:
-      NS_LOG_DEBUG ("Nack");
-      if (n.m_nestedTags.size()!=1) // should be exactly one UDATA inside this tag
-        throw CcnbParser::CcnbDecodingException ();
-            
-      interest.SetNack (
-               boost::any_cast<uint32_t> (
-                                          (*n.m_nestedTags.begin())->accept(nonNegativeIntegerVisitor)));
-      break;
-    }
-}
-
-
-uint32_t
-Interest::Deserialize (Buffer::Iterator start)
-{
-  static InterestVisitor interestVisitor;
-
-  Buffer::Iterator i = start;
-  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
-  root->accept (interestVisitor, GetPointer (m_interest));
-  
-  return i.GetDistanceFrom (start);
-}
-
-void
-Interest::Print (std::ostream &os) const
-{
-  os << "I: " << m_interest->GetName ();
-  
-  return;
-  // os << "<Interest>\n  <Name>" << GetName () << "</Name>\n";
-  // if (GetNack ()>0)
-  //   {
-  //     os << "  <NACK>";
-  //     switch (GetNack ())
-  //       {
-  //       case NACK_LOOP:
-  //         os << "loop";
-  //         break;
-  //       case NACK_CONGESTION:
-  //         os << "congestion";
-  //         break;
-  //       default:
-  //         os << "unknown";
-  //         break;
-  //       }
-  //     os << "</NACK>\n";
-  //   }
-  // if (GetMinSuffixComponents () >= 0)
-  //   os << "  <MinSuffixComponents>" << GetMinSuffixComponents () << "</MinSuffixComponents>\n";
-  // if (GetMaxSuffixComponents () >= 0)
-  //   os << "  <MaxSuffixComponents>" << m_maxSuffixComponents << "</MaxSuffixComponents>\n";
-  // if (IsEnabledExclude () && GetExclude ().size()>0)
-  //   os << "  <Exclude>" << GetExclude () << "</Exclude>\n";
-  // if (IsEnabledChildSelector ())
-  //   os << "  <ChildSelector />\n";
-  // if (IsEnabledAnswerOriginKind ())
-  //   os << "  <AnswerOriginKind />\n";
-  // if (GetScope () >= 0)
-  //   os << "  <Scope>" << GetScope () << "</Scope>\n";
-  // if ( !GetInterestLifetime ().IsZero() )
-  //   os << "  <InterestLifetime>" << GetInterestLifetime () << "</InterestLifetime>\n";
-  // if (GetNonce ()>0)
-  //   os << "  <Nonce>" << GetNonce () << "</Nonce>\n";
-  // os << "</Interest>";
-}
-
-} // ccnb
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb.cc b/model/wire/ccnb/wire-ccnb.cc
deleted file mode 100644
index 3403611..0000000
--- a/model/wire/ccnb/wire-ccnb.cc
+++ /dev/null
@@ -1,260 +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>
- */
-
-#include "wire-ccnb.h"
-
-#include <sstream>
-#include <boost/foreach.hpp>
-#include "ccnb-parser/common.h"
-#include "ccnb-parser/visitors/name-visitor.h"
-#include "ccnb-parser/syntax-tree/block.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-
-#define CCN_TT_BITS 3
-#define CCN_TT_MASK ((1 << CCN_TT_BITS) - 1)
-#define CCN_MAX_TINY ((1 << (7-CCN_TT_BITS)) - 1)
-#define CCN_TT_HBIT ((unsigned char)(1 << 7))
-
-size_t
-Ccnb::AppendBlockHeader (Buffer::Iterator &start, size_t val, uint32_t tt)
-{
-  unsigned char buf[1+8*((sizeof(val)+6)/7)];
-  unsigned char *p = &(buf[sizeof(buf)-1]);
-  size_t n = 1;
-  p[0] = (CCN_TT_HBIT & ~CcnbParser::CCN_CLOSE) |
-  ((val & CCN_MAX_TINY) << CCN_TT_BITS) |
-  (CCN_TT_MASK & tt);
-  val >>= (7-CCN_TT_BITS);
-  while (val != 0) {
-    (--p)[0] = (((unsigned char)val) & ~CCN_TT_HBIT) | CcnbParser::CCN_CLOSE;
-    n++;
-    val >>= 7;
-  }
-  start.Write (p,n);
-  return n;
-}
-
-size_t
-Ccnb::EstimateBlockHeader (size_t value)
-{
-  value >>= (7-CCN_TT_BITS);
-  size_t n = 1;
-  while (value>0)
-    {
-      value >>= 7;
-      n++;
-    }
-  return n;
-}
-
-size_t
-Ccnb::AppendNumber (Buffer::Iterator &start, uint32_t number)
-{
-  std::ostringstream os;
-  os << number;
-
-  size_t written = 0;
-  written += AppendBlockHeader (start, os.str().size(), CcnbParser::CCN_UDATA);
-  written += os.str().size();
-  start.Write (reinterpret_cast<const unsigned char*>(os.str().c_str()), os.str().size());
-
-  return written;
-}
-
-size_t
-Ccnb::EstimateNumber (uint32_t number)
-{
-  std::ostringstream os;
-  os << number;
-  return EstimateBlockHeader (os.str ().size ()) + os.str ().size ();
-}
-
-size_t
-Ccnb::AppendCloser (Buffer::Iterator &start)
-{
-  start.WriteU8 (CcnbParser::CCN_CLOSE);
-  return 1;
-}
-
-size_t
-Ccnb::AppendTimestampBlob (Buffer::Iterator &start, const Time &time)
-{
-  // the original function implements Markers... thought not sure what are these markers for...
-
-  // Determine miminal number of bytes required to store the timestamp
-  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
-  intmax_t ts = time.ToInteger (Time::S) >> 4;
-  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
-     required_bytes++;
-
-  size_t len = AppendBlockHeader(start, required_bytes, CcnbParser::CCN_BLOB);
-
-  // write part with seconds
-  ts = time.ToInteger (Time::S) >> 4;
-  for (int i = 0; i < required_bytes - 2; i++)
-    start.WriteU8 ( ts >> (8 * (required_bytes - 3 - i)) );
-
-  /* arithmetic contortions are to avoid overflowing 31 bits */
-  ts = ((time.ToInteger (Time::S) & 15) << 12) +
-       (((time.ToInteger (Time::NS) % 1000000000) / 5 * 8 + 195312) / 390625);
-  for (int i = required_bytes - 2; i < required_bytes; i++)
-    start.WriteU8 ( ts >> (8 * (required_bytes - 1 - i)) );
-
-  return len + required_bytes;
-}
-
-size_t
-Ccnb::EstimateTimestampBlob (const Time &time)
-{
-  int required_bytes = 2; // 12 bits for fractions of a second, 4 bits left for seconds. Sometimes it is enough
-  intmax_t ts = time.ToInteger (Time::S) >> 4;
-  for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
-     required_bytes++;
-
-  return EstimateBlockHeader (required_bytes) + required_bytes;
-}
-
-size_t
-Ccnb::AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag,
-                  const uint8_t *data, size_t size)
-{
-  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
-  /* 2 */
-  if (size>0)
-    {
-      written += AppendBlockHeader (start, size, CcnbParser::CCN_BLOB);
-      start.Write (data, size);
-      written += size;
-      /* size */
-    }
-  written += AppendCloser (start);
-  /* 1 */
-
-  return written;
-}
-
-size_t
-Ccnb::AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag,
-                                   uint32_t length,
-                                   const uint8_t *data, size_t size)
-{
-  if (size > length)
-    {
-      // no padding required
-      return AppendTaggedBlob (start, dtag, data, size);
-    }
-
-
-  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
-
-  /* 2 */
-  if (length>0)
-    {
-      written += AppendBlockHeader (start, length, CcnbParser::CCN_BLOB);
-      start.Write (data, size);
-      start.WriteU8 (0, length - size);
-      written += length;
-      /* size */
-    }
-  written += AppendCloser (start);
-  /* 1 */
-
-  return written;
-}
-
-size_t
-Ccnb::EstimateTaggedBlob (uint32_t dtag, size_t size)
-{
-  if (size>0)
-    return EstimateBlockHeader (dtag) + EstimateBlockHeader (size) + size + 1;
-  else
-    return EstimateBlockHeader (dtag) + 1;
-}
-
-size_t
-Ccnb::AppendString (Buffer::Iterator &start, uint32_t dtag,
-                                  const std::string &string)
-{
-  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
-  {
-    written += AppendBlockHeader (start, string.size (), CcnbParser::CCN_UDATA);
-    start.Write (reinterpret_cast<const uint8_t*> (string.c_str ()), string.size ());
-    written += string.size ();
-  }
-  written += AppendCloser (start);
-
-  return written;
-}
-
-size_t
-Ccnb::EstimateString (uint32_t dtag, const std::string &string)
-{
-  return EstimateBlockHeader (dtag) + EstimateBlockHeader (string.size ()) + string.size () + 1;
-}
-
-size_t
-Ccnb::SerializeName (Buffer::Iterator &start, const Name &name)
-{
-  size_t written = 0;
-  written += AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);
-  BOOST_FOREACH (const name::Component &component, name)
-    {
-      written += AppendTaggedBlob (start, CcnbParser::CCN_DTAG_Component,
-                                   reinterpret_cast<const uint8_t*>(component.buf ()), component.size());
-    }
-  written += AppendCloser (start);
-  return written;
-}
-
-size_t
-Ccnb::SerializedSizeName (const Name &name)
-{
-  size_t written = 0;
-  written += EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);
-  BOOST_FOREACH (const name::Component &component, name)
-    {
-      written += EstimateTaggedBlob (CcnbParser::CCN_DTAG_Component, component.size ());
-    }
-  written += 1;
-  return written;
-}
-
-Ptr<Name>
-Ccnb::DeserializeName (Buffer::Iterator &i)
-{
-  Ptr<Name> name = Create<Name> ();
-  CcnbParser::NameVisitor nameVisitor;
-
-  Ptr<CcnbParser::Block> root = CcnbParser::Block::ParseBlock (i);
-  root->accept (nameVisitor, GetPointer (name));
-
-  return name;
-}
-
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ccnb/wire-ccnb.h b/model/wire/ccnb/wire-ccnb.h
deleted file mode 100644
index bb1eef6..0000000
--- a/model/wire/ccnb/wire-ccnb.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2011-2013 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 NDN_WIRE_CCNB_SYNTAX_H
-#define NDN_WIRE_CCNB_SYNTAX_H
-
-#include "ns3/ptr.h"
-#include "ns3/nstime.h"
-#include "ns3/buffer.h"
-
-#include "ns3/ndn-common.h"
-#include "ns3/ndn-name.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-
-/**
- * \brief Helper to encode CCNb blocks
- */
-class Ccnb
-{
-public:
-  /**
-   * @brief Append CCNB block header
-   * @param start Buffer to store serialized
-   * @param value dictionary id of the block header
-   * @param block_type Type of CCNB block
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendBlockHeader (Buffer::Iterator &start, size_t value, uint32_t block_type);
-
-  /**
-   * @brief Estimate size of the CCNB block header
-   * @param value dictionary id of the block header
-   * @returns estimated length
-   */
-  static size_t
-  EstimateBlockHeader (size_t value);
-
-  /**
-   * @brief Add number in CCNB encoding
-   * @param start Buffer to store serialized NdnInterest
-   * @param number Number to be written
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendNumber (Buffer::Iterator &start, uint32_t number);
-
-  /**
-   * @brief Estimate size of the number in CCNB encoding
-   * @param number Number to be written
-   * @returns estimated length
-   */
-  static size_t
-  EstimateNumber (uint32_t number);
-
-  /**
-   * @brief Append CCNB closer tag (estimated size is 1)
-   * @param start Buffer to store serialized Interest
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendCloser (Buffer::Iterator &start);
-
-  /**
-   * Append a binary timestamp as a BLOB using the ccn binary
-   * Timestamp representation (12-bit fraction).
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param time - Time object
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendTimestampBlob (Buffer::Iterator &start, const Time &time);
-
-  /**
-   * @brief Estimate size of a binary timestamp as a BLOB using CCNB enconding
-   * @param time - Time object
-   * @returns estimated length
-   */
-  static size_t
-  EstimateTimestampBlob (const Time &time);
-
-  /**
-   * Append a tagged BLOB
-   *
-   * This is a ccnb-encoded element with containing the BLOB as content
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param dtag is the element's dtab
-   * @param data points to the binary data
-   * @param size is the size of the data, in bytes
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag,
-                    const uint8_t *data, size_t size);
-  
-  /**
-   * Append a tagged BLOB, adding 0-byte padding if necessary
-   *
-   * This is a ccnb-encoded element with containing the BLOB as content
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param dtag is the element's dtab
-   * @param length minimum required length of the added field (padding added if necessary)
-   * @param data points to the binary data
-   * @param size is the size of the data, in bytes
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag,
-                               uint32_t length,
-                               const uint8_t *data, size_t size);
-
-  /**
-   * @brief Estimate size of a tagged BLOB in CCNB enconding
-   * @param dtag is the element's dtab
-   * @param size is the size of the data, in bytes
-   * @returns estimated length
-   */
-  static size_t
-  EstimateTaggedBlob (uint32_t dtag, size_t size);
-
-  /**
-   * Append value as a tagged BLOB (templated version)
-   *
-   * This is a ccnb-encoded element with containing the BLOB as content
-   *
-   * Data will be reinterpret_cast<const uint8_t*> and size will be obtained using sizeof
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param dtag is the element's dtab
-   * @param data a value to add
-   *
-   * @returns written length
-   */
-  template<class T>
-  static inline size_t
-  AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data);
-
-  /**
-   * Append value as a tagged BLOB (templated version), add 0-padding if necessary
-   *
-   * This is a ccnb-encoded element with containing the BLOB as content
-   *
-   * Data will be reinterpret_cast<const uint8_t*> and size will be obtained using sizeof
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param dtag is the element's dtab
-   * @param length minimum required length of the field
-   * @param data a value to add
-   *
-   * @returns written length
-   */
-  template<class T>
-  static inline size_t
-  AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag, uint32_t length, const T &data);
-
-  /**
-   * Append a tagged string (should be a valid UTF-8 coded string)
-   *
-   * This is a ccnb-encoded element with containing UDATA as content
-   *
-   * @param start start iterator of  the buffer to append to.
-   * @param dtag is the element's dtab
-   * @param string UTF-8 string to be written
-   *
-   * @returns written length
-   */
-  static size_t
-  AppendString (Buffer::Iterator &start, uint32_t dtag,
-                const std::string &string);
-
-  /**
-   * @brief Estimate size of the string in CCNB encoding
-   * @param dtag is the element's dtab
-   * @param string UTF-8 string to be written
-   * @returns estimated length
-   */
-  static size_t
-  EstimateString (uint32_t dtag, const std::string &string);
-
-  ////////////////////////////////
-  // General use wire formatters
-  ////////////////////////////////
-  
-  /**
-   * @brief Append Name in CCNB encoding
-   * @param start Buffer to store serialized Interest
-   * @param name constant reference to Name object
-   *
-   * @returns written length
-   */
-  static size_t
-  SerializeName (Buffer::Iterator &start, const Name &name);
-
-  /**
-   * @brief Estimate size of Name in CCNB encoding
-   * @param name constant reference to Name object
-   * @returns estimated length
-   */
-  static size_t
-  SerializedSizeName (const Name &name);
-
-  /**
-   * @brief Deserialize Name from CCNB encodeing
-   * @param start Buffer that stores serialized Interest
-   * @param name Name object
-   */
-  static Ptr<Name>
-  DeserializeName (Buffer::Iterator &start);
-}; // Ccnb
-
-
-template<class T>
-inline size_t
-Ccnb::AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data)
-{
-  return AppendTaggedBlob (start, dtag, reinterpret_cast<const uint8_t*> (&data), sizeof (data));
-}
-
-template<class T>
-inline size_t
-Ccnb::AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag, uint32_t length, const T &data)
-{
-  return AppendTaggedBlobWithPadding (start, dtag, length, reinterpret_cast<const uint8_t*> (&data), sizeof (data));
-}
-
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // NDN_WIRE_CCNB_SYNTAX_H
diff --git a/model/wire/ndn-wire.cc b/model/wire/ndn-wire.cc
deleted file mode 100644
index 7753f83..0000000
--- a/model/wire/ndn-wire.cc
+++ /dev/null
@@ -1,306 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU 3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndn-wire.h"
-
-#include "ns3/global-value.h"
-#include "ns3/integer.h"
-#include "ns3/ndn-common.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-#include "ns3/ndn-header-helper.h"
-
-#include "ndnsim.h"
-#include "ndnsim/wire-ndnsim.h"
-#include "ccnb.h"
-#include "ccnb/wire-ccnb.h"
-
-NDN_NAMESPACE_BEGIN
-
-static
-GlobalValue g_wireFormat ("ndn::WireFormat",
-                          "Default wire format for ndnSIM.  ndnSIM will be accepting packets "
-                          "in any supported packet formats, but if encoding requested, it will "
-                          "use default wire format to encode (0 for ndnSIM (default), 1 for CCNb)",
-                          IntegerValue (Wire::WIRE_FORMAT_NDNSIM),
-                          MakeIntegerChecker<int32_t> ());
-
-static inline uint32_t
-GetWireFormat ()
-{
-  static int32_t format = -1;
-  if (format >= 0)
-    return format;
-
-  IntegerValue value;
-  g_wireFormat.GetValue (value);
-  format = value.Get ();
-
-  return format;
-}
-
-Ptr<Packet>
-Wire::FromInterest (Ptr<const Interest> interest, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-  if (wireFormat == WIRE_FORMAT_DEFAULT)
-    wireFormat = GetWireFormat ();
-
-  if (wireFormat == WIRE_FORMAT_NDNSIM)
-    return wire::ndnSIM::Interest::ToWire (interest);
-  else if (wireFormat == WIRE_FORMAT_CCNB)
-    return wire::ccnb::Interest::ToWire (interest);
-  else
-    {
-      NS_FATAL_ERROR ("Unsupported format requested");
-      return 0;
-    }
-}
-
-Ptr<Interest>
-Wire::ToInterest (Ptr<Packet> packet, int8_t wireFormat/* = WIRE_FORMAT_AUTODETECT*/)
-{
-  if (wireFormat == WIRE_FORMAT_AUTODETECT)
-    {
-      try
-        {
-          HeaderHelper::Type type = HeaderHelper::GetNdnHeaderType (packet);
-          switch (type)
-            {
-            case HeaderHelper::INTEREST_NDNSIM:
-              {
-                return wire::ndnSIM::Interest::FromWire (packet);
-              }
-            case HeaderHelper::INTEREST_CCNB:
-              {
-                return wire::ccnb::Interest::FromWire (packet);
-              }
-            case HeaderHelper::CONTENT_OBJECT_NDNSIM:
-            case HeaderHelper::CONTENT_OBJECT_CCNB:
-              NS_FATAL_ERROR ("Data packet supplied for InterestFromWire function");
-              break;
-            default:
-              NS_FATAL_ERROR ("Unsupported format");
-              return 0;
-            }
-
-          // exception will be thrown if packet is not recognized
-        }
-      catch (UnknownHeaderException)
-        {
-          NS_FATAL_ERROR ("Unknown NDN header");
-          return 0;
-        }
-    }
-  else
-    {
-      if (wireFormat == WIRE_FORMAT_NDNSIM)
-        return wire::ndnSIM::Interest::FromWire (packet);
-      else if (wireFormat == WIRE_FORMAT_CCNB)
-        return wire::ccnb::Interest::FromWire (packet);
-      else
-        {
-          NS_FATAL_ERROR ("Unsupported format requested");
-          return 0;
-        }
-    }
-}
-
-Ptr<Packet>
-Wire::FromData (Ptr<const Data> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-  if (wireFormat == WIRE_FORMAT_DEFAULT)
-    wireFormat = GetWireFormat ();
-
-  if (wireFormat == WIRE_FORMAT_NDNSIM)
-    return wire::ndnSIM::Data::ToWire (data);
-  else if (wireFormat == WIRE_FORMAT_CCNB)
-    return wire::ccnb::Data::ToWire (data);
-  else
-    {
-      NS_FATAL_ERROR ("Unsupported format requested");
-      return 0;
-    }
-}
-
-Ptr<Data>
-Wire::ToData (Ptr<Packet> packet, int8_t wireFormat/* = WIRE_FORMAT_AUTODETECT*/)
-{
-  if (wireFormat == WIRE_FORMAT_AUTODETECT)
-    {
-      try
-        {
-          HeaderHelper::Type type = HeaderHelper::GetNdnHeaderType (packet);
-          switch (type)
-            {
-            case HeaderHelper::CONTENT_OBJECT_NDNSIM:
-              {
-                return wire::ndnSIM::Data::FromWire (packet);
-              }
-            case HeaderHelper::CONTENT_OBJECT_CCNB:
-              {
-                return wire::ccnb::Data::FromWire (packet);
-              }
-            case HeaderHelper::INTEREST_NDNSIM:
-            case HeaderHelper::INTEREST_CCNB:
-              NS_FATAL_ERROR ("Interest supplied for DataFromWire function");
-              break;
-            default:
-              NS_FATAL_ERROR ("Unsupported format");
-              return 0;
-            }
-
-          // exception will be thrown if packet is not recognized
-        }
-      catch (UnknownHeaderException)
-        {
-          NS_FATAL_ERROR ("Unknown NDN header");
-          return 0;
-        }
-    }
-  else
-    {
-      if (wireFormat == WIRE_FORMAT_NDNSIM)
-        return wire::ndnSIM::Data::FromWire (packet);
-      else if (wireFormat == WIRE_FORMAT_CCNB)
-        return wire::ccnb::Data::FromWire (packet);
-      else
-        {
-          NS_FATAL_ERROR ("Unsupported format requested");
-          return 0;
-        }
-    }
-}
-
-
-std::string
-Wire::FromInterestStr (Ptr<const Interest> interest, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-  Ptr<Packet> pkt = FromInterest (interest, wireFormat);
-  std::string wire;
-  wire.resize (pkt->GetSize ());
-  pkt->CopyData (reinterpret_cast<uint8_t*> (&wire[0]), wire.size ());
-
-  return wire;
-}
-
-Ptr<Interest>
-Wire::ToInterestStr (const std::string &wire, int8_t type/* = WIRE_FORMAT_AUTODETECT*/)
-{
-  Ptr<Packet> pkt = Create<Packet> (reinterpret_cast<const uint8_t*> (&wire[0]), wire.size ());
-  return ToInterest (pkt, type);
-}
-
-std::string
-Wire::FromDataStr (Ptr<const Data> data, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-  Ptr<Packet> pkt = FromData (data, wireFormat);
-  std::string wire;
-  wire.resize (pkt->GetSize ());
-  pkt->CopyData (reinterpret_cast<uint8_t*> (&wire[0]), wire.size ());
-
-  return wire;
-}
-
-Ptr<Data>
-Wire::ToDataStr (const std::string &wire, int8_t type/* = WIRE_FORMAT_AUTODETECT*/)
-{
-  Ptr<Packet> pkt = Create<Packet> (reinterpret_cast<const uint8_t*> (&wire[0]), wire.size ());
-  return ToData (pkt, type);
-}
-
-// uint32_t
-// Wire::FromNameSize (Ptr<const Name> name, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-// {
-//   if (wireFormat == WIRE_FORMAT_DEFAULT)
-//     wireFormat = GetWireFormat ();
-
-//   if (wireFormat == WIRE_FORMAT_NDNSIM)
-//     {
-//       std::cout << wire::NdnSim::SerializedSizeName (*name) << std::endl;
-//       return wire::NdnSim::SerializedSizeName (*name);
-//     }
-//   else if (wireFormat == WIRE_FORMAT_CCNB)
-//     return wire::Ccnb::SerializedSizeName (*name);
-//   else
-//     {
-//       NS_FATAL_ERROR ("Unsupported format requested");
-//       return 0;
-//     }
-// }
-
-std::string
-Wire::FromName (Ptr<const Name> name, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-
-  if (wireFormat == WIRE_FORMAT_DEFAULT)
-    wireFormat = GetWireFormat ();
-
-  if (wireFormat == WIRE_FORMAT_NDNSIM)
-    {
-      Buffer buf;
-      buf.AddAtStart (wire::NdnSim::SerializedSizeName (*name));
-      Buffer::Iterator i = buf.Begin ();
-
-      wire::NdnSim::SerializeName (i, *name);
-
-      std::string wire;
-      wire.resize (buf.GetSize ());
-      buf.CopyData (reinterpret_cast<uint8_t *>(&wire[0]), wire.size ());
-
-      return wire;
-    }
-  else if (wireFormat == WIRE_FORMAT_CCNB)
-    {
-      Buffer buf;
-      buf.AddAtStart (wire::NdnSim::SerializedSizeName (*name));
-      Buffer::Iterator i = buf.Begin ();
-
-      wire::Ccnb::SerializeName (i, *name);
-
-      std::string wire;
-      wire.resize (buf.GetSize ());
-      buf.CopyData (reinterpret_cast<uint8_t *>(&wire[0]), wire.size ());
-
-      return wire;
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Unsupported format requested");
-    }
-}
-
-Ptr<Name>
-Wire::ToName (const std::string &name, int8_t wireFormat/* = WIRE_FORMAT_DEFAULT*/)
-{
-  Buffer buf;
-  buf.AddAtStart (name.size ());
-  Buffer::Iterator i = buf.Begin ();
-  i.Write (reinterpret_cast<const uint8_t *> (&name[0]), name.size ());
-
-  i = buf.Begin ();
-
-  if (wireFormat == WIRE_FORMAT_DEFAULT)
-    wireFormat = GetWireFormat ();
-
-  if (wireFormat == WIRE_FORMAT_NDNSIM)
-    {
-      return wire::NdnSim::DeserializeName (i);
-    }
-  else if (wireFormat == WIRE_FORMAT_CCNB)
-    {
-      return wire::Ccnb::DeserializeName (i);
-    }
-  else
-    {
-      NS_FATAL_ERROR ("Unsupported format requested");
-    }
-}
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ndn-wire.h b/model/wire/ndn-wire.h
deleted file mode 100644
index 38420e9..0000000
--- a/model/wire/ndn-wire.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU 3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_WIRE_H
-#define NDN_WIRE_H
-
-#include "ns3/buffer.h"
-
-#include "ns3/ndn-common.h"
-#include "ns3/ndn-name.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-NDN_NAMESPACE_BEGIN
-
-struct Wire
-{
-  enum
-    {
-      WIRE_FORMAT_DEFAULT = -2,
-      WIRE_FORMAT_AUTODETECT = -1,
-
-      WIRE_FORMAT_NDNSIM = 0,
-      WIRE_FORMAT_CCNB = 1
-    };
-
-  static Ptr<Packet>
-  FromInterest (Ptr<const Interest> interest, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  static Ptr<Interest>
-  ToInterest (Ptr<Packet> packet, int8_t type = WIRE_FORMAT_AUTODETECT);
-
-  static Ptr<Packet>
-  FromData (Ptr<const Data> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  static Ptr<Data>
-  ToData (Ptr<Packet> packet, int8_t type = WIRE_FORMAT_AUTODETECT);
-
-
-  // Helper methods for Python
-  static std::string
-  FromInterestStr (Ptr<const Interest> interest, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  static Ptr<Interest>
-  ToInterestStr (const std::string &wire, int8_t type = WIRE_FORMAT_AUTODETECT);
-
-  static std::string
-  FromDataStr (Ptr<const Data> data, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  static Ptr<Data>
-  ToDataStr (const std::string &wire, int8_t type = WIRE_FORMAT_AUTODETECT);
-
-  // /*
-  //  * @brief Get size of buffer to fit wire-formatted name object
-  //  */
-  // static uint32_t
-  // FromNameSize (Ptr<const Name> name, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  /**
-   * @brief Convert name to wire format
-   */
-  static std::string
-  FromName (Ptr<const Name> name, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-
-  /**
-   * @brief Convert name from wire format
-   */
-  static Ptr<Name>
-  ToName (const std::string &wire, int8_t wireFormat = WIRE_FORMAT_DEFAULT);
-};
-
-inline std::string
-PacketToBuffer (Ptr<const Packet> pkt)
-{
-  std::string buffer;
-  buffer.resize (pkt->GetSize ());
-  pkt->CopyData (reinterpret_cast<uint8_t*> (&buffer[0]), buffer.size ());
-
-  return buffer;
-}
-
-inline Ptr<Packet>
-BufferToPacket (const std::string &buffer)
-{
-  return Create<Packet> (reinterpret_cast<const uint8_t*> (&buffer[0]), buffer.size ());
-}
-
-
-NDN_NAMESPACE_END
-
-#endif // NDN_WIRE_H
diff --git a/model/wire/ndnsim.cc b/model/wire/ndnsim.cc
deleted file mode 100644
index 4668a79..0000000
--- a/model/wire/ndnsim.cc
+++ /dev/null
@@ -1,374 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * GNU 3.0 license, See the LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndnsim.h"
-
-using namespace std;
-
-#include <ns3/header.h>
-#include <ns3/packet.h>
-#include <ns3/log.h>
-
-#include "ndnsim/wire-ndnsim.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.wire.ndnSIM");
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-namespace ndnSIM {
-
-NS_OBJECT_ENSURE_REGISTERED (Interest);
-NS_OBJECT_ENSURE_REGISTERED (Data);
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-Interest::Interest ()
-  : m_interest (Create<ndn::Interest> ())
-{
-}
-
-Interest::Interest (Ptr<ndn::Interest> interest)
-  : m_interest (interest)
-{
-}
-
-Ptr<ndn::Interest>
-Interest::GetInterest ()
-{
-  return m_interest;
-}
-
-
-TypeId
-Interest::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Interest::ndnSIM")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Interest> ()
-    ;
-  return tid;
-}
-
-TypeId
-Interest::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-
-Ptr<Packet>
-Interest::ToWire (Ptr<const ndn::Interest> interest)
-{
-  Ptr<const Packet> p = interest->GetWire ();
-  if (!p)
-    {
-      Ptr<Packet> packet = Create<Packet> (*interest->GetPayload ());
-      Interest wireEncoding (ConstCast<ndn::Interest> (interest));
-      packet->AddHeader (wireEncoding);
-      interest->SetWire (packet);
-
-      p = packet;
-    }
-  
-  return p->Copy ();
-}
-
-Ptr<ndn::Interest>
-Interest::FromWire (Ptr<Packet> packet)
-{
-  Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-  Ptr<Packet> wire = packet->Copy ();
-
-  Interest wireEncoding (interest);
-  packet->RemoveHeader (wireEncoding);
-
-  interest->SetPayload (packet);
-  interest->SetWire (wire);
-
-  return interest;
-}
-
-uint32_t
-Interest::GetSerializedSize (void) const
-{
-  size_t size =
-    1/*version*/ + 1 /*type*/ + 2/*length*/ +
-    (4/*nonce*/ + 1/*scope*/ + 1/*nack type*/ + 2/*timestamp*/ +
-     NdnSim::SerializedSizeName (m_interest->GetName ()) +
-
-     (2 +
-      (m_interest->GetExclude () == 0 ? 0 : (1 + NdnSim::SerializedSizeExclude (*m_interest->GetExclude ())))
-      )/* selectors */ +
-     
-     (2 + 0)/* options */);
-  
-  NS_LOG_INFO ("Serialize size = " << size);
-  return size;
-}
-    
-void
-Interest::Serialize (Buffer::Iterator start) const
-{
-  start.WriteU8 (0x80); // version
-  start.WriteU8 (0x00); // packet type
-
-  start.WriteU16 (GetSerializedSize () - 4);
-
-  start.WriteU32 (m_interest->GetNonce ());
-  start.WriteU8 (m_interest->GetScope ());
-  start.WriteU8 (m_interest->GetNack ());
-
-  NS_ASSERT_MSG (0 <= m_interest->GetInterestLifetime ().ToInteger (Time::S) && m_interest->GetInterestLifetime ().ToInteger (Time::S) < 65535,
-                 "Incorrect InterestLifetime (should not be smaller than 0 and larger than 65535");
-  
-  // rounding timestamp value to seconds
-  start.WriteU16 (static_cast<uint16_t> (m_interest->GetInterestLifetime ().ToInteger (Time::S)));
-
-  NdnSim::SerializeName (start, m_interest->GetName ());
-
-  if (m_interest->GetExclude () == 0)
-    {
-      start.WriteU16 (0); // no selectors
-    }
-  else
-    {
-      start.WriteU16 (1 + NdnSim::SerializedSizeExclude (*m_interest->GetExclude ()));
-      start.WriteU8 (0x01);
-      NdnSim::SerializeExclude (start, *m_interest->GetExclude ());
-    }
-  
-  start.WriteU16 (0); // no options
-}
-
-uint32_t
-Interest::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-  
-  if (i.ReadU8 () != 0x80)
-    throw new InterestException ();
-
-  if (i.ReadU8 () != 0x00)
-    throw new InterestException ();
-
-  i.ReadU16 (); // length, don't need it right now
-  
-  m_interest->SetNonce (i.ReadU32 ());
-  m_interest->SetScope (i.ReadU8 ());
-  m_interest->SetNack (i.ReadU8 ());
-
-  m_interest->SetInterestLifetime (Seconds (i.ReadU16 ()));
-
-  m_interest->SetName (NdnSim::DeserializeName (i));
-  
-  uint32_t selectorsLen = i.ReadU16 ();
-  if (selectorsLen > 0)
-    {
-      if (i.ReadU8 () != 0x01) // exclude filter only
-        throw InterestException ();
-
-      m_interest->SetExclude (NdnSim::DeserializeExclude (i));
-    }
-  i.ReadU16 ();
-
-  NS_ASSERT (GetSerializedSize () == (i.GetDistanceFrom (start)));
-
-  return i.GetDistanceFrom (start);
-}
-
-void
-Interest::Print (std::ostream &os) const
-{
-  m_interest->Print (os);
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-
-TypeId
-Data::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::ndn::Data::ndnSIM")
-    .SetGroupName ("Ndn")
-    .SetParent<Header> ()
-    .AddConstructor<Data> ()
-    ;
-  return tid;
-}
-
-TypeId
-Data::GetInstanceTypeId (void) const
-{
-  return GetTypeId ();
-}
-  
-
-Data::Data ()
-  : m_data (Create<ndn::Data> ())
-{
-}
-
-Data::Data (Ptr<ndn::Data> data)
-  : m_data (data)
-{
-}
-
-Ptr<ndn::Data>
-Data::GetData ()
-{
-  return m_data;
-}
-
-Ptr<Packet>
-Data::ToWire (Ptr<const ndn::Data> data)
-{
-  Ptr<const Packet> p = data->GetWire ();
-  if (!p)
-    {
-      Ptr<Packet> packet = Create<Packet> (*data->GetPayload ());
-      Data wireEncoding (ConstCast<ndn::Data> (data));
-      packet->AddHeader (wireEncoding);
-      data->SetWire (packet);
-
-      p = packet;
-    }
-  
-  return p->Copy ();
-}
-
-Ptr<ndn::Data>
-Data::FromWire (Ptr<Packet> packet)
-{
-  Ptr<ndn::Data> data = Create<ndn::Data> ();
-  Ptr<Packet> wire = packet->Copy ();
-
-  Data wireEncoding (data);
-  packet->RemoveHeader (wireEncoding);
-
-  data->SetPayload (packet);
-  data->SetWire (wire);
-
-  return data;
-}
-
-uint32_t
-Data::GetSerializedSize () const
-{
-  uint32_t size = 1 + 1 + 2 +
-    ((2 + 2) +
-     NdnSim::SerializedSizeName (m_data->GetName ()) +
-     (2 + 2 + 4 + 2 + 2 + (2 + 0)));
-  if (m_data->GetSignature () != 0)
-    size += 4;
-  
-  NS_LOG_INFO ("Serialize size = " << size);
-  return size;
-}
-
-void
-Data::Serialize (Buffer::Iterator start) const
-{
-  start.WriteU8 (0x80); // version
-  start.WriteU8 (0x01); // packet type
-  start.WriteU16 (GetSerializedSize () - 4); // length
-  
-  if (m_data->GetSignature () != 0)
-    {
-      start.WriteU16 (6); // signature length
-      start.WriteU16 (0xFF00); // "fake" simulator signature
-      start.WriteU32 (m_data->GetSignature ());
-    }
-  else
-    {
-      start.WriteU16 (2); // signature length
-      start.WriteU16 (0); // empty signature
-    }
-
-  // name
-  NdnSim::SerializeName (start, m_data->GetName ());
-
-  // content
-  // for now assume that contentdata length is zero
-  start.WriteU16 (2 + 4 + 2 + 2 + (2 + 0));
-  start.WriteU16 (4 + 2 + 2 + (2 + 0));
-  start.WriteU32 (static_cast<uint32_t> (m_data->GetTimestamp ().ToInteger (Time::S)));
-  start.WriteU16 (static_cast<uint16_t> (m_data->GetFreshness ().ToInteger (Time::S)));
-  start.WriteU16 (0); // reserved 
-  start.WriteU16 (0); // Length (ContentInfoOptions)
-
-  // that's it folks
-}
-
-uint32_t
-Data::Deserialize (Buffer::Iterator start)
-{
-  Buffer::Iterator i = start;
-
-  if (i.ReadU8 () != 0x80)
-    throw new DataException ();
-
-  if (i.ReadU8 () != 0x01)
-    throw new DataException ();
-
-  i.ReadU16 (); // length
-
-  uint32_t signatureLength = i.ReadU16 ();
-  if (signatureLength == 6)
-    {
-      if (i.ReadU16 () != 0xFF00) // signature type
-        throw new DataException ();
-      m_data->SetSignature (i.ReadU32 ());
-    }
-  else if (signatureLength == 2)
-    {
-      if (i.ReadU16 () != 0) // signature type
-        throw new DataException ();
-      m_data->SetSignature (0);
-    }
-  else
-    throw new DataException ();
-
-  m_data->SetName (NdnSim::DeserializeName (i));
-
-  if (i.ReadU16 () != (2 + 4 + 2 + 2 + (2 + 0))) // content length
-    throw new DataException ();
-
-  if (i.ReadU16 () != (4 + 2 + 2 + (2 + 0))) // Length (content Info)
-    throw new DataException ();
-
-  m_data->SetTimestamp (Seconds (i.ReadU32 ()));
-  m_data->SetFreshness (Seconds (i.ReadU16 ()));
-
-  if (i.ReadU16 () != 0) // Reserved
-    throw new DataException ();
-  if (i.ReadU16 () != 0) // Length (ContentInfoOptions)
-    throw new DataException ();
-
-  NS_ASSERT_MSG (i.GetDistanceFrom (start) == GetSerializedSize (),
-                 "Something wrong with Data::Deserialize");
-  
-  return i.GetDistanceFrom (start);
-}
-
-void
-Data::Print (std::ostream &os) const
-{
-  m_data->Print (os);
-}
-
-} // ndnSIM
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ndnsim.h b/model/wire/ndnsim.h
deleted file mode 100644
index f247f77..0000000
--- a/model/wire/ndnsim.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * GNU 3.0 license, See the LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_WIRE_NDNSIM_H
-#define NDN_WIRE_NDNSIM_H
-
-#include "ns3/ndn-common.h"
-#include "ns3/ndn-interest.h"
-#include "ns3/ndn-data.h"
-
-NDN_NAMESPACE_BEGIN
-
-/**
- * @brief Namespace encapsulating wire operations
- */
-namespace wire {
-
-/**
- * @brief Namespace for ndnSIM wire format operations
- */
-namespace ndnSIM {
-
-/**
- * @brief Routines to serialize/deserialize Interest packet in ndnSIM format
- *
- * Optimized and simplified formatting of Interest packets 
- *
- *	Interest ::= Nonce 
- *	     	     Scope 
- *		     InterestLifetime 
- *	     	     Name 
- *	     	     Selectors 
- *	     	     Options
- *
- * Minumum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 0) + (2 + 0) + (2 + 0) = 14
- *
- * Maximum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 65535) + (2 + 65535) + (2 + 65535) = 196619
- *
- * ::
- *
- *        0                   1                   2                   3
- *        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *        |                          Nonce                                |
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *        |     Scope     |   Reserved    |      InterestLifetime         |
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *        |            Length             |                               |
- *	   |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
- *        ~                                                               ~
- *        ~                            Name                               ~
- *        |							           |	
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *        |            Length             |                               |
- *        |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
- *        ~                                                               ~
- *        ~                          Selectors                            ~
- *        |							            |	
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *        |            Length             |                               |
- *	   |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
- *        ~                                                               ~
- *        ~                          Options                              ~
- *        |							           |	
- *        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- */
-class Interest : public Header
-{
-public:
-  Interest ();
-  Interest (Ptr<ndn::Interest> interest);
-
-  Ptr<ndn::Interest>
-  GetInterest ();
-
-  static Ptr<Packet>
-  ToWire (Ptr<const ndn::Interest> interest);
-
-  static Ptr<ndn::Interest>
-  FromWire (Ptr<Packet> packet);
-  
-  // from Header
-  static TypeId GetTypeId (void); 
-  virtual TypeId GetInstanceTypeId (void) const; 
-  virtual void Print (std::ostream &os) const;
-  virtual uint32_t GetSerializedSize (void) const;
-  virtual void Serialize (Buffer::Iterator start) const;
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-private:
-  Ptr<ndn::Interest> m_interest;
-};
-
-/**
- * @brief Routines to serialize/deserialize Data packet in ndnSIM format
- *
- * Only few important fields are actually implemented in the simulation
- *
- * @see http://ndnsim.net/new-packet-formats.html
- *
- *	Data ::= Signature
- *                	  Name
- *                   	  Content
- *
- *      0                   1                   2                   3
- *      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *      |            Length             |                               |
- *      |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
- *      ~                                                               ~
- *      ~                           Signature                           ~
- *      |							        |	
- *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *      |            Length             |                               |
- *      |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
- *      ~                                                               ~
- *      ~                             Name                              ~
- *      |							        |	
- *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *      |            Length             |                               |
- *      |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
- *      ~                                                               ~
- *      ~                           Content                             ~
- *      |							        |	
- *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- *
- */
-class Data : public Header
-{
-public:
-  Data ();
-  Data (Ptr<ndn::Data> data);
-
-  Ptr<ndn::Data>
-  GetData ();
-
-  static Ptr<Packet>
-  ToWire (Ptr<const ndn::Data> data);
-
-  static Ptr<ndn::Data>
-  FromWire (Ptr<Packet> packet);
-  
-  // from Header
-  static TypeId GetTypeId (void);
-  virtual TypeId GetInstanceTypeId (void) const;
-  virtual void Print (std::ostream &os) const;
-  virtual uint32_t GetSerializedSize (void) const;
-  virtual void Serialize (Buffer::Iterator start) const;
-  virtual uint32_t Deserialize (Buffer::Iterator start);
-
-private:
-  Ptr<ndn::Data> m_data;  
-};
-
-} // ndnSIM
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // NDN_WIRE_NDNSIM_H
diff --git a/model/wire/ndnsim/wire-ndnsim.cc b/model/wire/ndnsim/wire-ndnsim.cc
deleted file mode 100644
index 013d78d..0000000
--- a/model/wire/ndnsim/wire-ndnsim.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * GNU 3.0 license, See the LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "wire-ndnsim.h"
-#include <boost/foreach.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////
-
-size_t
-NdnSim::SerializeName (Buffer::Iterator &i, const Name &name)
-{
-  Buffer::Iterator start = i;
-
-  i.WriteU16 (static_cast<uint16_t> (SerializedSizeName (name)-2));
-
-  for (Name::const_iterator item = name.begin ();
-       item != name.end ();
-       item++)
-    {
-      i.WriteU16 (static_cast<uint16_t> (item->size ()));
-      i.Write (reinterpret_cast<const uint8_t*> (item->buf ()), item->size ());
-    }
-
-  return i.GetDistanceFrom (start);
-}
-
-size_t
-NdnSim::SerializedSizeName (const Name &name)
-{
-  size_t nameSerializedSize = 2;
-
-  for (Name::const_iterator i = name.begin ();
-       i != name.end ();
-       i++)
-    {
-      nameSerializedSize += 2 + i->size ();
-    }
-  NS_ASSERT_MSG (nameSerializedSize < 30000, "Name is too long (> 30kbytes)");
-
-  return nameSerializedSize;
-}
-
-Ptr<Name>
-NdnSim::DeserializeName (Buffer::Iterator &i)
-{
-  Ptr<Name> name = Create<Name> ();
-
-  uint16_t nameLength = i.ReadU16 ();
-  while (nameLength > 0)
-    {
-      uint16_t length = i.ReadU16 ();
-      nameLength = nameLength - 2 - length;
-
-      uint8_t tmp[length];
-      i.Read (tmp, length);
-
-      name->append (tmp, length);
-    }
-
-  return name;
-}
-
-
-size_t
-NdnSim::SerializeExclude (Buffer::Iterator &i, const Exclude &exclude)
-{
-  Buffer::Iterator start = i;
-
-  i.WriteU16 (static_cast<uint16_t> (SerializedSizeExclude (exclude)-2));
-
-  for (Exclude::const_reverse_iterator item = exclude.rbegin ();
-       item != exclude.rend ();
-       item++)
-    {
-      if (!item->first.empty ())
-        {
-          i.WriteU8 (ExcludeNameType);
-          i.WriteU16 (static_cast<uint16_t> (item->first.size ()));
-          i.Write (reinterpret_cast<const uint8_t*> (item->first.buf ()), item->first.size ());
-        }
-      if (item->second)
-        {
-          i.WriteU8 (ExcludeAnyType);
-        }
-    }
-  return i.GetDistanceFrom (start);
-}
-
-size_t
-NdnSim::SerializedSizeExclude (const Exclude &exclude)
-{
-  size_t excludeSerializedSize = 2;
-
-  for (Exclude::const_reverse_iterator item = exclude.rbegin ();
-       item != exclude.rend ();
-       item++)
-    {
-      if (!item->first.empty ())
-        {
-          excludeSerializedSize += 1 + 2 + item->first.size ();
-        }
-      if (item->second)
-        {
-          excludeSerializedSize += 1;
-        }
-    }
-
-  return excludeSerializedSize;
-}
-
-Ptr<Exclude>
-NdnSim::DeserializeExclude (Buffer::Iterator &i)
-{
-  Ptr<Exclude> exclude = Create<Exclude> ();
-
-  uint16_t excludeLength = i.ReadU16 ();
-  while (excludeLength > 0)
-    {
-      uint8_t type = i.ReadU8 ();
-      excludeLength --;
-      
-      if (type == ExcludeAnyType)
-        {
-          exclude->appendExclude (name::Component (), true);
-        }
-      else if (type == ExcludeNameType)
-        {
-          uint16_t length = i.ReadU16 ();
-          excludeLength = excludeLength - 2 - length;
-
-          uint8_t tmp[length];
-          i.Read (tmp, length);
-
-          bool any = false;
-          if (excludeLength > 0)
-            {
-              uint8_t type = i.ReadU8 ();
-              if (type != ExcludeAnyType)
-                {
-                  i.Prev ();
-                }
-              else
-                {
-                  any = true;
-                  excludeLength --;
-                }
-            }
-
-          exclude->appendExclude (name::Component (tmp, length), any);
-        }
-      else
-        {
-          NS_FATAL_ERROR ("Incorrect format of Exclude filter");
-        }
-    }
-  return exclude;
-}
-
-
-} // wire
-
-NDN_NAMESPACE_END
diff --git a/model/wire/ndnsim/wire-ndnsim.h b/model/wire/ndnsim/wire-ndnsim.h
deleted file mode 100644
index 4ddfb3e..0000000
--- a/model/wire/ndnsim/wire-ndnsim.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/** -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/* 
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- * 
- * GNU 3.0 license, See the LICENSE file for more information
- * 
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_WIRE_NDNSIM_SYNTAX_H
-#define NDN_WIRE_NDNSIM_SYNTAX_H
-
-#include "ns3/ptr.h"
-#include "ns3/nstime.h"
-#include "ns3/buffer.h"
-
-#include "ns3/ndn-common.h"
-#include "ns3/ndnSIM/ndn.cxx/name.h"
-#include "ns3/ndnSIM/ndn.cxx/exclude.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace wire {
-
-/**
- * \brief Helper to encode ndnSIM wire elements
- */
-class NdnSim
-{
-public:
-  /**
-   * @brief Append Name in ndnSIM encoding
-   * @param start Buffer to store serialized Interest
-   * @param name constant reference to Name object
-   *
-   * @returns written length
-   */
-  static size_t
-  SerializeName (Buffer::Iterator &start, const Name &name);
-
-  /**
-   * @brief Estimate size of Name in ndnSIM encoding
-   * @param name constant reference to Name object
-   * @returns estimated length
-   */
-  static size_t
-  SerializedSizeName (const Name &name);
-
-  /**
-   * @brief Deserialize Name from ndnSIM encodeing
-   * @param start Buffer that stores serialized Interest
-   * @param name Name object
-   */
-  static Ptr<Name>
-  DeserializeName (Buffer::Iterator &start);
-
-
-  enum Selectors {
-    SelectorExclude = 0x01
-  };
-
-  enum ExcludeTypes {
-    ExcludeNameType = 0x01,
-    ExcludeAnyType = 0x02
-  };
-  
-  /**
-   * @brief Append Exclude in ndnSIM encoding
-   * @param start Buffer to store serialized Interest
-   * @param exclude constant reference to Exclude object
-   *
-   * @returns written length
-   */
-  static size_t
-  SerializeExclude (Buffer::Iterator &start, const Exclude &exclude);
-
-  /**
-   * @brief Estimate size of Exclude in ndnSIM encoding
-   * @param exclude constant reference to Exclude object
-   * @returns estimated length
-   */
-  static size_t
-  SerializedSizeExclude (const Exclude &exclude);
-
-  /**
-   * @brief Deserialize Exclude from ndnSIM encodeing
-   * @param start Buffer that stores serialized Interest
-   * @param exclude Exclude object
-   */
-  static Ptr<Exclude>
-  DeserializeExclude (Buffer::Iterator &start);
-}; // NdnSim
-
-} // wire
-
-NDN_NAMESPACE_END
-
-#endif // NDN_WIRE_NDNSIM_SYNTAX_H
diff --git a/ndn.cxx/blob.h b/ndn.cxx/blob.h
deleted file mode 100644
index 1b1aa2d..0000000
--- a/ndn.cxx/blob.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_BLOB_H
-#define NDN_BLOB_H
-
-#include "ns3/ndn-common.h"
-
-#include <vector>
-
-NDN_NAMESPACE_BEGIN
-
-/**
- * @ingroup ndn-cxx
- * @brief Class representing a general-use binary blob
- */
-class Blob
-{
-public:
-  typedef std::vector<char> base;
-  
-  typedef base::value_type             value_type;
-  typedef base::pointer                pointer;
-  typedef base::const_pointer          const_pointer;
-  typedef base::reference              reference;
-  typedef base::const_reference        const_reference;
-  typedef base::iterator               iterator;
-  typedef base::const_iterator         const_iterator;
-  typedef base::const_reverse_iterator const_reverse_iterator;
-  typedef base::reverse_iterator       reverse_iterator;
-  typedef base::size_type              size_type;
-  typedef base::difference_type        difference_type;
-  typedef base::allocator_type         allocator_type;
-  
-public:
-  /**
-   * @brief Creates an empty blob
-   */
-  Blob ()
-  {
-  }
-
-  Blob (const std::string &data)
-    : m_data (data.begin (), data.end ())
-  {
-  }
-
-  Blob (const void *buf, size_t length)
-    : m_data (reinterpret_cast<const char*> (buf), reinterpret_cast<const char*> (buf) + length)
-  {
-  }
-  
-  /**
-   * @brief Get pointer to the first byte of the binary blob
-   */
-  inline char*
-  buf ()
-  {
-    return &m_data.front ();
-  }
-
-  /**
-   * @brief Get const pointer to the first byte of the binary blob
-   */
-  inline const char*
-  buf () const
-  {
-    return &m_data.front ();
-  }
-
-  iterator begin () { return m_data.begin (); }
-  const_iterator begin () const { return m_data.begin (); }
-  iterator end () { return m_data.end (); }
-  const_iterator end () const { return m_data.end (); }
-  size_t size () const { return m_data.size (); }
-
-  void swap (Blob &x) { m_data.swap (x.m_data); }
-  void push_back (value_type val) { m_data.push_back (val); }
-
-  bool empty () const { return m_data.empty (); }
-
-  Blob &
-  operator = (const Blob &other) { m_data = other.m_data; return *this; }
-
-  reference operator [] (size_type pos) { return m_data [pos]; }
-  const_reference operator [] (size_type pos) const { return m_data [pos]; }
-
-  char getItem (size_type pos) const { return m_data [pos]; }
-
-  void clear () { m_data.clear (); }
-
-private:
-  friend bool operator == (const Blob &a, const Blob &b);
-  friend bool operator <  (const Blob &a, const Blob &b);
-  friend bool operator <= (const Blob &a, const Blob &b);
-  friend bool operator >  (const Blob &a, const Blob &b);
-  friend bool operator >= (const Blob &a, const Blob &b);
-
-private:
-  std::vector< char > m_data;
-};
-
-inline bool operator == (const Blob &a, const Blob &b)  { return a.m_data == b.m_data; }
-inline bool operator <  (const Blob &a, const Blob &b)  { return a.m_data <  b.m_data; }
-inline bool operator <= (const Blob &a, const Blob &b)  { return a.m_data <= b.m_data; }
-inline bool operator >  (const Blob &a, const Blob &b)  { return a.m_data >  b.m_data; }
-inline bool operator >= (const Blob &a, const Blob &b)  { return a.m_data >= b.m_data; }
-
-NDN_NAMESPACE_END
-
-#include <boost/functional/hash.hpp>
-namespace boost
-{
-inline std::size_t
-hash_value (const ns3::ndn::Blob v)
-{
-  return boost::hash_range (v.begin(), v.end());
-}
-}
-
-#endif // NDN_BLOB_H
diff --git a/ndn.cxx/detail/error.h b/ndn.cxx/detail/error.h
deleted file mode 100644
index db6b751..0000000
--- a/ndn.cxx/detail/error.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-/**
- * @file error.h
- * @brief This file defines basic elements for the library reporting
- *
- * The library throws a number of exceptions.
- * In general, the following example shows how to print out diagnostic information
- * when one of the exceptions is thrown
- * @code
- *     try
- *       {
- *         ... operations with ndn::Name
- *       }
- *     catch (boost::exception &e)
- *       {
- *         std::cerr << boost::diagnostic_information (e) << std::endl;
- *       }
- * @endcode
- */
-
-#ifndef NDN_ERROR2_H
-#define NDN_ERROR2_H
-
-#include "ns3/ndn-common.h"
-#include <boost/exception/all.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-/**
- * @ingroup ndn-cxx
- * @brief Namespace holding all errors from NDN.cxx API
- */
-namespace error
-{
-
-struct Error           : public virtual boost::exception, public virtual std::exception {}; ///< @brief Some error with error reporting engine
-struct Uri             : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with URI processing
-struct StringTransform : public virtual boost::exception, public virtual std::exception {};
-struct Name            : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with Name
-namespace name {
-struct Component       : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with name::Component
-}
-struct Exclude         : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with Exclude
-struct KeyLocator      : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with KeyLocator
-namespace wire {
-struct Ccnb            : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with wire::Ccnb encoding
-}
-struct Keychain        : public virtual boost::exception, public virtual std::exception {}; ///< @brief An error with security::Keychain
-
-// Diagnostic information fields
-
-/**
- * @brief Free-formatted text message explaining the error
- *
- * @code
- * ...
- * catch (boost::exception &e)
- * {
- *     if (const std::string *error = boost::get_error_info<error::msg> (e))
- *          ...
- * }
- * @endcode
- *
- * @see get_msg
- */
-typedef boost::error_info<struct tag_msg, std::string> msg;
-
-/**
- * @brief Helper method to get error message from the exception
- *
- * Method assumes that message is present, if not, an exception will be thrown
- */
-inline const std::string &
-get_msg (boost::exception &e)
-{
-  const std::string *error = boost::get_error_info<msg> (e);
-  if (error == 0)
-    BOOST_THROW_EXCEPTION (Error ());
-  return *error;
-}
-
-/**
- * @brief Report of the position of the error (error-specific meaning)
- *
- * @code
- * ...
- * catch (boost::exception &e)
- * {
- *     if (const int *error = boost::get_error_info<error::pos> (e))
- *          ...
- * }
- * @endcode
- *
- * @see get_pos
- */
-typedef boost::error_info<struct tag_pos, int> pos;
-
-/**
- * @brief Helper method to get position of the error from the exception
- *
- * Method assumes that position is present, if not, an exception will be thrown
- */
-inline int
-get_pos (boost::exception &e)
-{
-  const int *position = boost::get_error_info<pos> (e);
-  if (position == 0)
-    BOOST_THROW_EXCEPTION (Error ());
-  return *position;
-}
-
-} // error
-
-NDN_NAMESPACE_END
-
-#endif // NDN_ERROR2_H
diff --git a/ndn.cxx/detail/pending-interests-container.h b/ndn.cxx/detail/pending-interests-container.h
deleted file mode 100644
index b790864..0000000
--- a/ndn.cxx/detail/pending-interests-container.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_NDNCXX_DETAIL_PENDING_INTEREST_CONTAINER_H
-#define NDN_NDNCXX_DETAIL_PENDING_INTEREST_CONTAINER_H
-
-#include <ns3/ndnSIM/utils/trie/trie-with-policy.h>
-#include "timeouts-policy.h"
-
-namespace ns3 {
-namespace ndn {
-namespace detail {
-
-struct PendingInterestEntry : public SimpleRefCount< PendingInterestEntry >
-{
-public:
-  PendingInterestEntry (Ptr<const Interest> interest)
-    : m_interest (interest)
-  {
-  }
-
-  virtual ~PendingInterestEntry ()
-  {
-  }
-
-  void
-  AddCallbacks (ApiFace::DataCallback onData, ApiFace::TimeoutCallback onTimeout)
-  { 
-    if (! onData.IsNull ())
-      {
-         m_dataCallbacks.push_back (onData);
-      }
-    if (! onTimeout.IsNull ())
-      {
-         m_timeoutCallbacks.push_back (onTimeout);
-      }
-  }
-
-  void
-  ClearCallbacks ()
-  {
-    m_dataCallbacks.clear ();
-    m_timeoutCallbacks.clear ();
-  }
-
-  Ptr<const Interest>
-  GetInterest () const
-  {
-    return m_interest;
-  }
-
-  void
-  ProcessOnData (Ptr<const Interest> interest, Ptr<const Data> data)
-  {
-    for (std::list<ApiFace::DataCallback>::iterator i = m_dataCallbacks.begin ();
-         i != m_dataCallbacks.end ();
-         i++)
-      {
-        (*i) (interest, data);
-      }
-  }
-
-  void
-  ProcessOnTimeout (Ptr<const Interest> interest)
-  {
-    for (std::list<ApiFace::TimeoutCallback>::iterator i = m_timeoutCallbacks.begin ();
-         i != m_timeoutCallbacks.end ();
-         i++)
-      {
-        (*i) (interest);
-      }
-  }
-  
-private:
-  std::list<ApiFace::DataCallback> m_dataCallbacks;
-  std::list<ApiFace::TimeoutCallback> m_timeoutCallbacks;
-  Ptr<const Interest> m_interest;
-};
-
-
-struct PendingInterestContainer :
-    public ndnSIM::trie_with_policy<Name,
-                                    ndnSIM::smart_pointer_payload_traits< PendingInterestEntry >,
-                                    timeouts_policy_traits>
-{
-};
-
-} // detail
-} // ndn
-} // ns3
-
-#endif // NDN_NDNCXX_DETAIL_PENDING_INTEREST_CONTAINER_H
diff --git a/ndn.cxx/detail/registered-prefix-container.h b/ndn.cxx/detail/registered-prefix-container.h
deleted file mode 100644
index 2e6c151..0000000
--- a/ndn.cxx/detail/registered-prefix-container.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_NDNCXX_DETAIL_REGISTERED_PREFIX_CONTAINER_H
-#define NDN_NDNCXX_DETAIL_REGISTERED_PREFIX_CONTAINER_H
-
-#include <ns3/ndnSIM/utils/trie/trie-with-policy.h>
-#include <ns3/ndnSIM/utils/trie/counting-policy.h>
-
-namespace ns3 {
-namespace ndn {
-namespace detail {
-
-struct RegisteredPrefixEntry : public SimpleRefCount< RegisteredPrefixEntry >
-{
-public:
-  RegisteredPrefixEntry (Ptr<const Name> prefix)
-    : m_prefix (prefix)
-  { }
-  
-  void
-  AddCallback (ApiFace::InterestCallback callback)
-  { 
-    m_callback = callback;
-  }
-
-  void
-  ClearCallback ()
-  {
-    m_callback = ApiFace::InterestCallback ();
-  }
-
-  Ptr<const Name>
-  GetPrefix () const
-  {
-    return m_prefix;
-  }
-  
-public:
-  ApiFace::InterestCallback m_callback;
-  Ptr<const Name> m_prefix;
-};
-
-
-struct RegisteredPrefixContainer :
-    public ndnSIM::trie_with_policy<Name,
-                                    ndnSIM::smart_pointer_payload_traits< RegisteredPrefixEntry >,
-                                    ndnSIM::counting_policy_traits>
-{
-};
-
-} // detail
-} // ndn
-} // ns3
-
-#endif // NDN_NDNCXX_DETAIL_REGISTERED_PREFIX_CONTAINER_H
diff --git a/ndn.cxx/detail/timeouts-policy.h b/ndn.cxx/detail/timeouts-policy.h
deleted file mode 100644
index 7d94be1..0000000
--- a/ndn.cxx/detail/timeouts-policy.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_NDNCXX_DETAIL_TIMEOUTS_POLICY_H_
-#define NDN_NDNCXX_DETAIL_TIMEOUTS_POLICY_H_
-
-#include <boost/intrusive/options.hpp>
-#include <boost/intrusive/list.hpp>
-
-#include <ns3/nstime.h>
-#include <ns3/simulator.h>
-
-namespace ns3 {
-namespace ndn {
-namespace detail {
-
-/**
- * @brief Traits for timeouts policy
- */
-struct timeouts_policy_traits
-{
-  /// @brief Name that can be used to identify the policy (for NS-3 object model and logging)
-  static std::string GetName () { return "Timeouts"; }
-
-  struct policy_hook_type : public boost::intrusive::set_member_hook<> { Time timeWhenShouldExpire; };
-
-  template<class Container>
-  struct container_hook
-  {
-    typedef boost::intrusive::member_hook< Container,
-                                           policy_hook_type,
-                                           &Container::policy_hook_ > type;
-  };
-
-  template<class Base,
-           class Container,
-           class Hook>
-  struct policy
-  {
-    static Time& get_timeout (typename Container::iterator item)
-    {
-      return static_cast<typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
-    }
-
-    static const Time& get_timeout (typename Container::const_iterator item)
-    {
-      return static_cast<const typename policy_container::value_traits::hook_type*>
-        (policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
-    }
-
-    template<class Key>
-    struct MemberHookLess
-    {
-      bool operator () (const Key &a, const Key &b) const
-      {
-        return get_timeout (&a) < get_timeout (&b);
-      }
-    };
-
-    typedef boost::intrusive::multiset< Container,
-                                        boost::intrusive::compare< MemberHookLess< Container > >,
-                                        Hook > policy_container;
-
-
-    class type : public policy_container
-    {
-    public:
-      typedef policy policy_base; // to get access to get_timeout methods from outside
-      typedef Container parent_trie;
-
-      type (Base &base)
-        : m_base (base)
-      {
-      }
-
-      inline void
-      update (typename parent_trie::iterator item)
-      {
-        // do nothing
-      }
-
-      inline bool
-      insert (typename parent_trie::iterator item)
-      {
-        Time timeout = item->payload ()->GetInterest ()->GetInterestLifetime ();
-        if (timeout.IsZero ()) timeout = Seconds (4.0);
-        
-        get_timeout (item) = Simulator::Now () + timeout;
-        policy_container::insert (*item);
-
-        if (policy_container::s_iterator_to (*item) == policy_container::begin ())
-          {
-            if (m_timeoutEvent.IsRunning ())
-              {
-                Simulator::Remove (m_timeoutEvent); // just canceling would not clean up list of events
-              }
-
-            m_timeoutEvent = Simulator::Schedule (timeout, &type::ProcessTimeoutEntry, this, item);
-          }
-        
-        return true;
-      }
-
-      inline void
-      lookup (typename parent_trie::iterator item)
-      {
-        // do nothing. it's random policy
-      }
-
-      inline void
-      erase (typename parent_trie::iterator item)
-      {
-        bool needRescheduling = false;
-        if (policy_container::s_iterator_to (*item) == policy_container::begin ())
-          {
-            if (m_timeoutEvent.IsRunning ())
-              {
-                Simulator::Remove (m_timeoutEvent); // just canceling would not clean up list of events
-              }
-            needRescheduling = true;
-          }
-
-        // erase only if freshness is non zero (otherwise an item is not in the policy
-        policy_container::erase (policy_container::s_iterator_to (*item));
-
-        if (needRescheduling && !policy_container::empty ())
-          {
-            Time timeout = get_timeout (&*policy_container::begin ()) - Simulator::Now ();
-            m_timeoutEvent = Simulator::Schedule (timeout, &type::ProcessTimeoutEntry, this, &*policy_container::begin ());
-          }
-      }
-
-      inline void
-      clear ()
-      {
-        policy_container::clear ();
-      }
-
-      inline void
-      ProcessTimeoutEntry (typename parent_trie::iterator item)
-      {
-        item->payload ()->ProcessOnTimeout (item->payload ()->GetInterest ());
-
-        m_base.erase (item);
-      }
-
-    private:
-      type () : m_base (*((Base*)0)) { };
-
-    private:
-      Base &m_base;
-      EventId m_timeoutEvent;
-    };
-  };
-};
-
-} // detail
-} // ndn
-} // ns3
-
-#endif // NDN_NDNCXX_DETAIL_TIMEOUTS_STATS_POLICY_H
diff --git a/ndn.cxx/detail/uri.h b/ndn.cxx/detail/uri.h
deleted file mode 100644
index ae3844e..0000000
--- a/ndn.cxx/detail/uri.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_DETAIL_URI_H
-#define NDN_DETAIL_URI_H
-
-#include "ns3/ndn-common.h"
-
-#include "error.h"
-
-#include <boost/archive/iterators/transform_width.hpp>
-#include <boost/iterator/transform_iterator.hpp>
-
-NDN_NAMESPACE_BEGIN
-
-namespace detail
-{
-
-static const bool ESCAPE_CHARACTER [256] = {
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 26
-  1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 53
-  0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 107
-  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 134
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 161
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 188
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 215
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 242
-  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 255
-};
-
-/// @cond include_hidden
-template<class CharType>
-struct hex_from_4_bit
-{
-  typedef CharType result_type;
-  CharType operator () (CharType ch) const
-  {
-    const char lookup_table [16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
-    // cout << "New character: " << (int) ch << " (" << (char) ch << ")" << "\n";
-    BOOST_ASSERT (ch < 16);
-    return lookup_table[static_cast<size_t>(ch)];
-  }
-};
-
-typedef boost::transform_iterator<hex_from_4_bit<std::string::const_iterator::value_type>,
-                                  boost::archive::iterators::transform_width<std::string::const_iterator, 4, 8, std::string::const_iterator::value_type> > string_from_binary;
-
-
-
-template<class CharType>
-struct hex_to_4_bit
-{
-  typedef CharType result_type;
-  CharType operator () (CharType ch) const
-  {
-    const signed char lookup_table [] = {
-      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
-      -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-    };
-
-    signed char value = -1;
-    if ((unsigned)ch < 128)
-      value = lookup_table [(unsigned)ch];
-    if (value == -1)
-      boost::throw_exception (error::StringTransform ());
-
-    return value;
-  }
-};
-
-typedef boost::archive::iterators::transform_width<boost::transform_iterator<hex_to_4_bit<std::string::const_iterator::value_type>, std::string::const_iterator>, 8, 4> string_to_binary;
-/// @endcond
-
-} // detail
-
-/**
- * @brief A helper class to convert to/from URI
- */
-class Uri
-{
-public:
-  template<class Iterator1, class Iterator2>
-  inline static void
-  fromEscaped (Iterator1 begin, Iterator1 end, Iterator2 inserter)
-  {
-    Iterator1 i = begin;
-    while (i != end)
-      {
-        if (*i == '%')
-          {
-            try
-              {
-                ++i;
-                Iterator1 j = i;
-                advance (i, 2);
-              
-                std::copy (detail::string_to_binary (j), detail::string_to_binary (i), inserter);
-              }
-            catch (ndn::error::StringTransform &e)
-              {
-                BOOST_THROW_EXCEPTION (error::Uri ()
-                                       << error::pos (std::distance (i, begin)));
-              }
-          }
-        else if (!detail::ESCAPE_CHARACTER[static_cast<unsigned char> (*i)])
-          {
-            *inserter = *i;
-            ++inserter; ++i;
-          }
-        else
-          {
-            BOOST_THROW_EXCEPTION (error::Uri ()
-                                   << error::pos (std::distance (i, begin)));
-          }
-      }
-  }
-
-  template<class Iterator1, class Iterator2>
-  inline static void
-  toEscaped (Iterator1 begin, Iterator1 end, Iterator2 inserter)
-  {
-    const char lookup_table [16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
-    
-    for (Iterator1 i = begin; i != end; i++)
-      {
-        if (detail::ESCAPE_CHARACTER[static_cast<unsigned char> (*i)])
-          {
-            *inserter = '%';         ++inserter;
-            *inserter = lookup_table [(*i >> 4) & 0x0F]; ++inserter;
-            *inserter = lookup_table [(*i & 0x0F)];      ++inserter;
-          }
-        else
-          {
-            *inserter = *i; ++inserter;
-          }
-      }
-  }
-};
-
-NDN_NAMESPACE_END
-
-#endif // NDN_DETAIL_URI_H
diff --git a/ndn.cxx/exclude.cc b/ndn.cxx/exclude.cc
deleted file mode 100644
index f8137eb..0000000
--- a/ndn.cxx/exclude.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "exclude.h"
-
-#include "detail/error.h"
-
-NDN_NAMESPACE_BEGIN
-
-Exclude::Exclude ()
-{
-}
-
-// example: ANY /b /d ANY /f
-//
-// ordered in map as:
-//
-// /f (false); /d (true); /b (false); / (true)
-//
-// lower_bound (/)  -> / (true) <-- excluded (equal)
-// lower_bound (/a) -> / (true) <-- excluded (any)
-// lower_bound (/b) -> /b (false) <--- excluded (equal)
-// lower_bound (/c) -> /b (false) <--- not excluded (not equal and no ANY)
-// lower_bound (/d) -> /d (true) <- excluded
-// lower_bound (/e) -> /d (true) <- excluded
-bool
-Exclude::isExcluded (const name::Component &comp) const
-{
-  const_iterator lowerBound = m_exclude.lower_bound (comp);
-  if (lowerBound == end ())
-    return false;
-
-  if (lowerBound->second)
-    return true;
-  else
-    return lowerBound->first == comp;
-
-  return false;
-}
-
-Exclude &
-Exclude::excludeOne (const name::Component &comp)
-{
-  if (!isExcluded (comp))
-    {
-      m_exclude.insert (std::make_pair (comp, false));
-    }
-  return *this;
-}
-
-
-// example: ANY /b0 /d0 ANY /f0
-//
-// ordered in map as:
-//
-// /f0 (false); /d0 (true); /b0 (false); / (true)
-//
-// lower_bound (/)  -> / (true) <-- excluded (equal)
-// lower_bound (/a0) -> / (true) <-- excluded (any)
-// lower_bound (/b0) -> /b0 (false) <--- excluded (equal)
-// lower_bound (/c0) -> /b0 (false) <--- not excluded (not equal and no ANY)
-// lower_bound (/d0) -> /d0 (true) <- excluded
-// lower_bound (/e0) -> /d0 (true) <- excluded
-
-
-// examples with desired outcomes
-// excludeRange (/, /f0) ->  ANY /f0
-//                          /f0 (false); / (true)
-// excludeRange (/, /f1) ->  ANY /f1
-//                          /f1 (false); / (true)
-// excludeRange (/a0, /e0) ->  ANY /f0
-//                          /f0 (false); / (true)
-// excludeRange (/a0, /e0) ->  ANY /f0
-//                          /f0 (false); / (true)
-
-// excludeRange (/b1, /c0) ->  ANY /b0 /b1 ANY /c0 /d0 ANY /f0
-//                          /f0 (false); /d0 (true); /c0 (false); /b1 (true); /b0 (false); / (true)
-
-Exclude &
-Exclude::excludeRange (const name::Component &from, const name::Component &to)
-{
-  if (from >= to)
-    {
-      BOOST_THROW_EXCEPTION (error::Exclude ()
-                             << error::msg ("Invalid exclude range (for single name exclude use Exclude::excludeOne)")
-                             << error::msg (from.toUri ())
-                             << error::msg (to.toUri ()));
-    }
-
-  iterator newFrom = m_exclude.lower_bound (from);
-  if (newFrom == end () || !newFrom->second /*without ANY*/)
-    {
-      std::pair<iterator, bool> fromResult = m_exclude.insert (std::make_pair (from, true));
-      newFrom = fromResult.first;
-      if (!fromResult.second)
-        {
-          // this means that the lower bound is equal to the item itself. So, just update ANY flag
-          newFrom->second = true;
-        }
-    }
-  // else
-  // nothing special if start of the range already exists with ANY flag set
-
-  iterator newTo = m_exclude.lower_bound (to); // !newTo cannot be end ()
-  if (newTo == newFrom || !newTo->second)
-    {
-      std::pair<iterator, bool> toResult = m_exclude.insert (std::make_pair (to, false));
-      newTo = toResult.first;
-      ++ newTo;
-    }
-  else
-    {
-      // nothing to do really
-    }
-
-  m_exclude.erase (newTo, newFrom); // remove any intermediate node, since all of the are excluded
-
-  return *this;
-}
-
-Exclude &
-Exclude::excludeAfter (const name::Component &from)
-{
-  iterator newFrom = m_exclude.lower_bound (from);
-  if (newFrom == end () || !newFrom->second /*without ANY*/)
-    {
-      std::pair<iterator, bool> fromResult = m_exclude.insert (std::make_pair (from, true));
-      newFrom = fromResult.first;
-      if (!fromResult.second)
-        {
-          // this means that the lower bound is equal to the item itself. So, just update ANY flag
-          newFrom->second = true;
-        }
-    }
-  // else
-  // nothing special if start of the range already exists with ANY flag set
-
-  if (newFrom != m_exclude.begin ())
-    {
-      m_exclude.erase (m_exclude.begin (), newFrom); // remove any intermediate node, since all of the are excluded
-    }
-
-  return *this;
-}
-
-void
-Exclude::appendExclude (const name::Component &name, bool any)
-{
-  m_exclude.insert (std::make_pair (name, any));
-}
-
-std::ostream&
-operator << (std::ostream &os, const Exclude &exclude)
-{
-  for (Exclude::const_reverse_iterator i = exclude.rbegin (); i != exclude.rend (); i++)
-    {
-      os << i->first.toUri () << " ";
-      if (i->second)
-        os << "----> ";
-    }
-  return os;
-}
-
-NDN_NAMESPACE_END
diff --git a/ndn.cxx/exclude.h b/ndn.cxx/exclude.h
deleted file mode 100644
index fcdcbb3..0000000
--- a/ndn.cxx/exclude.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_EXCLUDE_H
-#define NDN_EXCLUDE_H
-
-#include <ns3/simple-ref-count.h>
-
-#include "name-component.h"
-#include <map>
-
-NDN_NAMESPACE_BEGIN
-
-/**
- * @ingroup ndn-cxx
- * @brief Class to represent Exclude component in NDN interests
- */
-class Exclude : public SimpleRefCount<Exclude>
-{
-public:
-  typedef std::map< name::Component, bool /*any*/, std::greater<name::Component> > exclude_type;
-
-  typedef exclude_type::iterator iterator;
-  typedef exclude_type::const_iterator const_iterator;
-  typedef exclude_type::reverse_iterator reverse_iterator;
-  typedef exclude_type::const_reverse_iterator const_reverse_iterator;
-
-  /**
-   * @brief Default constructor an empty exclude
-   */
-  Exclude ();
-
-  // no need for explicit copy constructor
-
-  /**
-   * @brief Check if name component is excluded
-   * @param comp Name component to check against exclude filter
-   */
-  bool
-  isExcluded (const name::Component &comp) const;
-
-  /**
-   * @brief Exclude specific name component
-   * @param comp component to exclude
-   * @returns *this to allow chaining
-   */
-  Exclude &
-  excludeOne (const name::Component &comp);
-
-  /**
-   * @brief Exclude components from range [from, to]
-   * @param from first element of the range
-   * @param to last element of the range
-   * @returns *this to allow chaining
-   */
-  Exclude &
-  excludeRange (const name::Component &from, const name::Component &to);
-
-  /**
-   * @brief Exclude all components from range [/, to]
-   * @param to last element of the range
-   * @returns *this to allow chaining
-   */
-  inline Exclude &
-  excludeBefore (const name::Component &to);
-
-  /**
-   * @brief Exclude all components from range [from, +Inf]
-   * @param to last element of the range
-   * @returns *this to allow chaining
-   */
-  Exclude &
-  excludeAfter (const name::Component &from);
-
-  /**
-   * @brief Method to directly append exclude element
-   * @param name excluded name component
-   * @param any  flag indicating if there is a postfix ANY component after the name
-   *
-   * This method is used during conversion from wire format of exclude filter
-   *
-   * If there is an error with ranges (e.g., order of components is wrong) an exception is thrown
-   */
-  void
-  appendExclude (const name::Component &name, bool any);
-
-  /**
-   * @brief Get number of exclude terms
-   */
-  inline size_t
-  size () const;
-
-  /**
-   * @brief Get begin iterator of the exclude terms
-   */
-  inline const_iterator
-  begin () const;
-
-  /**
-   * @brief Get end iterator of the exclude terms
-   */
-  inline const_iterator
-  end () const;
-
-  /**
-   * @brief Get begin iterator of the exclude terms
-   */
-  inline const_reverse_iterator
-  rbegin () const;
-
-  /**
-   * @brief Get end iterator of the exclude terms
-   */
-  inline const_reverse_iterator
-  rend () const;
-
-private:
-  Exclude &
-  excludeRange (iterator fromLowerBound, iterator toLowerBound);
-
-private:
-  exclude_type m_exclude;
-};
-
-std::ostream&
-operator << (std::ostream &os, const Exclude &name);
-
-inline Exclude &
-Exclude::excludeBefore (const name::Component &to)
-{
-  return excludeRange (name::Component (), to);
-}
-
-inline size_t
-Exclude::size () const
-{
-  return m_exclude.size ();
-}
-
-inline Exclude::const_iterator
-Exclude::begin () const
-{
-  return m_exclude.begin ();
-}
-
-inline Exclude::const_iterator
-Exclude::end () const
-{
-  return m_exclude.end ();
-}
-
-inline Exclude::const_reverse_iterator
-Exclude::rbegin () const
-{
-  return m_exclude.rbegin ();
-}
-
-inline Exclude::const_reverse_iterator
-Exclude::rend () const
-{
-  return m_exclude.rend ();
-}
-
-NDN_NAMESPACE_END
-
-#endif // NDN_EXCLUDE_H
diff --git a/ndn.cxx/name-component.cc b/ndn.cxx/name-component.cc
deleted file mode 100644
index d889a76..0000000
--- a/ndn.cxx/name-component.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#if __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wreorder"
-#elif __GNUC__
-#pragma GCC diagnostic ignored "-Wreorder"
-#endif
-
-#include "name-component.h"
-
-#include "detail/error.h"
-#include "detail/uri.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace name {
-
-Component::Component ()
-{
-}
-
-Component::Component (const std::string &uri)
-{
-  copy (uri.begin (), uri.end (), std::back_inserter (*this));
-}
-
-Component::Component (std::string::const_iterator begin, std::string::const_iterator end)
-{
-  copy (begin, end, std::back_inserter (*this));
-}
-
-Component::Component (const void *buf, size_t length)
-{
-  copy (static_cast<const char*> (buf),
-        static_cast<const char*> (buf)+length,
-        std::back_inserter (*this));
-}
-
-Component &
-Component::fromUri (const std::string &uri)
-{
-  try
-    {
-      Uri::fromEscaped (uri.begin (), uri.end (), std::back_inserter (*this));
-    }
-  catch (error::Uri &err)
-    {
-      // re-throwing different exception
-      BOOST_THROW_EXCEPTION (error::name::Component ()
-                             << error::msg (uri)
-                             << error::pos (error::get_pos (err)));
-    }
-
-  return *this;
-}
-
-Component &
-Component::fromUri (std::string::const_iterator begin, std::string::const_iterator end)
-{
-  try
-    {
-      Uri::fromEscaped (begin, end, std::back_inserter (*this));
-    }
-  catch (error::Uri &err)
-    {
-      // re-throwing different exception
-      BOOST_THROW_EXCEPTION (error::name::Component ()
-                             << error::msg (std::string (begin, end))
-                             << error::pos (error::get_pos (err)));
-    }
-  return *this;
-}
-
-int
-Component::compare (const Component &other) const
-{
-  if (size () < other.size ())
-    return -1;
-
-  if (size () > other.size ())
-    return +1;
-
-  // now we know that sizes are equal
-
-  std::pair<const_iterator, const_iterator> diff = mismatch (begin (), end (), other.begin ());
-  if (diff.first == end ()) // components are actually equal
-    return 0;
-
-  return (std::lexicographical_compare (diff.first, end (), diff.second, other.end ())) ? -1 : +1;
-}
-
-Component &
-Component::fromNumber (uint64_t number)
-{
-  while (number > 0)
-    {
-      this->push_back (static_cast<unsigned char> (number & 0xFF));
-      number >>= 8;
-    }
-  std::reverse (this->begin (), this->end ());
-  return *this;
-}
-
-Component &
-Component::fromNumberWithMarker (uint64_t number, unsigned char marker)
-{
-  this->push_back (marker);
-
-  while (number > 0)
-    {
-      this->push_back (static_cast<unsigned char> (number & 0xFF));
-      number >>= 8;
-    }
-
-  std::reverse (this->begin () + 1, this->end ());
-  return *this;
-}
-
-std::string
-Component::toBlob () const
-{
-  return std::string (begin (), end ());
-}
-
-void
-Component::toBlob (std::ostream &os) const
-{
-  os.write (buf (), size ());
-}
-
-std::string
-Component::toUri () const
-{
-  std::ostringstream os;
-  toUri (os);
-  return os.str ();
-}
-
-void
-Component::toUri (std::ostream &os) const
-{
-  const uint8_t* valuePtr = reinterpret_cast<const uint8_t*>(buf());
-  size_t valueSize = size();
-
-  bool gotNonDot = false;
-  for (unsigned i = 0; i < valueSize; ++i) {
-    if (valuePtr[i] != 0x2e) {
-      gotNonDot = true;
-      break;
-    }
-  }
-  if (!gotNonDot) {
-    // Special case for component of zero or more periods.  Add 3 periods.
-    os << "...";
-    for (size_t i = 0; i < valueSize; ++i)
-      os << '.';
-  }
-  else {
-    // In case we need to escape, set to upper case hex and save the previous flags.
-    std::ios::fmtflags saveFlags = os.flags(std::ios::hex | std::ios::uppercase);
-
-    for (size_t i = 0; i < valueSize; ++i) {
-      uint8_t x = valuePtr[i];
-      // Check for 0-9, A-Z, a-z, (+), (-), (.), (_)
-      if ((x >= 0x30 && x <= 0x39) || (x >= 0x41 && x <= 0x5a) ||
-          (x >= 0x61 && x <= 0x7a) || x == 0x2b || x == 0x2d ||
-          x == 0x2e || x == 0x5f)
-        os << x;
-      else {
-        os << '%';
-        if (x < 16)
-          os << '0';
-        os << static_cast<unsigned int>(x);
-      }
-    }
-
-    // Restore.
-    os.flags(saveFlags);
-  }
-}
-
-uint64_t
-Component::toNumber () const
-{
-  uint64_t ret = 0;
-  for (const_iterator i = begin (); i != end (); i++)
-    {
-      ret <<= 8;
-      ret |= static_cast<unsigned char> (*i);
-    }
-  return ret;
-}
-
-uint64_t
-Component::toNumberWithMarker (unsigned char marker) const
-{
-  if (empty () ||
-      static_cast<unsigned char> (*(begin ())) != marker)
-    {
-      BOOST_THROW_EXCEPTION (error::name::Component ()
-                             << error::msg ("Name component does not have required marker [" + toUri () + "]"));
-    }
-
-  uint64_t ret = 0;
-  for (const_iterator i = begin () + 1; i != end (); i++)
-    {
-      ret <<= 8;
-      ret |= static_cast<unsigned char> (*i);
-    }
-  return ret;
-}
-
-} // name
-
-NDN_NAMESPACE_END
diff --git a/ndn.cxx/name-component.h b/ndn.cxx/name-component.h
deleted file mode 100644
index 0de0442..0000000
--- a/ndn.cxx/name-component.h
+++ /dev/null
@@ -1,301 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDN_NAME_COMPONENT_H
-#define NDN_NAME_COMPONENT_H
-
-#include "blob.h"
-
-NDN_NAMESPACE_BEGIN
-
-namespace name {
-
-/**
- * @ingroup ndn-cxx
- * @brief Class to representing binary blob of NDN name component
- *
- * This class is based on Blob (std::vector<char>) and just provides several helpers
- * to work with name components, as well as operator to apply canonical
- * ordering on name components
- */
-class Component : public Blob
-{
-public:
-  /**
-   * @brief Default constructor an empty exclude
-   */
-  Component ();
-
-  /**
-   * @brief Create component from URI encoded string
-   * @param uri URI encoded name component (convert escaped with % characters)
-   */
-  Component (const std::string &uri);
-
-  /**
-   * @brief Create component from URI encoded string, with string specified by a pair of iterators
-   * @param begin begin iterator pointing to the URI encoded name
-   * @param end end iterator
-   */
-  Component (std::string::const_iterator begin, std::string::const_iterator end);
-  
-  /**
-   * @brief Create component using a binary blob
-   * @param buf pointer to first byte of binary blob to store as a name component
-   * @param length length of the binary blob
-   */
-  Component (const void *buf, size_t length);
-
-  /**
-   * @brief Apply canonical ordering on component comparison
-   * @return 0  They compare equal
-   *         <0 If *this comes before other in the canonical ordering
-   *         >0 If *this comes after in the canonical ordering
-   *
-   * @see http://www.ccnx.org/releases/latest/doc/technical/CanonicalOrder.html
-   */
-  int
-  compare (const Component &other) const;
-  
-  /**
-   * @brief Apply canonical ordering on component comparison (less or equal)
-   *
-   * @see http://www.ccnx.org/releases/latest/doc/technical/CanonicalOrder.html
-   */
-  inline bool
-  operator <= (const Component &other) const;
-
-  /**
-   * @brief Apply canonical ordering on component comparison (less)
-   *
-   * @see http://www.ccnx.org/releases/latest/doc/technical/CanonicalOrder.html
-   */
-  inline bool
-  operator < (const Component &other) const;
-
-  /**
-   * @brief Apply canonical ordering on component comparison (greater or equal)
-   *
-   * @see http://www.ccnx.org/releases/latest/doc/technical/CanonicalOrder.html
-   */
-  inline bool
-  operator >= (const Component &other) const;
-
-  /**
-   * @brief Apply canonical ordering on component comparison (greater)
-   *
-   * @see http://www.ccnx.org/releases/latest/doc/technical/CanonicalOrder.html
-   */
-  inline bool
-  operator > (const Component &other) const;
-
-  ////////////////////////////////////
-  // Component construction helpers //
-  ////////////////////////////////////
-
-  /**
-   * @brief Create component from URI encoded string
-   * @param uri URI encoded name component (convert escaped with % characters)
-   * @return *this
-   */
-  Component &
-  fromUri (const std::string &uri);
-
-  /**
-   * @brief Create component from URI encoded string, with string specified by a pair of iterators
-   * @param begin begin iterator pointing to the URI encoded name
-   * @param end end iterator
-   * @return *this
-   */
-  Component &
-  fromUri (std::string::const_iterator begin, std::string::const_iterator end);
-  
-  /**
-   * @brief Create network-ordered numeric component
-   *
-   * @param number number to be encoded and added as a component
-   * @return *this
-   *
-   * Number is encoded and added in network order. Tail zero-bytes are not included.
-   * For example, if the number is 1, then 1-byte binary blob will be added  0x01.
-   * If the number is 256, then 2 binary blob will be added: 0x01 0x01
-   *
-   * If the number is zero, an empty component will be created
-   */
-  Component &
-  fromNumber (uint64_t number);
-
-  /**
-   * @brief Create network-ordered numeric component to the name with marker
-   *
-   * @param number number to be encoded and added as a component
-   * @param marker byte marker, specified by the desired naming convention
-   *
-   * Currently defined naming conventions of the marker:
-   * - 0x00  sequence number
-   * - 0xC1  control number
-   * - 0xFB  block id
-   * - 0xFD  version number
-   *
-   * This version is almost exactly as appendNumber, with exception that it adds initial marker.
-   * The number is formatted in the exactly the same way.
-   *
-   * @see fromNumber
-   */
-  Component &
-  fromNumberWithMarker (uint64_t number, unsigned char marker);
-  
-  //////////////////////////////////////////////////////////////////////////////////
-  // helpers
-  //////////////////////////////////////////////////////////////////////////////////
-  
-  /**
-   * @brief Convert binary blob name component to std::string (no conversion is made)
-   * @param comp name component to be converted
-   * @see asUriString
-   */  
-  std::string
-  toBlob () const;
-
-  /**
-   * @brief Write blob of the name component to the specified output stream
-   * @param os output stream
-   */
-  void
-  toBlob (std::ostream &os) const;
-
-  /**
-   * @brief Convert binary blob name component to std::string, escaping all non-printable characters in URI format
-   * @param comp name component to be converted
-   * @see asString
-   */
-  std::string
-  toUri () const;
-
-  /**
-   * @brief Write name as URI to the specified output stream
-   * @param os output stream
-   */
-  void
-  toUri (std::ostream &os) const;
-  
-  /**
-   * @brief Convert binary blob name component (network-ordered number) to number
-   * @param comp name component to be converted
-   */  
-  uint64_t
-  toNumber () const;
-
-  /**
-   * @brief Convert binary blob name component (network-ordered number) to number, using appropriate marker from the naming convention
-   * @param comp name component to be converted
-   * @param marker required marker from the naming convention
-   *
-   * If the required marker does not exist, an exception will be thrown
-   */  
-  uint64_t
-  toNumberWithMarker (unsigned char marker) const;
-
-  /**
-   * @brief Convert binary blob name component, assuming sequence number naming convention (marker = 0x00)
-   * @param comp name component to be converted
-   * @see asNumberWithMarker
-   */
-  inline uint64_t
-  toSeqNum () const;
-  
-  /**
-   * @brief Convert binary blob name component, assuming control number naming convention (marker = 0xC1)
-   * @param comp name component to be converted
-   * @see asNumberWithMarker
-   */
-  inline uint64_t
-  toControlNum () const;
-
-  /**
-   * @brief Convert binary blob name component, assuming block ID naming convention (marker = 0xFB)
-   * @param comp name component to be converted
-   * @see asNumberWithMarker
-   */
-  inline uint64_t
-  toBlkId () const;
-
-  /**
-   * @brief Convert binary blob name component, assuming time-stamping version naming convention (marker = 0xFD)
-   * @param comp name component to be converted
-   * @see asNumberWithMarker
-   */
-  inline uint64_t
-  toVersion () const;
-};
-
-bool
-Component::operator <= (const Component &other) const
-{
-  return (compare (other) <= 0);
-}
-
-bool
-Component::operator < (const Component &other) const
-{
-  return (compare (other) < 0);
-}
-
-bool
-Component::operator >= (const Component &other) const
-{
-  return (compare (other) >= 0);
-}
-
-bool
-Component::operator > (const Component &other) const
-{
-  return (compare (other) > 0);
-}
-
-inline uint64_t
-Component::toSeqNum () const
-{
-  return toNumberWithMarker (0x00);
-}
-  
-inline uint64_t
-Component::toControlNum () const
-{
-  return toNumberWithMarker (0xC1);
-}
-
-inline uint64_t
-Component::toBlkId () const
-{
-  return toNumberWithMarker (0xFB);
-}
-
-inline uint64_t
-Component::toVersion () const
-{
-  return toNumberWithMarker (0xFD);
-}
-
-/**
- * @brief Stream output operator (output in escaped URI format)
- */
-inline std::ostream&
-operator <<(std::ostream &os, const Component &name)
-{
-  name.toUri (os);
-  return os;
-}
-
-} // name
-
-NDN_NAMESPACE_END
-
-#endif // NDN_NAME_COMPONENT_H
diff --git a/ndn.cxx/name.cc b/ndn.cxx/name.cc
deleted file mode 100644
index c0a1a57..0000000
--- a/ndn.cxx/name.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
- */
-
-#include "name.h"
-
-#include "detail/error.h"
-#include <boost/algorithm/string.hpp>
-
-#include <ctype.h>
-
-using namespace std;
-
-NDN_NAMESPACE_BEGIN
-
-ATTRIBUTE_HELPER_CPP (Name);
-
-///////////////////////////////////////////////////////////////////////////////
-//                              CONSTRUCTORS                                 //
-///////////////////////////////////////////////////////////////////////////////
-
-Name::Name ()
-{
-}
-
-Name::Name (const string &uri)
-{ 
-  string::const_iterator i = uri.begin ();
-  string::const_iterator end = uri.end ();
-
-  string::const_iterator firstSlash = std::find (i, end, '/');
-  if (firstSlash == end)
-    {
-      BOOST_THROW_EXCEPTION (error::Name ()
-                             << error::msg ("Name should include at least one slash (did you forget to specify initial /?)"));
-    }
-
-  if (firstSlash != i)
-    {
-      string schema (i, firstSlash);
-      if (*schema.rbegin () != ':')
-        {
-          BOOST_THROW_EXCEPTION (error::Name ()
-                                 << error::msg ("First component of the name does not start with a slash (did you forget to specify initial /?)"));
-        }
-
-      i = firstSlash;
-
-      if (!boost::iequals (schema, "ccnx:") &&
-          !boost::iequals (schema, "ndn:"))
-        {
-          BOOST_THROW_EXCEPTION (error::Name ()
-                                 << error::msg ("URI schema is not supported (only ccnx: or ndn: is allowed)")
-                                 << error::msg (schema));
-        }
-    }
-
-  string::const_iterator secondSlash = i;
-  secondSlash ++;
-  if (secondSlash != end && *secondSlash == '/')
-    {
-      // The authority component (the part after the initial "//" in the familiar http and ftp URI schemes) is present,
-      // but it is not relevant to NDN name.
-      // skipping it
-      secondSlash ++;
-      i = std::find (secondSlash, end, '/');
-    }
-  
-  if (i == end)
-    {
-      BOOST_THROW_EXCEPTION (error::Name ()
-                             << error::msg ("Invalid URI")
-                             << error::msg (uri));
-    }
-
-  while (i != end)
-    {
-      // skip any extra slashes
-      while (i != end && *i == '/')
-        {
-          i ++;
-        }
-      if (i == end)
-        break;
-      
-      string::const_iterator endOfComponent = std::find (i, end, '/');
-      name::Component comp;
-      appendBySwap (comp.fromUri (i, endOfComponent));
-
-      i = endOfComponent;
-    }
-}
-
-Name::Name (const Name &other)
-{
-  m_comps = other.m_comps;
-}
-
-Name &
-Name::operator= (const Name &other)
-{
-  m_comps = other.m_comps;
-  return *this;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//                                SETTERS                                    //
-///////////////////////////////////////////////////////////////////////////////
-
-Name &
-Name::appendVersion (uint64_t version/* = Name::nversion*/)
-{
-  if (version != Name::nversion)
-    return appendNumberWithMarker (version, 0xFD);
-  else
-    {
-      TimeInterval now = time::NowUnixTimestamp ();
-#ifdef NDNSIM_MODE
-      int64_t seconds = now.GetSeconds ();
-      int64_t microseconds = now.GetMicroSeconds () - seconds * 1000000;
-      
-      version = (seconds << 12) | (0xFFF & (microseconds / 244 /*( 1000,000 microseconds / 4096.0 resolution = last 12 bits)*/));
-#else
-      version = (now.total_seconds () << 12) | (0xFFF & (now.fractional_seconds () / 244 /*( 1000,000 microseconds / 4096.0 resolution = last 12 bits)*/));
-#endif
-      return appendNumberWithMarker (version, 0xFD);
-    }
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-//                                GETTERS                                    //
-///////////////////////////////////////////////////////////////////////////////
-
-const name::Component &
-Name::get (int index) const
-{
-  if (index < 0)
-    {
-      index = size () - (-index);
-    }
-
-  if (static_cast<unsigned int> (index) >= size ())
-    {
-      BOOST_THROW_EXCEPTION (error::Name ()
-                             << error::msg ("Index out of range")
-                             << error::pos (index));
-    }
-  return m_comps [index];
-}
-
-name::Component &
-Name::get (int index)
-{
-  if (index < 0)
-    {
-      index = size () - (-index);
-    }
-
-  if (static_cast<unsigned int> (index) >= size())
-    {
-      BOOST_THROW_EXCEPTION (error::Name ()
-                             << error::msg ("Index out of range")
-                             << error::pos (index));
-    }
-  return m_comps [index];
-}
-
-
-/////
-///// Static helpers to convert name component to appropriate value
-/////
-
-
-Name
-Name::getSubName (size_t pos/* = 0*/, size_t len/* = Name::npos*/) const
-{
-  Name retval;
-
-  if (len == npos)
-    {
-      len = size () - pos;
-    }
-
-  if (pos + len > size ())
-    {
-      BOOST_THROW_EXCEPTION (error::Name ()
-                             << error::msg ("getSubName parameter out of range")
-                             << error::pos (pos)
-                             << error::pos (len));
-    }
-
-  for (size_t i = pos; i < pos + len; i++)
-    {
-      retval.append (get (i));
-    }
-
-  return retval;
-}
-
-Name
-Name::operator+ (const Name &name) const
-{
-  Name newName;
-  newName
-    .append (*this)
-    .append (name);
-
-  return newName;
-}
-
-std::string
-Name::toUri () const
-{
-  ostringstream os;
-  toUri (os);
-  return os.str ();
-}
-
-void
-Name::toUri (std::ostream &os) const
-{
-  for (Name::const_iterator comp = begin (); comp != end (); comp++)
-    {
-      os << "/";
-      comp->toUri (os);
-    }
-  if (size () == 0)
-    os << "/";
-}
-
-// ostream &
-// operator << (ostream &os, const Name &name)
-// {
-//   for (Name::const_iterator comp = name.begin (); comp != name.end (); comp++)
-//     {
-//       os << "/" << *comp;
-//     }
-//   if (name.size () == 0)
-//     os << "/";
-//   return os;
-// }
-
-int
-Name::compare (const Name &name) const
-{
-  Name::const_iterator i = this->begin ();
-  Name::const_iterator j = name.begin ();
-
-  for (; i != this->end () && j != name.end (); i++, j++)
-    {
-      int res = i->compare (*j);
-      if (res == 0)
-        continue;
-      else
-        return res;
-    }
-
-  if (i == this->end () && j == name.end ())
-    return 0; // prefixes are equal
-
-  return (i == this->end ()) ? -1 : +1;
-}
-
-NDN_NAMESPACE_END
diff --git a/ndn.cxx/name.h b/ndn.cxx/name.h
deleted file mode 100644
index 731202d..0000000
--- a/ndn.cxx/name.h
+++ /dev/null
@@ -1,649 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *                     Zhenkai Zhu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
- */
-
-#ifndef NDN_NAME_H
-#define NDN_NAME_H
-
-#include "ns3/ndn-common.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/attribute.h"
-#include "ns3/attribute-helper.h"
-
-#include "name-component.h"
-
-NDN_NAMESPACE_BEGIN
-
-/**
- * @ingroup ndn-cxx
- * @brief Class for NDN Name
- */
-class Name : public SimpleRefCount<Name>
-{
-public:
-  typedef std::vector<name::Component>::iterator iterator;
-  typedef std::vector<name::Component>::const_iterator const_iterator;
-  typedef std::vector<name::Component>::reverse_iterator reverse_iterator;
-  typedef std::vector<name::Component>::const_reverse_iterator const_reverse_iterator;
-  typedef std::vector<name::Component>::reference reference;
-  typedef std::vector<name::Component>::const_reference const_reference;
-
-  typedef name::Component partial_type;
-  
-  ///////////////////////////////////////////////////////////////////////////////
-  //                              CONSTRUCTORS                                 //
-  ///////////////////////////////////////////////////////////////////////////////
-
-  /**
-   * @brief Default constructor to create an empty name (zero components, or "/")
-   */
-  Name ();
-
-  /**
-   * @brief Copy constructor
-   *
-   * @param other reference to a NDN name object
-   */
-  Name (const Name &other);
-
-  /**
-   * @brief Create a name from URL string
-   *
-   * @param url URI-represented name
-   */
-  Name (const std::string &url);
-
-  /**
-   * @brief Create a name from a container of elements [begin, end)
-   *
-   * @param begin begin iterator of the container
-   * @param end end iterator of the container
-   */
-  template<class Iterator>
-  Name (Iterator begin, Iterator end);
-
-  /**
-   * @brief Assignment operator
-   */
-  Name &
-  operator= (const Name &other);
-
-
-  ///////////////////////////////////////////////////////////////////////////////
-  //                                SETTERS                                    //
-  ///////////////////////////////////////////////////////////////////////////////
-
-  /**
-   * @brief Append a binary blob as a name component
-   *
-   * @param comp a binary blob
-   * @returns reference to self (to allow chaining of append methods)
-   */
-  inline Name &
-  append (const name::Component &comp);
-
-  /**
-   * @brief Append a binary blob as a name component
-   * @param comp a binary blob
-   *
-   * This version is a little bit more efficient, since it swaps contents of comp and newly added component
-   *
-   * Attention!!! This method has an intended side effect: content of comp becomes empty
-   */
-  inline Name &
-  appendBySwap (name::Component &comp);
-  
-  /**
-   * @brief Append components a container of elements [begin, end)
-   *
-   * @param begin begin iterator of the container
-   * @param end end iterator of the container
-   * @returns reference to self (to allow chaining of append methods)
-   */
-  template<class Iterator>
-  inline Name &
-  append (Iterator begin, Iterator end);
-
-  /**
-   * @brief Append components from another ndn::Name object
-   *
-   * @param comp reference to Name object
-   * @returns reference to self (to allow chaining of append methods)
-   */
-  inline Name &
-  append (const Name &comp);
-
-  /**
-   * @brief Append a string as a name component
-   *
-   * @param compStr a string
-   * @returns reference to self (to allow chaining of append methods)
-   *
-   * No conversions will be done to the string.  The string is included in raw form,
-   * without any leading '\0' symbols.
-   */
-  inline Name &
-  append (const std::string &compStr);
-
-  /**
-   * @brief Append a binary blob as a name component
-   *
-   * @param buf pointer to the first byte of the binary blob
-   * @param size length of the binary blob
-   * @returns reference to self (to allow chaining of append methods)
-   */
-  inline Name &
-  append (const void *buf, size_t size);
-
-  /**
-   * @brief Append network-ordered numeric component to the name
-   *
-   * @param number number to be encoded and added as a component
-   *
-   * Number is encoded and added in network order. Tail zero-bytes are not included.
-   * For example, if the number is 1, then 1-byte binary blob will be added  0x01.
-   * If the number is 256, then 2 binary blob will be added: 0x01 0x01
-   *
-   * If the number is zero, an empty component will be added
-   */
-  inline Name &
-  appendNumber (uint64_t number);
-
-  /**
-   * @brief Append network-ordered numeric component to the name with marker
-   *
-   * @param number number to be encoded and added as a component
-   * @param marker byte marker, specified by the desired naming convention
-   *
-   * Currently defined naming conventions of the marker:
-   * - 0x00  sequence number
-   * - 0xC1  control number
-   * - 0xFB  block id
-   * - 0xFD  version number
-   *
-   * This version is almost exactly as appendNumber, with exception that it adds initial marker.
-   * The number is formatted in the exactly the same way.
-   *
-   * @see appendNumber
-   */
-  inline Name &
-  appendNumberWithMarker (uint64_t number, unsigned char marker);
-
-  /**
-   * @brief Helper method to add sequence number to the name (marker = 0x00)
-   * @param seqno sequence number
-   * @see appendNumberWithMarker
-   */
-  inline Name &
-  appendSeqNum (uint64_t seqno);
-
-  /**
-   * @brief Helper method to add control number to the name (marker = 0xC1)
-   * @param control control number
-   * @see appendNumberWithMarker
-   */
-  inline Name &
-  appendControlNum (uint64_t control);
-
-  /**
-   * @brief Helper method to add block ID to the name (marker = 0xFB)
-   * @param blkid block ID
-   * @see appendNumberWithMarker
-   */
-  inline Name &
-  appendBlkId (uint64_t blkid);
-
-  /**
-   * @brief Helper method to add version to the name (marker = 0xFD)
-   * @param version fully formatted version in a desired format (e.g., timestamp).
-   *                If version is Name::nversion, then the version number is automatically
-   *                assigned based on UTC timestamp
-   * @see appendNumberWithMarker
-   */
-  Name &
-  appendVersion (uint64_t version = Name::nversion);
-
-  ///////////////////////////////////////////////////////////////////////////////
-  //                                GETTERS                                    //
-  ///////////////////////////////////////////////////////////////////////////////
-
-  /**
-   * @brief Get number of the name components
-   * @return number of name components
-   */
-  inline size_t
-  size () const;
-
-  /**
-   * @brief Get binary blob of name component
-   * @param index index of the name component.  If less than 0, then getting component from the back:
-   *              get(-1) getting the last component, get(-2) is getting second component from back, etc.
-   * @returns const reference to binary blob of the requested name component
-   *
-   * If index is out of range, an exception will be thrown
-   */
-  const name::Component &
-  get (int index) const;
-
-  /**
-   * @brief Get binary blob of name component
-   * @param index index of the name component.  If less than 0, then getting component from the back
-   * @returns reference to binary blob of the requested name component
-   *
-   * If index is out of range, an exception will be thrown
-   */
-  name::Component &
-  get (int index);
-
-  /////
-  ///// Iterator interface to name components
-  /////
-  inline Name::const_iterator
-  begin () const;           ///< @brief Begin iterator (const)
-
-  inline Name::iterator
-  begin ();                 ///< @brief Begin iterator
-
-  inline Name::const_iterator
-  end () const;             ///< @brief End iterator (const)
-
-  inline Name::iterator
-  end ();                   ///< @brief End iterator
-
-  inline Name::const_reverse_iterator
-  rbegin () const;          ///< @brief Reverse begin iterator (const)
-
-  inline Name::reverse_iterator
-  rbegin ();                ///< @brief Reverse begin iterator
-
-  inline Name::const_reverse_iterator
-  rend () const;            ///< @brief Reverse end iterator (const)
-
-  inline Name::reverse_iterator
-  rend ();                  ///< @brief Reverse end iterator
-
-
-  /////
-  ///// Static helpers to convert name component to appropriate value
-  /////
-
-  /**
-   * @brief Get a new name, constructed as a subset of components
-   * @param pos Position of the first component to be copied to the subname
-   * @param len Number of components to be copied. Value Name::npos indicates that all components till the end of the name.
-   */
-  Name
-  getSubName (size_t pos = 0, size_t len = npos) const;
-
-  /**
-   * @brief Get prefix of the name
-   * @param len length of the prefix
-   * @param skip number of components to skip from beginning of the name
-   */
-  inline Name
-  getPrefix (size_t len, size_t skip = 0) const;
-
-  /**
-   * @brief Get postfix of the name
-   * @param len length of the postfix
-   * @param skip number of components to skip from end of the name
-   */
-  inline Name
-  getPostfix (size_t len, size_t skip = 0) const;
-
-  /**
-   * @brief Get text representation of the name (URI)
-   */
-  std::string
-  toUri () const;
-
-  /**
-   * @brief Write name as URI to the specified output stream
-   * @param os output stream
-   */
-  void
-  toUri (std::ostream &os) const;
-
-  /////////////////////////////////////////////////
-  // Helpers and compatibility wrappers
-  /////////////////////////////////////////////////
-
-  /**
-   * @brief Compare two names, using canonical ordering for each component
-   * @return 0  They compare equal
-   *         <0 If *this comes before other in the canonical ordering
-   *         >0 If *this comes after in the canonical ordering
-   */
-  int
-  compare (const Name &name) const;
-
-  /**
-   * @brief Check if to Name objects are equal (have the same number of components with the same binary data)
-   */
-  inline bool
-  operator == (const Name &name) const;
-
-  /**
-   * @brief Check if two Name objects are not equal
-   */
-  inline bool
-  operator != (const Name &name) const;
-
-  /**
-   * @brief Less or equal comparison of two name objects
-   */
-  inline bool
-  operator <= (const Name &name) const;
-
-  /**
-   * @brief Less comparison of two name objects
-   */
-  inline bool
-  operator < (const Name &name) const;
-
-  /**
-   * @brief Great or equal comparison of two name objects
-   */
-  inline bool
-  operator >= (const Name &name) const;
-
-  /**
-   * @brief Great comparison of two name objects
-   */
-  inline bool
-  operator > (const Name &name) const;
-
-  /**
-   * @brief Operator [] to simplify access to name components
-   * @see get
-   */
-  inline name::Component &
-  operator [] (int index);
-
-  /**
-   * @brief Operator [] to simplify access to name components
-   * @see get
-   */
-  inline const name::Component &
-  operator [] (int index) const;
-
-  /**
-   * @brief Create a new Name object, by copying components from first and second name
-   */
-  Name
-  operator + (const Name &name) const;
-
-  /**
-   * @brief A wrapper for append method
-   */
-  template<class T>
-  inline void
-  push_back (const T &comp);
-
-public:
-  // Data Members (public):
-  ///  Value returned by various member functions when they fail.
-  const static size_t npos = static_cast<size_t> (-1);
-  const static uint64_t nversion = static_cast<uint64_t> (-1);
-
-private:
-  std::vector<name::Component> m_comps;
-};
-
-inline std::ostream &
-operator << (std::ostream &os, const Name &name)
-{
-  name.toUri (os);
-  return os;
-}
-
-inline std::istream &
-operator >> (std::istream &is, Name &name)
-{
-  std::string line;
-  is >> line;
-  name = Name (line);
-
-  return is;
-}
-
-/////////////////////////////////////////////////////////////////////////////////////
-// Definition of inline methods
-/////////////////////////////////////////////////////////////////////////////////////
-
-template<class Iterator>
-Name::Name (Iterator begin, Iterator end)
-{
-  append (begin, end);
-}
-
-inline Name &
-Name::append (const name::Component &comp)
-{
-  if (comp.size () != 0)
-    m_comps.push_back (comp);
-  return *this;
-}
-
-inline Name &
-Name::appendBySwap (name::Component &comp)
-{
-  if (comp.size () != 0)
-    {
-      Name::iterator newComp = m_comps.insert (end (), name::Component ());
-      newComp->swap (comp);
-    }
-  return *this;
-}
-
-template<class Iterator>
-inline Name &
-Name::append (Iterator begin, Iterator end)
-{
-  for (Iterator i = begin; i != end; i++)
-    {
-      append (*i);
-    }
-  return *this;
-}
-
-Name &
-Name::append (const Name &comp)
-{
-  if (this == &comp)
-    {
-      // have to double-copy if the object is self, otherwise results very frustrating (because we use vector...)
-      return append (Name (comp.begin (), comp.end ()));
-    }
-  return append (comp.begin (), comp.end ());
-}
-
-Name &
-Name::append (const std::string &compStr)
-{
-  name::Component comp (compStr);
-  return appendBySwap (comp);
-}
-
-Name &
-Name::append (const void *buf, size_t size)
-{
-  name::Component comp (buf, size);
-  return appendBySwap (comp);
-}
-
-Name &
-Name::appendNumber (uint64_t number)
-{
-  name::Component comp;
-  return appendBySwap (comp.fromNumber (number));
-}
-
-Name &
-Name::appendNumberWithMarker (uint64_t number, unsigned char marker)
-{
-  name::Component comp;
-  return appendBySwap (comp.fromNumberWithMarker (number, marker));
-}
-
-inline Name &
-Name::appendSeqNum (uint64_t seqno)
-{
-  return appendNumberWithMarker (seqno, 0x00);
-}
-
-inline Name &
-Name::appendControlNum (uint64_t control)
-{
-  return appendNumberWithMarker (control, 0xC1);
-}
-
-inline Name &
-Name::appendBlkId (uint64_t blkid)
-{
-  return appendNumberWithMarker (blkid, 0xFB);
-}
-
-inline size_t
-Name::size () const
-{
-  return m_comps.size ();
-}
-
-/////
-///// Iterator interface to name components
-/////
-inline Name::const_iterator
-Name::begin () const
-{
-  return m_comps.begin ();
-}
-
-inline Name::iterator
-Name::begin ()
-{
-  return m_comps.begin ();
-}
-
-inline Name::const_iterator
-Name::end () const
-{
-  return m_comps.end ();
-}
-
-inline Name::iterator
-Name::end ()
-{
-  return m_comps.end ();
-}
-
-inline Name::const_reverse_iterator
-Name::rbegin () const
-{
-  return m_comps.rbegin ();
-}
-
-inline Name::reverse_iterator
-Name::rbegin ()
-{
-  return m_comps.rbegin ();
-}
-
-inline Name::const_reverse_iterator
-Name::rend () const
-{
-  return m_comps.rend ();
-}
-
-
-inline Name::reverse_iterator
-Name::rend ()
-{
-  return m_comps.rend ();
-}
-
-
-//// helpers
-
-
-inline Name
-Name::getPrefix (size_t len, size_t skip/* = 0*/) const
-{
-  return getSubName (skip, len);
-}
-
-inline Name
-Name::getPostfix (size_t len, size_t skip/* = 0*/) const
-{
-  return getSubName (size () - len - skip, len);
-}
-
-
-template<class T>
-inline void
-Name::push_back (const T &comp)
-{
-  append (comp);
-}
-
-inline bool
-Name::operator ==(const Name &name) const
-{
-  return (compare (name) == 0);
-}
-
-inline bool
-Name::operator !=(const Name &name) const
-{
-  return (compare (name) != 0);
-}
-
-inline bool
-Name::operator <= (const Name &name) const
-{
-  return (compare (name) <= 0);
-}
-
-inline bool
-Name::operator < (const Name &name) const
-{
-  return (compare (name) < 0);
-}
-
-inline bool
-Name::operator >= (const Name &name) const
-{
-  return (compare (name) >= 0);
-}
-
-inline bool
-Name::operator > (const Name &name) const
-{
-  return (compare (name) > 0);
-}
-
-inline name::Component &
-Name::operator [] (int index)
-{
-  return get (index);
-}
-
-inline const name::Component &
-Name::operator [] (int index) const
-{
-  return get (index);
-}
-
-ATTRIBUTE_HELPER_HEADER (Name);
-
-NDN_NAMESPACE_END
-
-#endif
diff --git a/ndn.cxx/ndn-api-face.cc b/ndn.cxx/ndn-api-face.cc
deleted file mode 100644
index fd78763..0000000
--- a/ndn.cxx/ndn-api-face.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 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 "ndn-api-face.h"
-#include "detail/pending-interests-container.h"
-#include "detail/registered-prefix-container.h"
-
-#include <ns3/random-variable.h>
-
-#include <ns3/ndn-l3-protocol.h>
-#include <ns3/ndn-interest.h>
-#include <ns3/ndn-data.h>
-#include <ns3/ndn-face.h>
-#include <ns3/ndn-fib.h>
-
-#include <ns3/packet.h>
-#include <ns3/log.h>
-
-using namespace std;
-using namespace boost;
-using namespace ns3;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.ApiFace");
-
-namespace ns3 {
-namespace ndn {
-
-using namespace detail;
-
-class ApiFacePriv
-{
-public:
-  ApiFacePriv ()
-    : m_rand (0, std::numeric_limits<uint32_t>::max ())
-  {
-  }
-
-  ns3::UniformVariable m_rand; // nonce generator
-
-  PendingInterestContainer m_pendingInterests;
-  RegisteredPrefixContainer m_expectedInterests;
-};
-
-
-ApiFace::ApiFace (Ptr<Node> node)
-  : Face (node)
-  , m_this (new ApiFacePriv ())
-{
-  NS_LOG_FUNCTION (this << boost::cref (*this));
-
-  NS_ASSERT_MSG (GetNode ()->GetObject<L3Protocol> () != 0,
-                 "NDN stack should be installed on the node " << GetNode ());
-
-  GetNode ()->GetObject<L3Protocol> ()->AddFace (this);
-  this->SetUp (true);
-  this->SetFlags (APPLICATION);
-}
-
-ApiFace::~ApiFace ()
-{
-  NS_LOG_FUNCTION (this << boost::cref (*this));
-
-  delete m_this;
-}
-
-void
-ApiFace::Shutdown ()
-{
-  NS_LOG_FUNCTION (this << boost::cref (*this));
-
-  if (!IsUp ())
-    {
-      return;
-    }
-
-  this->SetUp (false);
-
-  m_this->m_pendingInterests.clear ();
-  m_this->m_expectedInterests.clear ();
-
-  GetNode ()->GetObject<L3Protocol> ()->RemoveFace (this);
-}
-
-void
-ApiFace::ExpressInterest (Ptr<Interest> interest,
-                          DataCallback onData,
-                          TimeoutCallback onTimeout/* = MakeNullCallback< void, Ptr<Interest> > ()*/)
-{
-  NS_LOG_INFO (">> I " << interest->GetName ());
-
-  if (interest->GetNonce () == 0)
-    {
-      interest->SetNonce (m_this->m_rand.GetValue ());
-    }
-
-  // Record the callback
-  bool needToActuallyExpressInterest = false;
-  PendingInterestContainer::iterator entry = m_this->m_pendingInterests.find_exact (interest->GetName ());
-  if (entry == m_this->m_pendingInterests.end ())
-    {
-      pair<PendingInterestContainer::iterator, bool> status =
-        m_this->m_pendingInterests.insert (interest->GetName (), Create <PendingInterestEntry> (interest));
-
-      entry = status.first;
-
-      needToActuallyExpressInterest = true;
-    }
-  entry->payload ()->AddCallbacks (onData, onTimeout);
-
-  if (needToActuallyExpressInterest)
-    {
-      Simulator::ScheduleNow (&Face::ReceiveInterest, this, interest);
-    }
-}
-
-void
-ApiFace::SetInterestFilter (Ptr<const Name> prefix, InterestCallback onInterest)
-{
-  NS_LOG_DEBUG ("== setInterestFilter " << *prefix << " (" << GetNode ()->GetId () << ")");
-
-  RegisteredPrefixContainer::iterator entry = m_this->m_expectedInterests.find_exact (*prefix);
-  if (entry == m_this->m_expectedInterests.end ())
-    {
-      pair<RegisteredPrefixContainer::iterator, bool> status =
-        m_this->m_expectedInterests.insert (*prefix, Create < RegisteredPrefixEntry > (prefix));
-
-      entry = status.first;
-    }
-
-  entry->payload ()->AddCallback (onInterest);
-
-  // creating actual face
-  Ptr<ndn::Fib> fib = GetNode ()->GetObject<ndn::Fib> ();
-  Ptr<ndn::fib::Entry> fibEntry = fib->Add (prefix, this, 0);
-  fibEntry->UpdateStatus (this, ndn::fib::FaceMetric::NDN_FIB_GREEN);
-}
-
-void
-ApiFace::ClearInterestFilter (Ptr<const Name> prefix)
-{
-  RegisteredPrefixContainer::iterator entry = m_this->m_expectedInterests.find_exact (*prefix);
-  if (entry == m_this->m_expectedInterests.end ())
-    return;
-
-  entry->payload ()->ClearCallback ();
-  m_this->m_expectedInterests.erase (entry);
-}
-
-void
-ApiFace::Put (Ptr<Data> data)
-{
-  NS_LOG_INFO (">> D " << data->GetName ());
-
-  Simulator::ScheduleNow (&Face::ReceiveData, this, data);
-}
-
-
-///////////////////////////////////////////////
-// private stuff
-
-
-bool
-ApiFace::SendInterest (Ptr<const Interest> interest)
-{
-  NS_LOG_FUNCTION (this << interest);
-
-  NS_LOG_DEBUG ("<< I " << interest->GetName ());
-
-  if (!IsUp ())
-    {
-      return false;
-    }
-
-  // the app cannot set several filters for the same prefix
-  RegisteredPrefixContainer::iterator entry = m_this->m_expectedInterests.longest_prefix_match (interest->GetName ());
-  if (entry == m_this->m_expectedInterests.end ())
-    {
-      return false;
-    }
-
-  if (!entry->payload ()->m_callback.IsNull ())
-    entry->payload ()->m_callback (entry->payload ()->GetPrefix (), interest);
-  return true;
-}
-
-bool
-ApiFace::SendData (Ptr<const Data> data)
-{
-  // data has been send out from NDN stack towards the application
-  NS_LOG_DEBUG ("<< D " << data->GetName ());
-  // NS_LOG_FUNCTION (this << data);
-
-  if (!IsUp ())
-    {
-      return false;
-    }
-
-  PendingInterestContainer::iterator entry = m_this->m_pendingInterests.longest_prefix_match (data->GetName ());
-  if (entry == m_this->m_pendingInterests.end ())
-    {
-      return false;
-    }
-
-  while (entry != m_this->m_pendingInterests.end ())
-    {
-      entry->payload ()->ProcessOnData (entry->payload ()->GetInterest (), data);
-      m_this->m_pendingInterests.erase (entry);
-
-      entry = m_this->m_pendingInterests.longest_prefix_match (data->GetName ());
-    }
-  m_this->m_pendingInterests.erase (entry);
-
-  return true;
-}
-
-std::ostream&
-ApiFace::Print (std::ostream &os) const
-{
-  os << "dev=ApiFace(" << GetId () << ")";
-  return os;
-}
-
-
-}
-}
diff --git a/ndn.cxx/ndn-api-face.h b/ndn.cxx/ndn-api-face.h
deleted file mode 100644
index fda34d1..0000000
--- a/ndn.cxx/ndn-api-face.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 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>
- *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
- *         Chaoyi Bian <bcy@pku.edu.cn>
- */
-
-#ifndef NDN_API_FACE_H
-#define NDN_API_FACE_H
-
-#include <ns3/ptr.h>
-#include <ns3/node.h>
-#include <ns3/callback.h>
-#include <ns3/ndn-face.h>
-#include <ns3/ndn-name.h>
-#include <ns3/ndn-interest.h>
-#include <ns3/ndn-data.h>
-
-namespace ns3 {
-namespace ndn {
-
-class ApiFacePriv;
-
-/**
- * @ingroup ndn
- * @defgroup ndn-cxx NDN.cxx API
- */
-
-/**
- * @ingroup ndn-face
- * @ingroup ndn-cxx
- * @brief An application NDN face, providing richer API interface, compared to ndn::AppFace
- *
- * @see ndn::AppFace
- */
-class ApiFace
-  : public ns3::ndn::Face
-{
-public:
-  typedef Callback<void, Ptr<const Name>,     Ptr<const Interest> > InterestCallback;
-  typedef Callback<void, Ptr<const Interest>, Ptr<const Data> > DataCallback;
-  typedef Callback<void, Ptr<const Interest> > TimeoutCallback;
-
-  /**
-   * @brief initialize the handler; a lot of things needs to be done. 1) init
-   * keystore 2) init keylocator 3) start a thread to hold a loop of ccn_run
-   *
-   */
-  ApiFace (Ptr<Node> node);
-  ~ApiFace ();
-
-  /**
-   * @brief Shutdown the API face
-   */
-  virtual void
-  Shutdown ();
-  
-  /**
-   * @brief Express Interest
-   *
-   * @param name the Interest name
-   * @param onData the callback function to deal with the returned data
-   * @param onTimeout the callback function to deal with timeouts
-   */
-  void
-  ExpressInterest (Ptr<Interest> interest,
-                   DataCallback onData,
-                   TimeoutCallback onTimeout); // = MakeNullCallback< void, Ptr<Interest> > ()
-
-  /**
-   * @brief set Interest filter (specify what interest you want to receive)
-   *
-   * @param prefix the prefix of Interest
-   * @param onInterest the callback function to deal with the returned data
-   */
-  void
-  SetInterestFilter (Ptr<const Name> prefix, InterestCallback onInterest);
-
-  /**
-   * @brief clear Interest filter
-   * @param prefix the prefix of Interest
-   */
-  void
-  ClearInterestFilter (Ptr<const Name> prefix);
-
-  /**
-   * @brief Publish data
-   * @param data Data packet to publish
-   */
-  void
-  Put (Ptr<Data> data);
-
-public:
-  virtual bool
-  SendInterest (Ptr<const Interest> interest);
-
-  virtual bool
-  SendData (Ptr<const Data> data);
-
-  virtual std::ostream&
-  Print (std::ostream &os) const;
-
-private:
-  ApiFace () : Face (0) {}
-  ApiFace (const ApiFace &) : Face (0) {}
-  ApiFace& operator= (const ApiFace &) { return *this; }
-
-private:
-  ApiFacePriv *m_this;
-};
-
-} // ndn
-} // ns3
-
-#endif // NDN_API_HANDLER_H
diff --git a/plugins/README b/plugins/README
deleted file mode 100644
index b8eb740..0000000
--- a/plugins/README
+++ /dev/null
@@ -1,13 +0,0 @@
-This folder contains several extensions that can be used in simulation scenarios.
-
-tracers/
-  an extensive set of tracers that can be used in NDN scenarios
-  * Some tracers require patching of NDN module code (patch provided)
-
-topology/
-  extension of topology reader
-  * requires patching of topology module (patch provided)
-
-mobility/
-  several custom mobility models and position allocator. 
-  * necessary for topology extensions
diff --git a/plugins/mobility/highway-position-allocator.cc b/plugins/mobility/highway-position-allocator.cc
deleted file mode 100644
index 03c9d27..0000000
--- a/plugins/mobility/highway-position-allocator.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * 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: Lucas Wang <lucas@cs.ucla.edu>
- */
-
-
-#include "highway-position-allocator.h"
-#include "ns3/random-variable.h"
-#include "ns3/log.h"
-#include "ns3/double.h"
-#include <math.h>
-
-NS_LOG_COMPONENT_DEFINE ("HighwayPositionAllocator");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (HighwayPositionAllocator);
-
-TypeId HighwayPositionAllocator::GetTypeId (void){
-  static TypeId tid = TypeId("ns3::HighwayPositionAllocator").
-    SetParent<PositionAllocator> ().
-    SetGroupName("Mobility").
-    AddConstructor<HighwayPositionAllocator>().
-    AddAttribute("Start", "the start position of the highway",
-		 VectorValue (Vector(0.0, 0.0, 0.0)),
-		 MakeVectorAccessor(&HighwayPositionAllocator::SetStartPosition,
-				    &HighwayPositionAllocator::GetStartPosition),
-                 MakeVectorChecker ()).
-    AddAttribute("Direction", "the direction of the highway",
-		 DoubleValue (0.0),
-		 MakeDoubleAccessor(&HighwayPositionAllocator::SetDirection,
-				    &HighwayPositionAllocator::GetDirection),
-                 MakeDoubleChecker<double> ()).
-    AddAttribute("Length", "the length of the highway",
-		 DoubleValue (0.0),
-		 MakeDoubleAccessor(&HighwayPositionAllocator::SetLength,
-				    &HighwayPositionAllocator::GetLength),
-                 MakeDoubleChecker<double> ());
-
-  return tid;
-}
-
-HighwayPositionAllocator::HighwayPositionAllocator ()
-  : m_previous_position (Vector (0.0, 0.0, 0.0))
-{
-}
-
-Vector HighwayPositionAllocator::GetNext (void) const{
-  double random_gap = m_random_gap_var.GetValue (1.0, 10.0);
-  
-  double delta_x = random_gap * cos(m_direction);
-  double delta_y = random_gap * sin(m_direction);
-  
-  
-  Vector new_position(m_previous_position.x - delta_x, m_previous_position.y - delta_y, m_previous_position.z);
-  m_previous_position.x = new_position.x;
-  m_previous_position.y = new_position.y;
-  m_previous_position.z = new_position.z;
-
-  return new_position;
-}
-
-void HighwayPositionAllocator::SetStartPosition(Vector start){
-  m_start = start;
-  m_previous_position = m_start; // initialize the m_previous_position to be start of the highway
-}
-
-Vector HighwayPositionAllocator::GetStartPosition(void) const {
-  return m_start;
-}
-
-void HighwayPositionAllocator::SetDirection(double direction){
-  m_direction = direction;
-}
-
-double HighwayPositionAllocator::GetDirection(void) const {
-  return m_direction;
-}
-
-void HighwayPositionAllocator::SetLength(double length){
-  m_length = length;
-}
-
-double HighwayPositionAllocator::GetLength(void) const {
-  return m_length;
-}
-
-
-int64_t
-HighwayPositionAllocator::AssignStreams (int64_t stream)
-{
-  m_random_gap_var.SetStream (stream);
-  return 1;
-}
-
-}
diff --git a/plugins/mobility/highway-position-allocator.h b/plugins/mobility/highway-position-allocator.h
deleted file mode 100644
index be0b219..0000000
--- a/plugins/mobility/highway-position-allocator.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2007 INRIA
- *
- * 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: Lucas Wang <lucas@cs.ucla.edu>
- */
-#ifndef HIGHWAY_POSITION_ALLOCATOR_H
-#define HIGHWAY_POSITION_ALLOCATOR_H
-
-#include "ns3/position-allocator.h"
-
-namespace ns3 {
-  
-/**
- * This position allocator is used to generate positions for cars 
- * on a highway.
- */
-
-class HighwayPositionAllocator : public PositionAllocator
-{
-public:
-  static TypeId GetTypeId (void);
-  HighwayPositionAllocator ();
-  virtual Vector GetNext (void) const;
-  void SetStartPosition(Vector start);
-  Vector GetStartPosition(void) const;
-  void SetDirection(double direction); // the angle in terms of radian degrees
-  double GetDirection(void) const ;
-  void SetLength(double length);
-  double GetLength(void) const ;
-
-  virtual int64_t AssignStreams (int64_t stream);
-
-private:
-  mutable Vector m_previous_position; // previously generated vehicle position
-  Vector m_start; // highway starting point
-  double m_direction; //highway direction
-  double m_length; // highway length
-
-  mutable UniformRandomVariable m_random_gap_var;
-};
-}
-
-#endif
diff --git a/plugins/mobility/spring-mobility-helper.cc b/plugins/mobility/spring-mobility-helper.cc
deleted file mode 100644
index 5e4b4f6..0000000
--- a/plugins/mobility/spring-mobility-helper.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006, 2007 INRIA
- *
- * 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 "spring-mobility-helper.h"
-#include "spring-mobility-model.h"
-
-namespace ns3 {
-
-void
-SpringMobilityHelper::InstallSprings (Ptr<Node> node1, Ptr<Node> node2)
-{
-  Ptr<SpringMobilityModel> model1, model2;
-  model1 = node1->GetObject<SpringMobilityModel> ();
-  model2 = node2->GetObject<SpringMobilityModel> ();
-  
-  NS_ASSERT (model1 != 0 && model2 != 0);
-
-  model1->AddSpring (model2);
-  model2->AddSpring (model1);
-}
-
-void
-SpringMobilityHelper::InstallSprings (TopologyReader::ConstLinksIterator first, 
-				      TopologyReader::ConstLinksIterator end)
-{
-  for (; first != end; first++)
-    {
-      InstallSprings (first->GetFromNode (), 
-		      first->GetToNode ());
-    }
-}
-
-} // namespace ns3
-
diff --git a/plugins/mobility/spring-mobility-helper.h b/plugins/mobility/spring-mobility-helper.h
deleted file mode 100644
index 7285d25..0000000
--- a/plugins/mobility/spring-mobility-helper.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006, 2007 INRIA
- *
- * 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 SPRING_MOBILITY_HELPER_H
-#define SPRING_MOBILITY_HELPER_H
-
-#include "ns3/topology-reader.h"
-
-namespace ns3 {
-
-/**
- * \ingroup mobility
- *
- * \brief 
- */
-class SpringMobilityHelper
-{
-public:
-  static void
-  InstallSprings (Ptr<Node> node1, Ptr<Node> node2);
-
-  static void
-  InstallSprings (TopologyReader::ConstLinksIterator first, 
-                  TopologyReader::ConstLinksIterator end);
-};
-
-} // namespace ns3
-
-#endif // SPRING_MOBILITY_HELPER_H
diff --git a/plugins/mobility/spring-mobility-model.cc b/plugins/mobility/spring-mobility-model.cc
deleted file mode 100644
index 170b428..0000000
--- a/plugins/mobility/spring-mobility-model.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006, 2007 INRIA
- *
- * 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 "spring-mobility-model.h"
-#include "ns3/simulator.h"
-#include "ns3/double.h"
-#include "ns3/log.h"
-#include "ns3/node-list.h"
-#include "ns3/node.h"
-
-#include <boost/foreach.hpp>
-
-NS_LOG_COMPONENT_DEFINE ("SpringMobilityModel");
-
-namespace ns3 {
-
-NS_OBJECT_ENSURE_REGISTERED (SpringMobilityModel);
-
-double SpringMobilityModel::m_totalKineticEnergy = 0.0;
-bool SpringMobilityModel::m_stable = false;
-EventId SpringMobilityModel::m_updateEvent;
-double SpringMobilityModel::m_epsilon = 100.0;
-
-const double COLOUMB_K = 200; 
-
-TypeId SpringMobilityModel::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::SpringMobilityModel")
-    .SetParent<MobilityModel> ()
-    .AddConstructor<SpringMobilityModel> ()
-    // .AddAttribute ("Epsilon", "Bound for kinetic energy when system is considered stable",
-    //                DoubleValue (100.0),
-    //                MakeDoubleAccessor (&SpringMobilityModel::m_epsilon),
-    //                MakeDoubleChecker<double> ())
-    .AddAttribute ("NodeMass", "Node mass",
-                   DoubleValue (10),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_nodeMass),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("NodeCharge", "Node charge",
-                   DoubleValue (2),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_nodeCharge),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("SpringNormalLength", "Normal length of spring length",
-                   DoubleValue (10),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_springNormalLength),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("SpringConstant", "Spring constant",
-                   DoubleValue (0.2),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_springConstant),
-                   MakeDoubleChecker<double> ())
-    .AddAttribute ("DampingFactor", "Dumping factor",
-                   DoubleValue (0.8),
-                   MakeDoubleAccessor (&SpringMobilityModel::m_dampingFactor),
-                   MakeDoubleChecker<double> ())
-    ;
-  
-  return tid;
-}
-
-SpringMobilityModel::SpringMobilityModel ()
-  : m_position (0,0,0)
-  , m_velocity (0,0,0)
-{
-}
-
-SpringMobilityModel::~SpringMobilityModel ()
-{
-}
-
-void
-SpringMobilityModel::AddSpring (Ptr<MobilityModel> node)
-{
-  m_springs.push_back (node);
-}
-
-void
-SpringMobilityModel::DoStart ()
-{
-  if (!m_updateEvent.IsRunning ())
-    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
-}
-
-void
-SpringMobilityModel::UpdateAll ()
-{
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
-      if (model != 0)
-        model->Update ();
-    }
-
-  if (m_totalKineticEnergy < m_epsilon)
-    {
-      m_stable = true;
-      NS_LOG_INFO ("Stabilized with " << m_totalKineticEnergy);
-    }
-  else
-    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);  
-}
-
-void
-SpringMobilityModel::Update () const
-{
-  NS_LOG_FUNCTION (this << m_stable << m_position << m_velocity);
-  if (m_stable) return;
-  Time now = Simulator::Now ();
-
-  if (now <= m_lastTime)
-    {
-      m_lastTime = now;
-      return;
-    }
-
-  double time_step_s = (now - m_lastTime).ToDouble (Time::S);
-  m_lastTime = now;
-
-  Vector force (0.0, 0.0, 0.0);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      if ((*node)->GetId () == GetObject<Node> ()->GetId ()) continue;
-      Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
-      if (model == 0) continue;
-      if (model == this) continue;
-
-      double distance = GetDistanceFrom (model);
-      if (distance < 0.1) continue;
-
-      Vector direction = (GetPosition () - model->GetPosition ()) / distance; // direction vector of size 1, force trying to take nodes apart
-
-      force += direction * COLOUMB_K * m_nodeCharge * m_nodeCharge / distance / distance;
-    }
-
-  BOOST_FOREACH (Ptr<MobilityModel> model, m_springs)
-    {
-      double distance = GetDistanceFrom (model);
-      Vector direction = (model->GetPosition () - GetPosition ()) / distance; // direction vector of size 1, force trying to take nodes closer, if they are more than distance apart
-
-      force += direction * (- m_springNormalLength + distance) / m_springConstant;
-    }
-
-  // NS_LOG_DEBUG ("force: " << force);
-
-  // subtract previous value of kinetic energy for the node
-  double velocityValue = CalculateDistance (m_velocity, Vector(0,0,0)); 
-  m_totalKineticEnergy -= m_nodeMass * velocityValue * velocityValue;
-
-  // Correct velocity and position
-  m_velocity = (m_velocity + force * time_step_s) * m_dampingFactor;
-  m_position += m_velocity * time_step_s;
-
-  // Add new value for the kinetic energy
-  velocityValue = CalculateDistance (m_velocity, Vector(0,0,0)); 
-  m_totalKineticEnergy += m_nodeMass * velocityValue * velocityValue;
-
-  NotifyCourseChange ();
-}
-
-Vector
-SpringMobilityModel::DoGetPosition (void) const
-{
-  // NS_LOG_FUNCTION (this << m_position);
-  return m_position;
-}
-void 
-SpringMobilityModel::DoSetPosition (const Vector &position)
-{
-  // NS_LOG_FUNCTION (this << position);
-  m_position = position;
-
-  NotifyCourseChange ();
-  m_stable = false;
-
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      Ptr<SpringMobilityModel> model = (*node)->GetObject<SpringMobilityModel> ();
-      if (model != 0)
-        model->m_lastTime = Simulator::Now ();
-    }
-  
-  if (!m_updateEvent.IsRunning ())
-    m_updateEvent = Simulator::Schedule (Seconds(0.05), SpringMobilityModel::UpdateAll);
-}
-Vector
-SpringMobilityModel::DoGetVelocity (void) const
-{
-  return m_velocity;
-}
-
-} // namespace ns3
diff --git a/plugins/mobility/spring-mobility-model.h b/plugins/mobility/spring-mobility-model.h
deleted file mode 100644
index 700c994..0000000
--- a/plugins/mobility/spring-mobility-model.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2006, 2007 INRIA
- *
- * 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: 
- */
-#ifndef SPRING_MOBILITY_MODEL_H
-#define SPRING_MOBILITY_MODEL_H
-
-#include "ns3/mobility-model.h"
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-
-namespace ns3 {
-
-/**
- * \ingroup mobility
- *
- * \brief 
- */
-class SpringMobilityModel : public MobilityModel 
-{
-public:
-  static TypeId GetTypeId (void);
-
-  /**
-   * Create a position located at coordinates (0,0,0) with velocity (0,0,0)
-   */
-  SpringMobilityModel ();
-  virtual ~SpringMobilityModel ();
-
-  /**
-   * \brief Attach node by a spring
-   * \param node MobilityModel layer of the attaching node
-   */
-  void
-  AddSpring (Ptr<MobilityModel> node);
-
-private:
-  // from Object
-  virtual void
-  DoStart ();
-
-  // from MobilityModel
-  virtual Vector 
-  DoGetPosition (void) const;
-
-  virtual void 
-  DoSetPosition (const Vector &position);
-
-  virtual Vector 
-  DoGetVelocity (void) const;
-
-  // Updating positions
-  void 
-  Update (void) const;
-
-  static void
-  UpdateAll ();
-
-private:
-  static double m_epsilon;
-
-  double m_nodeMass;
-  double m_nodeCharge;
-  double m_springNormalLength;
-  double m_springConstant;
-  double m_dampingFactor;
-
-  static double m_totalKineticEnergy;  
-  static bool m_stable;
-  static EventId m_updateEvent;
-  
-  mutable Vector m_position;
-  mutable Vector m_velocity;
-  mutable Time m_lastTime;
-
-  std::list<Ptr<MobilityModel> > m_springs;
-};
-
-} // namespace ns3
-
-#endif // SPRING_MOBILITY_MODEL_H
diff --git a/plugins/topology/patches/0001-topology-read-Several-extensions-of-TopologyReader.patch b/plugins/topology/patches/0001-topology-read-Several-extensions-of-TopologyReader.patch
deleted file mode 100644
index ffaefe7..0000000
--- a/plugins/topology/patches/0001-topology-read-Several-extensions-of-TopologyReader.patch
+++ /dev/null
@@ -1,146 +0,0 @@
-From 19ebf81e3d32dbdda4ef06406c28566c6d771f9d Mon Sep 17 00:00:00 2001
-From: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-Date: Mon, 12 Dec 2011 18:01:12 -0800
-Subject: [PATCH 1/3] topology-read: Several extensions of TopologyReader
-
----
- src/topology-read/model/topology-reader.cc |   17 ++++++++++++++
- src/topology-read/model/topology-reader.h  |   35 +++++++++++++++++++++++-----
- 2 files changed, 46 insertions(+), 6 deletions(-)
-
-diff --git a/src/topology-read/model/topology-reader.cc b/src/topology-read/model/topology-reader.cc
-index b531a6d..82a8343 100644
---- a/src/topology-read/model/topology-reader.cc
-+++ b/src/topology-read/model/topology-reader.cc
-@@ -106,12 +106,23 @@ TopologyReader::Link::Link ()
- {
- }
- 
-+void
-+TopologyReader::Link::SetNetDevices (Ptr<NetDevice> from, Ptr<NetDevice> to)
-+{
-+  m_fromNetDevice = from;
-+  m_toNetDevice = to;
-+}
- 
- Ptr<Node> TopologyReader::Link::GetFromNode (void) const
- {
-   return m_fromPtr;
- }
- 
-+Ptr<NetDevice> TopologyReader::Link::GetFromNetDevice (void) const
-+{
-+  return m_fromNetDevice;
-+}
-+
- std::string
- TopologyReader::Link::GetFromNodeName (void) const
- {
-@@ -124,6 +135,12 @@ TopologyReader::Link::GetToNode (void) const
-   return m_toPtr;
- }
- 
-+Ptr<NetDevice>
-+TopologyReader::Link::GetToNetDevice (void) const
-+{
-+  return m_toNetDevice;
-+}
-+
- std::string
- TopologyReader::Link::GetToNodeName (void) const
- {
-diff --git a/src/topology-read/model/topology-reader.h b/src/topology-read/model/topology-reader.h
-index 865b7d3..48c0c1d 100644
---- a/src/topology-read/model/topology-reader.h
-+++ b/src/topology-read/model/topology-reader.h
-@@ -32,6 +32,8 @@
- 
- namespace ns3 {
- 
-+class NetDevice;
-+
- /**
-  * \ingroup topology
-  *
-@@ -53,7 +55,7 @@ public:
-    */
-   class Link
-   {
--public:
-+  public:
-   /**
-    * \brief Constant iterator to scan the map of link attributes.
-    */
-@@ -66,14 +68,27 @@ public:
-      * \param toPtr Ptr to the node the link is directed to
-      * \param toName name of the node the link is directed to
-      */
--    Link ( Ptr<Node> fromPtr, const std::string &fromName, Ptr<Node> toPtr, const std::string &toName );
-+    Link (Ptr<Node> fromPtr, const std::string &fromName, Ptr<Node> toPtr, const std::string &toName);
- 
-     /**
-+     * \brief Set netdevices associated with the link
-+     * \param from NetDevice associated with From node
-+     * \param to NetDevice associated with To node
-+     */
-+    void
-+    SetNetDevices (Ptr<NetDevice> from, Ptr<NetDevice> to);
-+    
-+    /**
-      * \brief Returns a Ptr<Node> to the "from" node of the link
-      * \return a Ptr<Node> to the "from" node of the link
-      */
-     Ptr<Node> GetFromNode (void) const;
-     /**
-+     * \brief Returns a Ptr<NetDevice> of the "from" node of the link
-+     * \return a Ptr<NetDevice> of the "from" node of the link
-+     */
-+    Ptr<NetDevice> GetFromNetDevice (void) const;
-+    /**
-      * \brief Returns the name of the "from" node of the link
-      * \return the name of the "from" node of the link
-      */
-@@ -84,6 +99,11 @@ public:
-      */
-     Ptr<Node> GetToNode (void) const;
-     /**
-+     * \brief Returns a Ptr<NetDevice> of the "to" node of the link
-+     * \return a Ptr<NetDevice> of the "to" node of the link
-+     */
-+    Ptr<NetDevice> GetToNetDevice (void) const;
-+    /**
-      * \brief Returns the name of the "to" node of the link
-      * \return the name of the "to" node of the link
-      */
-@@ -127,7 +147,9 @@ private:
-     Ptr< Node > m_fromPtr;
-     std::string m_toName;
-     Ptr< Node > m_toPtr;
--    std::map<std::string, std::string> m_linkAttr;
-+    Ptr< NetDevice > m_fromNetDevice;
-+    Ptr< NetDevice > m_toNetDevice;
-+    std::map<std::string, std::string > m_linkAttr;
-   };
- 
-   /**
-@@ -195,13 +217,14 @@ private:
-    */
-   void AddLink (Link link);
- 
-+protected:
-+  std::string m_fileName;
-+  std::list<Link> m_linksList;
-+
- private:
-   TopologyReader (const TopologyReader&);
-   TopologyReader& operator= (const TopologyReader&);
- 
--  std::string m_fileName;
--  std::list<Link> m_linksList;
--
-   // end class TopologyReader
- };
- 
--- 
-1.7.10.2
-
diff --git a/plugins/topology/patches/0002-topology-read-TopologyReader-and-derivatives-are-no-.patch b/plugins/topology/patches/0002-topology-read-TopologyReader-and-derivatives-are-no-.patch
deleted file mode 100644
index db3f957..0000000
--- a/plugins/topology/patches/0002-topology-read-TopologyReader-and-derivatives-are-no-.patch
+++ /dev/null
@@ -1,299 +0,0 @@
-From cd1527f264045510fd79f3a6bd44ce5c48a8278d Mon Sep 17 00:00:00 2001
-From: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-Date: Tue, 13 Dec 2011 13:17:25 -0800
-Subject: [PATCH 2/3] topology-read: TopologyReader and derivatives are no
- longer Objects
-
-To allow smart pointers, TopologyReader is just inherited from
-SimpleRefCount<TopologyReader> class
----
- src/topology-read/helper/topology-reader-helper.cc |    7 +++----
- src/topology-read/helper/topology-reader-helper.h  |    5 ++---
- src/topology-read/model/inet-topology-reader.cc    |   20 ++++++++++----------
- src/topology-read/model/inet-topology-reader.h     |    2 +-
- src/topology-read/model/orbis-topology-reader.cc   |   20 ++++++++++----------
- src/topology-read/model/orbis-topology-reader.h    |    2 +-
- .../model/rocketfuel-topology-reader.cc            |   20 ++++++++++----------
- .../model/rocketfuel-topology-reader.h             |    3 +--
- src/topology-read/model/topology-reader.cc         |   19 +++++++++----------
- src/topology-read/model/topology-reader.h          |    8 +++-----
- 10 files changed, 50 insertions(+), 56 deletions(-)
-
-diff --git a/src/topology-read/helper/topology-reader-helper.cc b/src/topology-read/helper/topology-reader-helper.cc
-index ea4a9b2..c4678d1 100644
---- a/src/topology-read/helper/topology-reader-helper.cc
-+++ b/src/topology-read/helper/topology-reader-helper.cc
-@@ -47,7 +47,6 @@ TopologyReaderHelper::SetFileType (const std::string fileType)
-   m_fileType = fileType;
- }
- 
--
- Ptr<TopologyReader>
- TopologyReaderHelper::GetTopologyReader ()
- {
-@@ -59,17 +58,17 @@ TopologyReaderHelper::GetTopologyReader ()
-       if (m_fileType == "Orbis")
-         {
-           NS_LOG_INFO ("Creating Orbis formatted data input.");
--          m_inFile = CreateObject<OrbisTopologyReader> ();
-+          m_inFile = Create<OrbisTopologyReader> ();
-         }
-       else if (m_fileType == "Inet")
-         {
-           NS_LOG_INFO ("Creating Inet formatted data input.");
--          m_inFile = CreateObject<InetTopologyReader> ();
-+          m_inFile = Create<InetTopologyReader> ();
-         }
-       else if (m_fileType == "Rocketfuel")
-         {
-           NS_LOG_INFO ("Creating Rocketfuel formatted data input.");
--          m_inFile = CreateObject<RocketfuelTopologyReader> ();
-+          m_inFile = Create<RocketfuelTopologyReader> ();
-         }
-       else
-         {
-diff --git a/src/topology-read/helper/topology-reader-helper.h b/src/topology-read/helper/topology-reader-helper.h
-index c4bfbbe..c1cc198 100644
---- a/src/topology-read/helper/topology-reader-helper.h
-+++ b/src/topology-read/helper/topology-reader-helper.h
-@@ -22,11 +22,10 @@
- #ifndef TOPOLOGY_READER_HELPER_H
- #define TOPOLOGY_READER_HELPER_H
- 
--#include "ns3/topology-reader.h"
--#include <string>
--
- namespace ns3 {
- 
-+class TopologyReader;
-+
- /**
-  * \ingroup topology
-  *
-diff --git a/src/topology-read/model/inet-topology-reader.cc b/src/topology-read/model/inet-topology-reader.cc
-index ab1cc5d..10d1ac3 100644
---- a/src/topology-read/model/inet-topology-reader.cc
-+++ b/src/topology-read/model/inet-topology-reader.cc
-@@ -28,19 +28,19 @@
- 
- using namespace std;
- 
--namespace ns3 {
--
- NS_LOG_COMPONENT_DEFINE ("InetTopologyReader");
- 
--NS_OBJECT_ENSURE_REGISTERED (InetTopologyReader);
-+namespace ns3 {
-+
-+// NS_OBJECT_ENSURE_REGISTERED (InetTopologyReader);
- 
--TypeId InetTopologyReader::GetTypeId (void)
--{
--  static TypeId tid = TypeId ("ns3::InetTopologyReader")
--    .SetParent<Object> ()
--  ;
--  return tid;
--}
-+// TypeId InetTopologyReader::GetTypeId (void)
-+// {
-+//   static TypeId tid = TypeId ("ns3::InetTopologyReader")
-+//     .SetParent<Object> ()
-+//   ;
-+//   return tid;
-+// }
- 
- InetTopologyReader::InetTopologyReader ()
- {
-diff --git a/src/topology-read/model/inet-topology-reader.h b/src/topology-read/model/inet-topology-reader.h
-index 31aa4a0..d235370 100644
---- a/src/topology-read/model/inet-topology-reader.h
-+++ b/src/topology-read/model/inet-topology-reader.h
-@@ -47,7 +47,7 @@ namespace ns3 {
- class InetTopologyReader : public TopologyReader
- {
- public:
--  static TypeId GetTypeId (void);
-+  // static TypeId GetTypeId (void);
- 
-   InetTopologyReader ();
-   virtual ~InetTopologyReader ();
-diff --git a/src/topology-read/model/orbis-topology-reader.cc b/src/topology-read/model/orbis-topology-reader.cc
-index 04dbaf9..bdcd139 100644
---- a/src/topology-read/model/orbis-topology-reader.cc
-+++ b/src/topology-read/model/orbis-topology-reader.cc
-@@ -29,19 +29,19 @@
- 
- using namespace std;
- 
--namespace ns3 {
--
- NS_LOG_COMPONENT_DEFINE ("OrbisTopologyReader");
- 
--NS_OBJECT_ENSURE_REGISTERED (OrbisTopologyReader);
-+namespace ns3 {
-+
-+// NS_OBJECT_ENSURE_REGISTERED (OrbisTopologyReader);
- 
--TypeId OrbisTopologyReader::GetTypeId (void)
--{
--  static TypeId tid = TypeId ("ns3::OrbisTopologyReader")
--    .SetParent<Object> ()
--  ;
--  return tid;
--}
-+// TypeId OrbisTopologyReader::GetTypeId (void)
-+// {
-+//   static TypeId tid = TypeId ("ns3::OrbisTopologyReader")
-+//     .SetParent<Object> ()
-+//   ;
-+//   return tid;
-+// }
- 
- OrbisTopologyReader::OrbisTopologyReader ()
- {
-diff --git a/src/topology-read/model/orbis-topology-reader.h b/src/topology-read/model/orbis-topology-reader.h
-index 21b32cf..b25db15 100644
---- a/src/topology-read/model/orbis-topology-reader.h
-+++ b/src/topology-read/model/orbis-topology-reader.h
-@@ -44,7 +44,7 @@ namespace ns3 {
- class OrbisTopologyReader : public TopologyReader
- {
- public:
--  static TypeId GetTypeId (void);
-+  // static TypeId GetTypeId (void);
- 
-   OrbisTopologyReader ();
-   virtual ~OrbisTopologyReader ();
-diff --git a/src/topology-read/model/rocketfuel-topology-reader.cc b/src/topology-read/model/rocketfuel-topology-reader.cc
-index d048148..c103271 100644
---- a/src/topology-read/model/rocketfuel-topology-reader.cc
-+++ b/src/topology-read/model/rocketfuel-topology-reader.cc
-@@ -28,19 +28,19 @@
- #include "ns3/unused.h"
- #include "rocketfuel-topology-reader.h"
- 
--namespace ns3 {
--
- NS_LOG_COMPONENT_DEFINE ("RocketfuelTopologyReader");
- 
--NS_OBJECT_ENSURE_REGISTERED (RocketfuelTopologyReader);
-+namespace ns3 {
-+
-+// NS_OBJECT_ENSURE_REGISTERED (RocketfuelTopologyReader);
- 
--TypeId RocketfuelTopologyReader::GetTypeId (void)
--{
--  static TypeId tid = TypeId ("ns3::RocketfuelTopologyReader")
--    .SetParent<Object> ()
--  ;
--  return tid;
--}
-+// TypeId RocketfuelTopologyReader::GetTypeId (void)
-+// {
-+//   static TypeId tid = TypeId ("ns3::RocketfuelTopologyReader")
-+//     .SetParent<Object> ()
-+//   ;
-+//   return tid;
-+// }
- 
- RocketfuelTopologyReader::RocketfuelTopologyReader ()
- {
-diff --git a/src/topology-read/model/rocketfuel-topology-reader.h b/src/topology-read/model/rocketfuel-topology-reader.h
-index afb667d..c512ea0 100644
---- a/src/topology-read/model/rocketfuel-topology-reader.h
-+++ b/src/topology-read/model/rocketfuel-topology-reader.h
-@@ -21,7 +21,6 @@
- #ifndef ROCKETFUEL_TOPOLOGY_READER_H
- #define ROCKETFUEL_TOPOLOGY_READER_H
- 
--#include "ns3/nstime.h"
- #include "topology-reader.h"
- 
- namespace ns3 {
-@@ -43,7 +42,7 @@ namespace ns3 {
- class RocketfuelTopologyReader : public TopologyReader
- {
- public:
--  static TypeId GetTypeId (void);
-+  // static TypeId GetTypeId (void);
- 
-   RocketfuelTopologyReader ();
-   virtual ~RocketfuelTopologyReader ();
-diff --git a/src/topology-read/model/topology-reader.cc b/src/topology-read/model/topology-reader.cc
-index 82a8343..a2e66cb 100644
---- a/src/topology-read/model/topology-reader.cc
-+++ b/src/topology-read/model/topology-reader.cc
-@@ -19,24 +19,23 @@
-  * Author: Valerio Sartini (valesar@gmail.com)
-  */
- 
--#include "ns3/log.h"
--
- #include "topology-reader.h"
- 
-+#include "ns3/log.h"
- 
- namespace ns3 {
- 
- NS_LOG_COMPONENT_DEFINE ("TopologyReader");
- 
--NS_OBJECT_ENSURE_REGISTERED (TopologyReader);
-+// NS_OBJECT_ENSURE_REGISTERED (TopologyReader);
- 
--TypeId TopologyReader::GetTypeId (void)
--{
--  static TypeId tid = TypeId ("ns3::TopologyReader")
--    .SetParent<Object> ()
--  ;
--  return tid;
--}
-+// TypeId TopologyReader::GetTypeId (void)
-+// {
-+//   static TypeId tid = TypeId ("ns3::TopologyReader")
-+//     .SetParent<Object> ()
-+//   ;
-+//   return tid;
-+// }
- 
- TopologyReader::TopologyReader ()
- {
-diff --git a/src/topology-read/model/topology-reader.h b/src/topology-read/model/topology-reader.h
-index 48c0c1d..94eb37a 100644
---- a/src/topology-read/model/topology-reader.h
-+++ b/src/topology-read/model/topology-reader.h
-@@ -22,13 +22,11 @@
- #ifndef TOPOLOGY_READER_H
- #define TOPOLOGY_READER_H
- 
--#include <string>
- #include <map>
- #include <list>
- 
--#include "ns3/object.h"
- #include "ns3/node-container.h"
--
-+#include "ns3/simple-ref-count.h"
- 
- namespace ns3 {
- 
-@@ -42,7 +40,7 @@ class NetDevice;
-  * This interface perform the shared tasks among all possible input file readers.
-  * Each different file format is handled by its own topology reader.
-  */
--class TopologyReader : public Object
-+class TopologyReader : public SimpleRefCount<TopologyReader>
- {
- 
- public:
-@@ -157,7 +155,7 @@ private:
-    */
-   typedef std::list< Link >::const_iterator ConstLinksIterator;
- 
--  static TypeId GetTypeId (void);
-+  // static TypeId GetTypeId (void);
- 
-   TopologyReader ();
-   virtual ~TopologyReader ();
--- 
-1.7.10.2
-
diff --git a/plugins/topology/patches/0003-topology-read-Making-default-constructor-for-Topolog.patch b/plugins/topology/patches/0003-topology-read-Making-default-constructor-for-Topolog.patch
deleted file mode 100644
index 1dcafa3..0000000
--- a/plugins/topology/patches/0003-topology-read-Making-default-constructor-for-Topolog.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 4fd8af52681dc3ab641e93a28b8f2c044272bb16 Mon Sep 17 00:00:00 2001
-From: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
-Date: Thu, 19 Jan 2012 16:57:13 -0800
-Subject: [PATCH 3/3] topology-read: Making default constructor for
- TopologyReader::Link public.
-
-This is necessary for some STL containers operations.
----
- src/topology-read/model/topology-reader.h |    3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/topology-read/model/topology-reader.h b/src/topology-read/model/topology-reader.h
-index 94eb37a..d748989 100644
---- a/src/topology-read/model/topology-reader.h
-+++ b/src/topology-read/model/topology-reader.h
-@@ -59,6 +59,8 @@ public:
-    */
-     typedef std::map<std::string, std::string>::const_iterator ConstAttributesIterator;
- 
-+    Link (); // default constructor
-+    
-     /**
-      * \brief Constructor
-      * \param fromPtr Ptr to the node the link is orginating from
-@@ -140,7 +142,6 @@ public:
-     ConstAttributesIterator AttributesEnd (void);
- 
- private:
--    Link ();
-     std::string m_fromName;
-     Ptr< Node > m_fromPtr;
-     std::string m_toName;
--- 
-1.7.10.2
-
diff --git a/plugins/tracers-broken/README b/plugins/tracers-broken/README
deleted file mode 100644
index 9d4a069..0000000
--- a/plugins/tracers-broken/README
+++ /dev/null
@@ -1,2 +0,0 @@
-A set of tracers that can be useful for NDN and IP scenarios
-
diff --git a/plugins/tracers-broken/ccnx-trace-helper.cc b/plugins/tracers-broken/ccnx-trace-helper.cc
deleted file mode 100644
index 5e98c6f..0000000
--- a/plugins/tracers-broken/ccnx-trace-helper.cc
+++ /dev/null
@@ -1,415 +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 "ccnx-trace-helper.h"
-
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/packet.h"
-#include "ns3/log.h"
-#include "ns3/assert.h"
-#include "ns3/node-list.h"
-#include "ns3/object-vector.h"
-#include "ns3/simulator.h"
-#include "ns3/names.h"
-#include "ns3/tcp-l4-protocol.h"
-#include "ns3/node.h"
-
-#include <boost/ref.hpp>
-#include <boost/lexical_cast.hpp>
-
-#include "tracers/ccnx-aggregate-app-tracer.h"
-#include "tracers/ccnx-aggregate-l3-tracer.h"
-#include "tracers/ccnx-rate-l3-tracer.h"
-#include "tracers/ccnx-seqs-app-tracer.h"
-#include "tracers/ipv4-rate-l3-tracer.h"
-#include "tracers/ipv4-seqs-app-tracer.h"
-#include "tracers/ccnx-consumer-window-tracer.h"
-#include "tracers/ccnx-path-weight-tracer.h"
-
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-#include <fstream>
-
-using namespace std;
-using namespace boost;
-
-NS_LOG_COMPONENT_DEFINE ("CcnxTraceHelper");
-
-namespace ns3 {
-
-CcnxTraceHelper::CcnxTraceHelper ()
-  : m_l3RateTrace (0)
-  , m_appSeqsTrace (0)
-  , m_ipv4RateTrace (0)
-  , m_ipv4AppSeqsTrace (0)
-  , m_windowsTrace (0)
-  , m_windowsTcpTrace (0)
-  , m_pathWeightsTrace (0)
-{
-}
-
-CcnxTraceHelper::~CcnxTraceHelper ()
-{
-  NS_LOG_FUNCTION (this);
-  if (m_l3RateTrace != 0) delete m_l3RateTrace;
-  if (m_appSeqsTrace != 0) delete m_appSeqsTrace;
-  if (m_ipv4AppSeqsTrace != 0) delete m_ipv4AppSeqsTrace;
-  if (m_windowsTrace != 0) delete m_windowsTrace;
-  if (m_windowsTcpTrace != 0) delete m_windowsTcpTrace;
-  if (m_pathWeightsTrace != 0) delete m_pathWeightsTrace;
-  if (m_ipv4RateTrace != 0) delete m_ipv4RateTrace;
-  
-  if (m_apps.size () > 0)
-    {
-      ofstream of;
-      if (!m_appTrace.empty ())
-        {
-          of.open (m_appTrace.c_str (), ios_base::trunc | ios_base::out);
-          of << "# ";
-          m_apps.front ()->PrintHeader (of);
-          of << "\n";
-        }
-      
-      for (std::list<Ptr<CcnxAppTracer> >::iterator app = m_apps.begin ();
-           app != m_apps.end ();
-           app++)
-        {
-          if (!m_appTrace.empty ())
-            {
-              (*app)->Print (of);
-              of << "\n";
-            }
-          else
-            {
-              NS_LOG_INFO (*(*app));
-            }
-        }
-    }
-
-  if (m_l3s.size () > 0)
-    {
-      ofstream of;
-      if (!m_l3Trace.empty ())
-        {
-          of.open (m_l3Trace.c_str (), ios_base::trunc | ios_base::out);
-          of << "# ";
-          m_l3s.front ()->PrintHeader (of);
-          of << "\n";
-        }
-      
-      for (std::list<Ptr<CcnxL3Tracer> >::iterator l3 = m_l3s.begin ();
-           l3 != m_l3s.end ();
-           l3++)
-        {
-          if (!m_l3Trace.empty ())
-            {
-              (*l3)->Print (of);
-              of << "\n";
-            }
-          else
-            {
-              NS_LOG_INFO (*(*l3));
-            }
-        }
-    }
-}
-
-void
-CcnxTraceHelper::SetAppTraceFile (const std::string &appTrace)
-{
-  NS_LOG_FUNCTION (this << appTrace);
-  m_appTrace = appTrace;
-}
-
-void
-CcnxTraceHelper::SetL3TraceFile (const std::string &l3Trace)
-{
-  NS_LOG_FUNCTION (this << l3Trace);
-  m_l3Trace = l3Trace;
-}
-
-void
-CcnxTraceHelper::EnableAggregateAppAll (const std::string &appName)
-{
-  NS_LOG_FUNCTION (this << appName);
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      ObjectVectorValue apps;
-      (*node)->GetAttribute ("ApplicationList", apps);
-
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-      
-      uint32_t appId = 0;
-      for (ObjectVectorValue::Iterator app = apps.Begin ();
-           app != apps.End ();
-           app++, appId++)
-        {
-          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app).second->GetInstanceTypeId ().GetName ());
-          if ((*app).second->GetInstanceTypeId ().GetName () == appName)
-            {
-              m_apps.push_back (Create<CcnxAggregateAppTracer> (appName,
-                                                                *node,
-                                                                lexical_cast<string> (appId)));
-            }
-        }
-    }
-}
-
-void
-CcnxTraceHelper::EnableAggregateL3All ()
-{
-  NS_LOG_FUNCTION (this);
-  
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-      
-      m_l3s.push_back (Create<CcnxAggregateL3Tracer> (*node));
-    }
-}
-
-void
-CcnxTraceHelper::EnableRateL3All (const std::string &l3RateTrace)
-{
-  NS_LOG_FUNCTION (this);
-  m_l3RateTrace = new ofstream (l3RateTrace.c_str (), ios::trunc);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-
-      Ptr<CcnxRateL3Tracer> trace = Create<CcnxRateL3Tracer> (boost::ref(*m_l3RateTrace), *node);
-      trace->SetAveragingPeriod (Seconds (0.2));
-      m_l3Rates.push_back (trace);
-    }
-
-  if (m_l3Rates.size () > 0)
-    {
-      // *m_l3RateTrace << "# "; // not necessary for R's read.table
-      m_l3Rates.front ()->PrintHeader (*m_l3RateTrace);
-      *m_l3RateTrace << "\n";
-    }
-}
-
-void
-CcnxTraceHelper::EnableIpv4RateL3All (const std::string &file)
-{
-  NS_LOG_FUNCTION (this);
-  m_ipv4RateTrace = new ofstream (file.c_str (), ios::trunc);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-
-      Ptr<Ipv4RateL3Tracer> trace = Create<Ipv4RateL3Tracer> (boost::ref(*m_ipv4RateTrace), *node);
-      trace->SetAveragingPeriod (Seconds (0.2));
-      m_ipv4Rates.push_back (trace);
-    }
-
-  if (m_ipv4Rates.size () > 0)
-    {
-      // *m_ipv4RateTrace << "# "; // not necessary for R's read.table
-      m_ipv4Rates.front ()->PrintHeader (*m_ipv4RateTrace);
-      *m_ipv4RateTrace << "\n";
-    }
-}
-
-
-void
-CcnxTraceHelper::EnableSeqsAppAll (const std::string &appName, const std::string &trace)
-{
-  NS_LOG_FUNCTION (this);
-  m_appSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      ObjectVectorValue apps;
-      (*node)->GetAttribute ("ApplicationList", apps);
-
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-      
-      uint32_t appId = 0;
-      for (ObjectVectorValue::Iterator app = apps.Begin ();
-           app != apps.End ();
-           app++, appId++)
-        {
-          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app).second->GetInstanceTypeId ().GetName ());
-          if ((*app).second->GetInstanceTypeId ().GetName () == appName)
-            {
-              Ptr<CcnxSeqsAppTracer> trace = Create<CcnxSeqsAppTracer> (boost::ref(*m_appSeqsTrace),
-                                                                        appName,
-                                                                        *node,
-                                                                        lexical_cast<string> (appId));
-              m_appSeqs.push_back (trace);
-            }
-        }
-      
-    }
-
-  if (m_appSeqs.size () > 0)
-    {
-      // *m_l3RateTrace << "# "; // not necessary for R's read.table
-      m_appSeqs.front ()->PrintHeader (*m_appSeqsTrace);
-      *m_appSeqsTrace << "\n";
-    }
-}
-
-void
-CcnxTraceHelper::EnableIpv4SeqsAppAll (const std::string &trace)
-{
-  NS_LOG_FUNCTION (this);
-  m_ipv4AppSeqsTrace = new ofstream (trace.c_str (), ios::trunc);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      ObjectVectorValue apps;
-      (*node)->GetAttribute ("ApplicationList", apps);
-
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-      
-      uint32_t appId = 0;
-      for (ObjectVectorValue::Iterator app = apps.Begin ();
-           app != apps.End ();
-           app++, appId++)
-        {
-          NS_LOG_DEBUG ("App: " << lexical_cast<string> (appId) << ", typeId: " << (*app).second->GetInstanceTypeId ().GetName ());
-          if ((*app).second->GetInstanceTypeId ().GetName () == "ns3::PacketSink" ||
-              (*app).second->GetInstanceTypeId ().GetName () == "ns3::BulkSendApplication")
-            {
-              Ptr<Ipv4SeqsAppTracer> trace = Create<Ipv4SeqsAppTracer> (boost::ref(*m_ipv4AppSeqsTrace),
-                                                                        *node,
-                                                                        lexical_cast<string> (appId));
-              m_ipv4AppSeqs.push_back (trace);
-            }
-        }
-      
-    }
-
-  if (m_ipv4AppSeqs.size () > 0)
-    {
-      m_ipv4AppSeqs.front ()->PrintHeader (*m_ipv4AppSeqsTrace);
-      *m_ipv4AppSeqsTrace << "\n";
-    }
-}
-
-void
-CcnxTraceHelper::EnableWindowsAll (const std::string &windowTrace)
-{
-  NS_LOG_FUNCTION (this);
-  m_windowsTrace = new ofstream (windowTrace.c_str (), ios::trunc);
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      ObjectVectorValue apps;
-      (*node)->GetAttribute ("ApplicationList", apps);
-
-      NS_LOG_DEBUG ("Node: " << lexical_cast<string> ((*node)->GetId ()));
-      
-      uint32_t appId = 0;
-      for (ObjectVectorValue::Iterator app = apps.Begin ();
-           app != apps.End ();
-           app++, appId++)
-        {
-          if ((*app).second->GetInstanceTypeId ().GetName () == "ns3::CcnxConsumerWindow")
-            {
-              Ptr<CcnxConsumerWindowTracer> trace = Create<CcnxConsumerWindowTracer> (boost::ref(*m_windowsTrace),
-                                                                                      *node,
-                                                                                      lexical_cast<string> (appId));
-              m_windows.push_back (trace);
-            }
-        }
-      
-    }
-
-  if (m_windows.size () > 0)
-    {
-      m_windows.front ()->PrintHeader (*m_windowsTrace);
-      *m_windowsTrace << "\n";
-    }
-}
-
-void
-CcnxTraceHelper::TcpConnect (Ptr<Node> node)
-{
-  ObjectVectorValue sockets;
-  node->GetObject<TcpL4Protocol> ()->GetAttribute ("SocketList", sockets);
-  
-  uint32_t sockId = 0;      
-  for (ObjectVectorValue::Iterator socket = sockets.Begin ();
-       socket != sockets.End ();
-       socket++, sockId++)
-    {
-      // std::cout << "Node: " << node->GetId () << ", Socket " << sockId << "\n";
-          
-      Ptr<TcpCongestionWindowTracer> trace = Create<TcpCongestionWindowTracer> (boost::ref(*m_windowsTcpTrace),
-                                                                                node,
-                                                                                lexical_cast<string> (sockId));
-      m_windowsTcp.push_back (trace);
-    }
-}
-
-void
-CcnxTraceHelper::EnableWindowsTcpAll (const std::string &windowTrace)
-{
-  NS_LOG_FUNCTION (this);
-  m_windowsTcpTrace = new ofstream (windowTrace.c_str (), ios::trunc);
-
-  WindowTracer::PrintHeader (*m_windowsTcpTrace);
-  *m_windowsTcpTrace << "\n";
-}
-
-void
-CcnxTraceHelper::EnablePathWeights (const std::string &pathWeights)
-{
-  NS_LOG_FUNCTION (this);
-  m_pathWeightsTrace = new ofstream (pathWeights.c_str (), ios::trunc);
-
-  CcnxPathWeightTracer::PrintHeader (*m_pathWeightsTrace);
-  *m_pathWeightsTrace << "\n";
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      Ptr<CcnxPathWeightTracer> trace = Create<CcnxPathWeightTracer> (boost::ref(*m_pathWeightsTrace),
-                                                                      *node);
-      m_pathWeights.push_back (trace);
-    }
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/ccnx-trace-helper.h b/plugins/tracers-broken/ccnx-trace-helper.h
deleted file mode 100644
index aa9cd30..0000000
--- a/plugins/tracers-broken/ccnx-trace-helper.h
+++ /dev/null
@@ -1,165 +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 CCNX_TRACE_HELPER_H
-#define CCNX_TRACE_HELPER_H
-
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-
-#include <list>
-
-namespace ns3 {
-
-class Node;
-class CcnxAppTracer;
-class CcnxL3Tracer;
-class Ipv4L3Tracer;
-class Ipv4AppTracer;
-class WindowTracer;
-class CcnxPathWeightTracer;
-class Application;
-
-class CcnxTraceHelper
-{
-public:
-  CcnxTraceHelper ();
-  
-  /**
-   * @brief Destructor that invokes trace output procedures
-   */
-  ~CcnxTraceHelper ();
-
-  /**
-   * @brief Set filename to output app trace.
-   *
-   * By default, trace is output to NS_LOG_INFO stream
-   *
-   * @param file File where trace will be written to
-   */
-  void
-  SetAppTraceFile (const std::string &appTrace = "apps.log");
-
-  /**
-   * @brief Set filename to output app trace.
-   *
-   * By default, trace is output to NS_LOG_INFO stream
-   *
-   * @param file File where trace will be written to
-   */
-  void
-  SetL3TraceFile (const std::string &l3Trace = "l3.log");
-
-  /**
-   * @brief Enable aggregate app-level CCNx tracing on all CCNx applications
-   *
-   * @param app  Class name of the application of interest
-   */
-  void
-  EnableAggregateAppAll (const std::string &app);
-
-  /**
-   * @brief Enable aggregate network-level CCNx tracing on all CCNx node
-   */
-  void
-  EnableAggregateL3All ();
-
-  /**
-   * @brief Enable network-level CCNx rate tracing on all CCNx nodes
-   */
-  void
-  EnableRateL3All (const std::string &l3RateTrace = "l3-rate.log");
-  
-  /**
-   * @brief Enable app-level CCNx sequence tracing on all CCNx applications
-   */
-  void
-  EnableSeqsAppAll (const std::string &app, const std::string &appSeqsTrace = "app-seqs.log");
-
-  /**
-   * @brief Enable app-level IPv4 sequence tracing on all nodes (BulkSender + PacketSink)
-   */
-  void
-  EnableIpv4SeqsAppAll (const std::string &appSeqsTrace = "app-seqs.log");
-
-  /**
-   * @brief Enable network-level IPv4 rate tracing on all IPv4-enabled nodes
-   */
-  void
-  EnableIpv4RateL3All (const std::string &ipv4RateTrace = "ipv4-rate.log");
-
-  /**
-   * @brief Enable tracing of window changes in CcnxConsumerWindow
-   */
-  void
-  EnableWindowsAll (const std::string &windowTrace = "windows.log");
-
-  /**
-   * @brief Enable tracing of congestion window changes in TcpNewReno
-   */
-  void
-  EnableWindowsTcpAll (const std::string &windowTrace);
-
-  /**
-   * @brief Should be called with node pointer after TCP application
-   *
-   * Workaround because NS-3 needs object to exist before connecting trace
-   */
-  void TcpConnect (Ptr<Node> node);
-
-  /**
-   * @brief Enable tracing of path weights
-   */
-  void
-  EnablePathWeights (const std::string &pathWeights);
-
-private:
-  std::string m_appTrace;
-  std::list<Ptr<CcnxAppTracer> > m_apps;
-
-  std::string m_l3Trace;
-  std::list<Ptr<CcnxL3Tracer> > m_l3s;
-
-  std::list<Ptr<CcnxL3Tracer> > m_l3Rates;
-  std::ostream *m_l3RateTrace;
-
-  std::list<Ptr<CcnxAppTracer> > m_appSeqs;
-  std::ostream *m_appSeqsTrace;
-
-  std::list<Ptr<Ipv4L3Tracer> > m_ipv4Rates;
-  std::ostream *m_ipv4RateTrace;
-
-  std::list<Ptr<Ipv4AppTracer> > m_ipv4AppSeqs;
-  std::ostream *m_ipv4AppSeqsTrace;
-
-  std::list<Ptr<WindowTracer> > m_windows;
-  std::ostream *m_windowsTrace;
-
-  std::list<Ptr<WindowTracer> > m_windowsTcp;
-  std::ostream *m_windowsTcpTrace;
-
-  std::list<Ptr<CcnxPathWeightTracer> > m_pathWeights;
-  std::ostream *m_pathWeightsTrace;
-};
-
-
-} // namespace ns3
-
-#endif /* CCNX_TRACE_HELPER_H */
diff --git a/plugins/tracers-broken/patches/enable-path-stretch-trace.patch b/plugins/tracers-broken/patches/enable-path-stretch-trace.patch
deleted file mode 100644
index 1be4ef1..0000000
--- a/plugins/tracers-broken/patches/enable-path-stretch-trace.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-diff --git a/apps/ccnx-consumer.cc b/apps/ccnx-consumer.cc
-index 1ddc0b1..ac60412 100644
---- a/apps/ccnx-consumer.cc
-+++ b/apps/ccnx-consumer.cc
-@@ -33,7 +33,7 @@
- #include "../model/ccnx-local-face.h"
- #include "ns3/ccnx-interest-header.h"
- #include "ns3/ccnx-content-object-header.h"
--// #include "ns3/weights-path-stretch-tag.h"
-+#include "ns3/weights-path-stretch-tag.h"
- 
- #include <boost/ref.hpp>
- #include <boost/lexical_cast.hpp>
-@@ -288,14 +288,14 @@ CcnxConsumer::OnContentObject (const Ptr<const CcnxContentObject> &content
- 
-   m_rtt->AckSeq (SequenceNumber32 (seq));
- 
--  // Ptr<const WeightsPathStretchTag> tag = payload->RemovePacketTag<WeightsPathStretchTag> ();
--  // if (tag != 0)
--  //   {
--  //     // Notify trace about path weights vector (e.g., for path-stretch calculation)
--  //     m_pathWeightsTrace (GetNode (), tag->GetSourceNode (), seq, tag->GetTotalWeight ());
--  //     // if (Names::FindName (GetNode ()) == "36")// || Names::FindName (GetNode ()) == "40"|| Names::FindName (GetNode ()) == "5")
--  //     //   std::cout << Simulator::Now () << "\t" << boost::cref(*tag) << " = " << tag->GetTotalWeight () << "\n";
--  //   }
-+  Ptr<const WeightsPathStretchTag> tag = payload->RemovePacketTag<WeightsPathStretchTag> ();
-+  if (tag != 0)
-+    {
-+      // Notify trace about path weights vector (e.g., for path-stretch calculation)
-+      m_pathWeightsTrace (GetNode (), tag->GetSourceNode (), seq, tag->GetTotalWeight ());
-+      // if (Names::FindName (GetNode ()) == "36")// || Names::FindName (GetNode ()) == "40"|| Names::FindName (GetNode ()) == "5")
-+      //   std::cout << Simulator::Now () << "\t" << boost::cref(*tag) << " = " << tag->GetTotalWeight () << "\n";
-+}
- }
- 
- void
-diff --git a/model/ccnx-face.cc b/model/ccnx-face.cc
-index 86daa26..25cc0a5 100644
---- a/model/ccnx-face.cc
-+++ b/model/ccnx-face.cc
-@@ -30,7 +30,7 @@
- #include "ns3/boolean.h"
- #include "ns3/simulator.h"
- 
--// #include "ns3/weights-path-stretch-tag.h"
-+#include "ns3/weights-path-stretch-tag.h"
- 
- #include <boost/ref.hpp>
- 
-@@ -59,10 +59,10 @@ CcnxFace::GetTypeId ()
-                    MakeDoubleAccessor (&CcnxFace::m_bucketLeak),
-                    MakeDoubleChecker<double> ())
-                    
--    // .AddAttribute ("MetricTagging", "Enable metric tagging (path-stretch calculation)",
--    //                BooleanValue (false),
--    //                MakeBooleanAccessor (&CcnxFace::m_enableMetricTagging),
--    //                MakeBooleanChecker ())
-+    .AddAttribute ("MetricTagging", "Enable metric tagging (path-stretch calculation)",
-+                   BooleanValue (false),
-+                   MakeBooleanAccessor (&CcnxFace::m_enableMetricTagging),
-+                   MakeBooleanChecker ())
-     ;
-   return tid;
- }
-@@ -157,23 +157,23 @@ CcnxFace::Send (Ptr<Packet> packet)
-   if (!IsUp ())
-     return false;
- 
--  // if (m_enableMetricTagging)
--  //   {
--  //     // update path information
--  //     Ptr<const WeightsPathStretchTag> origTag = packet->RemovePacketTag<WeightsPathStretchTag> ();
--  //     Ptr<WeightsPathStretchTag> tag;
--  //     if (origTag == 0)
--  //       {
--  //         tag = CreateObject<WeightsPathStretchTag> (); // create a new tag
--  //       }
--  //     else
--  //       {
--  //         tag = CreateObject<WeightsPathStretchTag> (*origTag); // will update existing tag
--  //       }
--
--  //     tag->AddPathInfo (m_node, GetMetric ());
--  //     packet->AddPacketTag (tag);
--  //   }
-+  if (m_enableMetricTagging)
-+    {
-+      // update path information
-+      Ptr<const WeightsPathStretchTag> origTag = packet->RemovePacketTag<WeightsPathStretchTag> ();
-+      Ptr<WeightsPathStretchTag> tag;
-+      if (origTag == 0)
-+        {
-+          tag = CreateObject<WeightsPathStretchTag> (); // create a new tag
-+        }
-+      else
-+        {
-+          tag = CreateObject<WeightsPathStretchTag> (*origTag); // will update existing tag
-+        }
-+
-+      tag->AddPathInfo (m_node, GetMetric ());
-+      packet->AddPacketTag (tag);
-+    }
-   
-   SendImpl (packet);
-   return true;
diff --git a/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.cc b/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.cc
deleted file mode 100644
index a7f254b..0000000
--- a/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.cc
+++ /dev/null
@@ -1,172 +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 "ccnx-aggregate-app-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-namespace ns3 {
-    
-CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
-  : CcnxAppTracer (app, node, appId)
-  , m_inInterests (0)
-  , m_outInterests (0)
-  , m_inNacks (0)
-  , m_inData (0)
-  , m_outData (0)
-
-  , m_inInterestsBytes (0)
-  , m_outInterestsBytes (0)
-  , m_inNacksBytes (0)
-  , m_inDataBytes (0)
-  , m_outDataBytes (0)
-{
-}
-
-CcnxAggregateAppTracer::CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId)
-  : CcnxAppTracer (app, node, appId)
-  , m_inInterests (0)
-  , m_outInterests (0)
-  , m_inNacks (0)
-  , m_inData (0)
-  , m_outData (0)
-
-  , m_inInterestsBytes (0)
-  , m_outInterestsBytes (0)
-  , m_inNacksBytes (0)
-  , m_inDataBytes (0)
-  , m_outDataBytes (0)
-{
-}
-
-void
-CcnxAggregateAppTracer::Reset ()
-{
-  m_inInterests = 0;
-  m_outInterests = 0;
-  m_inNacks = 0;
-  m_inData = 0;
-  m_outData = 0;
-
-  m_inInterestsBytes = 0;
-  m_outInterestsBytes = 0;
-  m_inNacksBytes = 0;
-  m_inDataBytes = 0;
-  m_outDataBytes = 0;
-}
-
-void
-CcnxAggregateAppTracer::PrintHeader (std::ostream &os) const
-{
-  os << "NodeId" << "\t"
-     << "App" << "\t"
-     << "AppId" << "\t"
-     << "InInterests" << "\t"
-     << "OutInterests" << "\t"
-    
-     << "InNacks" << "\t"
-    
-     << "InData" << "\t"
-     << "OutData" << "\t"
-
-     << "InInterestsBytes" << "\t"
-     << "OutInterestsBytes" << "\t"
-    
-     << "InNacksBytes" << "\t"
-    
-     << "InDataBytes" << "\t"
-     << "OutDataBytes";
-}
-
-void
-CcnxAggregateAppTracer::Print (std::ostream &os) const
-{
-  os << m_node << "\t"
-     << m_app << "\t"
-     << m_appId << "\t"
-
-     << m_inInterests << "\t"
-     << m_outInterests << "\t"
-    
-     << m_inNacks << "\t"
-    
-     << m_inData << "\t"
-     << m_outData << "\t"
-
-     << m_inInterestsBytes << "\t"
-     << m_outInterestsBytes << "\t"
-    
-     << m_inNacksBytes << "\t"
-    
-     << m_inDataBytes << "\t"
-     << m_outDataBytes;
-}
-
-void
-CcnxAggregateAppTracer::OutInterests (std::string context,
-                                      Ptr<const CcnxInterest> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  m_outInterests++;
-  m_outInterestsBytes += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateAppTracer::OutData (std::string context,
-                                 Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                                 Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  m_outData++;
-  m_outDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
-}
-
-void
-CcnxAggregateAppTracer::InInterests (std::string context,
-                                     Ptr<const CcnxInterest> header,
-                                     Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  m_inInterests++;
-  m_inInterestsBytes += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateAppTracer::InNacks (std::string context,
-                                 Ptr<const CcnxInterest> header,
-                                 Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  m_inNacks++;
-  m_inNacksBytes += header->GetSerializedSize ();
-}
-  
-void
-CcnxAggregateAppTracer::InData (std::string context,
-                                Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                                Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  m_inData++;
-  m_inDataBytes += header->GetSerializedSize () + payload->GetSerializedSize ();
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.h b/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.h
deleted file mode 100644
index a0e52fb..0000000
--- a/plugins/tracers-broken/tracers/ccnx-aggregate-app-tracer.h
+++ /dev/null
@@ -1,81 +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 CCNX_AGGREGATE_APP_TRACER_H
-#define CCNX_AGGREGATE_APP_TRACER_H
-
-#include "ns3/ccnx-app-tracer.h"
-
-namespace ns3 {
-
-class CcnxAggregateAppTracer : public CcnxAppTracer
-{
-public:
-  CcnxAggregateAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
-  CcnxAggregateAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
-  virtual ~CcnxAggregateAppTracer () { };
-
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  OutInterests (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  InInterests  (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  InNacks (std::string context,
-           Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  OutData (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-  
-  virtual void
-  InData  (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-protected:
-  void
-  Reset ();
-
-protected:
-  uint64_t m_inInterests;
-  uint64_t m_outInterests;
-  uint64_t m_inNacks;
-  uint64_t m_inData; 
-  uint64_t m_outData;
-
-  uint64_t m_inInterestsBytes;
-  uint64_t m_outInterestsBytes;
-  uint64_t m_inNacksBytes;
-  uint64_t m_inDataBytes;
-  uint64_t m_outDataBytes;
-};
-
-} // namespace ns3
-
-#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.cc b/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.cc
deleted file mode 100644
index 030d308..0000000
--- a/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.cc
+++ /dev/null
@@ -1,201 +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 "ccnx-aggregate-l3-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-namespace ns3 {
-    
-CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (Ptr<Node> node)
-  : CcnxL3Tracer (node)
-{
-  Reset ();
-}
-
-CcnxAggregateL3Tracer::CcnxAggregateL3Tracer (const std::string &node)
-  : CcnxL3Tracer (node)
-{
-  Reset ();
-}
-
-void
-CcnxAggregateL3Tracer::Stats::Reset ()
-{
-  m_inInterests = 0;
-  m_outInterests = 0;
-  m_dropInterests = 0;
-  m_inNacks = 0;
-  m_outNacks = 0;
-  m_dropNacks = 0;
-  m_inData = 0;
-  m_outData = 0;
-  m_dropData = 0;
-}
-
-
-void
-CcnxAggregateL3Tracer::Reset ()
-{
-  m_packets.Reset ();
-  m_bytes.Reset ();
-}
-
-
-void
-CcnxAggregateL3Tracer::PrintHeader (std::ostream &os) const
-{
-  os << "Node" << "\t"
-     << "InInterests" << "\t"
-     << "OutInterests" << "\t"
-     << "DropInterests" << "\t"
-    
-     << "InNacks" << "\t"
-     << "OutNacks" << "\t"
-     << "DropNacks" << "\t"
-    
-     << "InData" << "\t"
-     << "OutData" << "\t"
-     << "DropData" << "\t"
-    
-     << "InInterestsBytes" << "\t"
-     << "OutInterestsBytes" << "\t"
-     << "DropInterestsBytes" << "\t"
-    
-     << "InNacksBytes" << "\t"
-     << "OutNacksBytes" << "\t"
-     << "DropNacksBytes" << "\t"
-    
-     << "InDataBytes" << "\t"
-     << "OutDataBytes" << "\t"
-     << "DropDataBytes";
-}
-
-void
-CcnxAggregateL3Tracer::Print (std::ostream &os) const
-{
-  os << m_node << "\t"
-     << m_packets.m_inInterests   << "\t"
-     << m_packets.m_outInterests  << "\t"
-     << m_packets.m_dropInterests << "\t"
-
-     << m_packets.m_inNacks   << "\t"
-     << m_packets.m_outNacks  << "\t"
-     << m_packets.m_dropNacks << "\t"
-
-     << m_packets.m_inData   << "\t"
-     << m_packets.m_outData  << "\t"
-     << m_packets.m_dropData << "\t"
-
-     << m_bytes.m_inInterests   << "\t"
-     << m_bytes.m_outInterests  << "\t"
-     << m_bytes.m_dropInterests << "\t"
-
-     << m_bytes.m_inNacks   << "\t"
-     << m_bytes.m_outNacks  << "\t"
-     << m_bytes.m_dropNacks << "\t"
-
-     << m_bytes.m_inData   << "\t"
-     << m_bytes.m_outData  << "\t"
-     << m_bytes.m_dropData;
-}
-
-void
-CcnxAggregateL3Tracer::OutInterests  (std::string context,
-                                      Ptr<const CcnxInterest> header, Ptr<const CcnxFace>)
-{
-  m_packets.m_outInterests++;
-  m_bytes.m_outInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::InInterests   (std::string context,
-                                      Ptr<const CcnxInterest> header, Ptr<const CcnxFace>)
-{
-  m_packets.m_inInterests++;
-  m_bytes.m_inInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::DropInterests (std::string context,
-                                      Ptr<const CcnxInterest> header, Ccnx::DropReason, Ptr<const CcnxFace>)
-{
-  m_packets.m_dropInterests++;
-  m_bytes.m_dropInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::OutNacks  (std::string context,
-                                  Ptr<const CcnxInterest> header, Ptr<const CcnxFace>)
-{
-  m_packets.m_outNacks++;
-  m_bytes.m_outNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::InNacks   (std::string context,
-                                  Ptr<const CcnxInterest> header, Ptr<const CcnxFace>)
-{
-  m_packets.m_inNacks++;
-  m_bytes.m_inNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::DropNacks (std::string context,
-                                  Ptr<const CcnxInterest> header, Ccnx::DropReason, Ptr<const CcnxFace>)
-{
-  m_packets.m_dropNacks++;
-  m_bytes.m_dropNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxAggregateL3Tracer::OutData  (std::string context,
-                                 Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                                 bool fromCache, Ptr<const CcnxFace>)
-{
-  m_packets.m_outData++;
-  m_bytes.m_outData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-void
-CcnxAggregateL3Tracer::InData   (std::string context,
-                                 Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                                 Ptr<const CcnxFace>)
-{
-  m_packets.m_inData++;
-  m_bytes.m_inData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-void
-CcnxAggregateL3Tracer::DropData (std::string context,
-                                 Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                                 Ccnx::DropReason, Ptr<const CcnxFace>)
-{
-  m_packets.m_dropData++;
-  m_bytes.m_dropData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.h b/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.h
deleted file mode 100644
index f64062c..0000000
--- a/plugins/tracers-broken/tracers/ccnx-aggregate-l3-tracer.h
+++ /dev/null
@@ -1,88 +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 CCNX_AGGREGATE_L3_TRACER_H
-#define CCNX_AGGREGATE_L3_TRACER_H
-
-#include "ns3/ccnx-l3-tracer.h"
-
-namespace ns3 {
-
-class CcnxAggregateL3Tracer : public CcnxL3Tracer
-{
-public:
-  CcnxAggregateL3Tracer (Ptr<Node> node);
-  CcnxAggregateL3Tracer (const std::string &node);
-  virtual ~CcnxAggregateL3Tracer () { };
-  
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  OutInterests  (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  InInterests   (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropInterests (std::string context,
-                 Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>);
-  
-  virtual void
-  OutNacks  (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  InNacks   (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropNacks (std::string context,
-             Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>);
-  
-  virtual void
-  OutData  (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
-
-  virtual void
-  InData   (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropData (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
-
-protected:
-  void
-  Reset ();
-  
-protected:
-  Stats m_packets;
-  Stats m_bytes;
-};
-
-} // namespace ns3
-
-#endif // CCNX_AGGREGATE_L3_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-app-tracer.cc b/plugins/tracers-broken/tracers/ccnx-app-tracer.cc
deleted file mode 100644
index 879e48e..0000000
--- a/plugins/tracers-broken/tracers/ccnx-app-tracer.cc
+++ /dev/null
@@ -1,84 +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 "ccnx-app-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/names.h"
-
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-
-#include <boost/lexical_cast.hpp>
-
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-using namespace std;
-using namespace boost;
-
-namespace ns3 {
-    
-CcnxAppTracer::CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId)
-  : m_app (app)
-  , m_appId (appId)
-  , m_nodePtr (node)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  Connect ();
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_node = name;
-    }
-}
-
-CcnxAppTracer::CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId)
-  : m_app (app)
-  , m_appId (appId)
-  , m_node (node)
-{
-  Connect ();
-}
-
-void
-CcnxAppTracer::Connect ()
-{
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedInterests",
-                   MakeCallback (&CcnxAppTracer::OutInterests, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedNacks",
-                   MakeCallback (&CcnxAppTracer::InNacks, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedInterests",
-                   MakeCallback (&CcnxAppTracer::InInterests, this));
-  
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/TransmittedDatas",
-                   MakeCallback (&CcnxAppTracer::OutData, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$"+m_app+"/ReceivedDatas",
-                   MakeCallback (&CcnxAppTracer::InData, this));
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-app-tracer.h b/plugins/tracers-broken/tracers/ccnx-app-tracer.h
deleted file mode 100644
index affb98b..0000000
--- a/plugins/tracers-broken/tracers/ccnx-app-tracer.h
+++ /dev/null
@@ -1,87 +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 CCNX_APP_TRACER_H
-#define CCNX_APP_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/ccnx.h"
-
-namespace ns3 {
-
-class CcnxApp;
-
-class CcnxAppTracer : public SimpleRefCount<CcnxAppTracer>
-{
-public:
-  CcnxAppTracer (const std::string &app, Ptr<Node> node, const std::string &appId = "*");
-  CcnxAppTracer (const std::string &app, const std::string &node, const std::string &appId = "*");
-  virtual ~CcnxAppTracer ()  { };
-
-  void
-  Connect ();
-
-  virtual void
-  PrintHeader (std::ostream &os) const = 0;
-  
-  virtual void
-  Print (std::ostream &os) const = 0;
-
-  virtual void
-  OutInterests (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
-
-  virtual void
-  InInterests  (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
-
-  virtual void
-  InNacks (std::string context,
-           Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
-
-  virtual void
-  OutData (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
-  
-  virtual void
-  InData  (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>) = 0;
-
-protected:
-  std::string m_app;
-  std::string m_appId;
-  std::string m_node;
-  Ptr<Node> m_nodePtr;
-};
-
-inline std::ostream&
-operator << (std::ostream &os, const CcnxAppTracer &tracer)
-{
-  os << "# ";
-  tracer.PrintHeader (os);
-  os << "\n";
-  tracer.Print (os);
-  return os;
-}
-
-} // namespace ns3
-
-#endif // CCNX_APP_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.cc b/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.cc
deleted file mode 100644
index eea664a..0000000
--- a/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.cc
+++ /dev/null
@@ -1,88 +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 "ccnx-consumer-window-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/names.h"
-#include "ns3/simulator.h"
-
-#include <boost/lexical_cast.hpp>
-
-using namespace std;
-using namespace boost;
-
-namespace ns3 {
-
-void
-CcnxConsumerWindowTracer::Connect ()
-{
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/"+m_appId+"/$ns3::CcnxConsumerWindow/WindowTrace",
-                   MakeCallback (&WindowTracer::OnWindowChange, this));
-}
-
-void
-TcpCongestionWindowTracer::Connect ()
-{
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::TcpL4Protocol/SocketList/*/CongestionWindow",
-                   MakeCallback (&WindowTracer::OnWindowChange, this));
-}
-
-
-WindowTracer::WindowTracer (std::ostream &os, Ptr<Node> node, const std::string &appId)
-  : m_appId (appId)
-  , m_nodePtr (node)
-  , m_os (os)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_nodeName = name;
-    }
-  else
-    m_nodeName = m_node;
-}
-
-
-void
-WindowTracer::PrintHeader (std::ostream &os)
-{
-  os << "Time\t"
-     << "Node\t"
-     << "AppId\t"
-     << "Window";
-}
-
-void
-WindowTracer::OnWindowChange (std::string context,
-                              uint32_t oldValue, uint32_t newValue)
-{
-  m_os                                                             
-    << Simulator::Now ().ToDouble (Time::S) << "\t"                   
-    << m_nodeName << "\t"                                                 
-    << m_appId << "\t"
-    << newValue << endl;
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.h b/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.h
deleted file mode 100644
index c538931..0000000
--- a/plugins/tracers-broken/tracers/ccnx-consumer-window-tracer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 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 CCNX_CONSUMER_WINDOW_TRACER_H
-#define CCNX_CONSUMER_WINDOW_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-
-namespace ns3 {
-
-class Node;
-
-class WindowTracer : public SimpleRefCount<WindowTracer>
-{
-public:
-  WindowTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*");
-  virtual ~WindowTracer () { };
-                
-  static void
-  PrintHeader (std::ostream &os);
-  
-  virtual void
-  OnWindowChange (std::string context,
-                  uint32_t oldValue, uint32_t newValue);
-
-protected:
-  std::string m_appId;
-  std::string m_node;
-  std::string m_nodeName;
-  Ptr<Node> m_nodePtr;
-  std::ostream& m_os;
-};
-
-class CcnxConsumerWindowTracer : public WindowTracer
-{
-public:
-  CcnxConsumerWindowTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*")
-    : WindowTracer (os, node, appId)
-  { Connect (); }
-
-  void
-  Connect ();
-};
-
-class TcpCongestionWindowTracer : public WindowTracer
-{
-public:
-  TcpCongestionWindowTracer (std::ostream &os, Ptr<Node> node, const std::string &appId = "*")
-    : WindowTracer (os, node, appId)
-  { Connect (); }
-
-  void
-  Connect ();
-};
-
-
-} // namespace ns3
-
-#endif // CCNX_CONSUMER_WINDOW_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-l3-tracer.cc b/plugins/tracers-broken/tracers/ccnx-l3-tracer.cc
deleted file mode 100644
index 415105b..0000000
--- a/plugins/tracers-broken/tracers/ccnx-l3-tracer.cc
+++ /dev/null
@@ -1,84 +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 "ccnx-l3-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/names.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-
-#include <boost/lexical_cast.hpp>
-
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-using namespace std;
-
-namespace ns3 {
-    
-CcnxL3Tracer::CcnxL3Tracer (Ptr<Node> node)
-: m_nodePtr (node)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  Connect ();
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_node = name;
-    }
-}
-
-CcnxL3Tracer::CcnxL3Tracer (const std::string &node)
-: m_node (node)
-{
-  Connect ();
-}
-
-void
-CcnxL3Tracer::Connect ()
-{
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/ForwardingStrategy/OutInterests",
-                   MakeCallback (&CcnxL3Tracer::OutInterests, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InInterests",
-                   MakeCallback (&CcnxL3Tracer::InInterests, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropInterests",
-                   MakeCallback (&CcnxL3Tracer::DropInterests, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutNacks",
-                   MakeCallback (&CcnxL3Tracer::OutNacks, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InNacks",
-                   MakeCallback (&CcnxL3Tracer::InNacks, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropNacks",
-                   MakeCallback (&CcnxL3Tracer::DropNacks, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/OutData",
-                   MakeCallback (&CcnxL3Tracer::OutData, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/InData",
-                   MakeCallback (&CcnxL3Tracer::InData, this));
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/DropData",
-                   MakeCallback (&CcnxL3Tracer::DropData, this));
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-l3-tracer.h b/plugins/tracers-broken/tracers/ccnx-l3-tracer.h
deleted file mode 100644
index ae4cea1..0000000
--- a/plugins/tracers-broken/tracers/ccnx-l3-tracer.h
+++ /dev/null
@@ -1,117 +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 CCNX_L3_TRACER_H
-#define CCNX_L3_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/ccnx.h"
-
-namespace ns3 {
-
-class Node;
-
-class CcnxL3Tracer : public SimpleRefCount<CcnxL3Tracer>
-{
-public:
-  CcnxL3Tracer (Ptr<Node> node);
-  CcnxL3Tracer (const std::string &node);
-  virtual ~CcnxL3Tracer () { };
-
-  void
-  Connect ();
-  
-  virtual void
-  PrintHeader (std::ostream &os) const = 0;
-
-  virtual void
-  Print (std::ostream &os) const = 0;
-  
-  virtual void
-  OutInterests  (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  InInterests   (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  DropInterests (std::string context,
-                 Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
-  
-  virtual void
-  OutNacks  (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  InNacks   (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  DropNacks (std::string context,
-             Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
-
-  
-  virtual void
-  OutData  (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  InData   (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ptr<const CcnxFace>) = 0;
-
-  virtual void
-  DropData (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>) = 0;
-
-protected:
-  std::string m_node;
-  Ptr<Node> m_nodePtr;
-
-  struct Stats
-  {
-    void Reset ();
-    
-    uint64_t m_inInterests;
-    uint64_t m_outInterests;
-    uint64_t m_dropInterests;
-    uint64_t m_inNacks;
-    uint64_t m_outNacks;
-    uint64_t m_dropNacks;
-    uint64_t m_inData;
-    uint64_t m_outData;
-    uint64_t m_dropData;
-  };
-};
-
-inline std::ostream&
-operator << (std::ostream &os, const CcnxL3Tracer &tracer)
-{
-  os << "# ";
-  tracer.PrintHeader (os);
-  os << "\n";
-  tracer.Print (os);
-  return os;
-}
-
-} // namespace ns3
-
-#endif // CCNX_L3_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.cc b/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.cc
deleted file mode 100644
index b2685bd..0000000
--- a/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.cc
+++ /dev/null
@@ -1,91 +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 "ccnx-path-weight-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/names.h"
-#include "ns3/callback.h"
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/boolean.h"
-#include "ns3/simulator.h"
-
-#include <boost/lexical_cast.hpp>
-#include <boost/foreach.hpp>
-
-using namespace std;
-
-namespace ns3 {
-    
-CcnxPathWeightTracer::CcnxPathWeightTracer (std::ostream &os, Ptr<Node> node)
-  : m_os (os)
-  , m_nodePtr (node)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  Connect ();
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_node = name;
-    }
-}
-
-void
-CcnxPathWeightTracer::Connect ()
-{
-  Config::Set ("/NodeList/"+m_node+"/$ns3::CcnxL3Protocol/FaceList/*/MetricTagging",
-               BooleanValue (true));
-
-  Config::Connect ("/NodeList/"+m_node+"/ApplicationList/*/PathWeightsTrace",
-                   MakeCallback (&CcnxPathWeightTracer::InLocalFace, this));
-}
-
-void
-CcnxPathWeightTracer::PrintHeader (std::ostream &os)
-{
-  os << "Time\t"
-     << "Src\t"
-     << "Dst\t"
-     << "SeqNo\t"
-     << "Weight";
-}
-
-void
-CcnxPathWeightTracer::InLocalFace (std::string context,
-                                   Ptr<Node> src, Ptr<Node> dst, uint32_t seqno, uint32_t weight)
-{
-  std::string srcName = Names::FindName (src);
-  std::string dstName = Names::FindName (dst);
-  if (srcName == "") srcName = boost::lexical_cast<std::string> (src->GetId ());
-  if (dstName == "") srcName = boost::lexical_cast<std::string> (dst->GetId ());
-  // std::cout << "Path weights from " << Names::FindName (src) << " to "<< Names::FindName (dst) <<" : " << weight << "\n";
-
-  m_os << Simulator::Now ().ToDouble (Time::S) << "\t"
-       << srcName << "\t"
-       << dstName << "\t"
-       << seqno << "\t"
-       << weight << "\n";
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.h b/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.h
deleted file mode 100644
index 303197d..0000000
--- a/plugins/tracers-broken/tracers/ccnx-path-weight-tracer.h
+++ /dev/null
@@ -1,62 +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 CCNX_PATH_WEIGHT_TRACER_H
-#define CCNX_PATH_WEIGHT_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/weights-path-stretch-tag.h"
-#include <list>
-
-namespace ns3 {
-
-class Node;
-class Packet;
-class CcnxApp;
-
-class CcnxPathWeightTracer : public SimpleRefCount<CcnxPathWeightTracer>
-{
-public:
-  CcnxPathWeightTracer (std::ostream &os, Ptr<Node> node);
-  virtual ~CcnxPathWeightTracer () { };
-
-  void
-  Connect ();
-  
-  static void
-  PrintHeader (std::ostream &os);
-
-  /**
-   * \brief Process packet weight upon reception of packet on a local face
-   */
-  virtual void
-  InLocalFace (std::string context,
-               Ptr<Node> src, Ptr<Node> dst, uint32_t seqno, uint32_t weight);
-
-protected:
-  std::ostream &m_os;
-  std::string m_node;
-  Ptr<Node> m_nodePtr;
-};
-
-} // namespace ns3
-
-#endif // CCNX_PATH_WEIGHT_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.cc b/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.cc
deleted file mode 100644
index 9d79d72..0000000
--- a/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.cc
+++ /dev/null
@@ -1,213 +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 "ccnx-rate-l3-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/simulator.h"
-
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-namespace ns3 {
-    
-CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node)
-  : CcnxL3Tracer (node)
-  , m_os (os)
-{
-  SetAveragingPeriod (Seconds (1.0));
-}
-
-CcnxRateL3Tracer::CcnxRateL3Tracer (std::ostream &os, const std::string &node)
-  : CcnxL3Tracer (node)
-  , m_os (os)
-{
-  SetAveragingPeriod (Seconds (1.0));
-}
-
-CcnxRateL3Tracer::~CcnxRateL3Tracer ()
-{
-  m_printEvent.Cancel ();
-}
-
-void
-CcnxRateL3Tracer::SetAveragingPeriod (const Time &period)
-{
-  m_period = period;
-  m_printEvent.Cancel ();
-  m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
-}
-
-void
-CcnxRateL3Tracer::PeriodicPrinter ()
-{
-  Print (m_os);
-  Reset ();
-  
-  m_printEvent = Simulator::Schedule (m_period, &CcnxRateL3Tracer::PeriodicPrinter, this);
-}
-
-void
-CcnxRateL3Tracer::PrintHeader (std::ostream &os) const
-{
-  os << "Time" << "\t"
-
-     << "Node" << "\t"
-     << "FaceId" << "\t"
-     << "FaceDescr" << "\t"
-
-     << "Type" << "\t"
-     << "Packets" << "\t"
-     << "Kilobytes";
-}
-
-void
-CcnxRateL3Tracer::Reset ()
-{
-  for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
-       stats != m_stats.end ();
-       stats++)
-    {
-      stats->second.get<0> ().Reset ();
-      stats->second.get<1> ().Reset ();
-    }
-}
-
-const double alpha = 0.8;
-
-#define STATS(INDEX) stats->second.get<INDEX> ()
-#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble (Time::S)
-
-#define PRINTER(printName, fieldName) \
-STATS(2).fieldName = /*new value*/alpha * RATE(0, fieldName) + /*old value*/(1-alpha) * STATS(2).fieldName; \
- STATS(3).fieldName = /*new value*/alpha * RATE(1, fieldName) / 1024.0 + /*old value*/(1-alpha) * STATS(3).fieldName; \
-                                                                        \
-os << time.ToDouble (Time::S) << "\t"                                   \
- << m_node << "\t"                                                      \
- << stats->first->GetId () << "\t"                                      \
- << *stats->first << "\t"                                               \
- << printName << "\t"                                                   \
- << STATS(2).fieldName  << "\t"                                        \
- << STATS(3).fieldName << "\n";
-
-void
-CcnxRateL3Tracer::Print (std::ostream &os) const
-{
-  for (std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
-       stats != m_stats.end ();
-       stats++)
-    {
-      Time time = Simulator::Now ();
-
-      PRINTER ("InInterests",   m_inInterests);
-      PRINTER ("OutInterests",  m_outInterests);
-      PRINTER ("DropInterests", m_dropInterests);
-      
-      PRINTER ("InNacks",   m_inNacks);
-      PRINTER ("OutNacks",  m_outNacks);
-      PRINTER ("DropNacks", m_dropNacks);
-
-      PRINTER ("InData",   m_inData);
-      PRINTER ("OutData",  m_outData);
-      PRINTER ("DropData", m_dropData);
-    }
-}
-
-
-void
-CcnxRateL3Tracer::OutInterests  (std::string context,
-                                      Ptr<const CcnxInterest> header, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_outInterests ++;
-  m_stats[face].get<1> ().m_outInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::InInterests   (std::string context,
-                                 Ptr<const CcnxInterest> header, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_inInterests ++;
-  m_stats[face].get<1> ().m_inInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::DropInterests (std::string context,
-                                      Ptr<const CcnxInterest> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_dropInterests ++;
-  m_stats[face].get<1> ().m_dropInterests += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::OutNacks  (std::string context,
-                                  Ptr<const CcnxInterest> header, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_outNacks ++;
-  m_stats[face].get<1> ().m_outNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::InNacks   (std::string context,
-                                  Ptr<const CcnxInterest> header, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_inNacks ++;
-  m_stats[face].get<1> ().m_inNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::DropNacks (std::string context,
-                             Ptr<const CcnxInterest> header, Ccnx::DropReason, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_dropNacks ++;
-  m_stats[face].get<1> ().m_dropNacks += header->GetSerializedSize ();
-}
-
-void
-CcnxRateL3Tracer::OutData  (std::string context,
-                            Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                            bool fromCache, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_inData ++;
-  m_stats[face].get<1> ().m_inData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-void
-CcnxRateL3Tracer::InData   (std::string context,
-                            Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                            Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_outData ++;
-  m_stats[face].get<1> ().m_outData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-void
-CcnxRateL3Tracer::DropData (std::string context,
-                            Ptr<const CcnxData> header, Ptr<const Packet> payload,
-                            Ccnx::DropReason, Ptr<const CcnxFace> face)
-{
-  m_stats[face].get<0> ().m_dropData ++;
-  m_stats[face].get<1> ().m_dropData += header->GetSerializedSize () + payload->GetSize ();
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.h b/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.h
deleted file mode 100644
index a93a305..0000000
--- a/plugins/tracers-broken/tracers/ccnx-rate-l3-tracer.h
+++ /dev/null
@@ -1,110 +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 CCNX_RATE_L3_TRACER_H
-#define CCNX_RATE_L3_TRACER_H
-
-#include "ns3/ccnx-l3-tracer.h"
-
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-
-#include <boost/tuple/tuple.hpp>
-#include <map>
-
-namespace ns3 {
-
-/**
- * @ingroup ccnx
- * @brief CCNx network-layer rate tracer
- */
-class CcnxRateL3Tracer : public CcnxL3Tracer
-{
-public:
-  /**
-   * @brief Network layer tracer constructor
-   */
-  CcnxRateL3Tracer (std::ostream &os, Ptr<Node> node);
-  CcnxRateL3Tracer (std::ostream &os, const std::string &node);
-  virtual ~CcnxRateL3Tracer ();
-
-  void
-  SetAveragingPeriod (const Time &period);
-  
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  OutInterests  (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  InInterests   (std::string context,
-                 Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropInterests (std::string context,
-                 Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>);
-  
-  virtual void
-  OutNacks  (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  InNacks   (std::string context,
-             Ptr<const CcnxInterest>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropNacks (std::string context,
-             Ptr<const CcnxInterest>, Ccnx::DropReason, Ptr<const CcnxFace>);
-  
-  virtual void
-  OutData  (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, bool fromCache, Ptr<const CcnxFace>);
-
-  virtual void
-  InData   (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ptr<const CcnxFace>);
-
-  virtual void
-  DropData (std::string context,
-            Ptr<const CcnxData>, Ptr<const Packet>, Ccnx::DropReason, Ptr<const CcnxFace>);
-
-private:
-  void
-  PeriodicPrinter ();
-  
-  void
-  Reset ();
-
-private:
-  std::ostream& m_os;
-  Time m_period;
-  EventId m_printEvent;
-
-  mutable std::map<Ptr<const CcnxFace>, boost::tuple<Stats, Stats, Stats, Stats> > m_stats;
-};
-
-} // namespace ns3
-
-#endif // CCNX_RATE_L3_TRACER_H
diff --git a/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.cc b/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.cc
deleted file mode 100644
index f974976..0000000
--- a/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.cc
+++ /dev/null
@@ -1,116 +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 "ccnx-seqs-app-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/simulator.h"
-
-#include "ns3/ccnx-app.h"
-#include "ns3/ccnx-face.h"
-#include "ns3/ccnx-interest-header.h"
-#include "ns3/ccnx-content-object-header.h"
-
-namespace ns3 {
-    
-CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId)
-  : CcnxAppTracer (app, node, appId)
-  , m_os (os)
-{
-}
-
-CcnxSeqsAppTracer::CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId)
-  : CcnxAppTracer (app, node, appId)
-  , m_os (os)
-{
-}
-
-void
-CcnxSeqsAppTracer::Reset ()
-{
-}
-
-void
-CcnxSeqsAppTracer::PrintHeader (std::ostream &os) const
-{
-  os << "Time\t"
-     << "Node\t"
-     << "AppName\t"
-     << "AppId\t"
-     << "Type\t"
-     << "SeqNo";
-}
-
-void
-CcnxSeqsAppTracer::Print (std::ostream &os) const
-{
-}
-
-#define PRINTER(type)                                              \
- m_os                                                              \
- << Simulator::Now ().ToDouble (Time::S) << "\t"                   \
- << m_node << "\t"                                                 \
- << m_app << "\t"                                                  \
- << m_appId << "\t"                                                \
- << type << "\t"                                                   \
- << header->GetName ().GetLastComponent () << std::endl;
-
-void
-CcnxSeqsAppTracer::OutInterests (std::string context,
-                                 Ptr<const CcnxInterest> header, Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  PRINTER ("OutInterest");
-}
-
-void
-CcnxSeqsAppTracer::OutData (std::string context,
-                            Ptr<const CcnxData> header, Ptr<const Packet>,
-                            Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  PRINTER ("OutData");
-}
-
-void
-CcnxSeqsAppTracer::InInterests (std::string context,
-                                Ptr<const CcnxInterest> header,
-                                Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  PRINTER ("InInterest");
-}
-
-void
-CcnxSeqsAppTracer::InNacks (std::string context,
-                            Ptr<const CcnxInterest> header,
-                            Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  PRINTER ("InNacks");
-}
-  
-void
-CcnxSeqsAppTracer::InData (std::string context,
-                           Ptr<const CcnxData> header, Ptr<const Packet>,
-                           Ptr<CcnxApp>, Ptr<CcnxFace>)
-{
-  PRINTER ("InData");
-}
-
-} // namespace ns3
diff --git a/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.h b/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.h
deleted file mode 100644
index 404c7a2..0000000
--- a/plugins/tracers-broken/tracers/ccnx-seqs-app-tracer.h
+++ /dev/null
@@ -1,71 +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 CCNX_SEQS_APP_TRACER_H
-#define CCNX_SEQS_APP_TRACER_H
-
-#include "ns3/ccnx-app-tracer.h"
-
-namespace ns3 {
-
-class CcnxSeqsAppTracer : public CcnxAppTracer
-{
-public:
-  CcnxSeqsAppTracer (std::ostream &os, const std::string &app, Ptr<Node> node, const std::string &appId = "*");
-  CcnxSeqsAppTracer (std::ostream &os, const std::string &app, const std::string &node, const std::string &appId = "*");
-  virtual ~CcnxSeqsAppTracer () { };
-
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  OutInterests (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  InInterests  (std::string context,
-                Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  InNacks (std::string context,
-           Ptr<const CcnxInterest>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-  virtual void
-  OutData (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-  
-  virtual void
-  InData  (std::string context,
-           Ptr<const CcnxData>, Ptr<const Packet>, Ptr<CcnxApp>, Ptr<CcnxFace>);
-
-protected:
-  void
-  Reset ();
-
-protected:
-  std::ostream& m_os;
-};
-
-} // namespace ns3
-
-#endif // CCNX_AGGREGATE_APP_TRACER_H
diff --git a/plugins/tracers-broken/weights-path-stretch-tag.cc b/plugins/tracers-broken/weights-path-stretch-tag.cc
deleted file mode 100644
index fe3e41c..0000000
--- a/plugins/tracers-broken/weights-path-stretch-tag.cc
+++ /dev/null
@@ -1,120 +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>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
- 
-#include "weights-path-stretch-tag.h"
-#include "ns3/node.h"
-#include "ns3/names.h"
-
-namespace ns3 {
-
-WeightsPathStretchTag::WeightsPathStretchTag ()
-{
-}
-
-void
-WeightsPathStretchTag::AddPathInfo (Ptr<Node> node, uint32_t weight)
-{
-  m_infos.push_back (NodeWeightPair (node, weight));
-}
-
-
-TypeId WeightsPathStretchTag::GetTypeId ()
-{
-  static TypeId tid = TypeId("ns3::WeightsPathStretchTag")
-    .SetParent<Tag>()
-    .AddConstructor<WeightsPathStretchTag>()
-    ;
-  return tid;
-}
-
-// TypeId
-// WeightsPathStretchTag::GetInstanceTypeId () const
-// {
-//   return GetTypeId ();
-// }
-
-uint64_t
-WeightsPathStretchTag::GetTotalWeight () const
-{
-  uint64_t total = 0;
-  for (std::list<NodeWeightPair>::const_iterator info = m_infos.begin (); info != m_infos.end (); info++)
-    {
-      total += info->weight;
-    }
-  return total;
-}
-
-Ptr<Node>
-WeightsPathStretchTag::GetSourceNode () const
-{
-  NS_ASSERT (m_infos.size () > 0);
-  return m_infos.front ().node;
-}
-
-Ptr<Node>
-WeightsPathStretchTag::GetDestinationNode () const
-{
-  NS_ASSERT (m_infos.size () > 0);
-  return m_infos.back ().node;
-}
-
-uint32_t WeightsPathStretchTag::GetSerializedSize (void) const
-{
-  return 0;
-  // return sizeof (GetPointer (m_value.node)) + sizeof (m_value.weight);
-}
-
-void WeightsPathStretchTag::Serialize (TagBuffer i) const
-{
-  NS_FATAL_ERROR ("Serialization is not supported for this tag");
-  // m_value.node->Ref ();
-  // i.WriteU64 (reinterpret_cast<uint64_t> (GetPointer (m_value.node)));
-  // i.WriteU32 (m_value.weight);
-}
-
-void WeightsPathStretchTag::Deserialize (TagBuffer i)
-{
-  NS_FATAL_ERROR ("Deserialization is not supported for this tag");
-  // m_value.node = Ptr<Node> (reinterpret_cast<Node*> (i.ReadU64 ()), false);
-  // m_value.weight = i.ReadU32 ();
-}
-
-void WeightsPathStretchTag::Print (std::ostream &os) const
-{
-  for (std::list<NodeWeightPair>::const_iterator info = m_infos.begin ();
-       info != m_infos.end ();
-       info ++)
-    {
-      if (info != m_infos.begin ()) os << ",";
-      NS_ASSERT (info->node != 0);
-
-      os << info->node->GetId () << "(" << Names::FindName (info->node) << ")";
-      // std::string name = Names::FindName (info->node);
-      // if (!name.empty ())
-      //   os << name;
-      // else
-      //   os << info->node->GetId ();
-      os << ":" << info->weight;
-    }
-}
-
-} // namespace ns3
-
diff --git a/plugins/tracers-broken/weights-path-stretch-tag.h b/plugins/tracers-broken/weights-path-stretch-tag.h
deleted file mode 100644
index 644871f..0000000
--- a/plugins/tracers-broken/weights-path-stretch-tag.h
+++ /dev/null
@@ -1,118 +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/tag.h"
- 
-#ifndef PATH_STRETCH_TAG_H
-#define PATH_STRETCH_TAG_H
-
-namespace ns3 {
-
-class Node;
-class Packet;
-
-//#define PATH_SPLICING_MAX_N_HOPS 38
-//#define PATH_SPLICING_MAX_SLICE_INDEX 16
-
-class WeightsPathStretchTag : public Tag
-{
-public:
-  struct NodeWeightPair
-  {
-    NodeWeightPair () : node (0), weight (0) { }
-    NodeWeightPair (Ptr<Node> _node, uint32_t _weight) : node (_node), weight (_weight) { }
-    
-    Ptr<Node> node;
-    uint32_t  weight;
-  };
-  
-  static TypeId
-  GetTypeId ();
-
-  WeightsPathStretchTag ();
-  virtual ~WeightsPathStretchTag () { };
-
-  void
-  AddPathInfo (Ptr<Node> node, uint32_t weight);
-
-  uint64_t
-  GetTotalWeight () const;
-
-  Ptr<Node>
-  GetSourceNode () const;
-
-  Ptr<Node>
-  GetDestinationNode () const;
-
-  const std::list<NodeWeightPair> &
-  GetInfos () const
-  { return m_infos; }
-
-  // from Tag
-  virtual uint32_t
-  GetSerializedSize (void) const;
-  
-  virtual void
-  Serialize (TagBuffer i) const;
-
-  virtual void
-  Deserialize (TagBuffer i);
-
-  virtual void
-  Print (std::ostream &os) const;
-  
-private:
-  std::list<NodeWeightPair> m_infos;
-};
-
-// class DelaysPathStretchTag : public Tag
-// {
-// public:
-//   DelaysPathStretchTag();
-
-//   static TypeId GetTypeId(void);
-//   virtual TypeId GetInstanceTypeId(void) const;
-
-//   virtual uint32_t GetSerializedSize(void) const;
-//   virtual void Serialize(TagBuffer i) const;
-//   virtual void Deserialize(TagBuffer i);
-//   virtual void Print(std::ostream &os) const;
-
-//   int GetNHops();
-//   void AddNewHop(double delay);
-//   int GetCurrentHop();
-//   void RemoveCurrentHop();
-//   //void RandomizeTags(UniformVariable &rand, uint32_t max);
-
-// private:
-//   //PathSplicingPathTag(const PathSplicingPathTag &o);
-//   //PathSplicingPathTag &operator = (const PathSplicingPathTag &o);
-
-//   //bool operator == (PathSplicingPathTag const &o) const;
-
-// private:
-//   std::list<double> m_delays;
-// };
-
-
-} // namespace ns3
-
-
-#endif /* PATH_STRETCH_TAG_H */
diff --git a/test/ndnSIM-api.cc b/test/ndnSIM-api.cc
deleted file mode 100644
index e1bd2aa..0000000
--- a/test/ndnSIM-api.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ndnSIM-api.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.ApiTest");
-
-namespace ns3
-{
-
-class ApiTestClient : public Application
-{
-public:
-  static TypeId
-  GetTypeId ()
-  {
-    static TypeId tid = TypeId ("ns3::ndn::test::ApiTestClient")
-      .SetParent<Application> ()
-      .AddConstructor<ApiTestClient> ()
-      ;
-    
-    return tid;
-  }
-
-  ApiTestClient ()
-    : datas (0)
-    , timeouts (0)
-  {
-  }
-  
-protected:
-  void
-  StartApplication ()
-  {
-    m_face = Create<ndn::ApiFace> (GetNode ());
-    
-    Simulator::Schedule (Seconds (0.1), &ApiTestClient::SendPacket, this, std::string ("/1"));
-    Simulator::Schedule (Seconds (5.0), &ApiTestClient::SendPacket, this, std::string ("/2"));
-  }
-
-  void
-  StopApplication ()
-  {
-    m_face->Shutdown ();
-    m_face = 0;
-  }
-
-private:
-  void
-  GotData (Ptr<const ndn::Interest>, Ptr<const ndn::Data>)
-  {
-    datas++;
-  }
-
-  void
-  GotTimeout (Ptr<const ndn::Interest>)
-  {
-    timeouts++;
-  }
-
-  void
-  SendPacket (const std::string &prefix)
-  {
-    Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-    interest->SetName (Create<ndn::Name> (prefix));
-    interest->SetInterestLifetime (Seconds (0.5));
-
-    m_face->ExpressInterest (interest,
-                             MakeCallback (&ApiTestClient::GotData, this),
-                             MakeCallback (&ApiTestClient::GotTimeout, this));
-  }
-
-public:
-  uint32_t datas;
-  uint32_t timeouts;
-  
-private:
-  Ptr<ndn::ApiFace> m_face;
-};
-
-NS_OBJECT_ENSURE_REGISTERED (ApiTestClient);
-
-void
-ApiTest::Check0 (Ptr<Application> app)
-{
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->datas, 0, "");
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->timeouts, 0, "");
-}
-
-void
-ApiTest::Check1 (Ptr<Application> app)
-{
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->datas, 1, "");
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->timeouts, 0, "");
-}
-
-void
-ApiTest::Check2 (Ptr<Application> app)
-{
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->datas, 1, "");
-  NS_TEST_ASSERT_MSG_EQ (DynamicCast<ApiTestClient> (app)->timeouts, 1, "");
-}
-
-
-void
-ApiTest::DoRun ()
-{
-  Config::SetDefault ("ns3::PointToPointNetDevice::DataRate", StringValue ("1Mbps"));
-  Config::SetDefault ("ns3::PointToPointChannel::Delay", StringValue ("10ms"));
-  Config::SetDefault ("ns3::DropTailQueue::MaxPackets", StringValue ("20"));
-
-  // Creating nodes
-  NodeContainer nodes;
-  nodes.Create (3);
-
-  // Connecting nodes using two links
-  PointToPointHelper p2p;
-  p2p.Install (nodes.Get (0), nodes.Get (1));
-  p2p.Install (nodes.Get (1), nodes.Get (2));
-
-  // Install NDN stack on all nodes
-  ndn::StackHelper ndnHelper;
-  ndnHelper.SetDefaultRoutes (true);
-  ndnHelper.InstallAll ();
-
-  // Installing applications
-
-  // Consumer
-  ndn::AppHelper consumerHelper ("ns3::ndn::test::ApiTestClient");
-  ApplicationContainer apps = consumerHelper.Install (nodes.Get (0)); // first node
-
-  // Producer
-  ndn::AppHelper producerHelper ("ns3::ndn::Producer");
-  // Producer will reply to all requests starting with /prefix
-  producerHelper.SetPrefix ("/");
-  producerHelper.SetAttribute ("Postfix", StringValue ("/unique/postfix"));
-  producerHelper.SetAttribute ("PayloadSize", StringValue("1024"));
-  producerHelper.Install (nodes.Get (2)).Stop (Seconds (4.0)); // last node
-
-  Simulator::Schedule (Seconds (0.0001), &ApiTest::Check0, this, apps.Get (0));
-  Simulator::Schedule (Seconds (0.2000), &ApiTest::Check1, this, apps.Get (0));
-  Simulator::Schedule (Seconds (5.6100), &ApiTest::Check2, this, apps.Get (0));
-
-  Simulator::Stop (Seconds (20.0));
-
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-}
diff --git a/test/ndnSIM-api.h b/test/ndnSIM-api.h
deleted file mode 100644
index 7df0112..0000000
--- a/test/ndnSIM-api.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Alexander Afanasyev
- *
- * GNU v3.0 license, See the LICENSE file for more information
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDNSIM_TEST_API_H
-#define NDNSIM_TEST_API_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-
-class Application;
-
-namespace ndn {
-}
-  
-class ApiTest : public TestCase
-{
-public:
-  ApiTest ()
-    : TestCase ("API test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-
-  void Check0 (Ptr<Application> app);
-  void Check1 (Ptr<Application> app);
-  void Check2 (Ptr<Application> app);
-};
-  
-}
-
-#endif // NDNSIM_TEST_API_H
diff --git a/test/ndnSIM-fib-entry.cc b/test/ndnSIM-fib-entry.cc
deleted file mode 100644
index c57cf4d..0000000
--- a/test/ndnSIM-fib-entry.cc
+++ /dev/null
@@ -1,152 +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-fib-entry.h"
-#include "ns3/core-module.h"
-#include "ns3/ndnSIM-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/node-list.h"
-
-#include <boost/lexical_cast.hpp>
-#include <boost/foreach.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/make_shared.hpp>
-
-#include "ns3/ndn-fib-entry.h"
-
-NS_LOG_COMPONENT_DEFINE ("ndn.FibEntryTest");
-
-namespace ns3
-{
-
-class FibEntryTestApp : public ndn::App
-{
-protected:
-  void
-  StartApplication ()
-  {
-    ndn::App::StartApplication ();
-
-    // add default route
-    Ptr<ndn::fib::Entry> fibEntry = GetNode ()->GetObject<ndn::Fib> ()->Add (ndn::Name ("/"), m_face, 0);
-    fibEntry->UpdateStatus (m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
-
-    Simulator::Schedule (Seconds (0.5), &FibEntryTestApp::SendPacket, this, std::string("/1"), 1);
-    Simulator::Schedule (Seconds (4.0), &FibEntryTestApp::SendPacket, this, std::string("/2"), 1);
-  }
-
-  void
-  StopApplication ()
-  {
-    ndn::App::StopApplication ();
-  }
-
-private:
-  void
-  SendPacket (const std::string &prefix, uint32_t nonce)
-  {
-    Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-    interest->SetName (Create<ndn::Name> (prefix));
-    interest->SetNonce (nonce);
-    interest->SetInterestLifetime (Seconds (0.5));
-
-    m_face->ReceiveInterest (interest);
-  }
-};
-
-struct StatusRecorder
-{
-  StatusRecorder (Ptr<Node> node, Ptr<ndn::fib::Entry> fibEntry, Ptr<ndn::Face> face)
-    : m_node (node)
-    , m_fibEntry (fibEntry)
-    , m_face (face)
-  {
-    count = 0;
-  }
-
-  void
-  StatusChange (ndn::fib::FaceMetric::Status oldStatus, ndn::fib::FaceMetric::Status newStatus)
-  {
-    count ++;
-    // std::cout << Simulator::Now ().ToDouble (Time::S) << "s\tnode " << m_node->GetId () << " has changed fibEntry " << m_fibEntry->GetPrefix () << " face " << *m_face << " to " << newStatus << " from " << oldStatus << std::endl;
-  }
-
-  int count;
-
-private:
-  Ptr<Node> m_node;
-  Ptr<ndn::fib::Entry> m_fibEntry;
-  Ptr<ndn::Face> m_face;
-};
-
-void
-FibEntryTest::DoRun ()
-{
-  Ptr<Node> node = CreateObject<Node> ();
-  Ptr<Node> nodeSink = CreateObject<Node> ();
-  PointToPointHelper p2p;
-  p2p.Install (node, nodeSink);
-
-  ndn::StackHelper ndn;
-  ndn.SetForwardingStrategy ("ns3::ndn::fw::BestRoute");
-  ndn.Install (node);
-  ndn.Install (nodeSink);
-
-  ndn::StackHelper::AddRoute (node, "/", 0, 0);
-
-  Ptr<Application> app1 = CreateObject<FibEntryTestApp> ();
-  node->AddApplication (app1);
-
-  ndn::AppHelper sinkHelper ("ns3::ndn::Producer");
-  sinkHelper.SetPrefix ("/");
-  sinkHelper.Install (nodeSink)
-    .Stop (Seconds (2.0));
-
-  std::list< boost::shared_ptr<StatusRecorder> > recorders;
-
-  for (NodeList::Iterator anode = NodeList::Begin ();
-       anode != NodeList::End ();
-       anode ++)
-    {
-      Ptr<ndn::Fib> fib = (*anode)->GetObject<ndn::Fib> ();
-
-      for (Ptr<ndn::fib::Entry> entry = fib->Begin ();
-           entry != fib->End ();
-           entry = fib->Next (entry))
-        {
-          BOOST_FOREACH (const ndn::fib::FaceMetric & faceMetric, entry->m_faces)
-            {
-              boost::shared_ptr<StatusRecorder> recorder = boost::make_shared<StatusRecorder> (*anode, entry, faceMetric.GetFace ());
-              recorders.push_back (recorder);
-
-              const_cast<ndn::fib::FaceMetric &> (faceMetric).GetStatusTrace ().ConnectWithoutContext (MakeCallback (&StatusRecorder::StatusChange, recorder.get ()));
-            }
-        }
-    }
-
-  Simulator::Stop (Seconds (10.0));
-  Simulator::Run ();
-  Simulator::Destroy ();
-
-  NS_TEST_ASSERT_MSG_EQ (recorders.size (), 1, "only one recorder should be: only one real FIB record should have existed");
-  NS_TEST_ASSERT_MSG_EQ (recorders.front ()->count, 2, "two events should have been reported");
-}
-
-}
diff --git a/test/ndnSIM-fib-entry.h b/test/ndnSIM-fib-entry.h
deleted file mode 100644
index 4f78f53..0000000
--- a/test/ndnSIM-fib-entry.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011-2013 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_FIB_ENTRY_H
-#define NDNSIM_TEST_FIB_ENTRY_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-
-namespace ndn {
-class Fib;
-class Pit;
-}
-
-class FibEntryTest : public TestCase
-{
-public:
-  FibEntryTest ()
-    : TestCase ("FIB entry test")
-  {
-  }
-
-private:
-  virtual void DoRun ();
-};
-
-}
-
-#endif // NDNSIM_TEST_FIB_ENTRY_H
diff --git a/test/ndnSIM-pit.cc b/test/ndnSIM-pit.cc
deleted file mode 100644
index db94f6f..0000000
--- a/test/ndnSIM-pit.cc
+++ /dev/null
@@ -1,144 +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-pit.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.PitTest");
-
-namespace ns3
-{
-
-class PitTestClient : public ndn::App
-{
-protected:
-  void
-  StartApplication ()
-  {
-    ndn::App::StartApplication ();
-
-    // add default route
-    Ptr<ndn::fib::Entry> fibEntry = GetNode ()->GetObject<ndn::Fib> ()->Add (ndn::Name ("/"), m_face, 0);
-    fibEntry->UpdateStatus (m_face, ndn::fib::FaceMetric::NDN_FIB_GREEN);
-    
-    Simulator::Schedule (Seconds (0.1), &PitTestClient::SendPacket, this, std::string("/1"), 1);
-    Simulator::Schedule (Seconds (0.2), &PitTestClient::SendPacket, this, std::string("/2"), 1);
-    Simulator::Schedule (Seconds (0.3), &PitTestClient::SendPacket, this, std::string("/3"), 1);
-    Simulator::Schedule (Seconds (0.4), &PitTestClient::SendPacket, this, std::string("/1"), 2);
-  }
-
-  void
-  StopApplication ()
-  {
-    ndn::App::StopApplication ();
-  }
-
-private:
-  void
-  SendPacket (const std::string &prefix, uint32_t nonce)
-  {
-    Ptr<ndn::Interest> interest = Create<ndn::Interest> ();
-    interest->SetName (Create<ndn::Name> (prefix));
-    interest->SetNonce (nonce);
-    interest->SetInterestLifetime (Seconds (0.5));
-
-    m_face->ReceiveInterest (interest);
-  }
-};
-
-void
-PitTest::Test (Ptr<ndn::Fib> fib)
-{
-  NS_TEST_ASSERT_MSG_EQ (fib->GetSize (), 1, "There should be only one entry");
-
-  Ptr<const ndn::fib::Entry> fibEntry = fib->Begin ();
-  NS_TEST_ASSERT_MSG_EQ (fibEntry->GetPrefix (), ndn::Name ("/"), "prefix should be /");
-}
-
-void
-PitTest::Check0 (Ptr<ndn::Pit> pit)
-{
-  // NS_LOG_DEBUG (*GetNode ()->GetObject<ndn::Pit> ());
-  NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 0, "There should 0 entries in PIT");
-}
-
-void
-PitTest::Check1 (Ptr<ndn::Pit> pit)
-{
-  NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 1, "There should 1 entry in PIT");
-}
-
-void
-PitTest::Check2 (Ptr<ndn::Pit> pit)
-{
-  // NS_LOG_DEBUG (*GetNode ()->GetObject<ndn::Pit> ());
-  NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 2, "There should 2 entries in PIT");
-}
-
-void
-PitTest::Check3 (Ptr<ndn::Pit> pit)
-{
-  // NS_LOG_DEBUG (*GetNode ()->GetObject<ndn::Pit> ());
-  NS_TEST_ASSERT_MSG_EQ (pit->GetSize (), 3, "There should 3 entries in PIT");
-}
-
-
-void
-PitTest::DoRun ()
-{
-  Ptr<Node> node = CreateObject<Node> ();
-  Ptr<Node> nodeSink = CreateObject<Node> ();
-  PointToPointHelper p2p;
-  p2p.Install (node, nodeSink);
-  
-  ndn::StackHelper ndn;
-  ndn.Install (node);
-  ndn.Install (nodeSink);
-
-  ndn::StackHelper::AddRoute (node, "/", 0, 0);
-
-  Ptr<Application> app1 = CreateObject<PitTestClient> ();
-  app1->SetStartTime (Seconds (0.0));
-  node->AddApplication (app1);
-
-  Simulator::Schedule (Seconds (0.0001), &PitTest::Test, this, node->GetObject<ndn::Fib> ());
-    
-  Simulator::Schedule (Seconds (0.01), &PitTest::Check0, this, node->GetObject<ndn::Pit> ());
-
-  Simulator::Schedule (Seconds (0.11), &PitTest::Check1, this, node->GetObject<ndn::Pit> ());
-  Simulator::Schedule (Seconds (0.21), &PitTest::Check2, this, node->GetObject<ndn::Pit> ());
-  Simulator::Schedule (Seconds (0.31), &PitTest::Check3, this, node->GetObject<ndn::Pit> ());
-
-  Simulator::Schedule (Seconds (0.61), &PitTest::Check3, this, node->GetObject<ndn::Pit> ());
-  Simulator::Schedule (Seconds (0.71), &PitTest::Check2, this, node->GetObject<ndn::Pit> ());
-  Simulator::Schedule (Seconds (0.81), &PitTest::Check1, this, node->GetObject<ndn::Pit> ());
-
-  Simulator::Schedule (Seconds (0.91), &PitTest::Check0, this, node->GetObject<ndn::Pit> ());
-
-  Simulator::Stop (Seconds (10.0));
-  Simulator::Run ();
-  Simulator::Destroy ();
-}
-
-}
diff --git a/test/ndnSIM-pit.h b/test/ndnSIM-pit.h
deleted file mode 100644
index bd8ad3d..0000000
--- a/test/ndnSIM-pit.h
+++ /dev/null
@@ -1,54 +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_PIT_H
-#define NDNSIM_TEST_PIT_H
-
-#include "ns3/test.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-
-namespace ndn {
-class Fib;
-class Pit;
-}
-  
-class PitTest : public TestCase
-{
-public:
-  PitTest ()
-    : TestCase ("PIT test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-
-  void Test (Ptr<ndn::Fib> fib);
-  void Check0 (Ptr<ndn::Pit> pit);
-  void Check1 (Ptr<ndn::Pit> pit);
-  void Check2 (Ptr<ndn::Pit> pit);
-  void Check3 (Ptr<ndn::Pit> pit);
-};
-  
-}
-
-#endif // NDNSIM_TEST_PIT_H
diff --git a/test/ndnSIM-serialization.cc b/test/ndnSIM-serialization.cc
deleted file mode 100644
index fee40b1..0000000
--- a/test/ndnSIM-serialization.cc
+++ /dev/null
@@ -1,133 +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>
- *         Ilya Moiseenko <iliamo@cs.ucla.edu>
- */
-
-#include "ns3/core-module.h"
-#include "ns3/ndnSIM-module.h"
-#include "ndnSIM-serialization.h"
-
-#include <boost/lexical_cast.hpp>
-#include "ns3/ndnSIM/model/wire/ndnsim.h"
-
-using namespace std;
-
-namespace ns3 {
-
-using namespace ndn;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.Serialization");
-
-void
-InterestSerializationTest::DoRun ()
-{
-  Ptr<Interest> source = Create<Interest> ();
-  
-  source->SetName (Create<Name> (boost::lexical_cast<Name> ("/test/test2")));
-  NS_TEST_ASSERT_MSG_EQ (source->GetName (), boost::lexical_cast<Name> ("/test/test2"), "set/get name failed");
-  
-  source->SetScope (2);
-  NS_TEST_ASSERT_MSG_EQ (source->GetScope (), 2, "set/get scope failed");
-
-  source->SetInterestLifetime (Seconds (100));
-  NS_TEST_ASSERT_MSG_EQ (source->GetInterestLifetime (), Seconds (100), "set/get interest lifetime failed");
-
-  source->SetNonce (200);
-  NS_TEST_ASSERT_MSG_EQ (source->GetNonce (), 200, "set/get nonce failed");
-
-  source->SetNack (10);
-  NS_TEST_ASSERT_MSG_EQ (source->GetNack (), 10, "set/get NACK failed");
-
-  NS_TEST_ASSERT_MSG_EQ (source->GetWire (), 0, "Wire should be empty");
-  NS_TEST_ASSERT_MSG_NE (source->GetPayload (), 0, "Payload should not be empty");
-
-  Ptr<Packet> packet = wire::ndnSIM::Interest::ToWire (source);
-
-  NS_TEST_ASSERT_MSG_NE (source->GetWire (), 0, "Wire should not be empty now");
-
-  Ptr<Interest> target = wire::ndnSIM::Interest::FromWire (packet);
-  
-  NS_TEST_ASSERT_MSG_EQ (source->GetName ()            , target->GetName ()            , "source/target name failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetScope ()           , target->GetScope ()           , "source/target scope failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetInterestLifetime (), target->GetInterestLifetime (), "source/target interest lifetime failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetNonce ()           , target->GetNonce ()           , "source/target nonce failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetNack ()            , target->GetNack ()            , "source/target NACK failed");
-
-  NS_TEST_ASSERT_MSG_EQ (source->GetExclude ()         , 0, "exclude should be empty");
-  NS_TEST_ASSERT_MSG_EQ (target->GetExclude ()         , 0, "exclude should be empty");
-  
-  Ptr<Exclude> exclude = Create<Exclude> ();
-  exclude->excludeAfter (name::Component ());
-  source->SetExclude (exclude);
-  
-  NS_TEST_ASSERT_MSG_EQ (boost::lexical_cast<std::string> (*source->GetExclude ()),
-                         " ----> ", "exclude should contain only <ANY/>");
-
-  exclude->appendExclude (name::Component ("alex"), false);
-  exclude->excludeAfter (name::Component ("zhenkai"));
-
-  source->SetExclude (exclude);  
-  NS_TEST_ASSERT_MSG_EQ (boost::lexical_cast<std::string> (*source->GetExclude ()),
-                         " ----> alex zhenkai ----> ", "exclude should contain only <ANY/>");
-
-  NS_TEST_ASSERT_MSG_EQ (source->GetWire (), 0, "Wire should be empty");
-  NS_TEST_ASSERT_MSG_NE (source->GetPayload (), 0, "Payload should not be empty");
-
-  packet = wire::ndnSIM::Interest::ToWire (source);
-  target = wire::ndnSIM::Interest::FromWire (packet);
-  NS_TEST_ASSERT_MSG_NE (target->GetExclude (), 0, "exclude should not be empty");
-
-  NS_TEST_ASSERT_MSG_EQ (boost::lexical_cast<std::string> (*target->GetExclude ()),
-                         " ----> alex zhenkai ----> ", "exclude should contain only <ANY/>");
-}
-
-void
-DataSerializationTest::DoRun ()
-{
-  Ptr<Data> source = Create<Data> (Create<Packet> (1024));
-  
-  source->SetName (Create<Name> (boost::lexical_cast<Name> ("/test/test2/1")));
-  NS_TEST_ASSERT_MSG_EQ (source->GetName (), boost::lexical_cast<Name> ("/test/test2/1"), "set/get name failed");
-  
-  source->SetFreshness (Seconds (10));
-  NS_TEST_ASSERT_MSG_EQ (source->GetFreshness (), Seconds (10), "set/get freshness failed");
-
-  source->SetTimestamp (Seconds (100));
-  NS_TEST_ASSERT_MSG_EQ (source->GetTimestamp (), Seconds (100), "set/get timestamp failed");
-
-  NS_TEST_ASSERT_MSG_EQ (source->GetSignature (), 0, "initialization of signature failed");
-
-  Ptr<Packet> packet = wire::ndnSIM::Data::ToWire (source);
-  int size = packet->GetSize ();
-
-  source->SetSignature (10);  
-  NS_TEST_ASSERT_MSG_EQ (source->GetSignature (), 10, "set/get signature failed");
-
-  packet = wire::ndnSIM::Data::ToWire (source);
-  NS_TEST_ASSERT_MSG_EQ (packet->GetSize (), static_cast<unsigned int> (size + 4), "Signature size should have increased by 4");
-
-  Ptr<Data> target = wire::ndnSIM::Data::FromWire (packet);
-  
-  NS_TEST_ASSERT_MSG_EQ (source->GetName ()     , target->GetName ()     , "source/target name failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetFreshness (), target->GetFreshness (), "source/target freshness failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetTimestamp (), target->GetTimestamp (), "source/target timestamp failed");
-  NS_TEST_ASSERT_MSG_EQ (source->GetSignature (), target->GetSignature (), "source/target signature failed");
-}
-
-}
diff --git a/test/ndnSIM-serialization.h b/test/ndnSIM-serialization.h
deleted file mode 100644
index 6d2015b..0000000
--- a/test/ndnSIM-serialization.h
+++ /dev/null
@@ -1,56 +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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#ifndef NDNSIM_SERIALIZATION_H
-#define NDNSIM_SERIALIZATION_H
-
-#include "ns3/test.h"
-
-namespace ns3
-{
-
-class InterestSerializationTest : public TestCase
-{
-public:
-  InterestSerializationTest ()
-    : TestCase ("Interest Serialization Test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-};
-
-class DataSerializationTest : public TestCase
-{
-public:
-  DataSerializationTest ()
-    : TestCase ("Data Serialization Test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-};
-
-}
-
-#endif // NDNSIM_SERIALIZATION_H
diff --git a/test/ndnSIM-tests.cc b/test/ndnSIM-tests.cc
deleted file mode 100644
index c6b4d6e..0000000
--- a/test/ndnSIM-tests.cc
+++ /dev/null
@@ -1,50 +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: Ilya Moiseenko <iliamo@cs.ucla.edu>
- *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "ns3/test.h"
-
-#include "ndnSIM-serialization.h"
-#include "ndnSIM-pit.h"
-#include "ndnSIM-fib-entry.h"
-#include "ndnSIM-api.h"
-
-namespace ns3
-{
-
-class NdnSimTestSuite : public TestSuite
-{
-public:
-  NdnSimTestSuite ()
-    : TestSuite ("ndnSIM", UNIT)
-  {
-    SetDataDir (NS_TEST_SOURCEDIR);
-
-    AddTestCase (new InterestSerializationTest (), TestCase::QUICK);
-    AddTestCase (new DataSerializationTest (), TestCase::QUICK);
-    AddTestCase (new FibEntryTest (), TestCase::QUICK);
-    AddTestCase (new PitTest (), TestCase::QUICK);
-    AddTestCase (new ApiTest (), TestCase::QUICK);
-  }
-};
-
-static NdnSimTestSuite suite;
-
-}
diff --git a/test/ndnSIM-trie.cc b/test/ndnSIM-trie.cc
deleted file mode 100644
index ee53ad4..0000000
--- a/test/ndnSIM-trie.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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 "ns3/core-module.h"
-#include "ns3/ndnSIM-module.h"
-
-#include "ndnSIM-trie.h"
-
-#include "../utils/trie/trie-with-policy.h"
-#include "../utils/trie/lru-policy.h"
-#include "../utils/trie/random-policy.h"
-#include "../utils/trie/fifo-policy.h"
-#include "../utils/trie/multi-policy.h"
-
-#include <boost/lexical_cast.hpp>
-
-using namespace std;
-using namespace ns3;
-using namespace ndn::ndnSIM;
-using namespace boost;
-
-NS_LOG_COMPONENT_DEFINE ("ndn.Trie");
-
-// class Integer : public ns3::SimpleRefCount<Integer>
-// {
-// public:
-//   ::Integer (int value) : value_ (value) {}
-
-//   operator int () const { return value_; }
-// private:
-//   int value_;
-// };
-
-// std::ostream &
-// operator << (std::ostream &os, const ::Integer &i)
-// {
-//   os << (int)i;
-//   return os;
-// }
-
-void
-TrieTest::DoRun ()
-{
-  cerr << "TrieTest is temporarily broken" << endl;
-  // typedef trie_with_policy<
-  //   ns3::NdnName,
-  //   smart_pointer_payload_traits<Integer>,
-  //   multi_policy_traits<
-  //     mpl::vector2<lru_policy_traits,random_policy_traits>
-  //     > > trie;
-  
-  // trie x;
-  // x.getPolicy ().get<0> ().set_max_size (100);
-  // x.getPolicy ().get<1> ().set_max_size (3);
-  // // // x.getPolicy ().get<1> ().set_max_size (3);
-  // // // // x.getPolicy ().get1 ().set_max_size (10);
-  // // // // x.getPolicy ().get2 ().set_max_size (3);
-  
-  // // // // x.getTrie ().PrintStat (std::cout);
-  
-  // ns3::NdnName n1,n2,n3,n4;
-  // // // // n1("a")("b")("c");
-  // // // // n2("a")("b")("d");
-  // // // // n3("a")("b")("f");
-  // // // // n4("a")("b");
-
-  // n1("a");
-  // n2("b");
-  // n3("c");
-  // n4("d");
-
-  // x.insert (n1, ns3::Create<Integer> (1));
-  // x.insert (n2, ns3::Create<Integer> (2));
-  // // // // x.longest_prefix_match (n1);
-  // x.insert (n3, ns3::Create<Integer> (3));
-  // x.insert (n4, ns3::Create<Integer> (4));
-  // x.insert (n4, ns3::Create<Integer> (4));
-
-  // std::cout << "digraph trie {\n";
-  // std::cout << x.getTrie ();
-  // std::cout << "}\n";
-
-  // Ptr<Node> node = CreateObject<Node> ();
-  // Names::Add ("TestNode", node);
-  // Ptr<ndn::App> app = CreateObject<ndn::App> ();
-  // node->AddApplication (app);
-  
-  // ObjectFactory factory ("ns3::ndn::fib::Default");
-  
-  // Ptr<ndn::Fib> fib = factory.Create<ndn::Fib> ();
-  // node->AggregateObject (fib);
-  // Ptr<ndn::Face> face = CreateObject<ndn::AppFace> (app);
-
-  // fib->Add (lexical_cast<ndn::Name> ("/bla"), face, 1);
-  // fib->Add (lexical_cast<ndn::Name> ("/bla/1"), face, 1);
-  // fib->Add (lexical_cast<ndn::Name> ("/bla/2"), face, 1);
-  // fib->Add (lexical_cast<ndn::Name> ("/bla/3"), face, 1);
-  // fib->Add (lexical_cast<ndn::Name> ("/bla/1/1"), face, 1);
-  // fib->Add (lexical_cast<ndn::Name> ("/bla/1/2"), face, 1);
-  
-  // cout << *fib << endl;
-
-  // fib->RemoveFromAll (face);
-
-  // cout << *fib << endl;
-  // BOOST_FOREACH (const trie::parent_trie &item, x.getPolicy ())
-  //   {
-  //     std::cout << *item.payload () << " " << std::endl;
-  //   }
-
-  // ns3::NdnName n4;
-  // n4("a")("c");
-    
-  // // std::cout << *x->find (n4).get<0> ();
-
-  // x->prune ();
-  // // x->find (n5).get<0> ()->erase ();
-  // x->find (n1).get<0> ()->erase ();
-    
-  // std::cout << "digraph trie {\n";
-  // std::cout << *x;
-  // std::cout << "}\n";
-
-  // x->PrintStat (std::cout);
-
-  // delete x;
-}
-
diff --git a/test/ndnSIM-trie.h b/test/ndnSIM-trie.h
deleted file mode 100644
index 6cf5190..0000000
--- a/test/ndnSIM-trie.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 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>
- *
- */
-
-#ifndef NDNSIM_TRIE_H
-#define NDNSIM_TRIE_H
-
-#include "ns3/test.h"
-
-namespace ns3
-{
-
-class TrieTest : public TestCase
-{
-public:
-  TrieTest ()
-    : TestCase ("Trie Test")
-  {
-  }
-    
-private:
-  virtual void DoRun ();
-};
-
-}
-
-#endif // NDNSIM_TRIE_H
diff --git a/tools/rocketfuel-maps-cch-to-annotaded.cc b/tools/rocketfuel-maps-cch-to-annotaded.cc
deleted file mode 100644
index 13b4ddd..0000000
--- a/tools/rocketfuel-maps-cch-to-annotaded.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 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>
- *         Ilya Moiseenko <iliamo@ucla.edu>
- */
-
-#include "ns3/core-module.h"
-#include "ns3/log.h"
-#include "ns3/ndnSIM-module.h"
-#include "ns3/point-to-point-module.h"
-#include "ns3/random-variable.h"
-
-#include <boost/foreach.hpp>
-
-#include "ns3/ndnSIM/plugins/topology/rocketfuel-map-reader.h"
-
-using namespace ns3;
-using namespace std;
-
-int main (int argc, char**argv)
-{
-  string topology = "";
-  string output_prefix = "";
-  uint32_t run = 0;
-  int clientNodeDegrees = -1;
-  bool buildGraphvizGraph = false;
-  bool keepLargestComponent = false;
-  bool connectBackbones = false;
-
-  CommandLine cmd;
-  cmd.AddValue ("topology", "Topology filename (.ccn)", topology);
-  cmd.AddValue ("output",   "Prefix for output files", output_prefix);
-  cmd.AddValue ("run", "Run for ranged parameter randomization", run);
-  cmd.AddValue ("clients", "Maximum degree of client nodes", clientNodeDegrees);
-  cmd.AddValue ("buildGraph", "Whether or not build a graphviz graph (using neato)", buildGraphvizGraph);
-  cmd.AddValue ("keepLargestComponent", "Keep only largest connected component of the network graph", keepLargestComponent);
-  cmd.AddValue ("connectBackbones", "Make sure that ``backbone'' nodes are connected (adding extra links)", connectBackbones);
-  cmd.Parse (argc, argv);
-
-  /**
-   * @todo Make range parameters as command line arguments
-   */
-
-  if (topology == "")
-    {
-      cerr << "ERROR: topology needs to be specified" << endl;
-      cerr << endl;
-
-      cmd.PrintHelp (cerr);
-      return 1;
-    }
-
-  if (output_prefix == "")
-    {
-      cerr << "ERROR: output needs to be specified" << endl;
-      cerr << endl;
-
-      cmd.PrintHelp (cerr);
-      return 1;
-    }
-
-  if (run == 0)
-    {
-      cerr << "ERROR: run needs to be specified" << endl;
-      cerr << endl;
-
-      cmd.PrintHelp (cerr);
-      return 1;
-    }
-
-  if (clientNodeDegrees < 0)
-    {
-      cerr << "ERROR: clients needs to be specified" << endl;
-      cerr << endl;
-
-      cmd.PrintHelp (cerr);
-      return 1;
-    }
-
-  Config::SetGlobal ("RngRun", IntegerValue (run));
-  GlobalValue::Bind ("SimulatorImplementationType", StringValue ("ns3::VisualSimulatorImpl"));
-
-  string input = topology;
-  string output = output_prefix+"-conv-annotated.txt";
-  string graph  = output_prefix+"-conv-annotated.dot";
-  string graph_pdf  = output_prefix+"-conv-annotated.pdf";
-
-  RocketfuelParams params;
-  params.clientNodeDegrees = clientNodeDegrees;
-  params.averageRtt = 0.25; // 250ms
-  //parameters for links Backbone<->Backbone
-  params.minb2bBandwidth = "40Mbps";
-  params.minb2bDelay = "5ms";
-
-  params.maxb2bBandwidth = "100Mbps";
-  params.maxb2bDelay = "10ms";
-
-  //parameters for links Backbone<->Gateway and Gateway <-> Gateway
-  params.minb2gBandwidth = "10Mbps";
-  params.minb2gDelay = "5ms";
-
-  params.maxb2gBandwidth = "20Mbps";
-  params.maxb2gDelay = "10ms";
-
-  //parameters for links Gateway <-> Customer
-  params.ming2cBandwidth ="1Mbps";
-  params.ming2cDelay = "70ms";
-
-  params.maxg2cBandwidth ="3Mbps";
-  params.maxg2cDelay = "10ms";
-
-  RocketfuelMapReader topologyReader ("/", 1.0);
-  topologyReader.SetFileName (input);
-  NodeContainer nodes = topologyReader.Read (params, keepLargestComponent, connectBackbones);
-  NodeContainer backboneRouters = topologyReader.GetBackboneRouters();
-  NodeContainer gatewayRouters = topologyReader.GetGatewayRouters();
-  NodeContainer customerRouters = topologyReader.GetCustomerRouters();
-  list<TopologyReader::Link> links = topologyReader.GetLinks();
-
-  topologyReader.SaveGraphviz (graph);
-  if (buildGraphvizGraph)
-    {
-      int ret = system (("neato -Tpdf \"" + graph + "\" > \"" + graph_pdf + "\"").c_str ());
-      if (ret != 0)
-        {
-          std::cerr << "WARN: failed to build a graph for the topology. Check if `neato' command is installed (part of graphviz package)" << std::endl;
-        }
-    }
-
-  topologyReader.SaveTopology (output);
-
-  // Names::Clear ();
-  // Simulator::Destroy ();
-
-  // // assign weights
-  // AnnotatedTopologyReader topologyReader2 ("", 1.0);
-  // topologyReader2.SetFileName (output);
-  // topologyReader2.Read ();
-
-  // char env[] = "NS_VIS_ASSIGN=1";
-  // putenv (env);
-
-  // Simulator::Stop (Seconds (0.0));
-  // Simulator::Run ();
-
-  // topologyReader2.SaveTopology (output);
-
-  // Simulator::Destroy ();
-  return 0;
-}
diff --git a/tools/wscript b/tools/wscript
deleted file mode 100644
index 6ebf98e..0000000
--- a/tools/wscript
+++ /dev/null
@@ -1,6 +0,0 @@
-# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
-
-def build(bld):
-    if 'topology' in bld.env['NDN_plugins']:
-        obj = bld.create_ns3_program('rocketfuel-maps-cch-to-annotaded', ['ndnSIM'])
-        obj.source = 'rocketfuel-maps-cch-to-annotaded.cc'
diff --git a/utils/ndn-local-info-tag.cc b/utils/ndn-local-info-tag.cc
deleted file mode 100644
index 15466b4..0000000
--- a/utils/ndn-local-info-tag.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 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 "ndn-local-info-tag.h"
-#include <ns3/ndn-face.h>
-
-namespace ns3 {
-namespace ndn {
-
-LocalInfoTag::LocalInfoTag (Ptr<Face> inFace)
-{
-  if (inFace != 0)
-    {
-      m_faceId = inFace->GetId ();
-    }
-  else
-    m_faceId = CACHE_FACE;
-}
-
-LocalInfoTag::~LocalInfoTag ()
-{
-}
-
-
-TypeId
-LocalInfoTag::GetTypeId ()
-{
-  static TypeId tid = TypeId("ns3::ndn::LocalInfo")
-    .SetParent<Tag>()
-    ;
-  return tid;
-}
-
-TypeId
-LocalInfoTag::GetInstanceTypeId () const
-{
-  return LocalInfoTag::GetTypeId ();
-}
-
-uint32_t
-LocalInfoTag::GetSerializedSize () const
-{
-  return sizeof (uint32_t);
-}
-
-void
-LocalInfoTag::Serialize (TagBuffer i) const
-{
-  i.WriteU32 (m_faceId);
-}
-  
-void
-LocalInfoTag::Deserialize (TagBuffer i)
-{
-  m_faceId = i.ReadU32 ();
-}
-
-void
-LocalInfoTag::Print (std::ostream &os) const
-{
-  os << m_faceId;
-}
-
-} // namespace ndn
-} // namespace ns3
diff --git a/utils/ndn-local-info-tag.h b/utils/ndn-local-info-tag.h
deleted file mode 100644
index ba7aa92..0000000
--- a/utils/ndn-local-info-tag.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013 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 NDN_LOCAL_INFO_TAG_H
-#define NDN_LOCAL_INFO_TAG_H
-
-#include "ns3/tag.h"
-#include "ns3/ptr.h"
-
-namespace ns3 {
-namespace ndn {
-
-class Face;
-
-/**
- * @ingroup ndn-fw
- * @brief Packet tag that is used to keep information about face from which packet was received
- *
- * This tag may be extended later to include more information, if necessary
- */
-class LocalInfoTag : public Tag
-{
-public:
-  static TypeId
-  GetTypeId ();
-
-  /**
-   * @brief Constructor
-   */
-  LocalInfoTag (Ptr<Face> inFace);
-
-  /**
-   * @brief Destructor
-   */
-  ~LocalInfoTag ();
-
-  /**
-   * @brief Get smart pointer to the face
-   *
-   * @returns 0 or a valid smart pointer to a face
-   */
-  uint32_t
-  Get () const
-  {
-    return m_faceId;
-  }
-
-  ////////////////////////////////////////////////////////
-  // from ObjectBase
-  ////////////////////////////////////////////////////////
-  virtual TypeId
-  GetInstanceTypeId () const;
-  
-  ////////////////////////////////////////////////////////
-  // from Tag
-  ////////////////////////////////////////////////////////
-  
-  virtual uint32_t
-  GetSerializedSize () const;
-
-  virtual void
-  Serialize (TagBuffer i) const;
-  
-  virtual void
-  Deserialize (TagBuffer i);
-
-  virtual void
-  Print (std::ostream &os) const;
-
-public:
-  static const uint32_t CACHE_FACE = static_cast<uint32_t> (-1);
-  
-private:
-  uint32_t m_faceId;
-};
-
-} // namespace ndn
-} // namespace ns3
-
-#endif // NDN_LOCAL_INFO_TAG_H
diff --git a/utils/tracers/ipv4-app-tracer.cc b/utils/tracers/ipv4-app-tracer.cc
deleted file mode 100644
index 75c8b87..0000000
--- a/utils/tracers/ipv4-app-tracer.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 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 "ipv4-app-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/names.h"
-
-#include <boost/lexical_cast.hpp>
-
-using namespace std;
-using namespace boost;
-
-namespace ns3 {
-
-Ipv4AppTracer::Ipv4AppTracer (Ptr<Node> node)
-  : m_nodePtr (node)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  Connect ();
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_node = name;
-    }
-}
-
-void
-Ipv4AppTracer::Connect ()
-{
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/SendOutgoing",
-                   MakeCallback (&Ipv4AppTracer::Tx, this));
-
-  Config::Connect ("/NodeList/"+m_node+"/$ns3::Ipv4L3Protocol/LocalDeliver",
-                   MakeCallback (&Ipv4AppTracer::Rx, this));
-}
-
-
-} // namespace ns3
diff --git a/utils/tracers/ipv4-app-tracer.h b/utils/tracers/ipv4-app-tracer.h
deleted file mode 100644
index d574117..0000000
--- a/utils/tracers/ipv4-app-tracer.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2012 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 IPV4_APP_TRACER_H
-#define IPV4_APP_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/ipv4.h"
-
-namespace ns3 {
-
-class Ipv4Header;
-
-/**
- * @ingroup ndn-tracers
- * @brief Base class for IPv4/TCP based applications
- */
-class Ipv4AppTracer : public SimpleRefCount<Ipv4AppTracer>
-{
-public:
-  Ipv4AppTracer (Ptr<Node> node);
-  virtual ~Ipv4AppTracer ()  { };
-
-  void
-  Connect ();
-
-  virtual void
-  PrintHeader (std::ostream &os) const = 0;
-
-  virtual void
-  Print (std::ostream &os) const = 0;
-
-  virtual void
-  Rx (std::string context,
-      const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
-
-  virtual void
-  Tx (std::string context,
-      const Ipv4Header &, Ptr<const Packet>, uint32_t) = 0;
-
-protected:
-  std::string m_node;
-  Ptr<Node> m_nodePtr;
-};
-
-inline std::ostream&
-operator << (std::ostream &os, const Ipv4AppTracer &tracer)
-{
-  os << "# ";
-  tracer.PrintHeader (os);
-  os << "\n";
-  tracer.Print (os);
-  return os;
-}
-
-} // namespace ns3
-
-#endif // IPV4_APP_TRACER_H
diff --git a/utils/tracers/ipv4-l3-tracer.cc b/utils/tracers/ipv4-l3-tracer.cc
deleted file mode 100644
index 384d177..0000000
--- a/utils/tracers/ipv4-l3-tracer.cc
+++ /dev/null
@@ -1,57 +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 "ipv4-l3-tracer.h"
-#include "ns3/node.h"
-#include "ns3/config.h"
-#include "ns3/names.h"
-#include "ns3/callback.h"
-#include "ns3/ipv4-l3-protocol.h"
-
-#include <boost/lexical_cast.hpp>
-
-using namespace std;
-
-namespace ns3 {
-
-Ipv4L3Tracer::Ipv4L3Tracer (Ptr<Node> node)
-: m_nodePtr (node)
-{
-  m_node = boost::lexical_cast<string> (m_nodePtr->GetId ());
-
-  Connect ();
-
-  string name = Names::FindName (node);
-  if (!name.empty ())
-    {
-      m_node = name;
-    }
-}
-
-void
-Ipv4L3Tracer::Connect ()
-{
-  Ptr<Ipv4L3Protocol> ip = m_nodePtr->GetObject<Ipv4L3Protocol> ();
-  ip->TraceConnectWithoutContext ("Tx",   MakeCallback (&Ipv4L3Tracer::Tx, this));
-  ip->TraceConnectWithoutContext ("Rx",   MakeCallback (&Ipv4L3Tracer::Rx, this));
-  ip->TraceConnectWithoutContext ("Drop", MakeCallback (&Ipv4L3Tracer::Drop, this));
-}
-
-} // namespace ns3
diff --git a/utils/tracers/ipv4-l3-tracer.h b/utils/tracers/ipv4-l3-tracer.h
deleted file mode 100644
index b63dc01..0000000
--- a/utils/tracers/ipv4-l3-tracer.h
+++ /dev/null
@@ -1,91 +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 IPV4_L3_TRACER_H
-#define IPV4_L3_TRACER_H
-
-#include "ns3/ptr.h"
-#include "ns3/simple-ref-count.h"
-#include "ns3/ipv4-l3-protocol.h"
-
-namespace ns3 {
-
-class Node;
-
-/**
- * @ingroup ndn-tracers
- * @brief Base class for IPv4 network-layer tracers
- */
-class Ipv4L3Tracer : public SimpleRefCount<Ipv4L3Tracer>
-{
-public:
-  Ipv4L3Tracer (Ptr<Node> node);
-  virtual ~Ipv4L3Tracer () { };
-
-  void
-  Connect ();
-  
-  virtual void
-  PrintHeader (std::ostream &os) const = 0;
-
-  virtual void
-  Print (std::ostream &os) const = 0;
-  
-  virtual void
-  Rx  (Ptr<const Packet>, Ptr<Ipv4>,  uint32_t) = 0;
-
-  virtual void
-  Tx   (Ptr<const Packet>, Ptr<Ipv4>,  uint32_t) = 0;
-
-  virtual void
-  Drop (const Ipv4Header &, Ptr<const Packet>, Ipv4L3Protocol::DropReason, Ptr<Ipv4>, uint32_t) = 0;
-
-protected:
-  std::string m_node;
-  Ptr<Node> m_nodePtr;
-
-  struct Stats
-  {
-    void Reset ()
-    {
-      m_in = 0;
-      m_out = 0;
-      m_drop = 0;
-    }
-    
-    uint64_t m_in;
-    uint64_t m_out;
-    uint64_t m_drop;
-  };
-};
-
-inline std::ostream&
-operator << (std::ostream &os, const Ipv4L3Tracer &tracer)
-{
-  os << "# ";
-  tracer.PrintHeader (os);
-  os << "\n";
-  tracer.Print (os);
-  return os;
-}
-
-} // namespace ns3
-
-#endif // IPV4_L3_TRACER_H
diff --git a/utils/tracers/ipv4-rate-l3-tracer.cc b/utils/tracers/ipv4-rate-l3-tracer.cc
deleted file mode 100644
index 0e2db8d..0000000
--- a/utils/tracers/ipv4-rate-l3-tracer.cc
+++ /dev/null
@@ -1,285 +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 "ipv4-rate-l3-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/simulator.h"
-#include "ns3/node-list.h"
-#include "ns3/node.h"
-#include "ns3/log.h"
-
-#include "ns3/ipv4-header.h"
-
-#include <boost/lexical_cast.hpp>
-
-using namespace boost;
-using namespace std;
-
-NS_LOG_COMPONENT_DEFINE ("Ipv4RateL3Tracer");
-
-namespace ns3 {
-
-template<class T>
-static inline void
-NullDeleter (T *ptr)
-{
-}
-
-boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4RateL3Tracer> > >
-Ipv4RateL3Tracer::InstallAll (const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
-{
-  std::list<Ptr<Ipv4RateL3Tracer> > tracers;
-  boost::shared_ptr<std::ostream> outputStream;
-  if (file != "-")
-    {
-      boost::shared_ptr<std::ofstream> os (new std::ofstream ());
-      os->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
-
-      if (!os->is_open ())
-        return boost::make_tuple (outputStream, tracers);
-
-      outputStream = os;
-    }
-  else
-    {
-      outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
-    }
-
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node++)
-    {
-      Ptr<Ipv4RateL3Tracer> trace = Install (*node, outputStream, 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);
-}
-
-boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4RateL3Tracer> > >
-Ipv4RateL3Tracer::Install (const NodeContainer &nodes, const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
-{
-  using namespace boost;
-  using namespace std;
-
-  std::list<Ptr<Ipv4RateL3Tracer> > tracers;
-  boost::shared_ptr<std::ostream> outputStream;
-  if (file != "-")
-    {
-      boost::shared_ptr<std::ofstream> os (new std::ofstream ());
-      os->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
-
-      if (!os->is_open ())
-        return boost::make_tuple (outputStream, tracers);
-
-      outputStream = os;
-    }
-  else
-    {
-      outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
-    }
-
-  for (NodeContainer::Iterator node = nodes.Begin ();
-       node != nodes.End ();
-       node++)
-    {
-      Ptr<Ipv4RateL3Tracer> trace = Install (*node, outputStream, 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);
-}
-
-boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4RateL3Tracer> > >
-Ipv4RateL3Tracer::Install (Ptr<Node> node, const std::string &file, Time averagingPeriod/* = Seconds (0.5)*/)
-{
-  using namespace boost;
-  using namespace std;
-
-  std::list<Ptr<Ipv4RateL3Tracer> > tracers;
-  boost::shared_ptr<std::ostream> outputStream;
-  if (file != "-")
-    {
-      boost::shared_ptr<std::ofstream> os (new std::ofstream ());
-      os->open (file.c_str (), std::ios_base::out | std::ios_base::trunc);
-
-      if (!os->is_open ())
-        return boost::make_tuple (outputStream, tracers);
-
-      outputStream = os;
-    }
-  else
-    {
-      outputStream = boost::shared_ptr<std::ostream> (&std::cout, NullDeleter<std::ostream>);
-    }
-
-  Ptr<Ipv4RateL3Tracer> trace = Install (node, outputStream, 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);
-}
-
-
-Ptr<Ipv4RateL3Tracer>
-Ipv4RateL3Tracer::Install (Ptr<Node> node,
-                           boost::shared_ptr<std::ostream> outputStream,
-                           Time averagingPeriod/* = Seconds (0.5)*/)
-{
-  NS_LOG_DEBUG ("Node: " << node->GetId ());
-
-  Ptr<Ipv4RateL3Tracer> trace = Create<Ipv4RateL3Tracer> (outputStream, node);
-  trace->SetAveragingPeriod (averagingPeriod);
-
-  return trace;
-}
-
-
-Ipv4RateL3Tracer::Ipv4RateL3Tracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
-  : Ipv4L3Tracer (node)
-  , m_os (os)
-{
-  SetAveragingPeriod (Seconds (1.0));
-}
-
-Ipv4RateL3Tracer::~Ipv4RateL3Tracer ()
-{
-  m_printEvent.Cancel ();
-}
-
-void
-Ipv4RateL3Tracer::SetAveragingPeriod (const Time &period)
-{
-  m_period = period;
-  m_printEvent.Cancel ();
-  m_printEvent = Simulator::Schedule (m_period, &Ipv4RateL3Tracer::PeriodicPrinter, this);
-}
-
-void
-Ipv4RateL3Tracer::PeriodicPrinter ()
-{
-  Print (*m_os);
-  Reset ();
-
-  m_printEvent = Simulator::Schedule (m_period, &Ipv4RateL3Tracer::PeriodicPrinter, this);
-}
-
-void
-Ipv4RateL3Tracer::PrintHeader (std::ostream &os) const
-{
-  os << "Time" << "\t"
-
-     << "Node" << "\t"
-     << "Interface" << "\t"
-
-     << "Type" << "\t"
-     << "Packets" << "\t"
-     << "Kilobytes";
-}
-
-void
-Ipv4RateL3Tracer::Reset ()
-{
-  for (std::map<uint32_t, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
-       stats != m_stats.end ();
-       stats++)
-    {
-      stats->second.get<0> ().Reset ();
-      stats->second.get<1> ().Reset ();
-    }
-}
-
-const double alpha = 0.8;
-
-#define STATS(INDEX) stats->second.get<INDEX> ()
-#define RATE(INDEX, fieldName) STATS(INDEX).fieldName / m_period.ToDouble (Time::S)
-
-#define PRINTER(printName, fieldName) \
-STATS(2).fieldName = /*new value*/alpha * RATE(0, fieldName) + /*old value*/(1-alpha) * STATS(2).fieldName; \
-STATS(3).fieldName = /*new value*/alpha * RATE(1, fieldName) / 1024.0 + /*old value*/(1-alpha) * STATS(3).fieldName; \
-                                                                        \
-os << time.ToDouble (Time::S) << "\t"                                   \
- << m_node << "\t"                                                      \
- << stats->first << "\t"                                      \
- << printName << "\t"                                                   \
- << STATS(2).fieldName  << "\t"                                        \
- << STATS(3).fieldName << "\n";
-
-void
-Ipv4RateL3Tracer::Print (std::ostream &os) const
-{
-  for (std::map<uint32_t, boost::tuple<Stats, Stats, Stats, Stats> >::iterator stats = m_stats.begin ();
-       stats != m_stats.end ();
-       stats++)
-    {
-      Time time = Simulator::Now ();
-
-      PRINTER ("In",   m_in);
-      PRINTER ("Out",  m_out);
-      PRINTER ("Drop", m_drop);
-    }
-}
-
-void
-Ipv4RateL3Tracer::Rx  (Ptr<const Packet> packet, Ptr<Ipv4> ipv4,  uint32_t iface)
-{
-  m_stats[iface].get<0> ().m_in ++;
-  m_stats[iface].get<1> ().m_in += packet->GetSize ();
-}
-
-void
-Ipv4RateL3Tracer::Tx   (Ptr<const Packet> packet, Ptr<Ipv4> ipv4,  uint32_t iface)
-{
-  m_stats[iface].get<0> ().m_out ++;
-  m_stats[iface].get<1> ().m_out += packet->GetSize ();
-}
-
-void
-Ipv4RateL3Tracer::Drop (const Ipv4Header &header, Ptr<const Packet> packet, Ipv4L3Protocol::DropReason, Ptr<Ipv4> ipv4, uint32_t iface)
-{
-  m_stats[iface].get<0> ().m_drop ++;
-  m_stats[iface].get<1> ().m_drop += packet->GetSize ();
-}
-
-
-} // namespace ns3
diff --git a/utils/tracers/ipv4-rate-l3-tracer.h b/utils/tracers/ipv4-rate-l3-tracer.h
deleted file mode 100644
index b039822..0000000
--- a/utils/tracers/ipv4-rate-l3-tracer.h
+++ /dev/null
@@ -1,139 +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 IPV4_RATE_L3_TRACER_H
-#define IPV4_RATE_L3_TRACER_H
-
-#include "ipv4-l3-tracer.h"
-
-#include "ns3/nstime.h"
-#include "ns3/event-id.h"
-#include "ns3/node-container.h"
-
-#include <boost/tuple/tuple.hpp>
-#include <boost/shared_ptr.hpp>
-#include <map>
-
-namespace ns3 {
-
-/**
- * @ingroup ndn-tracers
- * @brief IPv4 network-layer rate tracer
- */
-class Ipv4RateL3Tracer : public Ipv4L3Tracer
-{
-public:
-  /**
-   * @brief Network layer tracer constructor
-   */
-  Ipv4RateL3Tracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node);
-  virtual ~Ipv4RateL3Tracer ();
-
-  /**
-   * @brief Helper method to install tracers on all simulation nodes
-   *
-   * @param file File to which traces will be written
-   * @param averagingPeriod Defines averaging period for the rate calculation,
-   *        as well as 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<Ipv4RateL3Tracer> > >
-  InstallAll (const std::string &file, Time averagingPeriod = Seconds (0.5));
-
-  /**
-   * @brief Helper method to install tracers on the selected simulation nodes
-   *
-   * @param nodes Nodes on which to install tracer
-   * @param file File to which traces will be written.  If filename is -, then std::out is used
-   * @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<Ipv4RateL3Tracer> > >
-  Install (const NodeContainer &nodes, const std::string &file, Time averagingPeriod = Seconds (0.5));
-
-  /**
-   * @brief Helper method to install tracers on a specific simulation node
-   *
-   * @param nodes Nodes on which to install tracer
-   * @param file File to which traces will be written.  If filename is -, then std::out is used
-   * @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<Ipv4RateL3Tracer> > >
-  Install (Ptr<Node> node, const std::string &file, Time averagingPeriod = Seconds (0.5));
-
-  /**
-   * @brief Helper method to install tracers on a specific simulation node
-   *
-   * @param nodes Nodes on which to install tracer
-   * @param outputStream Smart pointer to a stream
-   * @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 Ptr<Ipv4RateL3Tracer>
-  Install (Ptr<Node> node, boost::shared_ptr<std::ostream> outputStream, Time averagingPeriod = Seconds (0.5));
-  
-  void
-  SetAveragingPeriod (const Time &period);
-
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  Rx  (Ptr<const Packet>, Ptr<Ipv4>,  uint32_t);
-
-  virtual void
-  Tx   (Ptr<const Packet>, Ptr<Ipv4>,  uint32_t);
-
-  virtual void
-  Drop (const Ipv4Header &, Ptr<const Packet>, Ipv4L3Protocol::DropReason, Ptr<Ipv4>, uint32_t);
-
-private:
-  void
-  PeriodicPrinter ();
-
-  void
-  Reset ();
-
-private:
-  boost::shared_ptr<std::ostream> m_os;
-  Time m_period;
-  EventId m_printEvent;
-
-  mutable std::map<uint32_t, boost::tuple<Stats, Stats, Stats, Stats> > m_stats;
-};
-
-} // namespace ns3
-
-#endif // IPV4_RATE_L3_TRACER_H
diff --git a/utils/tracers/ipv4-seqs-app-tracer.cc b/utils/tracers/ipv4-seqs-app-tracer.cc
deleted file mode 100644
index 170f280..0000000
--- a/utils/tracers/ipv4-seqs-app-tracer.cc
+++ /dev/null
@@ -1,133 +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 "ipv4-seqs-app-tracer.h"
-#include "ns3/node.h"
-#include "ns3/packet.h"
-#include "ns3/config.h"
-#include "ns3/callback.h"
-#include "ns3/simulator.h"
-#include "ns3/node-list.h"
-#include "ns3/node.h"
-#include "ns3/log.h"
-
-#include "ns3/tcp-l4-protocol.h"
-#include "ns3/tcp-header.h"
-#include "ns3/ipv4-header.h"
-
-#include <boost/lexical_cast.hpp>
-#include <fstream>
-
-NS_LOG_COMPONENT_DEFINE ("Ipv4SeqsAppTracer");
-
-using namespace boost;
-using namespace std;
-
-namespace ns3 {
-
-Ipv4SeqsAppTracer::Ipv4SeqsAppTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node)
-  : Ipv4AppTracer (node)
-  , m_os (os)
-{
-}
-
-boost::tuple< boost::shared_ptr<std::ostream>, std::list<Ptr<Ipv4SeqsAppTracer> > >
-Ipv4SeqsAppTracer::InstallAll (const std::string &file)
-{
-  std::list<Ptr<Ipv4SeqsAppTracer> > 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: " << lexical_cast<string> ((*node)->GetId ()));
-
-      Ptr<Ipv4SeqsAppTracer> trace = Create<Ipv4SeqsAppTracer> (outputStream, *node);
-      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);
-}
-
-void
-Ipv4SeqsAppTracer::Reset ()
-{
-}
-
-void
-Ipv4SeqsAppTracer::PrintHeader (std::ostream &os) const
-{
-  os << "Time\t"
-     << "Node\t"
-     << "Type\t"
-     << "SeqNo";
-}
-
-void
-Ipv4SeqsAppTracer::Print (std::ostream &os) const
-{
-}
-
-#define PRINTER(type,size)                                         \
- *m_os                                                              \
- << Simulator::Now ().ToDouble (Time::S) << "\t"                   \
- << m_node << "\t"                                                 \
- << type << "\t"                                                   \
- << static_cast<uint32_t> (size / 1040.0) << std::endl;
-
-void
-Ipv4SeqsAppTracer::Tx (std::string context,
-    const Ipv4Header &ip, Ptr<const Packet>, uint32_t)
-{
-  if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
-}
-
-void
-Ipv4SeqsAppTracer::Rx (std::string context,
-                       const Ipv4Header &ip, Ptr<const Packet> pktOrig, uint32_t)
-{
-  if (ip.GetProtocol () != TcpL4Protocol::PROT_NUMBER) return;
-
-  TcpHeader tcp;
-  Ptr<Packet> packet = pktOrig->Copy ();
-  packet->RemoveHeader (tcp);
-
-  if (tcp.GetFlags () | TcpHeader::ACK)
-    {
-      if (tcp.GetAckNumber ().GetValue () > 1000) // a little bit more cheating
-        {
-          PRINTER("InAck", tcp.GetAckNumber ().GetValue ());
-        }
-    }
-}
-
-} // namespace ns3
diff --git a/utils/tracers/ipv4-seqs-app-tracer.h b/utils/tracers/ipv4-seqs-app-tracer.h
deleted file mode 100644
index 5a64a5a..0000000
--- a/utils/tracers/ipv4-seqs-app-tracer.h
+++ /dev/null
@@ -1,77 +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 IPV4_SEQS_APP_TRACER_H
-#define IPV4_SEQS_APP_TRACER_H
-
-#include "ipv4-app-tracer.h"
-#include <boost/shared_ptr.hpp>
-#include <boost/tuple/tuple.hpp>
-
-namespace ns3 {
-
-/**
- * @ingroup ndn-tracers
- * @brief Helper to track application-level sequence numbers (approximated from TCP ACKs)
- */
-class Ipv4SeqsAppTracer : public Ipv4AppTracer
-{
-public:
-  Ipv4SeqsAppTracer (boost::shared_ptr<std::ostream> os, Ptr<Node> node);
-  virtual ~Ipv4SeqsAppTracer () { };
-
-  /**
-   * @brief Helper method to install tracers on all simulation nodes
-   *
-   * @param file File to which traces will be written
-   *
-   * @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<Ipv4SeqsAppTracer> > >
-  InstallAll (const std::string &file);
-
-
-  virtual void
-  PrintHeader (std::ostream &os) const;
-
-  virtual void
-  Print (std::ostream &os) const;
-
-  virtual void
-  Rx (std::string context,
-      const Ipv4Header &, Ptr<const Packet>, uint32_t);
-
-  virtual void
-  Tx (std::string context,
-      const Ipv4Header &, Ptr<const Packet>, uint32_t);
-
-protected:
-  void
-  Reset ();
-
-protected:
-  boost::shared_ptr<std::ostream> m_os;
-};
-
-} // namespace ns3
-
-#endif // IPV4_AGGREGATE_APP_TRACER_H
