diff --git a/services/tunnelbroker/src/Database/DatabaseEntitiesTools.h b/services/tunnelbroker/src/Database/DatabaseEntitiesTools.h
--- a/services/tunnelbroker/src/Database/DatabaseEntitiesTools.h
+++ b/services/tunnelbroker/src/Database/DatabaseEntitiesTools.h
@@ -13,19 +13,10 @@
 namespace database {
 
 template <typename T> std::shared_ptr<T> createItemByType() {
-  throw std::runtime_error("invalid Item type");
+  static_assert(std::is_base_of<Item, T>::value, "T must inherit from Item");
+  return std::make_shared<T>();
 }
 
-template <>
-std::shared_ptr<DeviceSessionItem> createItemByType<DeviceSessionItem>();
-
-template <>
-std::shared_ptr<SessionSignItem> createItemByType<SessionSignItem>();
-
-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/src/Database/DatabaseEntitiesTools.cpp b/services/tunnelbroker/src/Database/DatabaseEntitiesTools.cpp
deleted file mode 100644
--- a/services/tunnelbroker/src/Database/DatabaseEntitiesTools.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "DatabaseEntitiesTools.h"
-
-namespace comm {
-namespace network {
-namespace database {
-
-template <>
-std::shared_ptr<DeviceSessionItem> createItemByType<DeviceSessionItem>() {
-  return std::make_shared<DeviceSessionItem>();
-}
-
-template <>
-std::shared_ptr<SessionSignItem> createItemByType<SessionSignItem>() {
-  return std::make_shared<SessionSignItem>();
-}
-
-template <> std::shared_ptr<PublicKeyItem> createItemByType<PublicKeyItem>() {
-  return std::make_shared<PublicKeyItem>();
-}
-
-template <> std::shared_ptr<MessageItem> createItemByType<MessageItem>() {
-  return std::make_shared<MessageItem>();
-}
-
-} // namespace database
-} // namespace network
-} // namespace comm