diff --git a/inc/Message.hpp b/inc/Message.hpp
index ce2c59444540b6becd2955b73842abf58e723cbf..6ccef49af55ff352e780df7c238c3862f726d1d9 100644
--- a/inc/Message.hpp
+++ b/inc/Message.hpp
@@ -78,6 +78,16 @@ public:
 	 */
 	void appendString(uint8_t size, const char *value);
 
+	/**
+	 * Appends \p size bytes to the message
+	 *
+	 * @param size The amount of byte to append
+	 * @param value An array containing at least \p size bytes
+	 * @todo See if more than uint8_t strings will be supported
+	 * @todo Is uint16_t size too much or not enough? It has to be defined
+	 */
+	void appendString(uint16_t size, uint8_t *value);
+
 	/**
 	 * Reads the next \p numBits bits from the the message in a big-endian format
 	 * @param numBits
@@ -108,6 +118,15 @@ public:
 	 */
 	void readString(char *string, uint8_t size);
 
+	/**
+	* Reads the next \p size bytes from the message, and stores them into the allocated \p string
+	*
+	* NOTE: We assume that \p string is already allocated, and its size is at least
+	* ECSS_MAX_STRING_SIZE. This function does placs a \0 at the end of the created string
+	* @todo Is uint16_t size too much or not enough? It has to be defined
+	*/
+	void readString(uint8_t *value, uint16_t size);
+
 public:
 	Message(uint8_t serviceType, uint8_t messageType, PacketType packetType,
 	        uint16_t applicationId);
@@ -243,11 +262,8 @@ public:
 	 * PTC = 7, PFC = 0
 	 */
 	void appendOctetString(uint16_t size, uint8_t *byteString) {
-		assert(size < ECSS_MAX_STRING_SIZE);
-
-		for (std::size_t i = 0; i < size; i++) {
-			appendByte(byteString[i]);
-		}
+		appendUint16(size);
+		appendString(size, byteString);
 	}
 
 	/**
@@ -385,12 +401,8 @@ public:
 	 *
 	 * PTC = 7, PFC = 0
 	 */
