diff --git a/model/wire/ccnb/wire-ccnb-data.cc b/model/wire/ccnb/wire-ccnb-data.cc
index e625e06..fb87899 100644
--- a/model/wire/ccnb/wire-ccnb-data.cc
+++ b/model/wire/ccnb/wire-ccnb-data.cc
@@ -190,7 +190,8 @@
   //   {
   //     Ccnb::AppendString (start, CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
   //   }
-  Ccnb::AppendTaggedBlob (start, CcnbParser::CCN_DTAG_SignatureBits, m_data->GetSignature ()); // <SignatureBits />
+  Ccnb::AppendString (start, CcnbParser::CCN_DTAG_DigestAlgorithm, "NOP");
+  Ccnb::AppendTaggedBlobWithPadding (start, CcnbParser::CCN_DTAG_SignatureBits, 16, m_data->GetSignature ()); // <SignatureBits />
   Ccnb::AppendCloser (start);                                    // </Signature>
 
   Ccnb::AppendBlockHeader (start, CcnbParser::CCN_DTAG_Name, CcnbParser::CCN_DTAG);    // <Name>
@@ -269,8 +270,10 @@
   //   {
   //     written += Ccnb::EstimateString (CcnbParser::CCN_DTAG_DigestAlgorithm, GetSignature ().GetDigestAlgorithm ());
   //   }
-  written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits,
-                                       sizeof (m_data->GetSignature ()));      // <SignatureBits />
+  written += Ccnb::EstimateString (CcnbParser::CCN_DTAG_DigestAlgorithm, "NOP");
+  // "signature" will be always padded to 16 octets
+  written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits, 16);      // <SignatureBits />
+  // written += Ccnb::EstimateTaggedBlob (CcnbParser::CCN_DTAG_SignatureBits, sizeof (m_data->GetSignature ()));      // <SignatureBits />
   written += 1;                                    // </Signature>
 
   written += Ccnb::EstimateBlockHeader (CcnbParser::CCN_DTAG_Name);    // <Name>
diff --git a/model/wire/ccnb/wire-ccnb.cc b/model/wire/ccnb/wire-ccnb.cc
index e3a9ef1..7b92408 100644
--- a/model/wire/ccnb/wire-ccnb.cc
+++ b/model/wire/ccnb/wire-ccnb.cc
@@ -15,7 +15,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu> 
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
  */
 
 #include "wire-ccnb.h"
@@ -92,7 +92,7 @@
   os << number;
   return EstimateBlockHeader (os.str ().size ()) + os.str ().size ();
 }
-  
+
 size_t
 Ccnb::AppendCloser (Buffer::Iterator &start)
 {
@@ -110,7 +110,7 @@
   intmax_t ts = time.ToInteger (Time::S) >> 4;
   for (;  required_bytes < 7 && ts != 0; ts >>= 8) // not more than 6 bytes?
      required_bytes++;
-  
+
   size_t len = AppendBlockHeader(start, required_bytes, CcnbParser::CCN_BLOB);
 
   // write part with seconds
@@ -123,7 +123,7 @@
        (((time.ToInteger (Time::NS) % 1000000000) / 5 * 8 + 195312) / 390625);
   for (int i = required_bytes - 2; i < required_bytes; i++)
     start.WriteU8 ( ts >> (8 * (required_bytes - 1 - i)) );
-  
+
   return len + required_bytes;
 }
 
@@ -158,6 +158,35 @@
 }
 
 size_t
+Ccnb::AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag,
+                                   uint32_t length,
+                                   const uint8_t *data, size_t size)
+{
+  if (size > length)
+    {
+      // no padding required
+      return AppendTaggedBlob (start, dtag, data, size);
+    }
+
+
+  size_t written = AppendBlockHeader (start, dtag, CcnbParser::CCN_DTAG);
+
+  /* 2 */
+  if (length>0)
+    {
+      written += AppendBlockHeader (start, length, CcnbParser::CCN_BLOB);
+      start.Write (data, size);
+      start.WriteU8 (0, length - size);
+      written += length;
+      /* size */
+    }
+  written += AppendCloser (start);
+  /* 1 */
+
+  return written;
+}
+
+size_t
 Ccnb::EstimateTaggedBlob (uint32_t dtag, size_t size)
 {
   if (size>0)
diff --git a/model/wire/ccnb/wire-ccnb.h b/model/wire/ccnb/wire-ccnb.h
index 91d3d9e..bb1eef6 100644
--- a/model/wire/ccnb/wire-ccnb.h
+++ b/model/wire/ccnb/wire-ccnb.h
@@ -121,6 +121,24 @@
                     const uint8_t *data, size_t size);
   
   /**
+   * Append a tagged BLOB, adding 0-byte padding if necessary
+   *
+   * This is a ccnb-encoded element with containing the BLOB as content
+   *
+   * @param start start iterator of  the buffer to append to.
+   * @param dtag is the element's dtab
+   * @param length minimum required length of the added field (padding added if necessary)
+   * @param data points to the binary data
+   * @param size is the size of the data, in bytes
+   *
+   * @returns written length
+   */
+  static size_t
+  AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag,
+                               uint32_t length,
+                               const uint8_t *data, size_t size);
+
+  /**
    * @brief Estimate size of a tagged BLOB in CCNB enconding
    * @param dtag is the element's dtab
    * @param size is the size of the data, in bytes
@@ -147,6 +165,24 @@
   AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data);
 
   /**
+   * Append value as a tagged BLOB (templated version), add 0-padding if necessary
+   *
+   * This is a ccnb-encoded element with containing the BLOB as content
+   *
+   * Data will be reinterpret_cast<const uint8_t*> and size will be obtained using sizeof
+   *
+   * @param start start iterator of  the buffer to append to.
+   * @param dtag is the element's dtab
+   * @param length minimum required length of the field
+   * @param data a value to add
+   *
+   * @returns written length
+   */
+  template<class T>
+  static inline size_t
+  AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag, uint32_t length, const T &data);
+
+  /**
    * Append a tagged string (should be a valid UTF-8 coded string)
    *
    * This is a ccnb-encoded element with containing UDATA as content
@@ -203,12 +239,19 @@
 
 
 template<class T>
-size_t
+inline size_t
 Ccnb::AppendTaggedBlob (Buffer::Iterator &start, uint32_t dtag, const T &data)
 {
   return AppendTaggedBlob (start, dtag, reinterpret_cast<const uint8_t*> (&data), sizeof (data));
 }
 
+template<class T>
+inline size_t
+Ccnb::AppendTaggedBlobWithPadding (Buffer::Iterator &start, uint32_t dtag, uint32_t length, const T &data)
+{
+  return AppendTaggedBlobWithPadding (start, dtag, length, reinterpret_cast<const uint8_t*> (&data), sizeof (data));
+}
+
 } // wire
 
 NDN_NAMESPACE_END
