diff --git a/game/engines/default/data/gfx/metal-ui/selector-green1.png b/game/engines/default/data/gfx/metal-ui/selector-green1.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4c3097262b3677b644137624ceb27cae4b94258
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green1.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green2.png b/game/engines/default/data/gfx/metal-ui/selector-green2.png
new file mode 100644
index 0000000000000000000000000000000000000000..a71a1522d6c8b983a56a8ee4850fdd8e3935db2d
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green2.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green3.png b/game/engines/default/data/gfx/metal-ui/selector-green3.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c09c20c4782762a7276ddbb983b05e666f631d4
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green3.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green4.png b/game/engines/default/data/gfx/metal-ui/selector-green4.png
new file mode 100644
index 0000000000000000000000000000000000000000..15c6ab2b0a819ecc26e69cc2811780774779da36
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green4.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green5.png b/game/engines/default/data/gfx/metal-ui/selector-green5.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5b3fb7913238bb776a2e2a3f183fba59517bb6d
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green5.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green6.png b/game/engines/default/data/gfx/metal-ui/selector-green6.png
new file mode 100644
index 0000000000000000000000000000000000000000..0406e5bc4a238608976abb408a5f42c58dab1c90
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green6.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green7.png b/game/engines/default/data/gfx/metal-ui/selector-green7.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d1236c52e7726808bff67bb50d47c1584c4845d
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green7.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green8.png b/game/engines/default/data/gfx/metal-ui/selector-green8.png
new file mode 100644
index 0000000000000000000000000000000000000000..1071fde2906908469cae96584d4e23129137a710
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green8.png differ
diff --git a/game/engines/default/data/gfx/metal-ui/selector-green9.png b/game/engines/default/data/gfx/metal-ui/selector-green9.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f8cc7e2f6ed76dd1036a4f26184ecf75af42e3a
Binary files /dev/null and b/game/engines/default/data/gfx/metal-ui/selector-green9.png differ
diff --git a/game/engines/default/engine/ui/ImageList.lua b/game/engines/default/engine/ui/ImageList.lua
index b6875f96e04d37cf70fca2ab0e38847ade0cf409..738d2cb0c4c5bd27772a079e51214dc3c33e608a 100644
--- a/game/engines/default/engine/ui/ImageList.lua
+++ b/game/engines/default/engine/ui/ImageList.lua
@@ -34,6 +34,9 @@ function _M:init(t)
 	self.list = assert(t.list, "no image list list")
 	self.fct = assert(t.fct, "no image list fct")
 	self.padding = t.padding or 6
+	self.force_size = t.force_size
+	self.scrollbar = t.scrollbar
+	self.selection = t.selection
 
 	self.nb_w = math.floor(self.w / (self.tile_w + self.padding))
 	self.nb_h = math.floor(self.h / (self.tile_h + self.padding))
@@ -50,7 +53,9 @@ function _M:generate()
 	self.scroll = 1
 	self.dlist = {}
 	local row = {}
-	for i, f in ipairs(self.list) do
+	for i, data in ipairs(self.list) do
+		local f = data
+		if type(data) == "table" then f = f.image end
 		local s = Tiles:loadImage(f)
 		if s then
 			local w, h = s:getSize()
@@ -58,6 +63,7 @@ function _M:generate()
 			item.w = w
 			item.h = h
 			item.f = f
