diff --git a/ndn-cpp/name.cpp b/ndn-cpp/name.cpp
index 9e60ca9..2886d1a 100644
--- a/ndn-cpp/name.cpp
+++ b/ndn-cpp/name.cpp
@@ -4,7 +4,6 @@
  */
 
 #include <stdexcept>
-#include <sstream>
 #include <algorithm>
 #include "name.hpp"
 
@@ -12,51 +11,6 @@
 
 namespace ndn {
 
-/**
- * Write the value to result, escaping characters according to the NDN URI Scheme.
- * This also adds "..." to a value with zero or more ".".
- * @param value the buffer with the value to escape
- * @param result the string stream to write to.
- */
-static void toEscapedString(const vector<unsigned char> &value, ostringstream &result)
-{
-  bool gotNonDot = false;
-  for (unsigned i = 0; i < value.size(); ++i) {
-    if (value[i] != 0x2e) {
-      gotNonDot = true;
-      break;
-    }
-  }
-  if (!gotNonDot) {
-    // Special case for component of zero or more periods.  Add 3 periods.
-    result << "...";
-    for (unsigned int i = 0; i < value.size(); ++i)
-      result << '.';
-  }
-  else {
-    // In case we need to escape, set to upper case hex and save the previous flags.
-    ios::fmtflags saveFlags = result.flags(ios::hex | ios::uppercase);
-    
-    for (unsigned int i = 0; i < value.size(); ++i) {
-      unsigned char x = value[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)
-        result << x;
-      else {
-        result << '%';
-        if (x < 16)
-          result << '0';
-        result << (unsigned int)x;
-      }
-    }
-    
-    // Restore.
-    result.flags(saveFlags);
-  }  
-}
-
 static const char *WHITESPACE_CHARS = " \n\r\t";
 
 /**
@@ -298,4 +252,43 @@
 	return true;
 }
 
+void Name::toEscapedString(const vector<unsigned char> &value, ostringstream &result)
+{
+  bool gotNonDot = false;
+  for (unsigned i = 0; i < value.size(); ++i) {
+    if (value[i] != 0x2e) {
+      gotNonDot = true;
+      break;
+    }
+  }
+  if (!gotNonDot) {
+    // Special case for component of zero or more periods.  Add 3 periods.
+    result << "...";
+    for (unsigned int i = 0; i < value.size(); ++i)
+      result << '.';
+  }
+  else {
+    // In case we need to escape, set to upper case hex and save the previous flags.
+    ios::fmtflags saveFlags = result.flags(ios::hex | ios::uppercase);
+    
+    for (unsigned int i = 0; i < value.size(); ++i) {
+      unsigned char x = value[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)
+        result << x;
+      else {
+        result << '%';
+        if (x < 16)
+          result << '0';
+        result << (unsigned int)x;
+      }
+    }
+    
+    // Restore.
+    result.flags(saveFlags);
+  }  
+}
+
 }
