diff --git a/.gitignore b/.gitignore
index a15b9233fb1eaf13a108d3a161c2d72f9c52a510..47e3242aa7cbc3177f1176fe4b1fc4d47ddf4aa5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -78,3 +78,4 @@ __pycache__
 
 # IDEs
 .vscode
+.DS_Store
diff --git a/inc/Message.hpp b/inc/Message.hpp
index 327a9de4a3298fa0eb4bc344f0e5f1c1e5465aa3..f0b682b72ac88d037de60a3a8302de0edb523234 100644
--- a/inc/Message.hpp
+++ b/inc/Message.hpp
@@ -757,7 +757,14 @@ template <>
 inline void Message::append(const etl::istring& value) {
 	appendOctetString(value);
 }
-
+template <typename T>
+inline void Message::append(const T& value) {
+	append(std::underlying_type_t<T>(value));
+}
+template <typename T>
+inline T Message::read() {
+	return static_cast<T>(read<std::underlying_type_t<T>>());
+}
 template <>
 inline uint8_t Message::read() {
 	return readUint8();
diff --git a/test/MessageTests.cpp b/test/MessageTests.cpp
index f8d8c48856cfc75b6bf60174afea991f66bc999a..840d3e2eda157742842af5e106ef7b252afc1471 100644
--- a/test/MessageTests.cpp
+++ b/test/MessageTests.cpp
@@ -395,3 +395,64 @@ TEST_CASE("Packet sequence counter", "[message]") {
 		CHECK(message2.packetSequenceCount == 0);
 	}
 }
+
+TEST_CASE("Storing and retrieving enums in Messages") {
+	enum ActiveBus : uint8_t {
+		Main = 0x0,
+		Redundant = 0x1
+	};
+
+	SECTION("Using Enums in parameters") {
+		auto parameter1 = Parameter<ActiveBus>(Redundant);
+		auto parameter2 = Parameter<ActiveBus>(Main);
+		Message message;
+
+		parameter1.appendValueToMessage(message);
+		parameter2.setValueFromMessage(message);
+
+		CHECK(parameter1.getValue() == parameter2.getValue());
+	}
+
+	SECTION("Using Enums in variables") {
+		ActiveBus variable1 = Redundant;
+		ActiveBus variable2 = Main;
+		Message message;
+
+		message.append(variable1);
+		variable2 = message.read<ActiveBus>();
+
+		CHECK(variable1 == variable2);
+	}
+
+	SECTION("Another type of enum") {
+		enum Numbers : uint64_t {
+			First = 1577829600,
+			Second = 1667045679
+		};
+
+		auto parameter1 = Parameter<Numbers>(First);
+		auto parameter2 = Parameter<Numbers>(Second);
+		Message message;
+
+		parameter1.appendValueToMessage(message);
+		parameter2.setValueFromMessage(message);
+
+		CHECK(parameter1.getValue() == parameter2.getValue());
+	}
+
+		SECTION("Another type of enum") {
+		enum MemoryPartitionUsed : bool {
+			first = false,
+			second = true
+		};
+
+		auto parameter3 = Parameter<MemoryPartitionUsed>(first);
+		auto parameter4 = Parameter<MemoryPartitionUsed>(second);
+		Message message;
+
+		parameter3.appendValueToMessage(message);
+		parameter4.setValueFromMessage(message);
+
+		CHECK(parameter3.getValue() == parameter4.getValue());
+	}
+}