diff --git a/inc/Message.hpp b/inc/Message.hpp
index a303f84b7aef120dc3e0eefbf8c13c08b991754f..28ba738b09ab3babeb2173514da8704d892a5301 100644
--- a/inc/Message.hpp
+++ b/inc/Message.hpp
@@ -335,6 +335,8 @@ public:
 	 * Fetches an 4-byte single-precision floating point number from the current position in the
 	 * message
 	 *
+	 * @todo Check if endianness matters for this
+	 *
 	 * PTC = 5, PFC = 1
 	 */
 	float readFloat() {
diff --git a/tests/Message.cpp b/tests/Message.cpp
index 7fc23a77760588297436587b573bc1a4cc752ae6..f7698e3b93458474a159079174e75c4a89956f89 100644
--- a/tests/Message.cpp
+++ b/tests/Message.cpp
@@ -1,7 +1,7 @@
 #include <catch2/catch.hpp>
 #include <Message.hpp>
 
-TEST_CASE("1: Message is usable", "[message]") {
+TEST_CASE("Message is usable", "[message]") {
 	Message message(5, 17, Message::TC, 3);
 
 	REQUIRE(message.serviceType == 5);
@@ -15,7 +15,7 @@ TEST_CASE("1: Message is usable", "[message]") {
 	REQUIRE(message.readByte() == 250);
 }
 
-TEST_CASE("2: Bit manipulations", "[message]") {
+TEST_CASE("Bit manipulations", "[message]") {
 	Message message(0, 0, Message::TC, 0);
 
 	message.appendBits(10, 0x357);
@@ -41,3 +41,131 @@ TEST_CASE("2: Bit manipulations", "[message]") {
 	CHECK(message.readUint32() == 0xd5ecf82d);
 	CHECK(message.readBits(8) == 0xff);
 }
+
+TEST_CASE("Requirement 5.3.1", "[message][ecss]") {
+	SECTION("5.3.1a") {
+
+	}
+
+	SECTION("5.3.1b") {
+		REQUIRE(sizeof(Message::serviceType) == 1);
+	}
+
+	SECTION("5.3.1c") {
+		// TODO: Unimplemented
+	}
+
+	SECTION("5.3.1d") {
+		// TODO: Unimplemented
+	}
+}
+
+TEST_CASE("Requirement 7.3.2 (Boolean)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendBoolean(false);
+	message.appendBoolean(true);
+
+	REQUIRE(message.dataSize == 2);
+
+	CHECK(!message.readBoolean());
+	CHECK(message.readBoolean());
+}
+
+TEST_CASE("Requirement 7.3.3 (Enumerated)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendEnum8(230);
+	message.appendEnum16(15933);
+	message.appendEnum32(2000001);
+	message.appendEnumerated(12, 2052);
+	message.appendEnumerated(4, 10);
+
+	REQUIRE(message.dataSize == 1 + 2 + 4 + 2);
+
+	CHECK(message.readEnum8() == 230);
+	CHECK(message.readEnum16() == 15933);
+	CHECK(message.readEnum32() == 2000001);
+	CHECK(message.readEnumerated(12) == 2052);
+	CHECK(message.readEnumerated(4) == 10);
+}
+
+TEST_CASE("Requirement 7.3.4 (Unsigned integer)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendUint8(230);
+	message.appendUint16(15933);
+	message.appendUint32(2000001);
+
+	REQUIRE(message.dataSize == 1 + 2 + 4);
+
+	CHECK(message.readUint8() == 230);
+	CHECK(message.readUint16() == 15933);
+	CHECK(message.readUint32() == 2000001);
+
+	SECTION("7.4.3") {
+		// Make sure the endianness of the message data is correct
+		// As per the ECSS standard, stored data should be big-endian. However, ARM and x86
+		// processors store data in little endian format. As a result, special care needs to be
+		// taken for compliance.
+		CHECK(message.data[1] == 0x3e);
+		CHECK(message.data[2] == 0x3d);
+	}
+}
+
+TEST_CASE("Requirement 7.3.5 (Signed integer)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendSint8(-16);
+	message.appendSint16(-7009);
+	message.appendSint32(-2000001);
+	message.appendSint32(15839011);
+
+	REQUIRE(message.dataSize == 1 + 2 + 4 + 4);
+
+	CHECK(message.readSint8() == -16);
+	CHECK(message.readSint16() == -7009);
+	CHECK(message.readSint32() == -2000001);
+	CHECK(message.readSint32() == 15839011);
+
+	SECTION("7.4.3") {
+		// Make sure the endianness of the message data is correct
+		// As per the ECSS standard, stored data should be big-endian. However, ARM and x86
+		// processors store data in little endian format. As a result, special care needs to be
+		// taken for compliance.
+		CHECK(message.data[1] == 0xe4);
+		CHECK(message.data[2] == 0x9f);
+	}
+}
+
+TEST_CASE("Requirement 7.3.6 (Real)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendFloat(7.209f);
+	message.appendFloat(-9003.53135f);
+
+	REQUIRE(message.dataSize == 8);
+
+	CHECK(message.readFloat() == 7.209f);
+	CHECK(message.readFloat() == -9003.53135f);
+}
+
+TEST_CASE("Requirement 7.3.8 (Octet-string)", "[message][ecss]") {
+	Message message(0, 0, Message::TC, 0);
+
+	message.appendString(4, "test");
+
+	REQUIRE(message.dataSize == 4);
+
+	char string[5];
+	message.readString(string, 4);
+	CHECK_THAT(string, Catch::Matchers::Equals("test"));
+}
+
+TEST_CASE("Requirement 7.3.13 (Packet)", "[message][ecss]") {
+	Message telemetry(0, 0, Message::TM, 0);
+	Message telecommand(0, 0, Message::TC, 0);
+
+	CHECK(static_cast<int>(telemetry.packetType) == 0);
+	CHECK(static_cast<int>(telecommand.packetType) == 1);
+}
diff --git a/tests/tests.cpp b/tests/tests.cpp
index 58d828729fe64ff6cebd0a4cb77ca0c377ef82ce..4ed06df1f7bea8cc18ee161389b9c3e2741b08a0 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -1,3 +1,2 @@
 #define CATCH_CONFIG_MAIN
 #include <catch2/catch.hpp>
-