diff --git a/ndn-cpp/face.cpp b/ndn-cpp/face.cpp
index febdc7b..d70023b 100644
--- a/ndn-cpp/face.cpp
+++ b/ndn-cpp/face.cpp
@@ -10,7 +10,7 @@
 
 namespace ndn {
   
-unsigned int 
+uint64_t 
 Face::expressInterest(const Name& name, const Interest *interestTemplate, const OnData& onData, const OnTimeout& onTimeout)
 {
   if (interestTemplate)
diff --git a/ndn-cpp/face.hpp b/ndn-cpp/face.hpp
index 69f662d..8eab12a 100644
--- a/ndn-cpp/face.hpp
+++ b/ndn-cpp/face.hpp
@@ -47,7 +47,7 @@
    * This copies the function object, so you may need to use func_lib::ref() as appropriate.
    * @return The pending interest ID which can be used with removePendingInterest.
    */
-  unsigned int 
+  uint64_t 
   expressInterest(const Interest& interest, const OnData& onData, const OnTimeout& onTimeout = OnTimeout())
   {
     return node_.expressInterest(interest, onData, onTimeout);
@@ -64,7 +64,7 @@
    * This copies the function object, so you may need to use func_lib::ref() as appropriate.
    * @return The pending interest ID which can be used with removePendingInterest.
    */
-  unsigned int 
+  uint64_t 
   expressInterest(const Name& name, const Interest *interestTemplate, const OnData& onData, const OnTimeout& onTimeout = OnTimeout());
 
   /**
@@ -77,7 +77,7 @@
    * This copies the function object, so you may need to use func_lib::ref() as appropriate.
    * @return The pending interest ID which can be used with removePendingInterest.
    */
-  unsigned int 
+  uint64_t 
   expressInterest(const Name& name, const OnData& onData, const OnTimeout& onTimeout = OnTimeout()) 
   {
     return expressInterest(name, 0, onData, onTimeout);
@@ -90,7 +90,7 @@
    * @param pendingInterestId The ID returned from expressInterest.
    */
   void
-  removePendingInterest(unsigned int pendingInterestId)
+  removePendingInterest(uint64_t pendingInterestId)
   {
     node_.removePendingInterest(pendingInterestId);
   }
@@ -107,7 +107,7 @@
    * @param wireFormat A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat().
    * @return The registered prefix ID which can be used with removeRegisteredPrefix.
    */
-  unsigned int 
+  uint64_t 
   registerPrefix
     (const Name& prefix, const OnInterest& onInterest, const OnRegisterFailed& onRegisterFailed, const ForwardingFlags& flags = ForwardingFlags(), 
      WireFormat& wireFormat = *WireFormat::getDefaultWireFormat())
@@ -122,7 +122,7 @@
    * @param registeredPrefixId The ID returned from registerPrefix.
    */
   void
-  removeRegisteredPrefix(unsigned int registeredPrefixId)
+  removeRegisteredPrefix(uint64_t registeredPrefixId)
   {
     node_.removeRegisteredPrefix(registeredPrefixId);
   }
diff --git a/ndn-cpp/node.cpp b/ndn-cpp/node.cpp
index a86bdff..b0df607 100644
--- a/ndn-cpp/node.cpp
+++ b/ndn-cpp/node.cpp
@@ -65,8 +65,8 @@
 0x30, 0x18, 0xeb, 0x90, 0xfb, 0x17, 0xd3, 0xce, 0xb5
 };
 
-unsigned int Node::PendingInterest::lastPendingInterestId_ = 0;
-unsigned int Node::RegisteredPrefix::lastRegisteredPrefixId_ = 0;
+uint64_t Node::PendingInterest::lastPendingInterestId_ = 0;
+uint64_t Node::RegisteredPrefix::lastRegisteredPrefixId_ = 0;
 
 /**
  * Set the KeyLocator using the full SELFREG_PUBLIC_KEY_DER, sign the data packet using SELFREG_PRIVATE_KEY_DER 
@@ -123,14 +123,14 @@
 {
 }
 
-unsigned int 
+uint64_t 
 Node::expressInterest(const Interest& interest, const OnData& onData, const OnTimeout& onTimeout)
 {
   // TODO: Properly check if we are already connected to the expected host.
   if (!transport_->getIsConnected())
     transport_->connect(*connectionInfo_, *this);
   
-  unsigned int pendingInterestId = PendingInterest::getNextPendingInterestId();
+  uint64_t pendingInterestId = PendingInterest::getNextPendingInterestId();
   pendingInterestTable_.push_back(shared_ptr<PendingInterest>(new PendingInterest
     (pendingInterestId, shared_ptr<const Interest>(new Interest(interest)), onData, onTimeout)));
   
@@ -141,7 +141,7 @@
 }
 
 void
-Node::removePendingInterest(unsigned int pendingInterestId)
+Node::removePendingInterest(uint64_t pendingInterestId)
 {
   // Go backwards through the list so we can erase entries.
   // Remove all entries even though pendingInterestId should be unique.
@@ -151,12 +151,12 @@
   }
 }
 
-unsigned int 
+uint64_t 
 Node::registerPrefix
   (const Name& prefix, const OnInterest& onInterest, const OnRegisterFailed& onRegisterFailed, const ForwardingFlags& flags, WireFormat& wireFormat)
 {
   // Get the registeredPrefixId now so we can return it to the caller.
-  unsigned int registeredPrefixId = RegisteredPrefix::getNextRegisteredPrefixId();
+  uint64_t registeredPrefixId = RegisteredPrefix::getNextRegisteredPrefixId();
 
   if (ndndId_.size() == 0) {
     // First fetch the ndndId of the connected hub.
@@ -173,7 +173,7 @@
 }
 
 void
-Node::removeRegisteredPrefix(unsigned int registeredPrefixId)
+Node::removeRegisteredPrefix(uint64_t registeredPrefixId)
 {
   // Go backwards through the list so we can erase entries.
   // Remove all entries even though pendingInterestId should be unique.
@@ -206,7 +206,7 @@
 
 void 
 Node::registerPrefixHelper
-  (unsigned int registeredPrefixId, const shared_ptr<const Name>& prefix, const OnInterest& onInterest, const OnRegisterFailed& onRegisterFailed, 
+  (uint64_t registeredPrefixId, const shared_ptr<const Name>& prefix, const OnInterest& onInterest, const OnRegisterFailed& onRegisterFailed, 
    const ForwardingFlags& flags, WireFormat& wireFormat)
 {
   // Create a ForwardingEntry.
@@ -337,7 +337,7 @@
 }
 
 Node::PendingInterest::PendingInterest
-  (unsigned int pendingInterestId, const shared_ptr<const Interest>& interest, const OnData& onData, const OnTimeout& onTimeout)
+  (uint64_t pendingInterestId, const shared_ptr<const Interest>& interest, const OnData& onData, const OnTimeout& onTimeout)
 : pendingInterestId_(pendingInterestId), interest_(interest), onData_(onData), onTimeout_(onTimeout)
 {
   // Set up timeoutTime_.
diff --git a/ndn-cpp/node.hpp b/ndn-cpp/node.hpp
index 794120c..9130815 100644
--- a/ndn-cpp/node.hpp
+++ b/ndn-cpp/node.hpp
@@ -58,7 +58,7 @@
    * This copies the function object, so you may need to use func_lib::ref() as appropriate.
    * @return The pending interest ID which can be used with removePendingInterest.
    */
-  unsigned int 
+  uint64_t 
   expressInterest(const Interest& interest, const OnData& onData, const OnTimeout& onTimeout);
   
   /**
@@ -68,7 +68,7 @@
    * @param pendingInterestId The ID returned from expressInterest.
    */
   void
-  removePendingInterest(unsigned int pendingInterestId);
+  removePendingInterest(uint64_t pendingInterestId);
   
   /**
    * Register prefix with the connected NDN hub and call onInterest when a matching interest is received.
@@ -81,7 +81,7 @@
    * @param wireFormat A WireFormat object used to encode the input. If omitted, use WireFormat getDefaultWireFormat().
    * @return The registered prefix ID which can be used with removeRegisteredPrefix.
    */
-  unsigned int 
+  uint64_t 
   registerPrefix
     (const Name& prefix, const OnInterest& onInterest, const OnRegisterFailed& onRegisterFailed, const ForwardingFlags& flags, 
      WireFormat& wireFormat);
@@ -93,7 +93,7 @@
    * @param registeredPrefixId The ID returned from registerPrefix.
    */
   void
-  removeRegisteredPrefix(unsigned int registeredPrefixId);
+  removeRegisteredPrefix(uint64_t registeredPrefixId);
 
   /**
    * Process any data to receive.  For each element received, call onReceivedElement.
@@ -128,13 +128,13 @@
      * @param onTimeout A function object to call if the interest times out.  If onTimeout is an empty OnTimeout(), this does not use it.
      */
     PendingInterest
-      (unsigned int pendingInterestId, const ptr_lib::shared_ptr<const Interest>& interest, const OnData& onData, 
+      (uint64_t pendingInterestId, const ptr_lib::shared_ptr<const Interest>& interest, const OnData& onData, 
        const OnTimeout& onTimeout);
     
     /**
      * Return the next unique pending interest ID.
      */
-    static unsigned int 
+    static uint64_t 
     getNextPendingInterestId()
     {
       return ++lastPendingInterestId_;
@@ -143,7 +143,7 @@
     /**
      * Return the pendingInterestId given to the constructor.
      */
-    unsigned int 
+    uint64_t 
     getPendingInterestId() { return pendingInterestId_; }
     
     const ptr_lib::shared_ptr<const Interest>& 
@@ -181,8 +181,8 @@
     std::vector<struct ndn_ExcludeEntry> excludeEntries_;
     struct ndn_Interest interestStruct_;
   
-    static unsigned int lastPendingInterestId_; /**< A class variable used to get the next unique ID. */
-    unsigned int pendingInterestId_;            /**< A unique identifier for this entry so it can be deleted */
+    static uint64_t lastPendingInterestId_; /**< A class variable used to get the next unique ID. */
+    uint64_t pendingInterestId_;            /**< A unique identifier for this entry so it can be deleted */
     const OnData onData_;
     const OnTimeout onTimeout_;
     double timeoutTimeMilliseconds_; /**< The time when the interest times out in milliseconds according to gettimeofday, or -1 for no timeout. */
@@ -196,7 +196,7 @@
      * @param prefix A shared_ptr for the prefix.
      * @param onInterest A function object to call when a matching data packet is received.
      */
-    RegisteredPrefix(unsigned int registeredPrefixId, const ptr_lib::shared_ptr<const Name>& prefix, const OnInterest& onInterest)
+    RegisteredPrefix(uint64_t registeredPrefixId, const ptr_lib::shared_ptr<const Name>& prefix, const OnInterest& onInterest)
     : registeredPrefixId_(registeredPrefixId), prefix_(prefix), onInterest_(onInterest)
     {
     }
@@ -204,7 +204,7 @@
     /**
      * Return the next unique entry ID.
      */
-    static unsigned int 
+    static uint64_t 
     getNextRegisteredPrefixId()
     {
       return ++lastRegisteredPrefixId_;
@@ -213,7 +213,7 @@
     /**
      * Return the registeredPrefixId given to the constructor.
      */
-    unsigned int 
+    uint64_t 
     getRegisteredPrefixId() { return registeredPrefixId_; }
     
     const ptr_lib::shared_ptr<const Name>& 
@@ -223,8 +223,8 @@
     getOnInterest() { return onInterest_; }
     
   private:
-    static unsigned int lastRegisteredPrefixId_; /**< A class variable used to get the next unique ID. */
-    unsigned int registeredPrefixId_;            /**< A unique identifier for this entry so it can be deleted */
+    static uint64_t lastRegisteredPrefixId_; /**< A class variable used to get the next unique ID. */
+    uint64_t registeredPrefixId_;            /**< A unique identifier for this entry so it can be deleted */
     ptr_lib::shared_ptr<const Name> prefix_;
     const OnInterest onInterest_;
   };
@@ -268,7 +268,7 @@
        * @param flags
        * @param wireFormat
        */
-      Info(Node *node, unsigned int registeredPrefixId, const Name& prefix, const OnInterest& onInterest, 
+      Info(Node *node, uint64_t registeredPrefixId, const Name& prefix, const OnInterest& onInterest, 
            const OnRegisterFailed& onRegisterFailed, const ForwardingFlags& flags, WireFormat& wireFormat)
       : node_(*node), registeredPrefixId_(registeredPrefixId), prefix_(new Name(prefix)), onInterest_(onInterest), onRegisterFailed_(onRegisterFailed), 
         flags_(flags), wireFormat_(wireFormat)
@@ -276,7 +276,7 @@
       }
       
       Node& node_;
-      unsigned int registeredPrefixId_;
+      uint64_t registeredPrefixId_;
       ptr_lib::shared_ptr<const Name> prefix_;
       const OnInterest onInterest_;
       const OnRegisterFailed onRegisterFailed_;
@@ -316,7 +316,7 @@
    */  
   void 
   registerPrefixHelper
-    (unsigned int registeredPrefixId, const ptr_lib::shared_ptr<const Name>& prefix, const OnInterest& onInterest, 
+    (uint64_t registeredPrefixId, const ptr_lib::shared_ptr<const Name>& prefix, const OnInterest& onInterest, 
      const OnRegisterFailed& onRegisterFailed, const ForwardingFlags& flags, WireFormat& wireFormat);
   
   ptr_lib::shared_ptr<Transport> transport_;
