diff --git a/ndn-cpp/encoding/wire-format.hpp b/ndn-cpp/encoding/wire-format.hpp
index c229131..e0ffdf0 100644
--- a/ndn-cpp/encoding/wire-format.hpp
+++ b/ndn-cpp/encoding/wire-format.hpp
@@ -19,8 +19,52 @@
   virtual ptr_lib::shared_ptr<std::vector<unsigned char> > encodeInterest(const Interest &interest);
   virtual void decodeInterest(Interest &interest, const unsigned char *input, unsigned int inputLength);
 
-  virtual ptr_lib::shared_ptr<std::vector<unsigned char> > encodeData(const Data &data);
-  virtual void decodeData(Data &data, const unsigned char *input, unsigned int inputLength);
+  /**
+   * Encode data and return the encoding.  Your derived class should override.
+   * @param data The Data object to encode.
+   * @param signedFieldsBeginOffset Return the offset in the encoding of the beginning of the fields which are signed.
+   * If you are not encoding in order to sign, you can call encodeData(const Data &data) to ignore this returned value.
+   * @param signedFieldsEndOffset Return the offset in the encoding of the end of the fields which are signed.
+   * If you are not encoding in order to sign, you can call encodeData(const Data &data) to ignore this returned value.
+   * @return A shared_ptr with the vector<unsigned char> containing the encoding.
+   * @throw logic_error for unimplemented if the derived class does not override.
+   */
+  virtual ptr_lib::shared_ptr<std::vector<unsigned char> > encodeData
+    (const Data &data, unsigned int *signedFieldsBeginOffset, unsigned int *signedFieldsEndOffset);
+
+  /**
+   * Encode data and return the encoding.
+   * @param data The Data object to encode.
+   * @return A shared_ptr with the vector<unsigned char> containing the encoding.
+   * @throw logic_error for unimplemented if the derived class does not override.
+   */
+  ptr_lib::shared_ptr<std::vector<unsigned char> > encodeData(const Data &data)
+  {
+    unsigned int dummyBeginOffset, dummyEndOffset;
+    return encodeData(data, &dummyBeginOffset, &dummyEndOffset);
+  }
+
+  /**
+   * Decode input as a data packet and set the fields in the data object.  Your derived class should override.
+   * @param data The Data object whose fields are updated.
+   * @param input A pointer to the input buffer to decode.
+   * @param inputLength The number of bytes in input.
+   * @param signedFieldsBeginOffset Return the offset in the input buffer of the beginning of the fields which are signed.
+   * If you are not decoding in order to verify, you can call 
+   * decodeData(Data &data, const unsigned char *input, unsigned int inputLength) to ignore this returned value.
+   * @param signedFieldsEndOffset Return the offset in the input buffer of the end of the fields which are signed.
+   * If you are not decoding in order to verify, you can call 
+   * decodeData(Data &data, const unsigned char *input, unsigned int inputLength) to ignore this returned value.
+   * @throw logic_error for unimplemented if the derived class does not override.
+   */  
+  virtual void decodeData
+    (Data &data, const unsigned char *input, unsigned int inputLength, unsigned int *signedFieldsBeginOffset, unsigned int *signedFieldsEndOffset);
+
+  void decodeData(Data &data, const unsigned char *input, unsigned int inputLength)
+  {
+    unsigned int dummyBeginOffset, dummyEndOffset;
+    decodeData(data, input, inputLength, &dummyBeginOffset, &dummyEndOffset);
+  }
   
   /**
    * Set the static default WireFormat used by default encoding and decoding methods.
