diff --git a/src/craftitemdef.cpp b/src/craftitemdef.cpp
index 8d4cbea3c45ba6d876bb221620b6ceb9d58a6449..4461e38a73d59cac097ba5c2113214754ba40b64 100644
--- a/src/craftitemdef.cpp
+++ b/src/craftitemdef.cpp
@@ -88,12 +88,7 @@ class CCraftItemDefManager: public IWritableCraftItemDefManager
 	virtual const CraftItemDefinition* getCraftItemDefinition(const std::string &itemname_) const
 	{
 		// Convert name according to possible alias
-		std::string itemname = itemname_;
-		std::map<std::string, std::string>::const_iterator i;
-		i = m_aliases.find(itemname);
-		if(i != m_aliases.end()){
-			itemname = i->second;
-		}
+		std::string itemname = getAlias(itemname_);
 		// Get the definition
 		core::map<std::string, CraftItemDefinition*>::Node *n;
 		n = m_item_definitions.find(itemname);
@@ -108,6 +103,14 @@ class CCraftItemDefManager: public IWritableCraftItemDefManager
 			return "";
 		return def->imagename;
 	}
+	virtual std::string getAlias(const std::string &name) const
+	{
+		std::map<std::string, std::string>::const_iterator i;
+		i = m_aliases.find(name);
+		if(i != m_aliases.end())
+			return i->second;
+		return name;
+	}
 	virtual bool registerCraftItem(std::string itemname, const CraftItemDefinition &def)
 	{
 		infostream<<"registerCraftItem: registering CraftItem \""<<itemname<<"\""<<std::endl;
diff --git a/src/craftitemdef.h b/src/craftitemdef.h
index ee3d97aecb75c4c47bd8b9abb4963ea9dc4aaaf7..b5d4b9348c0d73501b372e09bcbbae14d7242b54 100644
--- a/src/craftitemdef.h
+++ b/src/craftitemdef.h
@@ -49,6 +49,7 @@ class ICraftItemDefManager
 	virtual ~ICraftItemDefManager(){}
 	virtual const CraftItemDefinition* getCraftItemDefinition(const std::string &itemname) const=0;
 	virtual std::string getImagename(const std::string &itemname) const =0;
+	virtual std::string getAlias(const std::string &name) const =0;
 
 	virtual void serialize(std::ostream &os)=0;
 };
diff --git a/src/inventory.cpp b/src/inventory.cpp
index a913430e6a060d2ebf028e7d7286405dac6d07e2..e9600ece5c66733c66a9e0535ebf1e0ec89b3e77 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -354,6 +354,15 @@ bool ToolItem::isKnown() const
 	CraftItem
 */
 
+CraftItem::CraftItem(IGameDef *gamedef, std::string subname, u16 count):
+	InventoryItem(gamedef, count)
+{
+	// Convert directly to the correct name through aliases.
+	// This is necessary because CraftItem callbacks are stored in
+	// Lua refenced by their correct name
+	m_subname = gamedef->cidef()->getAlias(subname);
+}
+
 #ifndef SERVER
 video::ITexture * CraftItem::getImage() const
 {
diff --git a/src/inventory.h b/src/inventory.h
index 3f3c5435b4cc5e10da98c1c6b93026209dc6e519..57af376501b4d5fec503518bf815cf0afaa7cc19 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -238,11 +238,7 @@ class MaterialItem : public InventoryItem
 class CraftItem : public InventoryItem
 {
 public:
-	CraftItem(IGameDef *gamedef, std::string subname, u16 count):
-		InventoryItem(gamedef, count)
-	{
-		m_subname = subname;
-	}
+	CraftItem(IGameDef *gamedef, std::string subname, u16 count);
 	/*
 		Implementation interface
 	*/