diff --git a/src/itemframe.lua b/src/itemframe.lua
index 5b890bed2b454ac776d495edf7e7b85bcc655924..525322452f29f11ffb90b1d92c78e0726898cf52 100644
--- a/src/itemframe.lua
+++ b/src/itemframe.lua
@@ -69,9 +69,11 @@ end
 
 function itemframe.rightclick(pos, node, clicker, itemstack)
 	local meta = minetest.get_meta(pos)
-	local player = clicker:get_player_name()
+	local player_name = clicker:get_player_name()
 	local owner = meta:get_string("owner")
-	if player ~= owner or not itemstack then
+	local admin = minetest.check_player_privs(player_name, "protection_bypass")
+
+	if not admin and (player_name ~= owner or not itemstack) then
 		return itemstack
 	end
 
@@ -85,19 +87,22 @@ end
 
 function itemframe.punch(pos, node, puncher)
 	local meta = minetest.get_meta(pos)
-	local player = puncher:get_player_name()
+	local player_name = puncher:get_player_name()
 	local owner = meta:get_string("owner")
+	local admin = minetest.check_player_privs(player_name, "protection_bypass")
 
-	if player ~= owner then return end
+	if not admin and player_name ~= owner then return end
 	drop_item(pos, node)
 end
 
 function itemframe.dig(pos, player)
+	if not player then return end
 	local meta = minetest.get_meta(pos)
-	local pname = player and player:get_player_name()
+	local player_name = player and player:get_player_name()
 	local owner = meta:get_string("owner")
+	local admin = minetest.check_player_privs(player_name, "protection_bypass")
 
-	return pname == owner
+	return admin or player_name == owner
 end
 
 xdecor.register("itemframe", {