diff --git a/ndn-cpp/util/blob.hpp b/ndn-cpp/util/blob.hpp
index 24de528..0572301 100644
--- a/ndn-cpp/util/blob.hpp
+++ b/ndn-cpp/util/blob.hpp
@@ -68,7 +68,8 @@
   /**
    * Return the length of the immutable byte array.
    */
-  unsigned int size() const
+  unsigned int 
+  size() const
   {
     if (*this)
       return (*this)->size();
@@ -79,7 +80,8 @@
   /**
    * Return a const pointer to the first byte of the immutable byte array, or 0 if the pointer is null.
    */
-  const unsigned char* buf() const
+  const unsigned char* 
+  buf() const
   {
     if (*this)
       return &(*this)->front();
diff --git a/ndn-cpp/util/changed-event.cpp b/ndn-cpp/util/changed-event.cpp
index 24a87bd..1d12c75 100644
--- a/ndn-cpp/util/changed-event.cpp
+++ b/ndn-cpp/util/changed-event.cpp
@@ -10,7 +10,8 @@
 
 namespace ndn {
 
-void ChangedEvent::fire()
+void 
+ChangedEvent::fire()
 {
   for (unsigned int i = 0; i < listeners_.size(); ++i)
     listeners_[i]();
diff --git a/ndn-cpp/util/changed-event.hpp b/ndn-cpp/util/changed-event.hpp
index 3bac8b6..ce4b20f 100644
--- a/ndn-cpp/util/changed-event.hpp
+++ b/ndn-cpp/util/changed-event.hpp
@@ -23,7 +23,8 @@
    * Add onChanged to the listener list. This does not check if a duplicate is already in the list.
    * @param onChanged The OnChanged function object.
    */
-  void add(OnChanged onChanged)
+  void 
+  add(OnChanged onChanged)
   {
     listeners_.push_back(onChanged);
   }
@@ -31,7 +32,8 @@
   /**
    * Call all the listeners.
    */
-  void fire();
+  void 
+  fire();
 
 #if 0  
 private:
diff --git a/ndn-cpp/util/dynamic-uchar-vector.cpp b/ndn-cpp/util/dynamic-uchar-vector.cpp
index 454ce8c..4b17e63 100644
--- a/ndn-cpp/util/dynamic-uchar-vector.cpp
+++ b/ndn-cpp/util/dynamic-uchar-vector.cpp
@@ -16,7 +16,8 @@
   ndn_DynamicUCharArray_initialize(this, &vector_->front(), initialLength, DynamicUCharVector::realloc);
 }
 
-unsigned char *DynamicUCharVector::realloc(struct ndn_DynamicUCharArray *self, unsigned char *array, unsigned int length)
+unsigned char*
+DynamicUCharVector::realloc(struct ndn_DynamicUCharArray *self, unsigned char *array, unsigned int length)
 {
   // Because this method is private, assume there is not a problem with upcasting.
   DynamicUCharVector *thisObject = (DynamicUCharVector *)self;
diff --git a/ndn-cpp/util/dynamic-uchar-vector.hpp b/ndn-cpp/util/dynamic-uchar-vector.hpp
index 7313cc9..68950a9 100644
--- a/ndn-cpp/util/dynamic-uchar-vector.hpp
+++ b/ndn-cpp/util/dynamic-uchar-vector.hpp
@@ -29,7 +29,8 @@
    * Get the shared_ptr to the allocated vector.
    * @return The shared_ptr to the allocated vector. 
    */
-  const ptr_lib::shared_ptr<std::vector<unsigned char> >& get() { return vector_; }
+  const ptr_lib::shared_ptr<std::vector<unsigned char> >& 
+  get() { return vector_; }
   
 private:
   /**
@@ -39,7 +40,8 @@
    * @param length The new length for the vector.
    * @return The front of the allocated vector.
    */
-  static unsigned char *realloc(struct ndn_DynamicUCharArray *self, unsigned char *array, unsigned int length);
+  static unsigned char*
+  realloc(struct ndn_DynamicUCharArray *self, unsigned char *array, unsigned int length);
   
   ptr_lib::shared_ptr<std::vector<unsigned char> > vector_;
 };
diff --git a/ndn-cpp/util/signed-blob.hpp b/ndn-cpp/util/signed-blob.hpp
index 25966b6..0b6cdda 100644
--- a/ndn-cpp/util/signed-blob.hpp
+++ b/ndn-cpp/util/signed-blob.hpp
@@ -76,7 +76,8 @@
   /**
    * Return the length of the signed portion of the immutable byte array, or 0 of the pointer to the array is null.
    */
-  unsigned int signedSize() const
+  unsigned int 
+  signedSize() const
   {
     if (*this)
       return signedPortionEndOffset_ - signedPortionBeginOffset_;
@@ -88,7 +89,8 @@
    * Return a const pointer to the first byte of the signed portion of the immutable byte array, or 0 if the 
    * pointer to the array is null.
    */
-  const unsigned char* signedBuf() const
+  const unsigned char*
+  signedBuf() const
   {
     if (*this)
       return &(*this)->front() + signedPortionBeginOffset_;
@@ -99,12 +101,14 @@
   /**
    * Return the offset in the array of the beginning of the signed portion.
    */  
-  unsigned int getSignedPortionBeginOffset() { return signedPortionBeginOffset_; }
+  unsigned int 
+  getSignedPortionBeginOffset() { return signedPortionBeginOffset_; }
 
   /**
    * Return the offset in the array of the end of the signed portion.
    */  
-  unsigned int getSignedPortionEndOffset() { return signedPortionEndOffset_; }
+  unsigned int 
+  getSignedPortionEndOffset() { return signedPortionEndOffset_; }
   
 private:
   unsigned int signedPortionBeginOffset_;
