diff --git a/game/modules/tome/dialogs/UseItemDialog.lua b/game/modules/tome/dialogs/UseItemDialog.lua
index 0cb9bce8223d4bc9596c36aac32c51c7cc484c90..73ef681b7b7e09c131e91da100406273c009119e 100644
--- a/game/modules/tome/dialogs/UseItemDialog.lua
+++ b/game/modules/tome/dialogs/UseItemDialog.lua
@@ -88,6 +88,28 @@ function _M:use(item)
 	elseif act == "takeoff" then
 		self.actor:doTakeoff(self.inven, self.item, self.object, nil, self.dst_actor)
 		self.onuse(self.inven, self.item, self.object, false)
+	elseif act == "tinker-remove" then
+		self.actor:doTakeoffTinker(self.inven[self.item], self.object)
+		self.actor:sortInven()
+		self.onuse(self.inven, self.item, self.object, false)
+	elseif act == "tinker-add" then
+		local list = {}
+		for inven_idx, inven in pairs(self.actor.inven) do if inven.worn then
+			for item_idx, o in ipairs(inven) do
+				if o:canAttachTinker(self.object, true) then list[#list+1] = {name=o:getName{do_color=true}, inven=inven, item=item_idx, o=o} end
+			end
+		end end
+		local doit = function(w)
+			self.actor:doWearTinker(self.inven, self.item, self.object, w.inven, w.item, w.o, true)
+			self.actor:sortInven()
+			self.onuse(self.inven, self.item, self.object, false)
+		end
+		if #list == 1 then doit(list[1])
+		elseif #list == 0 then
+			self:simplePopup("Attach tinker", "You do not have any equiped items that it can be attached to.")
+		else
+			self:listPopup("Attach tinker", "Select which item to attach it to:", list, 300, 400, doit)
+		end
 	elseif act == "transfer" then
 		game:registerDialog(PartySendItem.new(self.actor, self.object, self.inven, self.item, function()
 			self.onuse(self.inven, self.item, self.object, false)
@@ -136,6 +158,8 @@ function _M:generateList()
 	if not self.dst_actor and not self.object.__transmo and not self.no_use_allowed then if self.object:canUseObject() then list[#list+1] = {name="Use", action="use"} end end
 	if self.inven == self.actor.INVEN_INVEN and self.object:wornInven() and self.actor:getInven(self.object:wornInven()) then list[#list+1] = {name="Wield/Wear", action="wear"} end
 	if not self.object.__transmo then if self.inven ~= self.actor.INVEN_INVEN and self.object:wornInven() then list[#list+1] = {name="Take off", action="takeoff"} end end
+	if not self.object.__transmo then if self.inven ~= self.actor.INVEN_INVEN and self.object.is_tinker and self.object.tinkered then list[#list+1] = {name="Remove Tinker", action="tinker-remove"} end end
+	if not self.object.__transmo then if self.inven == self.actor.INVEN_INVEN and self.object.is_tinker and not self.object.tinkered then list[#list+1] = {name="Attach Tinker", action="tinker-add"} end end
 	if not self.dst_actor and not self.object.__tagged and self.inven == self.actor.INVEN_INVEN then list[#list+1] = {name="Drop", action="drop"} end
 	if not self.dst_actor and self.inven == self.actor.INVEN_INVEN and game.party:countInventoryAble() >= 2 then list[#list+1] = {name="Transfer to party", action="transfer"} end
 	if not self.dst_actor and not self.object.__tagged and self.inven == self.actor.INVEN_INVEN and transmo_chest and self.actor:transmoFilter(self.object) then list[#list+1] = {name=self.actor:transmoGetWord():capitalize().." now", action="transmo"} end