diff --git a/bindings/module-helpers.cpp b/bindings/module-helpers.cpp
new file mode 100644
index 0000000..cd7c198
--- /dev/null
+++ b/bindings/module-helpers.cpp
@@ -0,0 +1,32 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2016  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#include "module-helpers.hpp"
+
+namespace nfd {
+namespace fib {
+
+std::shared_ptr<Face>
+getFaceFromFibNextHop(const NextHop& nextHop)
+{
+  return nextHop.getFace().shared_from_this();
+}
+
+} // namespace fib
+} // namespace nfd
diff --git a/bindings/module-helpers.hpp b/bindings/module-helpers.hpp
new file mode 100644
index 0000000..3f90e98
--- /dev/null
+++ b/bindings/module-helpers.hpp
@@ -0,0 +1,34 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2011-2016  Regents of the University of California.
+ *
+ * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
+ * contributors.
+ *
+ * ndnSIM is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * ndnSIM 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
+ * ndnSIM, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
+ **/
+
+#ifndef NDNSIM_BINDINGS_MODULE_HELPERS_HPP
+#define NDNSIM_BINDINGS_MODULE_HELPERS_HPP
+
+#include <ns3/ndnSIM/NFD/daemon/table/fib.hpp>
+
+namespace nfd {
+namespace fib {
+
+std::shared_ptr<Face>
+getFaceFromFibNextHop(const NextHop& nextHop);
+
+} // namespace fib
+} // namespace nfd
+
+#endif // NDNSIM_BINDINGS_MODULE_HELPERS_HPP
diff --git a/bindings/modulegen__gcc_ILP32.py b/bindings/modulegen__gcc_ILP32.py
index 940aa6e..e0df60e 100644
--- a/bindings/modulegen__gcc_ILP32.py
+++ b/bindings/modulegen__gcc_ILP32.py
@@ -242,7 +242,7 @@
         # cls.add_method('insert', retval('std::pair<std::shared_ptr<ns3::ndn::nfd::fib::Entry>, bool>'), [param('const ns3::ndn::Name&', 'prefix')])
         cls.add_method('erase', retval('void'), [param('const ns3::ndn::Name&', 'prefix')])
         cls.add_method('erase', retval('void'), [param('const ns3::ndn::nfd::fib::Entry&', 'entry')])
-        cls.add_method('removeNextHopFromAllEntries', retval('void'), [param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+        # cls.add_method('removeNextHopFromAllEntries', retval('void'), [param('std::shared_ptr<ns3::ndn::Face>', 'face')])
 
         def reg_Entry(cls):
             cls.add_method('getPrefix', 'const ns3::ndn::Name&', [], is_const=True)
@@ -251,9 +251,11 @@
         reg_Entry(root_module['ns3::ndn::nfd::fib::Entry'])
 
         def reg_NextHop(cls):
-            cls.add_constructor([param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+            cls.add_constructor([param('const ns3::ndn::Face&', 'face')])
 
-            cls.add_method('getFace', 'std::shared_ptr<ns3::ndn::Face>', [], is_const=True)
+            cls.add_function_as_method('getFaceFromFibNextHop', 'std::shared_ptr<ns3::ndn::Face>',
+                                       [param('const ns3::ndn::nfd::fib::NextHop&', 'obj')],
+                                       custom_name='getFace')
             cls.add_method('setCost', 'void', [param('uint64_t', 'cost')])
             cls.add_method('getCost', 'uint64_t', [], is_const=True)
         reg_NextHop(root_module['ns3::ndn::nfd::fib::NextHop'])
diff --git a/bindings/modulegen__gcc_LP64.py b/bindings/modulegen__gcc_LP64.py
index 940aa6e..e0df60e 100644
--- a/bindings/modulegen__gcc_LP64.py
+++ b/bindings/modulegen__gcc_LP64.py
@@ -242,7 +242,7 @@
         # cls.add_method('insert', retval('std::pair<std::shared_ptr<ns3::ndn::nfd::fib::Entry>, bool>'), [param('const ns3::ndn::Name&', 'prefix')])
         cls.add_method('erase', retval('void'), [param('const ns3::ndn::Name&', 'prefix')])
         cls.add_method('erase', retval('void'), [param('const ns3::ndn::nfd::fib::Entry&', 'entry')])
-        cls.add_method('removeNextHopFromAllEntries', retval('void'), [param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+        # cls.add_method('removeNextHopFromAllEntries', retval('void'), [param('std::shared_ptr<ns3::ndn::Face>', 'face')])
 
         def reg_Entry(cls):
             cls.add_method('getPrefix', 'const ns3::ndn::Name&', [], is_const=True)
@@ -251,9 +251,11 @@
         reg_Entry(root_module['ns3::ndn::nfd::fib::Entry'])
 
         def reg_NextHop(cls):
-            cls.add_constructor([param('std::shared_ptr<ns3::ndn::Face>', 'face')])
+            cls.add_constructor([param('const ns3::ndn::Face&', 'face')])
 
-            cls.add_method('getFace', 'std::shared_ptr<ns3::ndn::Face>', [], is_const=True)
+            cls.add_function_as_method('getFaceFromFibNextHop', 'std::shared_ptr<ns3::ndn::Face>',
+                                       [param('const ns3::ndn::nfd::fib::NextHop&', 'obj')],
+                                       custom_name='getFace')
             cls.add_method('setCost', 'void', [param('uint64_t', 'cost')])
             cls.add_method('getCost', 'uint64_t', [], is_const=True)
         reg_NextHop(root_module['ns3::ndn::nfd::fib::NextHop'])