+			item.data = data
 			self.tiles[f] = {f=f, w=w, h=h, pos_i = #row+1, pos_j = #self.dlist}
 			row[#row+1] = item
 			if #row + 1 > self.nb_w then
@@ -69,11 +75,16 @@ function _M:generate()
 	self.dlist[#self.dlist+1] = row
 	self.max = #self.dlist
 
-	self.scrollbar = Slider.new{size=self.h, max=#self.dlist - self.nb_h}
+	if self.scrollbar then
+		self.scrollbar = Slider.new{size=self.h, max=#self.dlist - self.nb_h}
+	end
 
 	self.frame = self:makeFrame(nil, self.tile_w, self.tile_h)
 	self.frame_sel = self:makeFrame("ui/selector-sel", self.tile_w, self.tile_h)
 	self.frame_usel = self:makeFrame("ui/selector", self.tile_w, self.tile_h)
+	if self.selection then
+		self.frame_selected = self:makeFrame("ui/selector-green", self.tile_w, self.tile_h)
+	end
 
 	self.sel_i = 1
 	self.sel_j = 1
@@ -133,10 +144,31 @@ function _M:generate()
 	}
 end
 
+function _M:getAllSelected()
+	local list = {}
+	for i, row in ipairs(self.dlist) do for j, item in ipairs(row) do if item.selected then list[#list+1] = item end end end
+	return list
+end
+
+function _M:clearSelection()
+	for i, row in ipairs(self.dlist) do for j, item in ipairs(row) do item.selected = false end end
+end
+
 function _M:onUse(button)
 	local item = self.dlist[self.sel_j] and self.dlist[self.sel_j][self.sel_i]
 	self:sound("button")
-	if item then self.fct(item) end
+	if item then
+		if self.selection == "simple" then
+			self:clearSelection()
+			item.selected = not item.selected
+		elseif self.selection == "multiple" then
+			item.selected = not item.selected
+		elseif self.selection == "ctrl-multiple" then
+			if not core.key.modState("ctrl") then self:clearSelection() end
+			item.selected = not item.selected
+		end
+		self.fct(item)
+	end
 end
 
 function _M:onSelect()
@@ -150,6 +182,8 @@ function _M:display(x, y)
 		for i = 1, #row do
 			local item = row[i]
 
+			if item.selected then self:drawFrame(self.frame_selected, x + (i-1) * (self.tile_w + self.padding), y) end
+
 			if self.sel_i == i and self.sel_j == j then
 				if self.focused then self:drawFrame(self.frame_sel, x + (i-1) * (self.tile_w + self.padding), y)
 				else self:drawFrame(self.frame_usel, x + (i-1) * (self.tile_w + self.padding), y) end
@@ -157,12 +191,16 @@ function _M:display(x, y)
 				self:drawFrame(self.frame, x + (i-1) * (self.tile_w + self.padding), y)
 			end
 
-			item[1]:toScreenFull(x + (i-1) * (self.tile_w + self.padding) + self.tile_w - item.w, y + self.tile_h - item.h, item.w, item.h, item[2], item[3])
+			if self.force_size then
+				item[1]:toScreenFull(x + (i-1) * (self.tile_w + self.padding), y, self.tile_w, self.tile_h, item[2] * self.tile_w / item.w, item[3] * self.tile_h / item.h)
+			else
+				item[1]:toScreenFull(x + (i-1) * (self.tile_w + self.padding) + self.tile_w - item.w, y + self.tile_h - item.h, item.w, item.h, item[2], item[3])
+			end
 		end
 		y = y + self.tile_h + self.padding
 	end
 
-	if self.focused then
+	if self.focused and self.scrollbar then
 		self.scrollbar.pos = self.scroll
 		self.scrollbar:display(bx + self.w - self.scrollbar.w, by)
 	end
diff --git a/game/modules/tome/data/general/npcs/spider.lua b/game/modules/tome/data/general/npcs/spider.lua
index 57d3afdfe480bea0b5fc12c01ae76a41a5435ee5..c1cf8cbb1bc67801f6571193895b76644b2880b0 100644
--- a/game/modules/tome/data/general/npcs/spider.lua
+++ b/game/modules/tome/data/general/npcs/spider.lua
@@ -304,6 +304,7 @@ newEntity{ base = "BASE_NPC_SPIDER",
 
 newEntity{ base = "BASE_NPC_SPIDER",
 	name = "weaver matriarch", color=colors.DARK_BLUE,
+	resolvers.nice_tile{image="invis.png", add_mos = {{image="npc/spiderkin_spider_weaver_matriarch.png", display_h=2, display_y=-1}}},
 	desc = [[A large dark blue arachnid with a shifting yellow and white pattern on it's thorax.  It shifts and shimmers as though only partially connected to the timeline.]],
 	level_range = {38, nil}, exp_worth = 1,
 	rarity = 6, -- rarer then most spiderkin; only encountered in Maj'Eyal while laying eggs or caring for her young
@@ -339,6 +340,7 @@ newEntity{ base = "BASE_NPC_SPIDER",
 	name = "Ninandra, the Great Weaver", unique = true,
 	color = colors.VIOLET,
 	rarity = 50,
+	resolvers.nice_tile{image="invis.png", add_mos = {{image="npc/spiderkin_spider_ninandra_the_great_weaver.png", display_h=2, display_y=-1}}},
 	desc = [[A huge blue and white spiderkin who's form shifts and shimmers in and out of reality.  She spins the threads of fate and binds the destiny of all with in her web.]],
 	level_range = {45, nil}, exp_worth = 4,
 	max_life = 400, life_rating = 25, fixed_rating = true,
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 6ca1028cd878c667b80274732604df7245b4d6c6..56d9d7792d90bfdb79e6b2fdf32be3b84da41f49 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -1870,7 +1870,7 @@ newEntity{ base = "BASE_HEAVY_ARMOR",
 newEntity{ base = "BASE_MASSIVE_ARMOR",
 	power_source = {technique=true},
 	unique = true,
-	name = "Plate Armor of the King",
+	name = "Plate Armor of the King", image = "object/artifact/plate_armor_of_the_king.png",
 	unided_name = "suit of gleaming voratun plate",
 	desc = [[Beautifully detailed with images of King Toknor's defence of Last Hope. Despair fills the hearts of even the blackest villains at the sight of it.]],
 	color = colors.WHITE,
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/armors.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/armors.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6015b2646fa5d5dc0adcba2b53291872bbb919c
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/armors.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/gems.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/gems.png
new file mode 100644
index 0000000000000000000000000000000000000000..7237b3425c6408af93545803dc7f2fa2201ddcab
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/gems.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/inscriptions.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/inscriptions.png
new file mode 100644
index 0000000000000000000000000000000000000000..c85218c9f4afcf1004c7d27a9f673411146fa967
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/inscriptions.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/jewelry.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/jewelry.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ffdc9850d5a1b98cd50d2ea37f187651b75d9b8
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/jewelry.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc.png
new file mode 100644
index 0000000000000000000000000000000000000000..096c3b77a9013514d50f0231d13c6b0f3fc08578
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc_armors.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc_armors.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef2aea4f4b2f556d451060d166009d047c751e60
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/misc_armors.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/quests.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/quests.png
new file mode 100644
index 0000000000000000000000000000000000000000..9870e7bc483c56a54b0675e5f27d5da91da70710
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/quests.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/transmo.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/transmo.png
new file mode 100644
index 0000000000000000000000000000000000000000..570a71d7cfe771049aae7d0a4a8b222110933bb6
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/transmo.png differ
diff --git a/game/modules/tome/data/gfx/metal-ui/inven_tabs/weapons.png b/game/modules/tome/data/gfx/metal-ui/inven_tabs/weapons.png
new file mode 100644
index 0000000000000000000000000000000000000000..5928b5da2029cd8154074a263b1bb650d01e9be8
Binary files /dev/null and b/game/modules/tome/data/gfx/metal-ui/inven_tabs/weapons.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_ninandra_the_great_weaver.png b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_ninandra_the_great_weaver.png
new file mode 100644
index 0000000000000000000000000000000000000000..39b2a9158c4b388dbc51276ae54b7a659d6b7615
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_ninandra_the_great_weaver.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_matriarch.png b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_matriarch.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd41649e088a486a5edce6356306812a796f6c12
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_matriarch.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_patriarch.png b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_patriarch.png
new file mode 100644
index 0000000000000000000000000000000000000000..3cdf7bda8a27e717fe363335ad05ed20fa45cdfe
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_patriarch.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_young.png b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_young.png
new file mode 100644
index 0000000000000000000000000000000000000000..aacd628edc88f585c1dbc6d1ff66cd758fe567fa
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/npc/spiderkin_spider_weaver_young.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/object/artifact/plate_armor_of_the_king.png b/game/modules/tome/data/gfx/shockbolt/object/artifact/plate_armor_of_the_king.png
new file mode 100644
index 0000000000000000000000000000000000000000..239fe3bac18c3d164813ca2be5f6bae262041911
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/object/artifact/plate_armor_of_the_king.png differ
diff --git a/game/modules/tome/dialogs/Birther.lua b/game/modules/tome/dialogs/Birther.lua
index a009352a221033844b8e195e86238c503d52bd58..0878f8b1e7fcd7aec5b27ae09c78a160cfee6368 100644
--- a/game/modules/tome/dialogs/Birther.lua
+++ b/game/modules/tome/dialogs/Birther.lua
@@ -1174,7 +1174,7 @@ function _M:selectTile()
 		self.has_custom_tile = nil
 		self:setTile()
 	end}
-	local list = ImageList.new{width=500, height=500, tile_w=64, tile_h=64, padding=10, list=list, fct=function(item)
+	local list = ImageList.new{width=500, height=500, tile_w=64, tile_h=64, padding=10, scrollbar=true, list=list, fct=function(item)
 		game:unregisterDialog(d)
 		if not self:isDonator() then
 			self:selectTileNoDonations()
diff --git a/game/modules/tome/dialogs/ShowEquipInven.lua b/game/modules/tome/dialogs/ShowEquipInven.lua
index 3cd2c3c202874f487dcac0ef666d179d9cbdd61e..30eb5ec861c4351fb09abefaa576fb1c4721e3f3 100644
--- a/game/modules/tome/dialogs/ShowEquipInven.lua
+++ b/game/modules/tome/dialogs/ShowEquipInven.lua
@@ -24,6 +24,7 @@ local ListColumns = require "engine.ui.ListColumns"
 local Textzone = require "engine.ui.Textzone"
 local TextzoneList = require "engine.ui.TextzoneList"
 local Separator = require "engine.ui.Separator"
+local ImageList = require "engine.ui.ImageList"
 local EquipDollFrame = require "engine.ui.EquipDollFrame"
 
 module(..., package.seeall, class.inherit(Dialog))
@@ -41,7 +42,18 @@ function _M:init(title, actor, filter, action, on_select)
 
 	self.inner_scroll = self:makeFrame("ui/tooltip/", self.equipdolls_max_w, self.equipdolls_max_h)
 
-	self.c_inven = ListColumns.new{width=self.iw - 20 - self.equipdolls_max_w, height=self.ih - self.max_h*self.font_h - 10, sortable=true, scrollbar=true, columns={
+	self.c_tabs = ImageList.new{width=self.iw - 20 - self.equipdolls_max_w, height=36, tile_w=32, tile_h=32, padding=5, force_size=true, selection="ctrl-multiple", list={
+		{image="metal-ui/inven_tabs/weapons.png", 	kind="weapons"},
+		{image="metal-ui/inven_tabs/armors.png", 	kind="armors"},
+		{image="metal-ui/inven_tabs/jewelry.png", 	kind="jewelry"},
+		{image="metal-ui/inven_tabs/gems.png", 		kind="gems"},
+		{image="metal-ui/inven_tabs/inscriptions.png", 	kind="inscriptions"},
+		{image="metal-ui/inven_tabs/misc.png", 		kind="misc"},
+		{image="metal-ui/inven_tabs/quests.png", 	kind="quests"},
+	}, fct=function() self:generateList() end}
+	self.c_tabs.dlist[1][1].selected = true
+
+	self.c_inven = ListColumns.new{width=self.iw - 20 - self.equipdolls_max_w, height=self.ih - self.max_h*self.font_h - 10 - self.c_tabs.h, sortable=true, scrollbar=true, columns={
 		{name="", width={20,"fixed"}, display_prop="char", sort="id"},
 		{name="", width={24,"fixed"}, display_prop="object", sort="sortname", direct_draw=function(item, x, y) if item.object then item.object:toScreen(nil, x+4, y, 16, 16) end end},
 		{name="Inventory", width=72, display_prop="name", sort="sortname"},
@@ -51,7 +63,8 @@ function _M:init(title, actor, filter, action, on_select)
 
 	self:generateList()
 
-	uis[#uis+1] = {right=0, top=0, ui=self.c_inven}
+	uis[#uis+1] = {right=0, top=0, ui=self.c_tabs}
+	uis[#uis+1] = {right=0, top=self.c_tabs.h + 5, ui=self.c_inven}
 	uis[#uis+1] = {left=self.equipdolls_max_w, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}
 
 	self:loadUI(uis)
@@ -230,14 +243,57 @@ function _M:innerDisplayBack(x, y, nb_keyframes)
 	self.actor:toScreen(nil, x + doll.doll_x, y + self.base_doll_y + doll.doll_y, 128, 128)
 end
 
+local tab_filters = {
+	weapons = function(o) return o.type == "weapon" end,
+	armors = function(o) return o.type == "armor" end,
+	gems = function(o) return o.type == "gem" or o.type == "alchemist-gem" end,
+	jewelry = function(o) return o.type == "jewelry" end,
+	inscriptions = function(o) return o.type == "scroll" end,
+	quests = function(o) return o.plot or o.quest end,
+}
+
+function _M:updateTabFilter()
+	local list = self.c_tabs:getAllSelected()
+	local checks = {}
+
+	for i, item in ipairs(list) do
+		if item.data.kind == "weapons" then checks[#checks+1] = tab_filters.weapons
+		elseif item.data.kind == "armors" then checks[#checks+1] = tab_filters.armors
+		elseif item.data.kind == "gems" then checks[#checks+1] = tab_filters.gems
+		elseif item.data.kind == "jewelry" then checks[#checks+1] = tab_filters.jewelry
+		elseif item.data.kind == "inscriptions" then checks[#checks+1] = tab_filters.inscriptions
+		elseif item.data.kind == "quests" then checks[#checks+1] = tab_filters.quests
+		elseif item.data.kind == "misc" then
+			local misc
+			misc = function(o)
+				-- Anything else
+				for k, fct in pairs(tab_filters) do
+					if fct ~= misc then
+						if fct(o) then return false end
+					end
+				end
+				return true
+			end
+			checks[#checks+1] = misc
+		end
+	end
+
+	self.tab_filter = function(o)
+		for i = 1, #checks do if checks[i](o) then return true end end
+		return false
+	end
+end
+
 function _M:generateList(no_update)
+	self:updateTabFilter()
+
 	-- Makes up the list
 	self.inven_list = {}
 	local list = self.inven_list
 	local chars = {}
 	local i = 1
 	for item, o in ipairs(self.actor:getInven("INVEN") or {}) do
-		if not self.filter or self.filter(o) then
+		if (not self.filter or self.filter(o)) and (not self.tab_filter or self.tab_filter(o)) then
 			local char = self:makeKeyChar(i)
 
 			local enc = 0