-	void readOctetString(uint8_t *byteString, uint16_t size) {
-		assert(size < ECSS_MAX_STRING_SIZE);
-
-		for (std::size_t i = 0; i < size; i++) {
-			byteString[i] = readByte();
-		}
+	void readOctetString(uint16_t size, uint8_t *byteString) {
+		readString(byteString, size);
 	}
 
 	/**
diff --git a/src/Message.cpp b/src/Message.cpp
index 292ec6953655cc1bb6efb00b792eaf094fd583fc..0e95ad323ef0e8b8ea4b53cf1b09c35ee734c398 100644
--- a/src/Message.cpp
+++ b/src/Message.cpp
@@ -74,6 +74,15 @@ void Message::appendString(uint8_t size, const char *value) {
 	dataSize += size;
 }
 
+void Message::appendString(uint16_t size, uint8_t *value) {
+	assert(dataSize + size <= ECSS_MAX_MESSAGE_SIZE);
+	assert(size < ECSS_MAX_STRING_SIZE);
+
+	memcpy(data + dataSize, value, size);
+
+	dataSize += size;
+}
+
 uint16_t Message::readBits(uint8_t numBits) {
 	assert(numBits <= 16);
 	// TODO: Add assert
@@ -135,7 +144,16 @@ void Message::readString(char *string, uint8_t size) {
 	assert(size < ECSS_MAX_STRING_SIZE);
 
 	memcpy(string, data + readPosition, size);
-	string[size] = '\0';
+	string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed
+
+	readPosition += size;
+}
+
+void Message::readString(uint8_t *string, uint16_t size) {
+	assert(readPosition + size <= ECSS_MAX_MESSAGE_SIZE);
+	assert(size < ECSS_MAX_STRING_SIZE);
+
+	memcpy(string, data + readPosition, size);
 
 	readPosition += size;
 }
diff --git a/src/Services/MemoryManagementService.cpp b/src/Services/MemoryManagementService.cpp
index 72c086a5235e66cb800df007d17b73dbdd046849..5ba62e649188647ef3c6ae0fdae03e8c457bab97 100644
--- a/src/Services/MemoryManagementService.cpp
+++ b/src/Services/MemoryManagementService.cpp
@@ -108,7 +108,6 @@ void MemoryManagementService::RawDataMemoryManagement::dumpRawData(Message &requ
 
 		// This part is repeated N-times (N = iteration count)
 		report.appendUint64(startAddress); // Start address
-		report.appendUint16(readLength); // Data read length
 		report.appendOctetString(readLength, readData); // Save the read data
 	}
 	// todo: implement and append the checksum part of the reporting packet
diff --git a/src/main.cpp b/src/main.cpp
index d1a628e2f096860828513438193cf7579d694aba..f9bf03e44f053f43426d2412914b80ad7aabde49 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -56,10 +56,8 @@ int main() {
 	rcvPack.appendEnum8(MemoryManagementService::MemoryID::RAM); // Memory ID
 	rcvPack.appendUint16(2); // Iteration count
 	rcvPack.appendUint64(reinterpret_cast<uint64_t >(pStr)); // Start address
-	rcvPack.appendUint16(2); // Data length to append
 	rcvPack.appendOctetString(2, data);
 	rcvPack.appendUint64(reinterpret_cast<uint64_t >(pStr + 1)); // Start address
-	rcvPack.appendUint16(1);
 	rcvPack.appendOctetString(1, data);
 	memMangService.rawDataMemorySubservice.loadRawData(rcvPack);
 
diff --git a/test/Services/MemoryManagementService.cpp b/test/Services/MemoryManagementService.cpp
index 824866cb0891f0a3516495e67e993e1ffca7766e..984c51f958e6c860e086a5b89ec5831a6600f641 100644
--- a/test/Services/MemoryManagementService.cpp
+++ b/test/Services/MemoryManagementService.cpp
@@ -17,10 +17,8 @@ TEST_CASE("TM[6,2]", "[service][st06]") {
 	receivedPacket.appendEnum8(MemoryManagementService::MemoryID::RAM); // Memory ID
 	receivedPacket.appendUint16(2); // Iteration count
 	receivedPacket.appendUint64(reinterpret_cast<uint64_t >(pStr)); // Start address
-	receivedPacket.appendUint16(2); // Data length to append
 	receivedPacket.appendOctetString(2, data);
 	receivedPacket.appendUint64(reinterpret_cast<uint64_t >(pStr + 2)); // Start address
-	receivedPacket.appendUint16(1);
 	receivedPacket.appendOctetString(1, data);
 	memMangService.rawDataMemorySubservice.loadRawData(receivedPacket);
 
@@ -62,7 +60,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") {
 	CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_1));
 	readSize = sizeof(testString_1)/ sizeof(testString_1[0]);
 	CHECK(response.readUint16() == readSize);
-	response.readOctetString(checkString, readSize);
+	response.readOctetString(readSize, checkString);
 	CHECK(checkString[0] == 'F');
 	CHECK(checkString[1] == 'S');
 	CHECK(checkString[2] == 't');
@@ -73,7 +71,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") {
 	CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_2));
 	readSize = sizeof(testString_2)/ sizeof(testString_2[0]);
 	CHECK(response.readUint16() == readSize);
-	response.readOctetString(checkString, readSize);
+	response.readOctetString(readSize, checkString);
 	CHECK(checkString[0] == 'S');
 	CHECK(checkString[1] == 'e');
 	CHECK(checkString[2] == 'c');
@@ -86,7 +84,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") {
 	CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_3));
 	readSize = sizeof(testString_3)/ sizeof(testString_3[0]);
 	CHECK(response.readUint16() == readSize);
-	response.readOctetString(checkString, readSize);
+	response.readOctetString(readSize, checkString);
 	CHECK(checkString[0] == 5);
 	CHECK(checkString[1] == 8);
 }