diff --git a/ndn-cpp/name.cpp b/ndn-cpp/name.cpp
index d94eecd..2b5c6a9 100644
--- a/ndn-cpp/name.cpp
+++ b/ndn-cpp/name.cpp
@@ -103,7 +103,7 @@
   return result.str();
 }
 
-bool Name::Component::setFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset)
+Blob Name::Component::makeFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset)
 {
   string trimmedString(escapedString + beginOffset, escapedString + endOffset);
   trim(trimmedString);
@@ -113,18 +113,16 @@
     // Special case for component of only periods.  
     if (component.size() <= 2)
       // Zero, one or two periods is illegal.  Ignore this component.
-      return false;
+      return Blob();
     else
       // Remove 3 periods.
-      value_ = Blob((const unsigned char *)&component[3], component.size() - 3); 
+      return Blob((const unsigned char *)&component[3], component.size() - 3); 
   }
   else
-    value_ = Blob((const unsigned char *)&component[0], component.size()); 
-  
-  return true;
+    return Blob((const unsigned char *)&component[0], component.size()); 
 }
 
-void Name::Component::setSegment(unsigned long segment)
+Blob Name::Component::makeSegment(unsigned long segment)
 {
   ptr_lib::shared_ptr<vector<unsigned char> > value;
   
@@ -139,7 +137,7 @@
   
   // Make it big endian.
   reverse(value->begin() + 1, value->end());
-  value_ = value;
+  return Blob(value);
 }
 
 void Name::set(const char *uri_cstr) 
@@ -189,10 +187,10 @@
     if (iComponentEnd == string::npos)
       iComponentEnd = uri.size();
     
-    components_.push_back(Component());
-    if (!components_[components_.size() - 1].setFromEscapedString(&uri[0], iComponentStart, iComponentEnd))
-      // Ignore the illegal component.  This also gets rid of a trailing '/'.
-      components_.pop_back();
+    Blob component = Component::makeFromEscapedString(&uri[0], iComponentStart, iComponentEnd);
+    // Ignore illegal components.  This also gets rid of a trailing '/'.
+    if (component)
+      components_.push_back(Component(component));
     
     iComponentStart = iComponentEnd + 1;
   }
diff --git a/ndn-cpp/name.hpp b/ndn-cpp/name.hpp
index 587301c..cd80fac 100644
--- a/ndn-cpp/name.hpp
+++ b/ndn-cpp/name.hpp
@@ -19,12 +19,12 @@
 class Name {
 public:
   /**
-   * A Name::Component is holds an immutable name component value.
+   * A Name::Component is holds a read-only name component value.
    */
   class Component {
   public:
     /**
-     * Create a new Name::Component with an empty value.
+     * Create a new Name::Component with a null value.
      */
     Component() 
     {    
@@ -74,24 +74,23 @@
   
     const Blob& getValue() const { return value_; }
     
-    void setValue(const Blob& value) { value_ = value; }
-  
     /**
-     * Set this component value by decoding the escapedString between beginOffset and endOffset according to the NDN URI Scheme.
-     * If the escaped string is "", "." or ".." then return false, which means this component value was not changed, and
+     * Make a component value by decoding the escapedString between beginOffset and endOffset according to the NDN URI Scheme.
+     * If the escaped string is "", "." or ".." then return a Blob with a null pointer, which means this component value was not changed, and
      * the component should be skipped in a URI name.
      * @param escapedString The escaped string.  It does not need to be null-terminated because we only scan to endOffset.
      * @param beginOffset The offset in escapedString of the beginning of the portion to decode.
      * @param endOffset The offset in escapedString of the end of the portion to decode.
-     * @return True for success, false if escapedString is not a valid escaped component.
+     * @return The component value as a Blob, or a Blob with a null pointer if escapedString is not a valid escaped component.
      */
-    bool setFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset);
+    static Blob makeFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset);
     
     /**
-     * Set this component to the encoded segment number.
+     * Make a component as the encoded segment number.
      * @param segment The segment number.
+     * @return The component value as a Blob.
      */
-    void setSegment(unsigned long segment);
+    static Blob makeSegment(unsigned long segment);
   
   private:
     Blob value_;
@@ -198,8 +197,7 @@
    */
   void appendSegment(unsigned long segment)
   {
-    components_.push_back(Component());
-    components_.back().setSegment(segment);
+    components_.push_back(Component(Component::makeSegment(segment)));
   }
   
   /**
