diff --git a/lib/mapObjectConstructors/CObjectClassesHandler.cpp b/lib/mapObjectConstructors/CObjectClassesHandler.cpp
index 18926795b..22265c0cb 100644
--- a/lib/mapObjectConstructors/CObjectClassesHandler.cpp
+++ b/lib/mapObjectConstructors/CObjectClassesHandler.cpp
@@ -57,6 +57,8 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER_CLASS("shrine", ShrineInstanceConstructor);
 	SET_HANDLER_CLASS("hillFort", HillFortInstanceConstructor);
 	SET_HANDLER_CLASS("shipyard", ShipyardInstanceConstructor);
+	SET_HANDLER_CLASS("monster", CreatureInstanceConstructor);
+	SET_HANDLER_CLASS("resource", ResourceInstanceConstructor);
 
 	SET_HANDLER_CLASS("static", CObstacleConstructor);
 	SET_HANDLER_CLASS("", CObstacleConstructor);
@@ -73,7 +75,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("artifact", CGArtifact);
 	SET_HANDLER("borderGate", CGBorderGate);
 	SET_HANDLER("borderGuard", CGBorderGuard);
-	SET_HANDLER("monster", CGCreature);
 	SET_HANDLER("denOfThieves", CGDenOfthieves);
 	SET_HANDLER("event", CGEvent);
 	SET_HANDLER("garrison", CGGarrison);
@@ -87,7 +88,6 @@ CObjectClassesHandler::CObjectClassesHandler()
 	SET_HANDLER("pandora", CGPandoraBox);
 	SET_HANDLER("prison", CGHeroInstance);
 	SET_HANDLER("questGuard", CGQuestGuard);
-	SET_HANDLER("resource", CGResource);
 	SET_HANDLER("scholar", CGScholar);
 	SET_HANDLER("seerHut", CGSeerHut);
 	SET_HANDLER("sign", CGSignBottle);
diff --git a/lib/mapObjectConstructors/CommonConstructors.cpp b/lib/mapObjectConstructors/CommonConstructors.cpp
index 4a21d8825..f762b4d46 100644
--- a/lib/mapObjectConstructors/CommonConstructors.cpp
+++ b/lib/mapObjectConstructors/CommonConstructors.cpp
@@ -20,6 +20,7 @@
 #include "../TerrainHandler.h"
 #include "../VCMI_Lib.h"
 
+#include "../mapObjects/CGCreature.h"
 #include "../mapObjects/CGHeroInstance.h"
 #include "../mapObjects/CGMarket.h"
 #include "../mapObjects/CGTownInstance.h"
@@ -35,6 +36,26 @@ bool CObstacleConstructor::isStaticObject()
 	return true;
 }
 
+bool CreatureInstanceConstructor::hasNameTextID() const
+{
+	return true;
+}
+
+std::string CreatureInstanceConstructor::getNameTextID() const
+{
+	return VLC->creatures()->getByIndex(getSubIndex())->getNamePluralTextID();
+}
+
+bool ResourceInstanceConstructor::hasNameTextID() const
+{
+	return true;
+}
+
+std::string ResourceInstanceConstructor::getNameTextID() const
+{
+	return TextIdentifier("core", "restypes", getSubIndex()).get();
+}
+
 void CTownInstanceConstructor::initTypeData(const JsonNode & input)
 {
 	VLC->modh->identifiers.requestIdentifier("faction", input["faction"], [&](si32 index)
@@ -86,6 +107,16 @@ void CTownInstanceConstructor::randomizeObject(CGTownInstance * object, CRandomG
 		object->appearance = templ;
 }
 
+bool CTownInstanceConstructor::hasNameTextID() const
+{
+	return true;
+}
+
+std::string CTownInstanceConstructor::getNameTextID() const
+{
+	return faction->getNameTextID();
+}
+
 void CHeroInstanceConstructor::initTypeData(const JsonNode & input)
 {
 	VLC->modh->identifiers.requestIdentifier(
@@ -133,6 +164,16 @@ void CHeroInstanceConstructor::randomizeObject(CGHeroInstance * object, CRandomG
 
 }
 
+bool CHeroInstanceConstructor::hasNameTextID() const
+{
+	return true;
+}
+
+std::string CHeroInstanceConstructor::getNameTextID() const
+{
+	return heroClass->getNameTextID();
+}
+
 void BoatInstanceConstructor::initTypeData(const JsonNode & input)
 {
 	layer = EPathfindingLayer::SAIL;
diff --git a/lib/mapObjectConstructors/CommonConstructors.h b/lib/mapObjectConstructors/CommonConstructors.h
index 4a58d699e..4a2d9481e 100644
--- a/lib/mapObjectConstructors/CommonConstructors.h
+++ b/lib/mapObjectConstructors/CommonConstructors.h
@@ -22,6 +22,7 @@ class CGTownInstance;
 class CGHeroInstance;
 class CGMarket;
 class CHeroClass;
+class CGCreature;
 class CBank;
 class CGBoat;
 class CFaction;
@@ -33,6 +34,20 @@ public:
 	bool isStaticObject() override;
 };
 
+class CreatureInstanceConstructor : public CDefaultObjectTypeHandler<CGCreature>
+{
+public:
+	bool hasNameTextID() const override;
+	std::string getNameTextID() const override;
+};
+
+class ResourceInstanceConstructor : public CDefaultObjectTypeHandler<CGResource>
+{
+public:
+	bool hasNameTextID() const override;
+	std::string getNameTextID() const override;
+};
+
 class CTownInstanceConstructor : public CDefaultObjectTypeHandler<CGTownInstance>
 {
 	JsonNode filtersJson;
@@ -48,6 +63,9 @@ public:
 	void randomizeObject(CGTownInstance * object, CRandomGenerator & rng) const override;
 	void afterLoadFinalization() override;
 
+	bool hasNameTextID() const override;
+	std::string getNameTextID() const override;
+
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		h & filtersJson;
@@ -72,6 +90,9 @@ public:
 	void randomizeObject(CGHeroInstance * object, CRandomGenerator & rng) const override;
 	void afterLoadFinalization() override;
 
+	bool hasNameTextID() const override;
+	std::string getNameTextID() const override;
+
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		h & filtersJson;
diff --git a/lib/registerTypes/RegisterTypes.h b/lib/registerTypes/RegisterTypes.h
index c23a60074..09a2d8f7f 100644
--- a/lib/registerTypes/RegisterTypes.h
+++ b/lib/registerTypes/RegisterTypes.h
@@ -107,6 +107,8 @@ void registerTypesMapObjectTypes(Serializer &s)
 	s.template registerType<AObjectTypeHandler, ShrineInstanceConstructor>();
 	s.template registerType<AObjectTypeHandler, ShipyardInstanceConstructor>();
 	s.template registerType<AObjectTypeHandler, HillFortInstanceConstructor>();
+	s.template registerType<AObjectTypeHandler, CreatureInstanceConstructor>();
+	s.template registerType<AObjectTypeHandler, ResourceInstanceConstructor>();
 
 #define REGISTER_GENERIC_HANDLER(TYPENAME) s.template registerType<AObjectTypeHandler, CDefaultObjectTypeHandler<TYPENAME> >()