diff --git a/helper/ndn-stack-helper.hpp b/helper/ndn-stack-helper.hpp
index b6b4266..2f3ea3b 100644
--- a/helper/ndn-stack-helper.hpp
+++ b/helper/ndn-stack-helper.hpp
@@ -24,10 +24,12 @@
 
 #include "ns3/ndnSIM/model/ndn-common.hpp"
 
-#include "ns3/packet.h"
 #include "ns3/ptr.h"
 #include "ns3/object-factory.h"
-#include "ns3/nstime.h"
+#include "ns3/node.h"
+#include "ns3/node-container.h"
+
+#include "ndn-face-container.hpp"
 
 namespace ns3 {
 
@@ -35,8 +37,6 @@
 
 namespace ndn {
 
-class FaceContainer;
-class Face;
 class NetDeviceFace;
 class L3Protocol;
 
@@ -82,52 +82,6 @@
                      const std::string& attr3 = "", const std::string& value3 = "",
                      const std::string& attr4 = "", const std::string& value4 = "");
 
-  /**
-   * @brief Set forwarding strategy class and its attributes
-   * @param forwardingStrategyClass string containing name of the forwarding strategy class
-   *
-   * Valid options are "ns3::NdnFloodingStrategy" (default) and "ns3::NdnBestRouteStrategy"
-   *
-   * Other strategies can be implemented, inheriting ns3::NdnForwardingStrategy class
-   */
-  void
-  SetForwardingStrategy(const std::string& forwardingStrategyClass, const std::string& attr1 = "",
-                        const std::string& value1 = "", const std::string& attr2 = "",
-                        const std::string& value2 = "", const std::string& attr3 = "",
-                        const std::string& value3 = "", const std::string& attr4 = "",
-                        const std::string& value4 = "");
-
-  /**
-   * @brief Set content store class and its attributes
-   * @param contentStoreClass string, representing class of the content store
-   */
-  void
-  SetContentStore(const std::string& contentStoreClass, const std::string& attr1 = "",
-                  const std::string& value1 = "", const std::string& attr2 = "",
-                  const std::string& value2 = "", const std::string& attr3 = "",
-                  const std::string& value3 = "", const std::string& attr4 = "",
-                  const std::string& value4 = "");
-
-  /**
-   * @brief Set PIT class and its attributes
-   * @param pitClass string, representing class of PIT
-   */
-  void
-  SetPit(const std::string& pitClass, const std::string& attr1 = "", const std::string& value1 = "",
-         const std::string& attr2 = "", const std::string& value2 = "",
-         const std::string& attr3 = "", const std::string& value3 = "",
-         const std::string& attr4 = "", const std::string& value4 = "");
-
-  /**
-   * @brief Set FIB class and its attributes
-   * @param pitClass string, representing class of FIB
-   */
-  void
-  SetFib(const std::string& fibClass, const std::string& attr1 = "", const std::string& value1 = "",
-         const std::string& attr2 = "", const std::string& value2 = "",
-         const std::string& attr3 = "", const std::string& value3 = "",
-         const std::string& attr4 = "", const std::string& value4 = "");
-
   typedef Callback<shared_ptr<NetDeviceFace>, Ptr<Node>, Ptr<L3Protocol>, Ptr<NetDevice>>
     NetDeviceFaceCreateCallback;
 
@@ -137,10 +91,6 @@
    *
    * It is possible to set up several callbacks for different NetDevice types.
    *
-   * Currently, there is only one specialized callback for PointToPointNetDevice, which creates face
-   *and sets limits (if enabled)
-   * based on PointToPoint link parameters
-   *
    * If none of the callbacks fit the TypeId of NetDevice, a default callback is used
    *(DefaultNetDeviceCallback)
    */
@@ -166,28 +116,16 @@
   RemoveNetDeviceFaceCreateCallback(TypeId netDeviceType, NetDeviceFaceCreateCallback callback);
 
   /**
-   * @brief Enable Interest limits (disabled by default)
-   *
-   * @param enable           Enable or disable limits
-   * @param avgRtt           Average RTT
-   * @param avgData Average size of contentObject packets (including all headers)
-   * @param avgInterest      Average size of interest packets (including all headers)
-   */
-  void
-  EnableLimits(bool enable = true, Time avgRtt = Seconds(0.1), uint32_t avgData = 1100,
-               uint32_t avgInterest = 40);
-
-  /**
-   * \brief Install Ndn stack on the node
-   *
-   * This method will assert if called on a node that already has Ndn object
-   * installed on it
-   *
-   * \param nodeName The name of the node on which to install the stack.
-   *
-   * \returns list of installed faces in the form of a smart pointer
-   * to NdnFaceContainer object
-   */
+  * \brief Install Ndn stack on the node
+  *
+  * This method will assert if called on a node that already has Ndn object
+  * installed on it
+  *
+  * \param nodeName The name of the node on which to install the stack.
+  *
+  * \returns list of installed faces in the form of a smart pointer
+  * to NdnFaceContainer object
+  */
   Ptr<FaceContainer>
   Install(const std::string& nodeName) const;
 
@@ -229,69 +167,6 @@
   Ptr<FaceContainer>
   InstallAll() const;
 
-  /**
-   * \brief Add forwarding entry to FIB
-   *
-   * \param nodeName Node name
-   * \param prefix Routing prefix
-   * \param faceId Face index
-   * \param metric Routing metric
-   */
-  static void
-  AddRoute(const std::string& nodeName, const std::string& prefix, uint32_t faceId, int32_t metric);
-
-  /**
-   * \brief Add forwarding entry to FIB
-   *
-   * \param nodeName Node
-   * \param prefix Routing prefix
-   * \param faceId Face index
-   * \param metric Routing metric
-   */
-  static void
-  AddRoute(Ptr<Node> node, const std::string& prefix, uint32_t faceId, int32_t metric);
-
-  /**
-   * \brief Add forwarding entry to FIB
-   *
-   * \param node   Node
-   * \param prefix Routing prefix
-   * \param face   Face
-   * \param metric Routing metric
-   */
-  static void
-  AddRoute(Ptr<Node> node, const std::string& prefix, shared_ptr<Face> face, int32_t metric);
-
-  /**
-   * @brief Add forwarding entry to FIB (work only with point-to-point links)
-   *
-   * \param node Node
-   * \param prefix Routing prefix
-   * \param otherNode The other node, to which interests (will be used to infer face id
-   * \param metric Routing metric
-   */
-  static void
-  AddRoute(Ptr<Node> node, const std::string& prefix, Ptr<Node> otherNode, int32_t metric);
-
-  /**
-   * @brief Add forwarding entry to FIB (work only with point-to-point links)
-   *
-   * \param nodeName Node name (refer to ns3::Names)
-   * \param prefix Routing prefix
-   * \param otherNode The other node name, to which interests (will be used to infer face id (refer
-   *to ns3::Names)
-   * \param metric Routing metric
-   */
-  static void
-  AddRoute(const std::string& nodeName, const std::string& prefix, const std::string& otherNodeName,
-           int32_t metric);
-
-  /**
-   * \brief Set flag indicating necessity to install default routes in FIB
-   */
-  void
-  SetDefaultRoutes(bool needSet);
-
   static KeyChain&
   getKeyChain();
 
@@ -314,15 +189,8 @@
 
 private:
   ObjectFactory m_ndnFactory;
-  ObjectFactory m_strategyFactory;
   ObjectFactory m_contentStoreFactory;
-  ObjectFactory m_pitFactory;
-  ObjectFactory m_fibFactory;
 
-  bool m_limitsEnabled;
-  Time m_avgRtt;
-  uint32_t m_avgDataSize;
-  uint32_t m_avgInterestSize;
   bool m_needSetDefaultRoutes;
 
   typedef std::list<std::pair<TypeId, NetDeviceFaceCreateCallback>> NetDeviceCallbackList;
