diff --git a/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate b/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate
index 1e3e6102629ef05b3b5d41b0f80b0cef00d24949..6602ccb9c7d74c6ae7445b5d225517b10b5918c6 100644
Binary files a/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate and b/PacketLib.xcodeproj/project.xcworkspace/xcuserdata/bulgarelli.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/include/ByteStream.h b/include/ByteStream.h
index af2597398e32449a31c320e0504512acf1ac9ad5..d44f232ab3bb9757c04832c4763dc1af768b29bb 100644
--- a/include/ByteStream.h
+++ b/include/ByteStream.h
@@ -119,6 +119,20 @@ public:
     /// \param dim number of byte (1 or 2)
     long getValue(dword start, word dim);
 
+	/// Create a copy of the stream with some additional padding. The stream is divided into chunks
+	/// with numberOfChunks = size() / chunkSize.
+	/// \param chunkSize the size of a chunk without padding.
+	/// \param padSize Size of the padding.
+	/// \return The padded copy of this byte stream.
+	ByteStreamPtr getPaddedCopy(dword chunkSize, dword padSize);
+
+	/// Create a copy of the stream removing some padding. The stream is divided into chunks
+	/// with numberOfChunks = size() / chunkSize.
+	/// \param chunkSize the size of a chunk with padding.
+	/// \param padSize Size of the padding.
+	/// \return The unpadded copy of this byte stream.
+	ByteStreamPtr getUnpaddedCopy(dword chunkSize, dword padSize);
+
     char* printStreamInHexadecimal();
 
     /// Get type of allocations.
diff --git a/src/ByteStream.cpp b/src/ByteStream.cpp
index 95ab024795e8a06e45a99476d0fad046b853cb13..717a9af242ad9d9cfaf35913a6c817b1039f3a90 100644
--- a/src/ByteStream.cpp
+++ b/src/ByteStream.cpp
@@ -496,6 +496,42 @@ void PacketLib::ByteStream::deleteStreamMemory()
         delete[] stream;
 }
 
+ByteStreamPtr PacketLib::ByteStream::getPaddedCopy(dword chunkSize, dword padSize)
+{
+	if(byteInTheStream % chunkSize != 0)
+		throw new PacketException("getPadCopy() error. Chunk size must be a divisor of ByteStream::size().");
+
+	dword nChunks = byteInTheStream / chunkSize;
+	dword newChunkSize = chunkSize + padSize;
+
+	ByteStreamPtr sPtr = ByteStreamPtr(new ByteStream(nChunks*(newChunkSize), bigendian));
+	byte* raw = sPtr->getStream();
+
+	for(dword i=0; i<nChunks; i++)
+		memcpy(raw+i*newChunkSize, stream+i*chunkSize, chunkSize);
+
+	return sPtr;
+}
+
+ByteStreamPtr PacketLib::ByteStream::getUnpaddedCopy(dword chunkSize, dword padSize)
+{
+	if(byteInTheStream % chunkSize != 0)
+		throw new PacketException("getUnpadCopy() error. Chunk size must be a divisor of ByteStream::size().");
+	if(chunkSize - padSize <= 0)
+		throw new PacketException("getUnpadCopy() error. Chunk size - pad size gives a value <= 0.");
+
+	dword nChunks = byteInTheStream / chunkSize;
+	dword newChunkSize = chunkSize - padSize;
+
+	ByteStreamPtr sPtr = ByteStreamPtr(new ByteStream(nChunks*(newChunkSize), bigendian));
+	byte* raw = sPtr->getStream();
+
+	for(dword i=0; i<nChunks; i++)
+		memcpy(raw+i*newChunkSize, stream+i*chunkSize, newChunkSize);
+
+	return sPtr;
+}
+
 void PacketLib::ByteStream::swapWord() {
 	dword dim =  byteInTheStream;
 	for(dword i = 0; i< dim; i+=2)