diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua
index be158c119b24ccdf5df6e27fc4fefaf412fb7e5a..a66bf33d0e3935b58f70296bf7ea25f9556c5610 100644
--- a/builtin/game/item_entity.lua
+++ b/builtin/game/item_entity.lua
@@ -31,6 +31,7 @@ core.register_entity(":__builtin:item", {
 		spritediv = {x = 1, y = 1},
 		initial_sprite_basepos = {x = 0, y = 0},
 		is_visible = false,
+		infotext = "",
 	},
 
 	itemstring = '',
@@ -50,6 +51,7 @@ core.register_entity(":__builtin:item", {
 		local c = s
 		local itemtable = stack:to_table()
 		local itemname = nil
+		local description = ""
 		if itemtable then
 			itemname = stack:to_table().name
 		end
@@ -58,6 +60,7 @@ core.register_entity(":__builtin:item", {
 		if core.registered_items[itemname] then
 			item_texture = core.registered_items[itemname].inventory_image
 			item_type = core.registered_items[itemname].type
+			description = core.registered_items[itemname].description
 		end
 		local prop = {
 			is_visible = true,
@@ -66,6 +69,7 @@ core.register_entity(":__builtin:item", {
 			visual_size = {x = s, y = s},
 			collisionbox = {-c, -c, -c, c, c, c},
 			automatic_rotate = math.pi * 0.5,
+			infotext = description,
 		}
 		self.object:set_properties(prop)
 	end,
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 0ff8f031d977fc8d43eef6b6f8a99c36dd148894..c2d5183d7421110e53ea3879ef50d6bbaeb5e14a 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -3241,6 +3241,7 @@ Definition tables
         backface_culling = true, -- false to disable backface_culling for model
         nametag = "", -- by default empty, for players their name is shown if empty
         nametag_color = <color>, -- sets color of nametag as ColorSpec
+        infotext = "", -- by default empty, text to be shown when pointed at object
     }
 
 ### Entity definition (`register_entity`)
diff --git a/src/content_cao.h b/src/content_cao.h
index d9145c5f12bc6042e022a5bff6dc1aa49dd7c16b..abb242aa4d5906e3a6654f3b189cd1d47bc1085d 100644
--- a/src/content_cao.h
+++ b/src/content_cao.h
@@ -201,6 +201,11 @@ class GenericCAO : public ClientActiveObject
 			float time_from_last_punch=1000000);
 
 	std::string debugInfoText();
+	
+	std::string infoText()
+	{
+		return m_prop.infotext;
+	}
 };
 
 
diff --git a/src/game.cpp b/src/game.cpp
index 92d919931fd3346fce62b905cb36b431ee742e74..3902c50bba3d4e863c5e025f428a5968c5cdfaee 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -3732,8 +3732,11 @@ void Game::handlePointingAtObject(GameRunData *runData,
 {
 	infotext = utf8_to_wide(runData->selected_object->infoText());
 
-	if (infotext == L"" && show_debug) {
-		infotext = utf8_to_wide(runData->selected_object->debugInfoText());
+	if (show_debug) {
+		if (infotext != L"") {
+			infotext += L"\n";
+		}
+		infotext += utf8_to_wide(runData->selected_object->debugInfoText());
 	}
 
 	if (input->getLeftState()) {
diff --git a/src/object_properties.cpp b/src/object_properties.cpp
index abd1bbd0929361619ff264ee4ca90aaecd5a017f..89ca26274a805b239e20431e0b45442dd92f7572 100644
--- a/src/object_properties.cpp
+++ b/src/object_properties.cpp
@@ -118,6 +118,7 @@ void ObjectProperties::serialize(std::ostream &os) const
 	os << serializeString(nametag);
 	writeARGB8(os, nametag_color);
 	writeF1000(os, automatic_face_movement_max_rotation_per_sec);
+	os << serializeString(infotext);
 
 	// Add stuff only at the bottom.
 	// Never remove anything, because we don't want new versions of this
@@ -159,6 +160,7 @@ void ObjectProperties::deSerialize(std::istream &is)
 			nametag = deSerializeString(is);
 			nametag_color = readARGB8(is);
 			automatic_face_movement_max_rotation_per_sec = readF1000(is);
+			infotext = deSerializeString(is);
 		}catch(SerializationError &e){}
 	}
 	else
diff --git a/src/object_properties.h b/src/object_properties.h
index 47698cff7620eb53cb70c55358ef08b36976a503..02ec9d1f79b741fa972d32ee5c8f835d5b7f3540 100644
--- a/src/object_properties.h
+++ b/src/object_properties.h
@@ -51,6 +51,7 @@ struct ObjectProperties
 	std::string nametag;
 	video::SColor nametag_color;
 	f32 automatic_face_movement_max_rotation_per_sec;
+	std::string infotext;
 
 	ObjectProperties();
 	std::string dump();
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 62de2c968147e10f9169a78ca71a5121c4d9700b..275b22bb8eff802612bce8b6ec24ef32d5c3db42 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -216,6 +216,7 @@ void read_object_properties(lua_State *L, int index,
 		prop->automatic_face_movement_max_rotation_per_sec = luaL_checknumber(L, -1);
 	}
 	lua_pop(L, 1);
+	getstringfield(L, -1, "infotext", prop->infotext);
 }
 
 /******************************************************************************/
@@ -282,6 +283,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
 	lua_setfield(L, -2, "nametag_color");
 	lua_pushnumber(L, prop->automatic_face_movement_max_rotation_per_sec);
 	lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec");
+	lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size());
+	lua_setfield(L, -2, "infotext");
 }
 
 /******************************************************************************/