diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h
--- a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h
+++ b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h
@@ -2,6 +2,7 @@
 
 #include "DeviceSessionItem.h"
 #include "Item.h"
+#include "MessageItem.h"
 #include "PublicKeyItem.h"
 #include "SessionSignItem.h"
 
@@ -23,6 +24,8 @@
 
 template <> std::shared_ptr<PublicKeyItem> createItemByType<PublicKeyItem>();
 
+template <> std::shared_ptr<MessageItem> createItemByType<MessageItem>();
+
 } // namespace database
 } // namespace network
 } // namespace comm
diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp
--- a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp
+++ b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp
@@ -18,6 +18,10 @@
   return std::make_shared<PublicKeyItem>();
 }
 
+template <> std::shared_ptr<MessageItem> createItemByType<MessageItem>() {
+  return std::make_shared<MessageItem>();
+}
+
 } // namespace database
 } // namespace network
 } // namespace comm
diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "Item.h"
+
+#include <string>
+
+namespace comm {
+namespace network {
+namespace database {
+
+class MessageItem : public Item {
+  std::string messageID;
+  std::string fromDeviceID;
+  std::string toDeviceID;
+  std::string payload;
+  std::string blobHashes;
+
+  void validate() const override;
+
+public:
+  static const std::string FIELD_MESSAGE_ID;
+  static const std::string FIELD_FROM_DEVICE_ID;
+  static const std::string FIELD_TO_DEVICE_ID;
+  static const std::string FIELD_PAYLOAD;
+  static const std::string FIELD_BLOB_HASHES;
+
+  std::string getPrimaryKey() const override;
+  std::string getTableName() const override;
+  std::string getMessageID() const;
+  std::string getFromDeviceID() const;
+  std::string getToDeviceID() const;
+  std::string getPayload() const;
+  std::string getBlobHashes() const;
+
+  MessageItem() {
+  }
+  MessageItem(
+      const std::string messageID,
+      const std::string fromDeviceID,
+      const std::string toDeviceID,
+      const std::string payload,
+      const std::string blobHashes);
+  MessageItem(const AttributeValues &itemFromDB);
+  void assignItemFromDatabase(const AttributeValues &itemFromDB) override;
+};
+
+} // namespace database
+} // namespace network
+} // namespace comm
diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp
new file mode 100644
--- /dev/null
+++ b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp
@@ -0,0 +1,90 @@
+#include "MessageItem.h"
+#include "ConfigManager.h"
+
+namespace comm {
+namespace network {
+namespace database {
+
+const std::string FIELD_MESSAGE_ID = "MessageID";
+const std::string FIELD_FROM_DEVICE_ID = "FromDeviceID";
+const std::string FIELD_TO_DEVICE_ID = "ToDeviceID";
+const std::string FIELD_PAYLOAD = "Payload";
+const std::string FIELD_BLOB_HASHES = "BlobHashes";
+
+MessageItem::MessageItem(
+    const std::string messageID,
+    const std::string fromDeviceID,
+    const std::string toDeviceID,
+    const std::string payload,
+    const std::string blobHashes)
+    : messageID(messageID),
+      fromDeviceID(fromDeviceID),
+      toDeviceID(toDeviceID),
+      payload(payload),
+      blobHashes(blobHashes) {
+  this->validate();
+}
+
+MessageItem::MessageItem(const AttributeValues &itemFromDB) {
+  this->assignItemFromDatabase(itemFromDB);
+}
+
+void MessageItem::validate() const {
+  if (!this->messageID.size()) {
+    throw std::runtime_error("Error: messageID is empty");
+  }
+  if (!this->fromDeviceID.size()) {
+    throw std::runtime_error("Error: fromDeviceID is empty");
+  }
+  if (!this->toDeviceID.size()) {
+    throw std::runtime_error("Error: toDeviceID is empty");
+  }
+}
+
+void MessageItem::assignItemFromDatabase(const AttributeValues &itemFromDB) {
+  try {
+    this->messageID = itemFromDB.at(MessageItem::FIELD_MESSAGE_ID).GetS();
+    this->fromDeviceID =
+        itemFromDB.at(MessageItem::FIELD_FROM_DEVICE_ID).GetS();
+    this->toDeviceID = itemFromDB.at(MessageItem::FIELD_TO_DEVICE_ID).GetS();
+    this->payload = itemFromDB.at(MessageItem::FIELD_PAYLOAD).GetS();
+    this->blobHashes = itemFromDB.at(MessageItem::FIELD_BLOB_HASHES).GetS();
+  } catch (const std::exception &e) {
+    throw std::runtime_error(
+        "Got an exception at MessageItem: " + std::string(e.what()));
+  }
+  this->validate();
+}
+
+std::string MessageItem::getTableName() const {
+  return config::ConfigManager::getInstance().getParameter(
+      config::ConfigManager::OPTION_DYNAMODB_MESSAGES_TABLE);
+}
+
+std::string MessageItem::getPrimaryKey() const {
+  return MessageItem::FIELD_MESSAGE_ID;
+}
+
+std::string MessageItem::getMessageID() const {
+  return this->messageID;
+}
+
+std::string MessageItem::getFromDeviceID() const {
+  return this->fromDeviceID;
+}
+
+std::string MessageItem::getToDeviceID() const {
+  return this->toDeviceID;
+}
+
+std::string MessageItem::getPayload() const {
+  return this->payload;
+}
+
+std::string MessageItem::getBlobHashes() const {
+  return this->blobHashes;
+}
+
+} // namespace database
+} // namespace network
+} // namespace comm