diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 0600689e4b242c8124c93b8a85980e3a247ee24f..ad48f95fbb3d00d2c7d1b6367d7121f4218c1bf4 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -717,7 +717,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	m_attachment_sent(false),
 	// public
 	m_moved(false),
-	m_inventory_not_sent(false),
 	m_physics_override_speed(1),
 	m_physics_override_jump(1),
 	m_physics_override_gravity(1),
@@ -1162,11 +1161,6 @@ InventoryLocation PlayerSAO::getInventoryLocation() const
 	return loc;
 }
 
-void PlayerSAO::setInventoryModified()
-{
-	m_inventory_not_sent = true;
-}
-
 std::string PlayerSAO::getWieldList() const
 {
 	return "main";
diff --git a/src/content_sao.h b/src/content_sao.h
index 6b7304944d30cd83ecd4b882a50e295ece7270f2..a9302915490bf27946ceb277ca6048dd04ae48c0 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -205,7 +205,6 @@ class PlayerSAO : public ServerActiveObject
 	Inventory* getInventory();
 	const Inventory* getInventory() const;
 	InventoryLocation getInventoryLocation() const;
-	void setInventoryModified();
 	std::string getWieldList() const;
 	int getWieldIndex() const;
 	void setWieldIndex(int i);
@@ -317,7 +316,6 @@ class PlayerSAO : public ServerActiveObject
 public:
 	// Some flags used by Server
 	bool m_moved;
-	bool m_inventory_not_sent;
 
 	float m_physics_override_speed;
 	float m_physics_override_jump;
diff --git a/src/network/packethandlers/server.cpp b/src/network/packethandlers/server.cpp
index 2deede0ca3f6e6ea29f06e58d25bc25f50503a5e..9dd1c95dd2536f8e8f6be7d01a7a07e2bfd8de84 100644
--- a/src/network/packethandlers/server.cpp
+++ b/src/network/packethandlers/server.cpp
@@ -1390,7 +1390,9 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
 			// Placement was handled in lua
 
 			// Apply returned ItemStack
-			playersao->setWieldedItem(item);
+			if (playersao->setWieldedItem(item)) {
+				SendInventory(pkt->getPeerId());
+			}
 		}
 
 		// If item has node placement prediction, always send the
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index 0bc6c0bbcdb97083e5919571061983ee6ec5fd7e..0f3848aace75f2bf22c53e2d962be0040b1d5369 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -355,6 +355,9 @@ int ObjectRef::l_set_wielded_item(lua_State *L)
 	// Do it
 	ItemStack item = read_item(L, 2, getServer(L));
 	bool success = co->setWieldedItem(item);
+	if (success && co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+		getServer(L)->SendInventory(((PlayerSAO*)co)->getPeerID());
+	}
 	lua_pushboolean(L, success);
 	return 1;
 }
diff --git a/src/server.cpp b/src/server.cpp
index cafeb951dcf298bb68edf961c002118830d96c0f..0bb91d7584cb3557904cc1eee63c6c6143af284f 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -609,14 +609,6 @@ void Server::AsyncRunStep(bool initial_step)
 				SendMovePlayer(*i);
 				playersao->m_moved = false;
 			}
-
-			/*
-				Send player inventories if necessary
-			*/
-			if(playersao->m_inventory_not_sent) {
-				UpdateCrafting(*i);
-				SendInventory(*i);
-			}
 		}
 	}
 
@@ -1164,7 +1156,6 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
 	SendPlayerInventoryFormspec(peer_id);
 
 	// Send inventory
-	UpdateCrafting(peer_id);
 	SendInventory(peer_id);
 
 	// Send HP
@@ -1385,7 +1376,8 @@ void Server::setInventoryModified(const InventoryLocation &loc)
 		PlayerSAO *playersao = player->getPlayerSAO();
 		if(!playersao)
 			return;
-		playersao->m_inventory_not_sent = true;
+
+		SendInventory(playersao->getPeerID());
 	}
 		break;
 	case InventoryLocation::NODEMETA:
@@ -1650,7 +1642,7 @@ void Server::SendInventory(u16 peer_id)
 	PlayerSAO *playersao = getPlayerSAO(peer_id);
 	assert(playersao);
 
-	playersao->m_inventory_not_sent = false;
+	UpdateCrafting(playersao->getPlayer());
 
 	/*
 		Serialize it
@@ -2701,13 +2693,10 @@ void Server::DeleteClient(u16 peer_id, ClientDeletionReason reason)
 		SendChatMessage(PEER_ID_INEXISTENT,message);
 }
 
-void Server::UpdateCrafting(u16 peer_id)
+void Server::UpdateCrafting(Player* player)
 {
 	DSTACK(__FUNCTION_NAME);
 
-	Player* player = m_env->getPlayer(peer_id);
-	assert(player);
-
 	// Get a preview for crafting
 	ItemStack preview;
 	InventoryLocation loc;
diff --git a/src/server.h b/src/server.h
index 8c5ea2e1e9e619663d4005d2292f8cad6ab4c5f6..b3d5d0fec434fa42c5b14260d46b7d5a94165c77 100644
--- a/src/server.h
+++ b/src/server.h
@@ -375,6 +375,9 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
 	void SendPlayerBreath(u16 peer_id);
 
+	// Envlock and conlock should be locked when calling these
+	void SendInventory(u16 peer_id);
+
 	// Bind address
 	Address m_bind_addr;
 
@@ -394,8 +397,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	/* mark blocks not sent for all clients */
 	void SetBlocksNotSent(std::map<v3s16, MapBlock *>& block);
 
-	// Envlock and conlock should be locked when calling these
-	void SendInventory(u16 peer_id);
+
 	void SendChatMessage(u16 peer_id, const std::wstring &message);
 	void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
 	void SendPlayerHP(u16 peer_id);
@@ -466,7 +468,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	void DiePlayer(u16 peer_id);
 	void RespawnPlayer(u16 peer_id);
 	void DeleteClient(u16 peer_id, ClientDeletionReason reason);
-	void UpdateCrafting(u16 peer_id);
+	void UpdateCrafting(Player *player);
 
 	// When called, connection mutex should be locked
 	RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
diff --git a/src/serverobject.cpp b/src/serverobject.cpp
index 9cf817859a855d0a1656dc29eff219d98f16c2df..699040bf2599a42716aa4dd0ec471c39183042e8 100644
--- a/src/serverobject.cpp
+++ b/src/serverobject.cpp
@@ -90,14 +90,9 @@ ItemStack ServerActiveObject::getWieldedItem() const
 
 bool ServerActiveObject::setWieldedItem(const ItemStack &item)
 {
-	Inventory *inv = getInventory();
-	if(inv)
-	{
-		InventoryList *list = inv->getList(getWieldList());
-		if (list)
-		{
+	if(Inventory *inv = getInventory()) {
+		if (InventoryList *list = inv->getList(getWieldList())) {
 			list->changeItem(getWieldIndex(), item);
-			setInventoryModified();
 			return true;
 		}
 	}