diff --git a/inc/Services/LargePacketTransferService.hpp b/inc/Services/LargePacketTransferService.hpp
index 0e8746eb732deca05d855fc297f929cbd2a766a6..e3219472881dfb84e59541aafa3d7c3c48725511 100644
--- a/inc/Services/LargePacketTransferService.hpp
+++ b/inc/Services/LargePacketTransferService.hpp
@@ -69,6 +69,13 @@ public:
 	 * @param string This will change when these function will be modified
 	 */
 	String<ECSS_MAX_FIXED_OCTET_STRING_SIZE> lastUplinkPart(const String<ECSS_MAX_FIXED_OCTET_STRING_SIZE>& string);
+
+	/**
+	 * Function that splits large messages
+	 * @param Message that is exceeds the standards and has to be split down
+	 * @param largeMessageTransactionIdentifier that is a value we assign to this splitting of the large message
+	 */
+	void split(Message& message, uint16_t largeMessageTransactionIdentifier);
 };
 
 #endif // ECSS_SERVICES_LARGEPACKETTRANSFERSERVICE_HPP
diff --git a/src/Services/LargePacketTransferService.cpp b/src/Services/LargePacketTransferService.cpp
index 06fdad2604656bcd34feba03808e5c644b05c584..15b0e3c3609c41f242a6f6830f570b5598a30f9a 100644
--- a/src/Services/LargePacketTransferService.cpp
+++ b/src/Services/LargePacketTransferService.cpp
@@ -53,3 +53,38 @@ LargePacketTransferService::lastUplinkPart(const String<ECSS_MAX_FIXED_OCTET_STR
 	// TC[13, 11]
 	return string;
 }
+
+void LargePacketTransferService::split(Message& message, uint16_t largeMessageTransactionIdentifier) {
+	//TODO: Should this be uint32?
+	uint16_t size = message.dataSize;
+	uint16_t positionCounter = 0;
+	uint16_t parts = (size/ECSS_MAX_FIXED_OCTET_STRING_SIZE) + 1;
+	String<ECSS_MAX_FIXED_OCTET_STRING_SIZE> stringPart("");
+	uint8_t dataPart[ECSS_MAX_FIXED_OCTET_STRING_SIZE];
+
+	for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){
+		dataPart[i] = message.data[positionCounter];
+		positionCounter++;
+	}
+	stringPart = dataPart;
+	firstDownlinkPartReport(largeMessageTransactionIdentifier, 0, stringPart);
+
+	for (uint16_t part = 1; part < (parts - 1u); part++){
+		for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){
+			dataPart[i] = message.data[positionCounter];
+			positionCounter++;
+		}
+		stringPart = dataPart;
+		intermediateDownlinkPartReport(largeMessageTransactionIdentifier, part, stringPart);
+	}
+
+	for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){
+		if (message.dataSize == positionCounter){
+			dataPart[i] = 0; // To prevent from filling the rest of the String with garbage info
+		}
+		dataPart[i] = message.data[positionCounter];
+		positionCounter++;
+	}
+	stringPart = dataPart;
+	lastDownlinkPartReport(largeMessageTransactionIdentifier, (parts - 1u), stringPart);
+}
diff --git a/test/Services/LargePacketTransferService.cpp b/test/Services/LargePacketTransferService.cpp
index 1171f2f302ca19a16b1e52f7009e3cd1ac2fb622..4d75409acdf09ea4a9a41c973c31423b77c2b575 100644
--- a/test/Services/LargePacketTransferService.cpp
+++ b/test/Services/LargePacketTransferService.cpp
@@ -4,6 +4,7 @@
 #include "ServiceTests.hpp"
 #include <cstring>
 #include <etl/String.hpp>
+#include "ECSS_Definitions.hpp"
 
 LargePacketTransferService& lPT = Services.largePacketTransferService;
 
@@ -17,7 +18,7 @@ TEST_CASE("First Downlink Part Report TM[13,1]", "[service][st13]") {
 	CHECK(report.readUint16() == 1);
 	CHECK(report.readUint16() == 1);
 	uint8_t string2[ECSS_MAX_FIXED_OCTET_STRING_SIZE];
-	printf("%d", report.readOctetString(string2));
+	report.readOctetString(string2);
 	auto a = String<ECSS_MAX_FIXED_OCTET_STRING_SIZE>(string2, 8);
 	CHECK(string.compare(a) == 0);
 }
@@ -66,3 +67,24 @@ TEST_CASE("Last Uplink Part TC[13,11]", "[service][st13]") {
 	String<256> string = "12345678";
 	CHECK(string.compare(lPT.lastUplinkPart(string)) == 0);
 }
+
+TEST_CASE("Split function", "[no][service]") {
+	Message message(13, 0, Message::TC, 0);
+	for (uint16_t i = 0; i < 800; i++){
+		message.appendUint8(UINT8_MAX);
+	}
+	uint16_t largeMessageTransactionIdentifier = 1;
+	lPT.split(message, largeMessageTransactionIdentifier);
+	Message message5(13, 0, Message::TC, 0);
+
+	for (int i = 0; i < 4; i++){
+		uint16_t partSequenceNumber = i;
+		CHECK(largeMessageTransactionIdentifier == ServiceTests::get(i).readUint16());
+		CHECK(partSequenceNumber == ServiceTests::get(i).readUint16());
+		CHECK(ECSS_MAX_FIXED_OCTET_STRING_SIZE == ServiceTests::get(i).readUint16());
+		for (int j = 0; j < 256; j++){
+			message5.appendUint8(ServiceTests::get(i).readUint8());
+		}
+	}
+	CHECK(message == message5);
+}