changed folder structure so we can deploy via ESOUI's github panel

git [01-25-18 - 11:21]
changed folder structure so we can deploy via ESOUI's github panel
Filename
Bindings.lua
Bindings.xml
CharBagSpaceTooltip.lua
CharCurrencyTooltip.lua
IIfA.lua
IIfA.txt
IIfA.xml
IIfA/Bindings.lua
IIfA/Bindings.xml
IIfA/CharBagSpaceTooltip.lua
IIfA/CharCurrencyTooltip.lua
IIfA/IIfA.lua
IIfA/IIfA.txt
IIfA/IIfA.xml
IIfA/IIfABackpack.lua
IIfA/IIfADataCollection.lua
IIfA/IIfAEvents.lua
IIfA/IIfAMenu.lua
IIfA/IIfASceneFuncs.lua
IIfA/IIfASettingsAdapter.lua
IIfA/IIfATooltip.lua
IIfA/IIfA_xml_adapter.lua
IIfA/README.md
IIfA/StringRegistration.lua
IIfA/assets/apparel/clothing_down.dds
IIfA/assets/apparel/clothing_over.dds
IIfA/assets/apparel/clothing_up.dds
IIfA/assets/apparel/jewelry_down.dds
IIfA/assets/apparel/jewelry_over.dds
IIfA/assets/apparel/jewelry_up.dds
IIfA/assets/apparel/shield_down.dds
IIfA/assets/apparel/shield_over.dds
IIfA/assets/apparel/shield_up.dds
IIfA/assets/consumables/containers/container_down.dds
IIfA/assets/consumables/containers/container_over.dds
IIfA/assets/consumables/containers/container_up.dds
IIfA/assets/consumables/drinks/drink_down.dds
IIfA/assets/consumables/drinks/drink_over.dds
IIfA/assets/consumables/drinks/drink_up.dds
IIfA/assets/consumables/food/food_down.dds
IIfA/assets/consumables/food/food_over.dds
IIfA/assets/consumables/food/food_up.dds
IIfA/assets/consumables/motifs/motif_down.dds
IIfA/assets/consumables/motifs/motif_over.dds
IIfA/assets/consumables/motifs/motif_up.dds
IIfA/assets/consumables/poison/poison_down.dds
IIfA/assets/consumables/poison/poison_over.dds
IIfA/assets/consumables/poison/poison_up.dds
IIfA/assets/consumables/potion/potion_down.dds
IIfA/assets/consumables/potion/potion_over.dds
IIfA/assets/consumables/potion/potion_up.dds
IIfA/assets/consumables/recipes/recipe_down.dds
IIfA/assets/consumables/recipes/recipe_over.dds
IIfA/assets/consumables/recipes/recipe_up.dds
IIfA/assets/consumables/repair/repair_down.dds
IIfA/assets/consumables/repair/repair_over.dds
IIfA/assets/consumables/repair/repair_up.dds
IIfA/assets/icons/Akaviri.dds
IIfA/assets/icons/Bandit.dds
IIfA/assets/icons/BuoyantArmiger.dds
IIfA/assets/icons/Maormer.dds
IIfA/assets/icons/Primitive.dds
IIfA/assets/icons/Reach.dds
IIfA/assets/icons/Soulshriven.dds
IIfA/assets/icons/abahswatch.dds
IIfA/assets/icons/akatosh.dds
IIfA/assets/icons/altmer.dds
IIfA/assets/icons/ancient.dds
IIfA/assets/icons/apostle.dds
IIfA/assets/icons/argonian.dds
IIfA/assets/icons/assassin.dds
IIfA/assets/icons/bloodforge.dds
IIfA/assets/icons/bosmer.dds
IIfA/assets/icons/breton.dds
IIfA/assets/icons/broken.dds
IIfA/assets/icons/cliffracer.dds
IIfA/assets/icons/clockwork.dds
IIfA/assets/icons/daedric.dds
IIfA/assets/icons/daggerfall.dds
IIfA/assets/icons/darkbrotherhood.dds
IIfA/assets/icons/docked_down.dds
IIfA/assets/icons/docked_over.dds
IIfA/assets/icons/docked_up.dds
IIfA/assets/icons/dragonknight.dds
IIfA/assets/icons/dreadhorn.dds
IIfA/assets/icons/dromathra.dds
IIfA/assets/icons/dunmer.dds
IIfA/assets/icons/dwemer.dds
IIfA/assets/icons/ebonheart.dds
IIfA/assets/icons/ebonshadow.dds
IIfA/assets/icons/ebony.dds
IIfA/assets/icons/frostcaster.dds
IIfA/assets/icons/harlequin.dds
IIfA/assets/icons/hlaalu.dds
IIfA/assets/icons/hollowjack.dds
IIfA/assets/icons/imperial.dds
IIfA/assets/icons/inventoryinsight_icon.dds
IIfA/assets/icons/khajit.dds
IIfA/assets/icons/kothringi.dds
IIfA/assets/icons/laurel.dds
IIfA/assets/icons/lizard.dds
IIfA/assets/icons/malacath.dds
IIfA/assets/icons/minotaur.dds
IIfA/assets/icons/moragtong.dds
IIfA/assets/icons/necromancer.dds
IIfA/assets/icons/nightblade.dds
IIfA/assets/icons/nord.dds
IIfA/assets/icons/ordinator.dds
IIfA/assets/icons/orsimer.dds
IIfA/assets/icons/outlaw.dds
IIfA/assets/icons/ragada.dds
IIfA/assets/icons/redguard.dds
IIfA/assets/icons/redoran.dds
IIfA/assets/icons/skinchanger.dds
IIfA/assets/icons/skull.dds
IIfA/assets/icons/skull_nice.dds
IIfA/assets/icons/sorcerer.dds
IIfA/assets/icons/telvanni.dds
IIfA/assets/icons/templar.dds
IIfA/assets/icons/thief.dds
IIfA/assets/icons/triangle.dds
IIfA/assets/icons/trinimac.dds
IIfA/assets/icons/tsaesci.dds
IIfA/assets/icons/undocked_down.dds
IIfA/assets/icons/undocked_over.dds
IIfA/assets/icons/undocked_up.dds
IIfA/assets/icons/wheel.dds
IIfA/assets/materials/atrait/atrait_down.dds
IIfA/assets/materials/atrait/atrait_over.dds
IIfA/assets/materials/atrait/atrait_up.dds
IIfA/assets/materials/wtrait/wtrait_down.dds
IIfA/assets/materials/wtrait/wtrait_over.dds
IIfA/assets/materials/wtrait/wtrait_up.dds
IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds
IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds
IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds
IIfA/assets/miscellaneous/bait/bait_down.dds
IIfA/assets/miscellaneous/bait/bait_over.dds
IIfA/assets/miscellaneous/bait/bait_up.dds
IIfA/assets/miscellaneous/glyphs/glyphs_down.dds
IIfA/assets/miscellaneous/glyphs/glyphs_over.dds
IIfA/assets/miscellaneous/glyphs/glyphs_up.dds
IIfA/assets/miscellaneous/soulgem/soulgem_down.dds
IIfA/assets/miscellaneous/soulgem/soulgem_over.dds
IIfA/assets/miscellaneous/soulgem/soulgem_up.dds
IIfA/assets/miscellaneous/trash/trash_down.dds
IIfA/assets/miscellaneous/trash/trash_over.dds
IIfA/assets/miscellaneous/trash/trash_up.dds
IIfA/assets/miscellaneous/trophy/trophy_down.dds
IIfA/assets/miscellaneous/trophy/trophy_over.dds
IIfA/assets/miscellaneous/trophy/trophy_up.dds
IIfA/assets/weapons/bow_down.dds
IIfA/assets/weapons/bow_over.dds
IIfA/assets/weapons/bow_up.dds
IIfA/assets/weapons/destruction_down.dds
IIfA/assets/weapons/destruction_over.dds
IIfA/assets/weapons/destruction_up.dds
IIfA/assets/weapons/healing_down.dds
IIfA/assets/weapons/healing_over.dds
IIfA/assets/weapons/healing_up.dds
IIfA/assets/weapons/onehanded_down.dds
IIfA/assets/weapons/onehanded_over.dds
IIfA/assets/weapons/onehanded_up.dds
IIfA/assets/weapons/twohanded_down.dds
IIfA/assets/weapons/twohanded_over.dds
IIfA/assets/weapons/twohanded_up.dds
IIfA/libs/LibAddonMenu-2.0/LICENSE
IIfA/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
IIfA/libs/LibAddonMenu-2.0/controls/button.lua
IIfA/libs/LibAddonMenu-2.0/controls/checkbox.lua
IIfA/libs/LibAddonMenu-2.0/controls/colorpicker.lua
IIfA/libs/LibAddonMenu-2.0/controls/custom.lua
IIfA/libs/LibAddonMenu-2.0/controls/description.lua
IIfA/libs/LibAddonMenu-2.0/controls/divider.lua
IIfA/libs/LibAddonMenu-2.0/controls/dropdown.lua
IIfA/libs/LibAddonMenu-2.0/controls/editbox.lua
IIfA/libs/LibAddonMenu-2.0/controls/header.lua
IIfA/libs/LibAddonMenu-2.0/controls/iconpicker.lua
IIfA/libs/LibAddonMenu-2.0/controls/panel.lua
IIfA/libs/LibAddonMenu-2.0/controls/separator.dds
IIfA/libs/LibAddonMenu-2.0/controls/slider.lua
IIfA/libs/LibAddonMenu-2.0/controls/submenu.lua
IIfA/libs/LibAddonMenu-2.0/controls/texture.lua
IIfA/libs/LibCustomMenu/LibCustomMenu.lua
IIfA/libs/LibCustomMenu/Unlicense.rtf
IIfA/libs/LibCustomTitles/LibCustomTitles.lua
IIfA/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
IIfA/libs/LibScroll/LibScroll.lua
IIfA/libs/LibStub/LibStub.lua
IIfABackpack.lua
IIfADataCollection.lua
IIfAEvents.lua
IIfAMenu.lua
IIfASceneFuncs.lua
IIfASettingsAdapter.lua
IIfATooltip.lua
IIfA_xml_adapter.lua
README.md
StringRegistration.lua
assets/apparel/clothing_down.dds
assets/apparel/clothing_over.dds
assets/apparel/clothing_up.dds
assets/apparel/jewelry_down.dds
assets/apparel/jewelry_over.dds
assets/apparel/jewelry_up.dds
assets/apparel/shield_down.dds
assets/apparel/shield_over.dds
assets/apparel/shield_up.dds
assets/consumables/containers/container_down.dds
assets/consumables/containers/container_over.dds
assets/consumables/containers/container_up.dds
assets/consumables/drinks/drink_down.dds
assets/consumables/drinks/drink_over.dds
assets/consumables/drinks/drink_up.dds
assets/consumables/food/food_down.dds
assets/consumables/food/food_over.dds
assets/consumables/food/food_up.dds
assets/consumables/motifs/motif_down.dds
assets/consumables/motifs/motif_over.dds
assets/consumables/motifs/motif_up.dds
assets/consumables/poison/poison_down.dds
assets/consumables/poison/poison_over.dds
assets/consumables/poison/poison_up.dds
assets/consumables/potion/potion_down.dds
assets/consumables/potion/potion_over.dds
assets/consumables/potion/potion_up.dds
assets/consumables/recipes/recipe_down.dds
assets/consumables/recipes/recipe_over.dds
assets/consumables/recipes/recipe_up.dds
assets/consumables/repair/repair_down.dds
assets/consumables/repair/repair_over.dds
assets/consumables/repair/repair_up.dds
assets/icons/Akaviri.dds
assets/icons/Bandit.dds
assets/icons/BuoyantArmiger.dds
assets/icons/Maormer.dds
assets/icons/Primitive.dds
assets/icons/Reach.dds
assets/icons/Soulshriven.dds
assets/icons/abahswatch.dds
assets/icons/akatosh.dds
assets/icons/altmer.dds
assets/icons/ancient.dds
assets/icons/apostle.dds
assets/icons/argonian.dds
assets/icons/assassin.dds
assets/icons/bloodforge.dds
assets/icons/bosmer.dds
assets/icons/breton.dds
assets/icons/broken.dds
assets/icons/cliffracer.dds
assets/icons/clockwork.dds
assets/icons/daedric.dds
assets/icons/daggerfall.dds
assets/icons/darkbrotherhood.dds
assets/icons/docked_down.dds
assets/icons/docked_over.dds
assets/icons/docked_up.dds
assets/icons/dragonknight.dds
assets/icons/dreadhorn.dds
assets/icons/dromathra.dds
assets/icons/dunmer.dds
assets/icons/dwemer.dds
assets/icons/ebonheart.dds
assets/icons/ebonshadow.dds
assets/icons/ebony.dds
assets/icons/frostcaster.dds
assets/icons/harlequin.dds
assets/icons/hlaalu.dds
assets/icons/hollowjack.dds
assets/icons/imperial.dds
assets/icons/inventoryinsight_icon.dds
assets/icons/khajit.dds
assets/icons/kothringi.dds
assets/icons/laurel.dds
assets/icons/lizard.dds
assets/icons/malacath.dds
assets/icons/minotaur.dds
assets/icons/moragtong.dds
assets/icons/necromancer.dds
assets/icons/nightblade.dds
assets/icons/nord.dds
assets/icons/ordinator.dds
assets/icons/orsimer.dds
assets/icons/outlaw.dds
assets/icons/ragada.dds
assets/icons/redguard.dds
assets/icons/redoran.dds
assets/icons/skinchanger.dds
assets/icons/skull.dds
assets/icons/skull_nice.dds
assets/icons/sorcerer.dds
assets/icons/telvanni.dds
assets/icons/templar.dds
assets/icons/thief.dds
assets/icons/triangle.dds
assets/icons/trinimac.dds
assets/icons/tsaesci.dds
assets/icons/undocked_down.dds
assets/icons/undocked_over.dds
assets/icons/undocked_up.dds
assets/icons/wheel.dds
assets/materials/atrait/atrait_down.dds
assets/materials/atrait/atrait_over.dds
assets/materials/atrait/atrait_up.dds
assets/materials/wtrait/wtrait_down.dds
assets/materials/wtrait/wtrait_over.dds
assets/materials/wtrait/wtrait_up.dds
assets/miscellaneous/avaweapon/avaweapon_down.dds
assets/miscellaneous/avaweapon/avaweapon_over.dds
assets/miscellaneous/avaweapon/avaweapon_up.dds
assets/miscellaneous/bait/bait_down.dds
assets/miscellaneous/bait/bait_over.dds
assets/miscellaneous/bait/bait_up.dds
assets/miscellaneous/glyphs/glyphs_down.dds
assets/miscellaneous/glyphs/glyphs_over.dds
assets/miscellaneous/glyphs/glyphs_up.dds
assets/miscellaneous/soulgem/soulgem_down.dds
assets/miscellaneous/soulgem/soulgem_over.dds
assets/miscellaneous/soulgem/soulgem_up.dds
assets/miscellaneous/trash/trash_down.dds
assets/miscellaneous/trash/trash_over.dds
assets/miscellaneous/trash/trash_up.dds
assets/miscellaneous/trophy/trophy_down.dds
assets/miscellaneous/trophy/trophy_over.dds
assets/miscellaneous/trophy/trophy_up.dds
assets/weapons/bow_down.dds
assets/weapons/bow_over.dds
assets/weapons/bow_up.dds
assets/weapons/destruction_down.dds
assets/weapons/destruction_over.dds
assets/weapons/destruction_up.dds
assets/weapons/healing_down.dds
assets/weapons/healing_over.dds
assets/weapons/healing_up.dds
assets/weapons/onehanded_down.dds
assets/weapons/onehanded_over.dds
assets/weapons/onehanded_up.dds
assets/weapons/twohanded_down.dds
assets/weapons/twohanded_over.dds
assets/weapons/twohanded_up.dds
libs/LibAddonMenu-2.0/LICENSE
libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
libs/LibAddonMenu-2.0/controls/button.lua
libs/LibAddonMenu-2.0/controls/checkbox.lua
libs/LibAddonMenu-2.0/controls/colorpicker.lua
libs/LibAddonMenu-2.0/controls/custom.lua
libs/LibAddonMenu-2.0/controls/description.lua
libs/LibAddonMenu-2.0/controls/divider.lua
libs/LibAddonMenu-2.0/controls/dropdown.lua
libs/LibAddonMenu-2.0/controls/editbox.lua
libs/LibAddonMenu-2.0/controls/header.lua
libs/LibAddonMenu-2.0/controls/iconpicker.lua
libs/LibAddonMenu-2.0/controls/panel.lua
libs/LibAddonMenu-2.0/controls/separator.dds
libs/LibAddonMenu-2.0/controls/slider.lua
libs/LibAddonMenu-2.0/controls/submenu.lua
libs/LibAddonMenu-2.0/controls/texture.lua
libs/LibCustomMenu/LibCustomMenu.lua
libs/LibCustomMenu/Unlicense.rtf
libs/LibCustomTitles/LibCustomTitles.lua
libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
libs/LibScroll/LibScroll.lua
libs/LibStub/LibStub.lua
diff --git a/Bindings.lua b/Bindings.lua
deleted file mode 100644
index d83f7cc..0000000
--- a/Bindings.lua
+++ /dev/null
@@ -1,3 +0,0 @@
--- this puts the item in the bind list, toggle call is in bindings.xml
-ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_INVENTORY_FRAME", "Toggle Inventory Frame")
-
diff --git a/Bindings.xml b/Bindings.xml
deleted file mode 100644
index 3a0e42c..0000000
--- a/Bindings.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<Bindings>
-  <Layer name="SI_KEYBINDINGS_CATEGORY_GENERAL">
-    <Category name="Inventory Insight">
-      <Action name="TOGGLE_INVENTORY_FRAME">
-        <Down>IIfA:ToggleInventoryFrame()</Down>
-      </Action>
-    </Category>
-  </Layer>
-</Bindings>
diff --git a/CharBagSpaceTooltip.lua b/CharBagSpaceTooltip.lua
deleted file mode 100644
index fb57591..0000000
--- a/CharBagSpaceTooltip.lua
+++ /dev/null
@@ -1,241 +0,0 @@
-local CharBagFrame = ZO_Object:Subclass()
-if IIfA == nil then IIfA = {} end
-IIfA.CharBagFrame = CharBagFrame
-
---[[ not currently used
-local function HexToN(sHexVal)
-	local Nibble1=0
-	local Nibble2=0
-	Nibble1, Nibble2=string.byte(sHexVal,1,2)
-	if Nibble1>=65 then
-		Nibble1=Nibble1-55
-	else
-		Nibble1=Nibble1-48
-	end
-	if Nibble2>=65 then
-		Nibble2=Nibble2-55
-	else
-		Nibble2=Nibble2-48
-	end
-	local Byte=Nibble1*16+Nibble2
-	return Byte/255
-end
---]]
-
-local function nToHex(Byte)
---	local Byte=nVal * 255
-	local Nibble1=math.floor(Byte/16)
-	local Nibble2=Byte-(Nibble1*16)
-	local Part1=string.char(Nibble1+48)
-	local Part2=string.char(Nibble2+48)
-	if Nibble1>9 then
-		Part1=string.char(Nibble1+55)
-	end
-	if Nibble2>9 then
-		Part2=string.char(Nibble2+55)
-	end
-	return string.format("%s%s", Part1, Part2)
-end
-
-function CharBagFrame:rgb2hex(ay)
-	-- local rtn
-	return string.format("%s%s%s", nToHex(ay.r * 255), nToHex(ay.g * 255), nToHex(ay.b * 255))
-	-- return rtn
-end
-
-local function ColorStart(colorHTML)
-	return string.format("%s%s", "|c",string.sub(colorHTML,1,6))
-end
-
-function CharBagFrame:ComputeColorAndText(spaceCurr, spaceMax)
-	local usedBagPercent = tonumber(spaceCurr) * 100 / tonumber(spaceMax)
-	local cs = ""
-	if spaceCurr == spaceMax then
-		return ColorStart(self.ColorFull)
-	else
-		if usedBagPercent >= self.parent.BagSpaceAlert.threshold then
-			cs = ColorStart(self.ColorAlert)
-		else
-			if usedBagPercent >= self.parent.BagSpaceWarn.threshold then
-				cs = ColorStart(self.ColorWarn)
-			end
-		end
-	end
-	return cs .. spaceCurr
-end
-
-
-function CharBagFrame:SetQty(control, field, qty)
-	local ctl = control:GetNamedChild(field)
-	ctl:SetText(qty)
-end
-
-function CharBagFrame:UpdateAssets()
-	if self.currAssets ~= nil then
-		self.currAssets.spaceUsed = GetNumBagUsedSlots(BAG_BACKPACK)
-		self.currAssets.spaceMax = GetBagSize(BAG_BACKPACK)
-	end
-end
-
-function CharBagFrame:FillCharAndBank()
-	self:UpdateAssets()
-
-	local spaceUsed = self.currAssets.spaceUsed
-	local spaceMax = self.currAssets.spaceMax
-	local bankMax = GetBagSize(BAG_BANK)
-	if IsESOPlusSubscriber() then
-		bankMax = bankMax + GetBagSize(BAG_SUBSCRIBER_BANK)
-	end
-	local bankUsed = GetNumBagUsedSlots(BAG_BANK)
-	bankUsed = bankUsed + GetNumBagUsedSlots(BAG_SUBSCRIBER_BANK)
-
-	self:SetQty(self.charControl, "spaceUsed", self:ComputeColorAndText(spaceUsed, spaceMax))
-	self:SetQty(self.charControl, "spaceMax", spaceMax)
-
-	self:SetQty(self.bankControl, "spaceUsed", self:ComputeColorAndText(bankUsed, bankMax))
-	self:SetQty(self.bankControl, "spaceMax", bankMax)
-
-	spaceUsed = spaceUsed + bankUsed + self.totSpaceUsed
-	spaceMax = spaceMax + bankMax + self.totSpaceMax
-
-	self:SetQty(self.totControl, "spaceUsed", spaceUsed)
-	self:SetQty(self.totControl, "spaceMax", spaceMax)
-end
-
-function CharBagFrame:RepaintSpaceUsed()
-	-- loop through characters
-	local assets = self.parent.assets
-	for i=1, GetNumCharacters() do
-		local _, _, _, _, _, _, charId, _ = GetCharacterInfo(i)
-		tControl = GetControl("IIFA_GUI_Bag_Grid_Row_" .. i)
-		if charId ~= currId then
-			if assets[charId] ~= nil then
-				if assets[charId].spaceUsed ~= nil then
-					self:SetQty(tControl, "spaceUsed", self:ComputeColorAndText(assets[charId].spaceUsed, assets[charId].spaceMax))
-					self:SetQty(tControl, "spaceMax", assets[charId].spaceMax)
-				end
-			end
-		end
-	end
-end
-
-
-function CharBagFrame:Initialize(objectForAssets)
-	local function ComputeSpaceUsedText(spaceUsed, spaceMax)
-		-- returns color coded
-	end
-
-	self.frame = IIFA_CharBagFrame
-	local tControl
-	local prevControl = self.frame
-	local currId = GetCurrentCharacterId()
-
-	if objectForAssets.assets == nil then
-		objectForAssets.assets = {}
-	end
-	local assets = objectForAssets.assets
-	self.parent = objectForAssets
-
-	if assets[currId] == nil then
-		assets[currId] = {}
-		assets[currId].spaceUsed = 0
-		assets[currId].spaceMax = 0
-	else
-		if assets[currId].spaceUsed == nil then
-			assets[currId].spaceUsed = 0
-		end
-		if assets[currId].spaceMax == nil then
-			assets[currId].spaceMax = 0
-		end
-	end
-	if objectForAssets.BagSpaceWarn == nil then
-		objectForAssets.BagSpaceWarn = { threshold = 85, r = 230 / 255, g = 130 / 255, b = 0 }
-		objectForAssets.BagSpaceAlert = { threshold = 95, r = 1, g = 1, b = 0 }
-		objectForAssets.BagSpaceFull = { r = 1, g = 0, b = 0 }
-	end
-
-	self.ColorWarn = self:rgb2hex(objectForAssets.BagSpaceWarn)
-	self.ColorAlert = self:rgb2hex(objectForAssets.BagSpaceAlert)
-	self.ColorFull = self:rgb2hex(objectForAssets.BagSpaceFull)
-
-	self.currAssets = objectForAssets.assets[currId]
-
-	self.frame:SetAnchor(TOPLEFT, IIFA_GUI_Header_BagButton, TOPRIGHT, 5, 0)
-	self.totSpaceUsed = 0
-	self.totSpaceMax = 0
-
-	for i=1, GetNumCharacters() do
-		local charName, _, _, _, _, alliance, charId, _ = GetCharacterInfo(i)
-		charName = charName:sub(1, charName:find("%^") - 1)
-		tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Grid_Row_" .. i, self.frame, "IIFA_CharBagRow")
-		if i == 1 then
-			tControl:SetAnchor(TOPLEFT, prevControl:GetNamedChild("_Title"), BOTTOMLEFT, 0, 30)
-			prevControl:GetNamedChild("_Title"):SetText("Bag Space")
-			prevControl:GetNamedChild("_TitleCharName"):SetText(GetString(SI_GROUP_LIST_PANEL_NAME_HEADER))
-		else
-			tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 2)
-		end
-		tControl:GetNamedChild("charName"):SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-		tControl:GetNamedChild("charName"):SetText(GetAllianceColor(alliance):Colorize(charName))
-		if charId == currId then
-			self.charControl = tControl
-		else
-			if assets[charId] ~= nil then
-				if assets[charId].spaceUsed ~= nil then
-					self.totSpaceUsed = self.totSpaceUsed + assets[charId].spaceUsed
-					self.totSpaceMax = self.totSpaceMax + assets[charId].spaceMax
-
-					self:SetQty(tControl, "spaceUsed", self:ComputeColorAndText(assets[charId].spaceUsed, assets[charId].spaceMax))
-					self:SetQty(tControl, "spaceMax", assets[charId].spaceMax)
-				end
-			end
-		end
-		prevControl = tControl
-	end
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Divider1", self.frame, "ZO_Options_Divider")
-	tControl:SetDimensions(288, 3)
-    tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 0)
-    tControl:SetAlpha(1)
-	self.divider1 = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Bank", self.frame, "IIFA_CharBagRow")
-	tControl:GetNamedChild("charName"):SetText(GetString(SI_CURRENCYLOCATION1))
-	tControl:SetAnchor(TOPLEFT, self.divider1, BOTTOMLEFT, 0, 0)
-	self.bankControl = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Divider2", self.frame, "ZO_Options_Divider")
-	tControl:SetDimensions(288, 3)
-    tControl:SetAnchor(TOPLEFT, self.bankControl, BOTTOMLEFT, 0, 0)
-    tControl:SetAlpha(1)
-	self.divider2 = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Tots", self.frame, "IIFA_CharBagRow")
-	tControl:GetNamedChild("charName"):SetText("Totals")
-	tControl:SetAnchor(TOPLEFT, self.divider2, BOTTOMLEFT, 0, 0)
-	self.totControl = tControl
-
-	self.frame:SetHeight((GetNumCharacters() + 4) * 26)	-- numchars + 4 represents # chars + bank + total + title and col titles
-
-	self:FillCharAndBank()
-
-	self.isInitialized = true
-end
-
-function CharBagFrame:Show(control)
-	if self.isInitialized == nil then return end
-	if not self.isShowing then
-		self.isShowing = true
-		self:FillCharAndBank()
-		self.frame:SetHidden(false)
-	end
-end
-
-function CharBagFrame:Hide(control)
-	if self.isInitialized == nil then return end
-	if self.isShowing then
-		self.isShowing = false
-		self.frame:SetHidden(true)
-	end
-end
-
diff --git a/CharCurrencyTooltip.lua b/CharCurrencyTooltip.lua
deleted file mode 100644
index 2d92da1..0000000
--- a/CharCurrencyTooltip.lua
+++ /dev/null
@@ -1,205 +0,0 @@
-local CharCurrencyFrame = ZO_Object:Subclass()
-if IIfA == nil then IIfA = {} end
-IIfA.CharCurrencyFrame = CharCurrencyFrame
-
-function CharCurrencyFrame:SetQty(control, field, fieldType, qty)
-	local ctl = control:GetNamedChild(field)
-	if qty == nil then
-		qty = 0
-	end
-	ZO_CurrencyControl_SetSimpleCurrency(ctl, fieldType, qty, ZO_KEYBOARD_CARRIED_CURRENCY_OPTIONS)
-	-- text in control looks like this
-    -- "@|u0:4:currency:1,748,124|u|t12:12:EsoUI/Art/currency/currency_gold.dds|t",
-	-- need to chop off the |t and all after to get rid of the icon
-
-	local ctlText = ctl:GetText()
-	ctl:SetText(ctlText:sub(1, ctlText:find("|t") - 1))
-end
-
-function CharCurrencyFrame:UpdateAssets()
-	if self.currAssets ~= nil then
-		self.currAssets.gold = GetCarriedCurrencyAmount(CURT_MONEY)
-		self.currAssets.tv = GetCarriedCurrencyAmount(CURT_TELVAR_STONES)
-		self.currAssets.ap = GetCarriedCurrencyAmount(CURT_ALLIANCE_POINTS)
-		self.currAssets.wv = GetCarriedCurrencyAmount(CURT_WRIT_VOUCHERS)
-	end
-end
-
-function CharCurrencyFrame:FillCharAndBank()
-	self:UpdateAssets()
-
-	local gold = self.currAssets.gold
-	local tv = self.currAssets.tv
-	local ap = self.currAssets.ap
-	local wv = self.currAssets.wv
-
-	self:SetQty(self.charControl, "qtyGold", CURT_MONEY, gold)
-	self:SetQty(self.charControl, "qtyTV", CURT_TELVAR_STONES, tv)
-	self:SetQty(self.charControl, "qtyAP", CURT_ALLIANCE_POINTS, ap)
-	self:SetQty(self.charControl, "qtyWV", CURT_WRIT_VOUCHERS, wv)
-
-	self:SetQty(self.bankControl, "qtyGold", CURT_MONEY, GetBankedCurrencyAmount(CURT_MONEY))
-	self:SetQty(self.bankControl, "qtyTV", CURT_TELVAR_STONES, GetBankedCurrencyAmount(CURT_TELVAR_STONES))
-	self:SetQty(self.bankControl, "qtyAP", CURT_ALLIANCE_POINTS, GetBankedCurrencyAmount(CURT_ALLIANCE_POINTS))
-	self:SetQty(self.bankControl, "qtyWV", CURT_WRIT_VOUCHERS, GetBankedCurrencyAmount(CURT_WRIT_VOUCHERS))
-
-	gold = gold + GetBankedCurrencyAmount(CURT_MONEY) + self.totGold
-	tv = tv + GetBankedCurrencyAmount(CURT_TELVAR_STONES) + self.totTV
-	ap = ap + GetBankedCurrencyAmount(CURT_ALLIANCE_POINTS) + self.totAP
-	wv = wv + GetBankedCurrencyAmount(CURT_WRIT_VOUCHERS) + self.totWV
-
-	self:SetQty(self.totControl, "qtyGold", CURT_MONEY, gold)
-	self:SetQty(self.totControl, "qtyTV", CURT_TELVAR_STONES, tv)
-	self:SetQty(self.totControl, "qtyAP", CURT_ALLIANCE_POINTS, ap)
-	self:SetQty(self.totControl, "qtyWV", CURT_WRIT_VOUCHERS, wv)
-
--- field width testing
---	self:SetQty(self.totControl, "qtyGold", CURT_MONEY, 99999999)
---	self:SetQty(self.totControl, "qtyTV", CURT_TELVAR_STONES, 99999999)
---	self:SetQty(self.totControl, "qtyAP", CURT_ALLIANCE_POINTS, 99999999)
-end
-
-
-function CharCurrencyFrame:Initialize(objectForAssets)
-	self.frame = IIFA_CharCurrencyFrame
-	local tControl
-	local prevControl = self.frame
-	local currId = GetCurrentCharacterId()
-
-	local iconSize = 18
-	prevControl:GetNamedChild("CURT_MONEY"):SetTexture(GetCurrencyKeyboardIcon(CURT_MONEY))
-	prevControl:GetNamedChild("CURT_MONEY"):SetDimensions(iconSize, iconSize)
-	prevControl:GetNamedChild("CURT_ALLIANCE_POINTS"):SetTexture(GetCurrencyKeyboardIcon(CURT_ALLIANCE_POINTS))
-	prevControl:GetNamedChild("CURT_ALLIANCE_POINTS"):SetDimensions(iconSize, iconSize)
-	prevControl:GetNamedChild("CURT_TELVAR_STONES"):SetTexture(GetCurrencyKeyboardIcon(CURT_TELVAR_STONES))
-	prevControl:GetNamedChild("CURT_TELVAR_STONES"):SetDimensions(iconSize, iconSize)
-	prevControl:GetNamedChild("CURT_WRIT_VOUCHERS"):SetTexture(GetCurrencyKeyboardIcon(CURT_WRIT_VOUCHERS))
-	prevControl:GetNamedChild("CURT_WRIT_VOUCHERS"):SetDimensions(iconSize, iconSize)
-
-	if objectForAssets.assets == nil then
-		objectForAssets.assets = {}
-	end
-	local assets = objectForAssets.assets
-
-	if assets[currId] == nil then
-		assets[currId] = {}
-		assets[currId].gold = 0
-		assets[currId].tv = 0
-		assets[currId].ap = 0
-		assets[currId].wv = 0
-	else
-		if assets[currId].gold == nil then
-			assets[currId].gold = 0
-		end
-		if assets[currId].tv == nil then
-			assets[currId].tv = 0
-		end
-		if assets[currId].ap == nil then
-			assets[currId].ap = 0
-		end
-		if assets[currId].wv == nil then
-			assets[currId].wv = 0
-		end
-	end
-
-	self.currAssets = assets[currId]
-
-	self.frame:SetAnchor(TOPLEFT, IIFA_GUI_Header_GoldButton, TOPRIGHT, 5, 0)
-	self.totGold = 0
-	self.totTV = 0
-	self.totAP = 0
-	self.totWV = 0
-
-	for i=1, GetNumCharacters() do
-		local charName, _, _, _, _, alliance, charId, _ = GetCharacterInfo(i)
-		charName = charName:sub(1, charName:find("%^") - 1)
-		tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_" .. i, self.frame, "IIFA_CharCurrencyRow")
-		if i == 1 then
-			tControl:SetAnchor(TOPLEFT, prevControl:GetNamedChild("_Title"), BOTTOMLEFT, 0, 26)
-			prevControl:GetNamedChild("_Title"):SetText(GetString(SI_INVENTORY_MODE_CURRENCY))
-			prevControl:GetNamedChild("_TitleCharName"):SetText(GetString(SI_GROUP_LIST_PANEL_NAME_HEADER))
-		else
-			tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 2)
-		end
-		tControl:GetNamedChild("charName"):SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-		tControl:GetNamedChild("charName"):SetText(GetAllianceColor(alliance):Colorize(charName))
-		if GetCurrentCharacterId() == charId then
-			self.charControl = tControl
-		else
-			if assets[charId] ~= nil then
-				if assets[charId].gold == nil then
-					assets[charId].gold = 0
-				end
-				self.totGold = self.totGold + assets[charId].gold
-
-				if assets[charId].tv == nil then
-					assets[charId].tv = 0
-				end
-				self.totTV = self.totTV + assets[charId].tv
-
-				if assets[charId].ap == nil then
-					assets[charId].ap = 0
-				end
-				self.totAP = self.totAP + assets[charId].ap
-
-				if assets[charId].wv == nil then
-					assets[charId].wv = 0
-				end
-				self.totWV = self.totWV + assets[charId].wv
-
-				self:SetQty(tControl, "qtyGold", CURT_MONEY, assets[charId].gold)
-				self:SetQty(tControl, "qtyTV", CURT_TELVAR_STONES, assets[charId].tv)
-				self:SetQty(tControl, "qtyAP", CURT_ALLIANCE_POINTS, assets[charId].ap)
-				self:SetQty(tControl, "qtyWV", CURT_WRIT_VOUCHERS, assets[charId].wv)
-			end
-		end
-		prevControl = tControl
-	end
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Divider1", self.frame, "ZO_Options_Divider")
-	tControl:SetDimensions(490, 3)
-    tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 0)
-    tControl:SetAlpha(1)
-	self.divider1 = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Bank", self.frame, "IIFA_CharCurrencyRow")
-	tControl:GetNamedChild("charName"):SetText(GetString(SI_CURRENCYLOCATION1))
-	tControl:SetAnchor(TOPLEFT, self.divider1, BOTTOMLEFT, 0, 0)
-	self.bankControl = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Divider2", self.frame, "ZO_Options_Divider")
-	tControl:SetDimensions(490, 3)
-    tControl:SetAnchor(TOPLEFT, self.bankControl, BOTTOMLEFT, 0, 0)
-    tControl:SetAlpha(1)
-	self.divider2 = tControl
-
-	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Tots", self.frame, "IIFA_CharCurrencyRow")
-	tControl:GetNamedChild("charName"):SetText("Totals")
-	tControl:SetAnchor(TOPLEFT, self.divider2, BOTTOMLEFT, 0, 0)
-	self.totControl = tControl
-
-
-	self.frame:SetHeight((GetNumCharacters() + 4) * 26)	-- numchars + 4 represents # chars + bank + total + title and col titles
-
-	self:FillCharAndBank()
-
-	self.isInitialized = true
-end
-
-function CharCurrencyFrame:Show(control)
-	if self.isInitialized == nil then return end
-	if not self.isShowing then
-		self.isShowing = true
-		self:FillCharAndBank()
-		self.frame:SetHidden(false)
-	end
-end
-
-function CharCurrencyFrame:Hide(control)
-	if self.isInitialized == nil then return end
-	if self.isShowing then
-		self.isShowing = false
-		self.frame:SetHidden(true)
-	end
-end
-
diff --git a/IIfA.lua b/IIfA.lua
deleted file mode 100644
index 608e644..0000000
--- a/IIfA.lua
+++ /dev/null
@@ -1,568 +0,0 @@
-------------------------------------------------------------------
---IIfA.lua
---Original Author: Vicster0
---v0.8
--- v1.x and 2.x - rewrites by ManaVortex & AssemblerManiac
---[[
-	Collects inventory data for all characters on a single account
-	including the shared bank and makes this information available
-	on tooltips across the entire account providing the player
-	with useful insight into their account wide inventory.
-DISCLAIMER
-	This Add-on is not created by, affiliated with or sponsored by
-	ZeniMax Media Inc. or its affiliates. The Elder Scrolls and
-	related logos are registered trademarks or trademarks of
-	ZeniMax Media Inc. in the United States and/or other countries.
-	All rights reserved."
-]]
-------------------------------------------------------------------
-if IIfA == nil then IIfA = {} end
---local IIfA = IIfA
-
-IIfA.name 				= "Inventory Insight"
-IIfA.version 			= "2.20"
-IIfA.author 			= "AssemblerManiac & manavortex"
-IIfA.defaultAlertType 	= UI_ALERT_CATEGORY_ALERT
-IIfA.defaultAlertSound 	= nil
-IIfA.PlayerLoadedFired 	= false
-IIfA.CharacterNames 	= {}
-IIfA.colorHandler 		= nil
-IIfA.isGuildBankReady 	= false
-IIfA.TooltipLink 		= nil
-IIfA.CurrSceneName 		= "hud"
-IIfA.bFilterOnSetName 	= false
-IIfA.searchFilter 		= ""
-IIfA.searchFilterLower 	= ""
-
-local LMP = LibStub("LibMediaProvider-1.0")
-local BACKPACK = ZO_PlayerInventoryBackpack
-local BANK = ZO_PlayerBankBackpack
-
-local ITEMTOOLTIP = ZO_ItemToolTip
-local POPUPTOOLTIP = ZO_PopupToolTip
-
-local IIFA_COLORDEF_DEFAULT = ZO_ColorDef:New("3399FF")
-
--- --------------------------------------------------------------
---	Global Variables and external functions
--- --------------------------------------------------------------
-
-IIfA.trackedBags = {
-	[BAG_WORN] 					= true,
-	[BAG_BACKPACK] 				= true,
-	[BAG_BANK] 					= true,
-	[BAG_SUBSCRIBER_BANK] 		= true,
-	[BAG_GUILDBANK] 			= true,
-	[BAG_VIRTUAL] 				= true,
-}
-IIfA.dropdownBankNames = {
-	"All",
-	"All Banks",
-	"All Guild Banks",
-	"All Characters",
-	"Bank and Characters",
-	"Bank and Current Character",
-	"Bank Only",
-	"Craft Bag"
-}
-if GetAPIVersion() >= 100022 then
-	IIfA.trackedBags[BAG_SUBSCRIBER_BANK] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_TWO] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_THREE]	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_FOUR] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_FIVE] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_SIX] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_SEVEN] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_EIGHT] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_NINE] 	= true
-	IIfA.trackedBags[BAG_HOUSE_BANK_TEN] 	= true
-	table.insert(IIfA.dropdownBankNames, "Housing Storage")
-end
-
-
-function IIfA:GetItemID(itemLink)
-	local ret = nil
-	if (itemLink) then
-		local data = itemLink:match("|H.:item:(.-)|h.-|h")
-		local itemID = zo_strsplit(':', data)		-- just get the number
-
-		-- because other functions may be comparing string to string, we can't make this be a number or it won't compare properly
-		ret = itemID
-	end
-	return ret
-end
-
--- 7-26-16 AM - global func, not part of IIfA class, used in IIfA_OnLoad
-function IIfA_SlashCommands(cmd)
-
-	if (cmd == "") then
-    	d("[IIfA]:Please find the majority of options in the addon settings section of the menu under Inventory Insight.")
-    	d(" ")
-    	d("[IIfA]:Usage - ")
-    	d("	/IIfA [options]")
-    	d(" 	")
-    	d("	Options")
-    	d("		debug - Enables debug functionality for the IIfA addon.")
-    	d("		run - Runs the IIfA data collector.")
-		d("		color - Opens the color picker dialog to set tooltip text color.")
-		return
-	end
-
-	if (cmd == "debug") then
-		if (IIfA.data.bDebug) then
-			d("[IIfA]:Debug[Off]")
-			IIfA.data.bDebug = false
-		else
-			d("[IIfA]:Debug[On]")
-			IIfA.data.bDebug = true
-		end
-		return
-	end
-
-	if (cmd == "run") then
-		d("[IIfA]:Running collector...")
-		IIfA:CollectAll()
-		return
-	end
-
-	if (cmd == "color") then
-		local in2ColorPickerOnMouseUp = _in2OptionsColorPicker:GetHandler("OnMouseUp")
-		in2ColorPickerOnMouseUp(_in2OptionsColorPicker, nil, true)
-		return
-	end
-end
-
-function IIfA:DebugOut(output)
-	if (IIfA.data.bDebug) then
-		d(output)
-	end
-end
-
-function IIfA:StatusAlert(message)
-	if (IIfA.data.bDebug) then
-		ZO_Alert(IIfA.defaultAlertType, IIfA.defaultAlertSound, message)
-	end
-end
-
-local function onFirstOpen()
-	IIfA:OnFirstInventoryOpen()
-end
-
-
-function IIfA_onLoad(eventCode, addOnName)
-	if (addOnName ~= "IIfA") then
-		return
-	end
-
-	local valDocked = true
-	local valLocked = false
-	local valMinimized = false
-	local valLastX = 400
-	local valLastY = 300
-	local valHeight = 798
-	local valWidth = 380
-
-	-- initializing default values
-	local defaultGlobal = {
-		saveSettingsGlobally 	= true,
-		bDebug 					= false,
-		in2TextColors 			= IIFA_COLORDEF_DEFAULT:ToHex(),
-		showItemCountOnRight 	= true,
-		ignoredCharEquipment	= {},
-		ignoredCharInventories	= {},
-		frameSettings =
-			{
-			["bank"] =			{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["guildBank"] =  	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["tradinghouse"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["smithing"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["store"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["stables"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["trade"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["inventory"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["hud"] =   		{ hidden = true, docked = false, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["alchemy"] =   	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth }
-			},
-
-		bCollectGuildBankData 			= false,
-		in2DefaultInventoryFrameView 	= "All",
-		in2AgedGuildBankDataWarning 	= true,
-		in2TooltipsFont 				= "ZoFontGame",
-		in2TooltipsFontSize 			= 16,
-		ShowToolTipWhen 				= "Always",
-		DBv3 							= {},
-		}
-
-	-- initializing default values
-	local default = {
-		in2TextColors = IIFA_COLORDEF_DEFAULT:ToHex(),
-		showItemCountOnRight = true,
-
-		frameSettings =
-			{
-			["bank"] =			{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["guildBank"] =  	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["tradinghouse"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["smithing"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["store"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["stables"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["trade"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["inventory"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["hud"] =   		{ hidden = true, docked = false, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
-			["alchemy"] =   	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth }
-			},
-
-		bCollectGuildBankData = false,
-		in2DefaultInventoryFrameView = "All",
-		in2AgedGuildBankDataWarning = true,
-		in2TooltipsFont = "ZoFontGame",
-		in2TooltipsFontSize = 16,
-		}
-
-	IIfA.minWidth = 410
-	-- prevent resizing by user to be larger than this
-	IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 300, -1, 1400)
-
-	-- Grab a couple static values that shouldn't change while it's running
-	IIfA.HeaderHeight = IIFA_GUI_Header:GetHeight()
-	IIfA.SearchHeight = IIFA_GUI_Search:GetHeight()
-
-	IIFA_GUI_ListHolder.rowHeight = 52	-- trying to find optimal size for this, set it in one spot for easier adjusting
-
-	IIfA.currentCharacterId = GetCurrentCharacterId()
-	IIfA.currentAccount = GetDisplayName()
-
-	IIfA.filterGroup = "All"
-	IIfA.filterTypes = nil
-
-	-- grabs data from bagpack, and worn bag when we first open the inventory
-	ZO_PreHook(PLAYER_INVENTORY, "ApplyBackpackLayout", IIfA.OnFirstInventoryOpen)
-	ZO_PreHook(BACKPACK_GUILD_BANK_LAYOUT_FRAGMENT, "ApplyBackpackLayout", IIfA.CollectGuildBank)
-
-	-- ZO_PreHook(SHARED_INVENTORY, "GetOrCreateBagCache", function(self, bagId)
-		-- d("SHARED_INVENTORY: GetOrCreateBagCache: " .. tostring(bagId))
-	-- end)
-	-- ZO_PreHook(SHARED_INVENTORY, "PerformFullUpdateOnBagCache", function(self, bagId)
-		-- d("SHARED_INVENTORY: PerformFullUpdateOnBagCache: " .. tostring(bagId))
-	-- end)
-
-
-	-- http://esodata.uesp.net/100016/src/libraries/utility/zo_savedvars.lua.html#67
-
-	IIfA.settings 	= ZO_SavedVars:NewCharacterIdSettings("IIfA_Settings", 1, nil, default)
-	IIfA.data 		= ZO_SavedVars:NewAccountWide("IIfA_Data", 1, "Data", defaultGlobal)
-
-
-	local ObjSettings = IIfA:GetSettings()
-	if ObjSettings.in2InventoryFrameSceneSettings ~= nil then
-		ObjSettings.in2InventoryFrameSceneSettings = nil
-	end
-	if ObjSettings.in2InventoryFrameScenes ~= nil then
-		ObjSettings.in2InventoryFrameScenes = nil
-	end
-	if ObjSettings.valDocked ~= nil then
-		ObjSettings.valDocked = nil
-		ObjSettings.valLocked = nil
-		ObjSettings.valMinimized = nil
-		ObjSettings.valLastX = nil
-		ObjSettings.valLastY = nil
-		ObjSettings.valHeight = nil
-		ObjSettings.valWidth = nil
-		ObjSettings.valWideX = nil
-	end
-
-	if IIfA.settings.in2ToggleGuildBankDataCollection ~= nil then
-		IIfA.settings.in2ToggleGuildBankDataCollection = nil
-	end
-	if IIfA.data.in2ToggleGuildBankDataCollection ~= nil then
-		IIfA.data.bCollectGuildBankData = IIfA.data.in2ToggleGuildBankDataCollection
-		IIfA.data.in2ToggleGuildBankDataCollection = nil
-	end
-
-	if IIfA.data.showToolTipOnIIFAOnly ~= nil then
-		if IIfA.data.showToolTipWhen == nil then		-- safety test - this should be nil at this point, but ya never know
-			if IIfA.data.showToolTipOnIIFAOnly then
-				IIfA.data.showToolTipWhen = "IIfA"
-			else
-				IIfA.data.showToolTipWhen = "Always"
-			end
-		end
-		IIfA.data.showToolTipOnIIFAOnly = nil
-	else
-		if IIfA.data.showToolTipWhen == nil then
-			IIfA.data.showToolTipWhen = "Always"
-		end
-	end
-	if ObjSettings.showToolTipOnIIFAOnly ~= nil then
-		if ObjSettings.showToolTipWhen == nil then		-- safety test - this should be nil at this point, but ya never know
-			if ObjSettings.showToolTipOnIIFAOnly then
-				ObjSettings.showToolTipWhen = "IIfA"
-			else
-				ObjSettings.showToolTipWhen = "Always"
-			end
-		end
-		ObjSettings.showToolTipOnIIFAOnly = nil
-	else
-		if ObjSettings.showToolTipWhen == nil then
-			ObjSettings.showToolTipWhen = IIfA.data.showToolTipWhen
-		end
-	end
-
-	if IIfA.data.showStyleInfo == nil then
-		IIfA.data.showStyleInfo = true
-	end
-	if ObjSettings.showStyleInfo == nil then
-		ObjSettings.showStyleInfo = IIfA.data.showStyleInfo
-	end
-
-
-	-- 2-9-17 AM - convert saved data names into proper language for this session
-    local lang = GetCVar("language.2")
-	if IIfA.data.lastLang == nil or IIfA.data.lastLang ~= lang then
-		IIfA:RenameItems()
-		IIfA.data.lastLang = lang
-	end
-
-	IIfA:SetupCharLookups()
-
-	if IIfA.settings.accountCharacters ~= nil then
-		IIfA.settings.accountCharacters = nil
-	end
-	if IIfA.settings.guildBanks ~= nil then
-		IIfA.settings.guildBanks = nil
-	end
-
-	-- this MUST remain in this location, otherwise it's possible that CollectAll will remove ALL characters data from the list (because they haven't been converted)
-	if IIfA.data.accountCharacters ~= nil then
-		IIfA:ConvertNameToId()
-		IIfA.data.accountCharacters = nil
-	end
-
-	if ObjSettings.bFilterOnSetNameToo == nil then
-		ObjSettings.bFilterOnSetNameToo = false
-		IIfA.data.bFilterOnSetNameToo = false
-	end
-
-	if IIfA.data.guildBanks == nil then
-		IIfA.data.guildBanks = {}
-		local i
-		for i = 1, GetNumGuilds() do
-			local id = GetGuildId(i)
-			local guildName = GetGuildName(id)
-			IIfA.data.guildBanks[guildName] = {bCollectData = true, lastCollected = GetDate() .. "@" .. GetFormattedTime(), items = 0}
-		end
-	end
-
-	if ObjSettings.bInSeparateFrame == nil then
-		ObjSettings.bInSeparateFrame = true
-		IIfA.data.bInSeparateFrame = true
-	end
-
-	IIfA.bFilterOnSetName = ObjSettings.bFilterOnSetName
-	if ObjSettings.bFilterOnSetName == nil then
-		IIfA.bFilterOnSetName = false
-		ObjSettings.bFilterOnSetName = false
-	end
-	IIFA_GUI_SetNameOnly_Checked:SetHidden(not IIfA.bFilterOnSetName)
-
-	IIFA_GUI_Header_Filter_Button0:SetState(BSTATE_PRESSED)
-	IIfA.LastFilterControl = IIFA_GUI_Header_Filter_Button0
-
-	-- save off anchors for the ListHolder
-	local _, point, relTo, relPoint, offsX, offsY = IIFA_GUI_ListHolder:GetAnchor(0)
-	IIFA_GUI_ListHolder.savedAnchor1 = {point, relTo, relPoint, offsX, offsY}
-
-	_, point, relTo, relPoint, offsX, offsY = IIFA_GUI_ListHolder:GetAnchor(1)
-	IIFA_GUI_ListHolder.savedAnchor2 = {point, relTo, relPoint, offsX, offsY}
-
-	IIfA.colorHandler = ZO_ColorDef:New(ObjSettings.in2TextColors)
-	SLASH_COMMANDS["/ii"] = IIfA_SlashCommands
-	IIfA:CreateSettingsWindow(IIfA.settings, default)
-
-	IIfA.CharCurrencyFrame:Initialize(IIfA.data)
-	IIfA.CharBagFrame:Initialize(IIfA.data)
-
-	IIfA:SetupBackpack()	-- setup the inventory frame
-	IIfA:CreateTooltips()	-- setup the tooltip frames
-
-	if (IIfA.data.bConvertedGlyphs == nil or IIfA.data.bConvertedLocType == nil) and IIfA.data.DBv3 == nil then
-		-- glyphs are currently stored by itemid, remove them so it can store them properly by item link
-		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
-			if IIfA.data.bConvertedGlyphs == nil then
-				if DBItem.attributes.itemName:lower():find("glyph") ~= nil and itemLink:find("|") == nil then
-					IIfA.data.DBv2[itemLink] = nil
-				end
-			end
-			for locationName, locData in pairs(DBItem) do
-				if locData.locationType ~= nil then
-					locData.bagID = locData.locationType
-					locData.locationType = nil
-				end
-			end
-		end
-		IIfA.data.bConvertedGlyphs = true
-		IIfA.data.bConvertedLocType = true
-	end
-	if IIfA.data.bConvertedMotifs == nil and IIfA.data.DBv3 == nil then			-- 9-12-16 AM - added whole if to convert motifs to item ids
-		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
-			if itemLink:find("|") ~= nil then			-- not a numeric itemid, it's a link
-				local itemType = GetItemLinkItemType(itemLink)
-				if itemType == ITEMTYPE_RACIAL_STYLE_MOTIF then		-- 9-12-16 AM - added because motifs now appear to have level info in them
-					itemKey = IIfA:GetItemID(itemLink)
-					if IIfA.data.DBv2[itemKey] == nil then
-						IIfA.data.DBv2[itemKey] = DBItem
-						IIfA.data.DBv2[itemLink] = nil
-						IIfA.data.DBv2[itemKey].itemLink = itemLink
-					else
-						for attrib, data in pairs(DBItem) do
-							if data.itemCount ~= nil then
-								if IIfA.data.DBv2[itemKey][attrib].itemCount ~= nil then
-									IIfA.data.DBv2[itemKey][attrib].itemCount = IIfA.data.DBv2[itemKey][attrib].itemCount + data.itemCount
-								else
-									IIfA.data.DBv2[itemKey][attrib] = data
-								end
-							end
-						end
-						IIfA.data.DBv2[itemKey].attributes.itemLink = itemLink
-						IIfA.data.DBv2[itemLink] = nil
-					end
-				end
-			end
-		end
-		IIfA.data.bConvertedMotifs = true
-	end
-
-	if IIfA.data.DBv3 == nil then
-		dbv3 = {}
-		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
-			dbv3[itemLink] = {}
-			dbv3[itemLink].locations = {}
-			dbv3[itemLink].itemQuality = DBItem.attributes.itemQuality
-			dbv3[itemLink].itemName    = DBItem.attributes.itemName
-			dbv3[itemLink].iconFile    = DBItem.attributes.iconFile
-			dbv3[itemLink].filterType  = DBItem.attributes.filterType
-			if DBItem.attributes.itemLink ~= nil then
-				dbv3[itemLink].itemLink = DBItem.attributes.itemLink
-			end
-
-			for locname, locdata in pairs(DBItem) do
-				if locname ~= "attributes" then
-					dbv3[itemLink].locations[locname] = locdata
-				end
-			end
-		end
-		IIfA.data.DBv3 = dbv3
-	end
-
-	IIfA:ActionLayerInventoryUpdate()
-
-	if not ObjSettings.frameSettings.hud.hidden then
-		IIfA:ProcessSceneChange("hud", "showing", "shown")
-	end
---	IIfA:MakeBSI()
-
-	IIfA:RegisterForEvents()
-	IIfA:RegisterForSceneChanges() -- register for callbacks on scene statechanges using user preferences or defaults
-	IIfA:ScanCurrentCharacter()
-	IIfA:ScanBank()
-end
-
-EVENT_MANAGER:RegisterForEvent("IIfALoaded", EVENT_ADD_ON_LOADED, IIfA_onLoad)
-
-function IIfA:MakeBSI()
-	local bs = {}
-	local idx
-	local itemLink, DBItem, locname, data
-	for itemLink, DBItem in pairs(IIfA.data.DBv3) do
-		for locname, data in pairs(DBItem.locations) do
-			if ((data.bagID == BAG_BACKPACK or data.bagID == BAG_WORN) and locname == IIfA.currentCharacterId) or	-- only index items ON this character if they're in backpack
-				(data.bagID ~= BAG_BACKPACK and data.bagID ~= BAG_WORN) then
-				idx = data.bagID
-				if idx == BAG_GUILDBANK then		-- replace idx with appropriate guild bank name instead of the ID for BAG_GUILDBANK (to differentiate guild banks)
-					idx = locname
-				end
-				if bs[idx] == nil then
-					bs[idx] = {}
-				end
-
-				bs[idx][data.bagSlot] = itemLink
-			end
-		end
-	end
-	IIfA.BagSlotInfo = bs
-end
-
-
-
---[[
-for reference
-
-GetCurrentCharacterId()
-Returns: string id
-
-GetNumCharacters()
-Returns: integer numCharacters
-
-GetCharacterInfo(luaindex index)
-Returns: string name,
-		[Gender|#Gender] gender,
-		integer level,
-		integer classId,
-		integer raceId,
-		[Alliance|#Alliance] alliance,
-		string id,
-		integer locationId
-__________________
-	--]]
-
-function IIfA:SetupCharLookups()
-
-	IIfA.CharIdToName = {}
-	IIfA.CharNameToId= {}
-	local charInfo = {}
-	-- create transient pair of lookup arrays, CharIdToName and CharNameToId (for use with the dropdown and converting stored data char name to charid)
-	for i=1, GetNumCharacters() do
-		local charName, _, _, _, _, _, charId, _ = GetCharacterInfo(i)
-		charName = charName:sub(1, charName:find("%^") - 1)
-		IIfA.CharIdToName[charId] = charName
-		IIfA.CharNameToId[charName] = charId
-	end
-end
-
-function IIfA:ConvertNameToId()
-	-- run list of dbv2 items, change names to ids
-	-- ignore attributes, and anything that's in guild bank list
-	-- remaining items are character names (or should be)
-	-- if found in CharNameToId, convert it, otherwise erase whole entry (since it's an orphan)
-	-- do same for settings
-	local tbl = IIfA.data.DBv2
-	if nil == tbl or {} == tbl then return end
-	for itemLink, DBItem in pairs(IIfA.data.DBv2) do
-		for itemDetailName, itemInfo in pairs(DBItem) do
-			local bagID = itemInfo.locationType
-			if bagID ~= nil then
-				if bagID == BAG_BACKPACK or bagID == BAG_WORN then
-					if IIfA.CharNameToId[itemDetailName] ~= nil then
-	--					d("Swapping name to # -- " .. itemLink .. ", " )
-						DBItem[IIfA.CharNameToId[itemDetailName] ] = DBItem[itemDetailName]
-						DBItem[itemDetailName] = nil
-					end
-				end
-			end
-		end
-	end
-end
-
--- used for testing - wipes all craft bag data
-function IIfA:clearvbag()
-	for itemLink, DBItem in pairs(IIfA.data.DBv3) do
-		for locationName, locData in pairs(DBItem.locations) do
---			if locData.bagID ~= nil then
-				if locData.bagID == BAG_VIRTUAL then
-					locData = nil
-					DBItem[locationName] = nil
-				end
---			end
-		end
-	end
-end
diff --git a/IIfA.txt b/IIfA.txt
deleted file mode 100644
index 7305e42..0000000
--- a/IIfA.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-## Title: Inventory Insight
-## Author: manavortex, AssemblerManiac
-## Version: 2.20
-## APIVersion: 100021 100022
-## SavedVariables: IIfA_Settings IIfA_Data
-## OptionalDependsOn: libFilters
-
-libs\LibStub\LibStub.lua
-libs\LibCustomTitles\LibCustomTitles.lua
-libs\LibScroll\LibScroll.lua
-libs\LibMediaProvider-1.0\LibMediaProvider-1.0.lua
-libs\LibAddonMenu-2.0\LibAddonMenu-2.0.lua
-libs\LibAddonMenu-2.0\controls\panel.lua
-libs\LibAddonMenu-2.0\controls\submenu.lua
-libs\LibAddonMenu-2.0\controls\button.lua
-libs\LibAddonMenu-2.0\controls\checkbox.lua
-libs\LibAddonMenu-2.0\controls\colorpicker.lua
-libs\LibAddonMenu-2.0\controls\custom.lua
-libs\LibAddonMenu-2.0\controls\description.lua
-libs\LibAddonMenu-2.0\controls\dropdown.lua
-libs\LibAddonMenu-2.0\controls\editbox.lua
-libs\LibAddonMenu-2.0\controls\header.lua
-libs\LibAddonMenu-2.0\controls\slider.lua
-libs\LibAddonMenu-2.0\controls\texture.lua
-libs\LibAddonMenu-2.0\controls\iconpicker.lua
-libs\LibAddonMenu-2.0\controls\divider.lua
-libs\LibCustomMenu\LibCustomMenu.lua
-
-StringRegistration.lua
-
-IIfA.xml
-Bindings.xml
-CharCurrencyTooltip.lua
-CharBagSpaceTooltip.lua
-IIfA.lua
-Bindings.lua
-IIfASettingsAdapter.lua
-IIfAEvents.lua
-IIfATooltip.lua
-IIfABackpack.lua
-IIfASceneFuncs.lua
-IIfAMenu.lua
-IIfADataCollection.lua
-IIfA_xml_adapter.lua
-
-; DISCLOSURE:
-; This Add-on is not created by, affiliated with or sponsored by ZeniMax
-; Media Inc. or its affiliates. The Elder Scrolls and related logos are
-; registered trademarks or trademarks of ZeniMax Media Inc. in the United
-; States and/or other countries. All rights reserved.
-; You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
diff --git a/IIfA.xml b/IIfA.xml
deleted file mode 100644
index a349e29..0000000
--- a/IIfA.xml
+++ /dev/null
@@ -1,1123 +0,0 @@
-<GuiXml>
-	<Controls>
-		<TopLevelControl name="IIFA_GUI" clampedToScreen="true" mouseEnabled="true" moveable="true" hidden="true" resizeHandleSize="10">
-			<DimensionConstraints minX="410" minY="300" maxY="1400"/>
-			<Anchor point="TOPRIGHT" relativeTo="GUI_ROOT" relativePoint="TOPRIGHT" offsetX="-25" offsetY="40" />
-
-			<OnMoveStop>IIfA:SaveFrameInfo("onMoveStop")</OnMoveStop>
-			<OnResizeStop>IIfA:onResizeStop()</OnResizeStop>
-
-			<Controls>
-				<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
-
-				<Control name="$(parent)_Header" hidden="false" resizeToFitDescendents="true" >
-					<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP"/>
-
-					<Controls>
-<!-- Lock/Unlock buttons -->
-						<Button name="$(parent)_Locked" hidden="true">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="5" offsetY="5"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Allow window movement")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GUILock(false)</OnMouseUp>
-							<Dimensions x="24" y="24" />
-							<Textures normal="/esoui/art/miscellaneous/locked_up.dds"
-										pressed="/esoui/art/miscellaneous/locked_down.dds"
-									 mouseOver="/esoui/art/miscellaneous/locked_over.dds"
-							/>
-						</Button>
-
-						<Button name="$(parent)_Unlocked" >
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Locked" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Lock window in place")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GUILock(true)</OnMouseUp>
-							<Dimensions x="24" y="24" />
-							<Textures normal="/esoui/art/miscellaneous/unlocked_up.dds"
-										pressed="/esoui/art/miscellaneous/unlocked_down.dds"
-									 mouseOver="/esoui/art/miscellaneous/unlocked_over.dds"
-							/>
-						</Button>
-<!-- end of Lock/Unlock buttons -->
-
-<!-- Dock/Undock buttons -->
-						<Button name="$(parent)_Docked" hidden="true">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="35"  offsetY="5"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Un-dock window")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GuiDock(false)</OnMouseUp>
-							<Dimensions x="24" y="24" />
-							<Textures normal="IIfA/assets/icons/docked_up.dds"
-										pressed="IIfA/assets/icons/docked_down.dds"
-									 mouseOver="IIfA/assets/icons/docked_over.dds"
-							/>
-						</Button>
-
-						<Button name="$(parent)_Undocked" >
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Docked" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Dock window")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GuiDock(true)</OnMouseUp>
-							<Dimensions x="24" y="24" />
-							<Textures normal="IIfA/assets/icons/undocked_up.dds"
-										pressed="IIfA/assets/icons/undocked_down.dds"
-									 mouseOver="IIfA/assets/icons/undocked_over.dds"
-							/>
-						</Button>
-<!-- end of Dock/Undock buttons -->
-
-						<Label name="$(parent)_Label" mouseEnabled="false" font="ZoFontBookPaper" text="-Inventory Insight-" >
-							<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="0"/>
-						</Label>
-
-						<Button name="$(parent)_Hide">
-							<Anchor point="TOPRIGHT" relativeTo="IIFA_GUI" relativePoint="TOPRIGHT" offsetX="0" offsetY="3"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Hide window")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GUIButtonHideOnMouseUp()</OnMouseUp>
-							<Dimensions x="25" y="25" />
-							<Textures normal="/esoui/art/buttons/decline_up.dds"
-										pressed="/esoui/art/buttons/decline_down.dds"
-									 mouseOver="/esoui/art/buttons/decline_over.dds"
-							/>
-						</Button>
-
-						<Button name="$(parent)_Minimize" >
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Hide" relativePoint="TOPLEFT" offsetX="-5" offsetY="2"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Minimize window")	</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)	</OnMouseExit>
-							<Dimensions x="20" y="20" />
-							<OnMouseUp>IIfA:GUIMinimize(true)</OnMouseUp>
-							<Textures normal="/esoui/art/buttons/minimize_normal.dds"
-										pressed="/esoui/art/buttons/minimize_mousedown.dds"
-									 mouseOver="/esoui/art/buttons/minimize_mousedown.dds"
-							/>
-						</Button>
-
-						<Button name="$(parent)_Maximize" hidden="true">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Minimize" relativePoint="TOPLEFT" />
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Restore window")	</OnMouseEnter>
-							<OnMouseExit> IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<Dimensions x="20" y="20" />
-							<OnMouseUp>IIfA:GUIMinimize(false)</OnMouseUp>
-							<Textures normal="/esoui/art/buttons/maximize_normal.dds"
-										pressed="/esoui/art/buttons/maximize_down.dds"
-									 mouseOver="/esoui/art/buttons/maximize_down.dds"
-							/>
-						</Button>
-
-
-						<Button name="$(parent)_GoldButton" mouseOverBlendMode="ADD" inherits="ZO_RadioButton">
-							<Dimensions x="32" y="32" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="45"/>
-							<OnMouseEnter>IIfA.CharCurrencyFrame:Show(self)</OnMouseEnter>
-							<OnMouseExit>IIfA.CharCurrencyFrame:Hide(self)</OnMouseExit>
-							<Textures normal="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds"
-										pressed="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds"
-									 mouseOver="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds" />
-						</Button>
-
-						<Button name="$(parent)_BagButton" mouseOverBlendMode="ADD" inherits="ZO_RadioButton">
-							<Dimensions x="24" y="24" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_GoldButton" relativePoint="TOPRIGHT" offsetX="4" offsetY="0"/>
-							<OnMouseEnter>IIfA.CharBagFrame:Show(self)</OnMouseEnter>
-							<OnMouseExit>IIfA.CharBagFrame:Hide(self)</OnMouseExit>
-							<Textures normal="EsoUI/Art/Tooltips/icon_bag.dds"
-										pressed="EsoUI/Art/Tooltips/icon_bag.dds"
- 									 mouseOver="EsoUI/Art/Tooltips/icon_bag.dds" />
- <!--							<TextureCoords left="0" right="1.25" top="0" bottom="1.25" /> -->
-						</Button>
-
-
-						<Control name="$(parent)_Dropdown" inherits="ZO_ComboBox" mouseEnabled="true" >
-							<Dimensions x="200" y="30" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="110" offsetY="40"/>
-
-							<OnShow>	IIfA:GuiSetupDropdown(self)</OnShow>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Select inventory to view")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-						</Control>
-
-						<Control name="$(parent)_Filter" mouseEnabled="true">
-							<Dimensions x="300" y="30" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="50" offsetY="80"/>
-
-							<Controls>
-								<Button name="$(parent)_Button0">
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Items")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "All", nil)</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds"
-									/>
-
-								</Button>
-								<Button name="$(parent)_Button1">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Weapons")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", nil)</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_weapons_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_weapons_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_weapons_over.dds"
-									/>
-								</Button>
-								<Button name="$(parent)_Button2">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Armor")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", nil)</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_armor_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_armor_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_armor_over.dds"
-									/>
-								</Button>
-								<Button name="$(parent)_Button3">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Consumables")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER, ITEMTYPE_FOOD, ITEMTYPE_DRINK, ITEMTYPE_POTION, ITEMTYPE_POISON, ITEMTYPE_RECIPE, ITEMTYPE_RACIAL_STYLE_MOTIF, ITEMTYPE_AVA_REPAIR, ITEMTYPE_TOOL, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_consumables_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_consumables_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_consumables_over.dds"
-									/>
-								</Button>
-								<Button name="$(parent)_Button4">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Crafting Materials")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER, ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_RUNE_POTENCY, ITEMTYPE_FISH, ITEMTYPE_FLAVORING, ITEMTYPE_INGREDIENT, ITEMTYPE_POISON_BASE, ITEMTYPE_POTION_BASE, ITEMTYPE_REAGENT, ITEMTYPE_RAW_MATERIAL, ITEMTYPE_WEAPON_TRAIT, ITEMTYPE_SPICE, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER, ITEMTYPE_STYLE_MATERIAL})</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_crafting_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_crafting_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_crafting_over.dds"
-									/>
-								</Button>
-
-								<Button name="$(parent)_Button5">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Furniture")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
-									<Textures normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
-												pressed="esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
-												mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds"
-									/>
-
-
-								</Button>
-
-								<Button name="$(parent)_Button6">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
-									<Dimensions x="40" y="40" />
-									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Miscellaneous")</OnMouseEnter>
-									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON, ITEMTYPE_SOUL_GEM, ITEMTYPE_SIEGE, ITEMTYPE_LURE, ITEMTYPE_TOOL, ITEMTYPE_REPAIR, ITEMTYPE_TRASH, ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE})</OnMouseUp>
-									<Textures normal="/esoui/art/inventory/inventory_tabicon_misc_up.dds"
-												pressed="/esoui/art/inventory/inventory_tabicon_misc_down.dds"
-												mouseOver="/esoui/art/inventory/inventory_tabicon_misc_over.dds"
-									/>
-								</Button>
-							</Controls>
-						</Control>
-
-<!-- SubFilter Groups -->
-						<Control name="$(parent)_Subfilter" mouseEnabled="true">
-							<Dimensions x="300" y="0" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Filter" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="2"/>
-<!-- SubFilter Group 1 - Weapons -->
-							<Controls>
-								<Control name="$(parent)_1" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Weapons")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", nil)</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "One Handed")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_AXE, WEAPONTYPE_HAMMER, WEAPONTYPE_SWORD, WEAPONTYPE_DAGGER}, {"Axe", "Hammer", "Sword", "Dagger"})</OnMouseUp>
-											<Textures	normal = "IIfA/assets/weapons/onehanded_up.dds"
-															pressed = "IIfA/assets/weapons/onehanded_down.dds"
-															mouseOver = "IIfA/assets/weapons/onehanded_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Two Handed")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_TWO_HANDED_AXE, WEAPONTYPE_TWO_HANDED_HAMMER, WEAPONTYPE_TWO_HANDED_SWORD}, {"Axe 2H", "Hammer 2H", "Sword 2H"})</OnMouseUp>
-											<Textures	normal="IIfA/assets/weapons/twohanded_up.dds"
-															pressed="IIfA/assets/weapons/twohanded_down.dds"
-															mouseOver="IIfA/assets/weapons/twohanded_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Bows")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_BOW})</OnMouseUp>
-											<Textures	normal="IIfA/assets/weapons/bow_up.dds"
-															pressed="IIfA/assets/weapons/bow_down.dds"
-															mouseOver="IIfA/assets/weapons/bow_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Destruction Staves")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_FIRE_STAFF, WEAPONTYPE_FROST_STAFF, WEAPONTYPE_LIGHTNING_STAFF}, {"Flame", "Frost", "Lightning"})</OnMouseUp>
-											<Textures	normal="IIfA/assets/weapons/destruction_up.dds"
-															pressed="IIfA/assets/weapons/destruction_down.dds"
-															mouseOver="IIfA/assets/weapons/destruction_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Healing Staves")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_HEALING_STAFF})</OnMouseUp>
-											<Textures	normal="IIfA/assets/weapons/healing_up.dds"
-															pressed="IIfA/assets/weapons/healing_down.dds"
-															mouseOver="IIfA/assets/weapons/healing_over.dds" />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 1 - Weapons -->
-
-<!-- SubFilter Group 2 - Armor/Clothing -->
-								<Control name="$(parent)_2" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Armor")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", nil)</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Heavy")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_HEAVY, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
-											<Textures	normal="/esoui/art/icons/progression_tabicon_armorheavy_up.dds"
-															pressed="/esoui/art/icons/progression_tabicon_armorheavy_down.dds"
-															mouseOver="/esoui/art/icons/progression_tabicon_armorheavy_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Medium")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_MEDIUM, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
-											<Textures	normal="/esoui/art/icons/progression_tabicon_armormedium_up.dds"
-															pressed="/esoui/art/icons/progression_tabicon_armormedium_down.dds"
-															mouseOver="/esoui/art/icons/progression_tabicon_armormedium_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Light")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_LIGHT, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
-											<Textures	normal="/esoui/art/icons/progression_tabicon_armorlight_up.dds"
-															pressed="/esoui/art/icons/progression_tabicon_armorlight_down.dds"
-															mouseOver="/esoui/art/icons/progression_tabicon_armorlight_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Clothing")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_NONE, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
-											<Textures	normal="IIfA/assets/apparel/clothing_up.dds"
-															pressed="IIfA/assets/apparel/clothing_down.dds"
-															mouseOver="IIfA/assets/apparel/clothing_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Shields")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_SHIELD}, nil)</OnMouseUp>
-											<Textures	normal="IIfA/assets/apparel/shield_up.dds"
-															pressed="IIfA/assets/apparel/shield_down.dds"
-															mouseOver="IIfA/assets/apparel/shield_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button6">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Jewelry")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_NONE, EQUIP_TYPE_RING, EQUIP_TYPE_NECK}, {"Placeholder", "Ring", "Necklace"})</OnMouseUp>
-											<Textures	normal="IIfA/assets/apparel/jewelry_up.dds"
-															pressed="IIfA/assets/apparel/jewelry_down.dds"
-															mouseOver="IIfA/assets/apparel/jewelry_over.dds" />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 2 - Armor/Clothing -->
-
-<!-- SubFilter Group 3 - Consumables -->
-								<Control name="$(parent)_3" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-35" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Consumables")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER, ITEMTYPE_FOOD, ITEMTYPE_DRINK, ITEMTYPE_POTION, ITEMTYPE_POISON, ITEMTYPE_RECIPE, ITEMTYPE_RACIAL_STYLE_MOTIF, ITEMTYPE_MASTER_WRIT, ITEMTYPE_AVA_REPAIR, ITEMTYPE_TOOL, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Food")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_FOOD})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/food/food_up.dds"
-												pressed = "IIfA/assets/consumables/food/food_down.dds"
-												mouseOver = "IIfA/assets/consumables/food/food_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Drink")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_DRINK})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/drinks/drink_up.dds"
-												pressed = "IIfA/assets/consumables/drinks/drink_down.dds"
-												mouseOver = "IIfA/assets/consumables/drinks/drink_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Recipes")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_RECIPE, SPECIALIZED_ITEMTYPE_RECIPE_BLACKSMITHING_DIAGRAM_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_CLOTHIER_PATTERN_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_WOODWORKING_BLUEPRINT_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_ENCHANTING_SCHEMATIC_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_ALCHEMY_FORMULA_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_PROVISIONING_DESIGN_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_PROVISIONING_STANDARD_FOOD}, {"Placeholder", "Diagrams", "Patterns", "Blueprints", "Schematics", "Formulae", "Faux Food/Candles", "Food/Drink"})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/recipes/recipe_up.dds"
-												pressed = "IIfA/assets/consumables/recipes/recipe_down.dds"
-												mouseOver = "IIfA/assets/consumables/recipes/recipe_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Potions")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_POTION})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/potion/potion_up.dds"
-												pressed = "IIfA/assets/consumables/potion/potion_down.dds"
-												mouseOver = "IIfA/assets/consumables/potion/potion_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Poisons")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_POISON})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/poison/poison_up.dds"
-												pressed = "IIfA/assets/consumables/poison/poison_down.dds"
-												mouseOver = "IIfA/assets/consumables/poison/poison_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button6">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Motifs")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_RACIAL_STYLE_MOTIF})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/motifs/motif_up.dds"
-												pressed = "IIfA/assets/consumables/motifs/motif_down.dds"
-												mouseOver = "IIfA/assets/consumables/motifs/motif_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button7">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Master Writs")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_MASTER_WRIT})</OnMouseUp>
-											<Textures
-												normal = "esoui/art/crafting/formulae_tabicon_up.dds"
-												pressed = "esoui/art/crafting/formulae_tabicon_down.dds"
-												mouseOver = "esoui/art/crafting/formulae_tabicon_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button8">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Containers")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/containers/container_up.dds"
-												pressed = "IIfA/assets/consumables/containers/container_down.dds"
-												mouseOver = "IIfA/assets/consumables/containers/container_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button9">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button8" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Repair")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_AVA_REPAIR, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/repair/repair_up.dds"
-												pressed = "IIfA/assets/consumables/repair/repair_down.dds"
-												mouseOver = "IIfA/assets/consumables/repair/repair_over.dds" />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 3 - Consumables -->
-
-<!-- SubFilter Group 4 - Crafting Materials -->
-								<Control name="$(parent)_4" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-40" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Materials")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER, ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_RUNE_POTENCY, ITEMTYPE_FISH, ITEMTYPE_FLAVORING, ITEMTYPE_INGREDIENT, ITEMTYPE_POISON_BASE, ITEMTYPE_POTION_BASE, ITEMTYPE_REAGENT, ITEMTYPE_RAW_MATERIAL, ITEMTYPE_WEAPON_TRAIT, ITEMTYPE_SPICE, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER, ITEMTYPE_STYLE_MATERIAL, ITEMTYPE_FURNISHING_MATERIAL})</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Smithing")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER}, {"Raw Material", "Material", "Temper"})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Clothier")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER}, {"Raw Material", "Material", "Tannin"})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Woodworking")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER}, {"Raw Material", "Material", "Resin"})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Alchemy")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_REAGENT, ITEMTYPE_POTION_BASE, ITEMTYPE_POISON_BASE}, {"Reagent", "Potion Base", "Poison Base"})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Enchanting")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_ENCHANTING_RUNE_POTENCY}, {"Aspect", "Essence", "Potency"})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button6">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Provisioning")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_INGREDIENT})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button7">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Styles")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_STYLE_MATERIAL})</OnMouseUp>
-											<Textures
-												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_up.dds"
-												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_down.dds"
-												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button8">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Weapon Traits")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_WEAPON_TRAIT})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/materials/wtrait/wtrait_up.dds"
-												pressed = "IIfA/assets/materials/wtrait/wtrait_down.dds"
-												mouseOver = "IIfA/assets/materials/wtrait/wtrait_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button9">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button8" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Armor Traits")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/materials/atrait/atrait_up.dds"
-												pressed = "IIfA/assets/materials/atrait/atrait_down.dds"
-												mouseOver = "IIfA/assets/materials/atrait/atrait_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button10">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button9" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
-											<Dimensions x="36" y="36"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Furnishing")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_FURNISHING_MATERIAL})</OnMouseUp>
-											<Textures
-												normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
-												pressed="esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
-												mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds" />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 4 - Crafting Materials -->
-
-<!-- SubFilter Group 5 - Furniture -->
-								<Control name="$(parent)_5" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Furniture")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Crafting Stations")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION})</OnMouseUp>
-											<Textures	normal = "/esoui/art/treeicons/housing_indexicon_workshop_up.dds"
-															pressed = "/esoui/art/treeicons/housing_indexicon_workshop_down.dds"
-															mouseOver = "/esoui/art/treeicons/housing_indexicon_workshop_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Lights")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT})</OnMouseUp>
-											<Textures	normal="/esoui/art/treeicons/housing_indexicon_shrine_up.dds"
-															pressed="/esoui/art/treeicons/housing_indexicon_shrine_down.dds"
-															mouseOver="/esoui/art/treeicons/housing_indexicon_shrine_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Ornamental")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL})</OnMouseUp>
-											<Textures	normal="/esoui/art/treeicons/housing_indexicon_gallery_up.dds"
-															pressed="/esoui/art/treeicons/housing_indexicon_gallery_down.dds"
-															mouseOver="/esoui/art/treeicons/housing_indexicon_gallery_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Seating")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING})</OnMouseUp>
-											<Textures	normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
-															pressed="/esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
-															mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Target Dummies")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
-											<Textures	normal="/esoui/art/treeicons/collection_indexicon_weapons+armor_up.dds"
-															pressed="/esoui/art/treeicons/collection_indexicon_weapons+armor_down.dds"
-															mouseOver="/esoui/art/treeicons/collection_indexicon_weapons+armor_over.dds" />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 5 - Furniture -->
-
-<!-- SubFilter Group 6 - Miscellaneous -->
-								<Control name="$(parent)_6" mouseEnabled="true" hidden="true">
-									<Dimensions x="300" y="0" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-35" offsetY="0"/>
-									<Controls>
-										<Button name="$(parent)_Button0">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Misc.")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON, ITEMTYPE_SOUL_GEM, ITEMTYPE_SIEGE, ITEMTYPE_LURE, ITEMTYPE_TOOL, ITEMTYPE_REPAIR, ITEMTYPE_TRASH, ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE})</OnMouseUp>
-											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
-															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
-															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
-										</Button>
-										<Button name="$(parent)_Button1">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Glyphs")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON}, {"Glyph - Armor", "Glyph - Jewelry", "Glyph - Weapon"})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/glyphs/glyphs_up.dds"
-												pressed = "IIfA/assets/miscellaneous/glyphs/glyphs_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/glyphs/glyphs_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button2">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Soul Gems")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_SOUL_GEM})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/soulgem/soulgem_up.dds"
-												pressed = "IIfA/assets/miscellaneous/soulgem/soulgem_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/soulgem/soulgem_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button3">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Siege")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_SIEGE})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds"
-												pressed = "IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button4">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Bait")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_LURE})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/bait/bait_up.dds"
-												pressed = "IIfA/assets/miscellaneous/bait/bait_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/bait/bait_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button5">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Tools")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TOOL})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/consumables/repair/repair_up.dds"
-												pressed = "IIfA/assets/consumables/repair/repair_down.dds"
-												mouseOver = "IIfA/assets/consumables/repair/repair_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button6">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Trophy")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE}, {"Trophy", "Collectible", "Fish", "Treasure"})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/trophy/trophy_up.dds"
-												pressed = "IIfA/assets/miscellaneous/trophy/trophy_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/trophy/trophy_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button7">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Stolen")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Stolen", nil)</OnMouseUp>
-											<Textures
-												normal = "/esoui/art/vendor/vendor_tabicon_fence_up.dds"
-												pressed = "/esoui/art/vendor/vendor_tabicon_fence_down.dds"
-												mouseOver = "/esoui/art/vendor/vendor_tabicon_fence_over.dds"
-											 />
-										</Button>
-										<Button name="$(parent)_Button8">
-											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-											<Dimensions x="38" y="38"/>
-											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Trash")</OnMouseEnter>
-											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TRASH})</OnMouseUp>
-											<Textures
-												normal = "IIfA/assets/miscellaneous/trash/trash_up.dds"
-												pressed = "IIfA/assets/miscellaneous/trash/trash_down.dds"
-												mouseOver = "IIfA/assets/miscellaneous/trash/trash_over.dds"
-											 />
-										</Button>
-									</Controls>
-								</Control>
-<!-- End SubFilter Group 6 - Miscellaneous -->
-
-							</Controls>
-						</Control>
-<!-- End SubFilter Groups -->
-
-						<Control name="$(parent)_SortBar" mouseEnabled="true">
-
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Subfilter" relativePoint="BOTTOMLEFT" offsetY="3" offsetX="-50" />
-							<Dimensions y="30" x="110"/>
-
-							<Controls>
-								<Button name="$(parent)_Sort" verticalAlignment="LEFT"  mouseEnabled="true">
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="2" />
-									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="2" />
-									<OnMouseUp>IIfA:GuiOnSort()</OnMouseUp>
-									<Controls>
-
-										<Texture name="$(parent)_Icon">
-											<Dimensions x="30" y="30"/>
-											<Anchor point="LEFT" relativeTo="$(parent)" relativePoint="LEFT" offsetX="10" />
-										</Texture>
-
-										<Label name="$(parent)_SortName" hidden="false" text="Name" mouseEnabled="false" font="ZoFontGameLargeBold">
-											<Anchor point="LEFT" relativeTo="$(parent)_Icon" relativePoint="RIGHT" offsetX="20" />
-										</Label>
-
-									</Controls>
-								</Button>
-
-								<Control name="$(parent)_Subfilter_Dropdown" inherits="ZO_ComboBox" mouseEnabled="true" hidden="true">
-									<Dimensions x="150" y="30" />
-									<Anchor point="TOPLEFT" relativeTo="$(parent)_Sort_SortName" relativePoint="TOPRIGHT" offsetX="90" offsetY="0"/>
-								</Control>
-
-							</Controls>
-
-						</Control>
-
-					</Controls>
-				</Control>
-
-				<Control name="$(parent)_Search" mouseEnabled="true" resizeToFitDescendents="true">
-
-					<Anchor point="BOTTOMLEFT" relativeTo="$(parent)" relativePoint="BOTTOMLEFT" offsetX="16" offsetY="-30"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="-16" offsetY="-30"/>
-
-					<Controls>
-
-						<EditBox name="$(parent)Box"  inherits="ZO_InventorySearchBox" >
-
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="20"/>
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="0" offsetY="20"/>
-
-							<OnTextChanged>IIfA:GuiOnSearchboxText(self)</OnTextChanged>
-							<Controls>
-								<Backdrop name="$(parent)_bg" inherits="ZO_ThinBackdrop" centerColor="591141" >
-								</Backdrop>
-							</Controls>
-						</EditBox>
-						<Button name="$(parent)_Clear">
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-1" offsetY="22"/>
-							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Clear Search Text")</OnMouseEnter>
-							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
-							<OnMouseUp>IIfA:GuiOnSearchBoxClear()</OnMouseUp>
-							<Dimensions x="23" y="23" />
-							<Textures normal="/esoui/art/buttons/decline_up.dds"
-										pressed="/esoui/art/buttons/decline_down.dds"
-									 mouseOver="/esoui/art/buttons/decline_over.dds"
-							/>
-						</Button>
-					</Controls>
-				</Control>
-
-				<Control name="$(parent)_SetNameOnly" mouseEnabled="true">
-					<Anchor point="BOTTOMLEFT" relativeTo="$(parent)_Search" relativePoint="TOPLEFT" offsetX="0" offsetY="-8"/>
-					<Controls>
-						<Button name="$(parent)_Box">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-							<Dimensions x="20" y="20"/>
-							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
-							<Textures
-								normal = "esoui/art/buttons/swatchframe_down.dds"
-							 />
-						</Button>
-						<Button name="$(parent)_Checked" hidden="true">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
-							<Dimensions x="20" y="20"/>
-							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
-							<Textures
-								normal = "esoui/art/buttons/decline_up.dds"
-							 />
-						</Button>
-						<Label name="$(parent)_Label" mouseEnabled="true" font="ZoFontGame" text="|cC5C29EFilter on Set Name only|r">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Box" relativePoint="TOPRIGHT" offsetX="5" offsetY="-3"/>
-							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
-						</Label>
-
-					</Controls>
-				</Control>
-
-				<Control name="$(parent)_ListHolder" mouseEnabled="true">
-					<DimensionConstraints  minY="52"/>
-					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="15" offsetY="150"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="-27" offsetY="-75"/>
-					<OnMouseWheel>IIfA:GuiOnScroll(self, delta)</OnMouseWheel>
-
-					<Controls>
-						<Slider name="$(parent)_Slider" mouseEnabled="true" step="1" inherits="ZO_VerticalScrollbarBase">
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="16" offsetY="0"/>
-							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="16" offsetY="0"/>
-
-							<OnMouseDown>self.locked = false</OnMouseDown>
-							<OnMouseUp>self.locked = true</OnMouseUp>
-							<OnValueChanged>IIfA:GuiOnSliderUpdate(self, value)</OnValueChanged>
-						</Slider>
-
-					</Controls>
-
-				</Control>
-
-
-			</Controls>
-
-		</TopLevelControl>
-
-
-		<Control name="IIFA_SlotTemplate" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
-			<Dimensions x="300" y="52" />
-			<Controls>
-				<Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds" alpha="0.4">
-					<AnchorFill />
-					<TextureCoords left="0" right="1" top="0" bottom=".8125" />
-				</Texture>
-
-				<Button name="$(parent)Button" inherits="ZO_InventorySlotNoMouseover">
-					<Dimensions x="40" y="40" />
-					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="0" offsetY="3" />
-				</Button>
-
-				<Label name="$(parent)Qty" font="ZoFontGameShadow" horizontalAlignment="RIGHT" verticalAlignment="CENTER">
-					<Dimensions x="44" y="50"/>
-					<Anchor point="TOPLEFT" relativeTo="$(parent)Button" relativePoint="TOPRIGHT" offsetX="8" offsetY="-3" />
-				</Label>
-
-				<Label name="$(parent)Name" font="ZoFontGameShadow" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
-					<Dimensions y="50" />
-					<Anchor point="TOPLEFT" relativeTo="$(parent)Qty" relativePoint="TOPRIGHT" offsetX="18" offsetY="0"/>
-					<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
-				</Label>
-
-				<Texture name="$(parent)IconWorn" textureFile="esoui/art/campaign/overview_indexicon_bonus_disabled.dds" alpha="0.8" hidden="true">
-					<Dimensions x="20" y="20"/>
-					<Anchor point="TOPRIGHT" relativeTo="$(parent)Button" relativePoint="TOPLEFT" />
-				</Texture>
-
-				<Texture name="$(parent)IconStolen" textureFile="esoui/art/inventory/inventory_stolenitem_icon.dds" alpha="0.4" >
-					<Dimensions x="20" y="20"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)Button" relativePoint="BOTTOMLEFT" />
-				</Texture>
-			</Controls>
-		</Control>
-
-
-
-			<!-- tooltips -->
-			<Tooltip name="IIFA_POPUP_TOOLTIP" hidden="true" mouseEnabled="false" movable="false" clampedToScreen="true" virtual="true" inherits="ItemTooltipBase">
-				<Dimensions  x="416" y="200" />
-				<Anchor point="TOP" relativeTo="PopupTooltip" relativePoint="BOTTOM" offsetX="0" offsetY="0" />
-				<Controls>
-					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="" hidden="true">
-						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
-					</Label>
-					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
-						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
-						<Dimensions x="50" y="50" />
-					</Texture>
-				</Controls>
-			</Tooltip>
-
-			<Tooltip name="IIFA_ITEM_TOOLTIP" hidden="true" mouseEnabled="false" movable="false" clampedToScreen="true" virtual="true" inherits="ItemTooltipBase">
-				<Dimensions  x="200" y="200" />
-				<Anchor point="TOP" relativeTo="ItemTooltip" relativePoint="BOTTOM" offsetX="0" offsetY="0" />
-				<Controls>
-					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="" hidden="true">
-						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
-					</Label>
-					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
-						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
-						<Dimensions x="50" y="50" />
-					</Texture>
-				</Controls>
-			</Tooltip>
-
-			<Control name="IIFA_TT_Template" hidden="true" virtual="true">
-				<Controls>
-					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="">
-						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
-					</Label>
-					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
-						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
-						<Dimensions x="64" y="64" />
-					</Texture>
-				</Controls>
-			</Control>
-
-
-			<TopLevelControl name="IIFA_CharCurrencyFrame" clampedToScreen="true" hidden="true">
-				<Dimensions x="467" />
-				<Controls>
-					<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
-					<Label name="$(parent)_Title" font="ZoFontGameShadow" text="" horizontalAlignment="CENTER">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="467" y="26" />
-					</Label>
-					<Label name="$(parent)_TitleCharName" font="ZoFontGameShadow" text="">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_Title" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="165" y="24" />
-					</Label>
-					<Texture name="$(parent)CURT_MONEY">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="TOPRIGHT" offsetX="54" offsetY="4" />
-					</Texture>
-					<Texture name="$(parent)CURT_TELVAR_STONES">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_MONEY" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
-					</Texture>
-					<Texture name="$(parent)CURT_ALLIANCE_POINTS">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_TELVAR_STONES" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
-					</Texture>
-					<Texture name="$(parent)CURT_WRIT_VOUCHERS">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_ALLIANCE_POINTS" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
-					</Texture>
-					<Texture name="$(parent)_Divider" inherits="ZO_Options_Divider">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="490" y="3" />
-					</Texture>
-				</Controls>
-			</TopLevelControl>
-
-			<Control name="IIFA_CharCurrencyRow" virtual="true">
-				<Dimensions x="463" y="24" />
-				<Controls>
-					<Label name="$(parent)charName" font="ZoFontGameShadow" text="">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="165" y="24" />
-					</Label>
-					<Label name="$(parent)qtyGold" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)charName" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="72" y="24" />
-					</Label>
-					<Label name="$(parent)qtyTV" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyGold" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="72" y="24" />
-					</Label>
-					<Label name="$(parent)qtyAP" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyTV" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="72" y="24" />
-					</Label>
-					<Label name="$(parent)qtyWV" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyAP" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="68" y="24" />
-					</Label>
-				</Controls>
-			</Control>
-
-			<TopLevelControl name="IIFA_CharBagFrame" clampedToScreen="true" hidden="true">
-				<Dimensions x="274" />
-				<Controls>
-					<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
-					<Label name="$(parent)_Title" font="ZoFontGameShadow" text="" horizontalAlignment="CENTER">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="274" y="26" />
-					</Label>
-					<Label name="$(parent)_TitleCharName" font="ZoFontGameShadow" text="">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_Title" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="165" y="24" />
-					</Label>
-					<Label name="$(parent)_TitleUsed" font="ZoFontGameShadow" text="Used" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="TOPRIGHT" offsetX="0" offsetY="0" />
-						<Dimensions x="50" y="24" />
-					</Label>
-					<Label name="$(parent)_TitleMax" font="ZoFontGameShadow" text="Size" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleUsed" relativePoint="TOPRIGHT" offsetX="5" offsetY="0" />
-						<Dimensions x="55" y="24" />
-					</Label>
-					<Texture name="$(parent)_Divider" inherits="ZO_Options_Divider">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="288" y="3" />
-					</Texture>
-				</Controls>
-			</TopLevelControl>
-
-			<Control name="IIFA_CharBagRow" virtual="true">
-				<Dimensions x="262" y="24" />
-				<Controls>
-					<Label name="$(parent)charName" font="ZoFontGameShadow" text="">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
-						<Dimensions x="165" y="24" />
-					</Label>
-					<Label name="$(parent)spaceUsed" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)charName" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="42" y="24" />
-					</Label>
-					<Label name="$(parent)spaceMax" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
-						<Anchor point="TOPLEFT" relativeTo="$(parent)spaceUsed" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
-						<Dimensions x="55" y="24" />
-					</Label>
-				</Controls>
-			</Control>
-
-		</Controls>
-</GuiXml>
diff --git a/IIfA/Bindings.lua b/IIfA/Bindings.lua
new file mode 100644
index 0000000..d83f7cc
--- /dev/null
+++ b/IIfA/Bindings.lua
@@ -0,0 +1,3 @@
+-- this puts the item in the bind list, toggle call is in bindings.xml
+ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_INVENTORY_FRAME", "Toggle Inventory Frame")
+
diff --git a/IIfA/Bindings.xml b/IIfA/Bindings.xml
new file mode 100644
index 0000000..3a0e42c
--- /dev/null
+++ b/IIfA/Bindings.xml
@@ -0,0 +1,9 @@
+<Bindings>
+  <Layer name="SI_KEYBINDINGS_CATEGORY_GENERAL">
+    <Category name="Inventory Insight">
+      <Action name="TOGGLE_INVENTORY_FRAME">
+        <Down>IIfA:ToggleInventoryFrame()</Down>
+      </Action>
+    </Category>
+  </Layer>
+</Bindings>
diff --git a/IIfA/CharBagSpaceTooltip.lua b/IIfA/CharBagSpaceTooltip.lua
new file mode 100644
index 0000000..fb57591
--- /dev/null
+++ b/IIfA/CharBagSpaceTooltip.lua
@@ -0,0 +1,241 @@
+local CharBagFrame = ZO_Object:Subclass()
+if IIfA == nil then IIfA = {} end
+IIfA.CharBagFrame = CharBagFrame
+
+--[[ not currently used
+local function HexToN(sHexVal)
+	local Nibble1=0
+	local Nibble2=0
+	Nibble1, Nibble2=string.byte(sHexVal,1,2)
+	if Nibble1>=65 then
+		Nibble1=Nibble1-55
+	else
+		Nibble1=Nibble1-48
+	end
+	if Nibble2>=65 then
+		Nibble2=Nibble2-55
+	else
+		Nibble2=Nibble2-48
+	end
+	local Byte=Nibble1*16+Nibble2
+	return Byte/255
+end
+--]]
+
+local function nToHex(Byte)
+--	local Byte=nVal * 255
+	local Nibble1=math.floor(Byte/16)
+	local Nibble2=Byte-(Nibble1*16)
+	local Part1=string.char(Nibble1+48)
+	local Part2=string.char(Nibble2+48)
+	if Nibble1>9 then
+		Part1=string.char(Nibble1+55)
+	end
+	if Nibble2>9 then
+		Part2=string.char(Nibble2+55)
+	end
+	return string.format("%s%s", Part1, Part2)
+end
+
+function CharBagFrame:rgb2hex(ay)
+	-- local rtn
+	return string.format("%s%s%s", nToHex(ay.r * 255), nToHex(ay.g * 255), nToHex(ay.b * 255))
+	-- return rtn
+end
+
+local function ColorStart(colorHTML)
+	return string.format("%s%s", "|c",string.sub(colorHTML,1,6))
+end
+
+function CharBagFrame:ComputeColorAndText(spaceCurr, spaceMax)
+	local usedBagPercent = tonumber(spaceCurr) * 100 / tonumber(spaceMax)
+	local cs = ""
+	if spaceCurr == spaceMax then
+		return ColorStart(self.ColorFull)
+	else
+		if usedBagPercent >= self.parent.BagSpaceAlert.threshold then
+			cs = ColorStart(self.ColorAlert)
+		else
+			if usedBagPercent >= self.parent.BagSpaceWarn.threshold then
+				cs = ColorStart(self.ColorWarn)
+			end
+		end
+	end
+	return cs .. spaceCurr
+end
+
+
+function CharBagFrame:SetQty(control, field, qty)
+	local ctl = control:GetNamedChild(field)
+	ctl:SetText(qty)
+end
+
+function CharBagFrame:UpdateAssets()
+	if self.currAssets ~= nil then
+		self.currAssets.spaceUsed = GetNumBagUsedSlots(BAG_BACKPACK)
+		self.currAssets.spaceMax = GetBagSize(BAG_BACKPACK)
+	end
+end
+
+function CharBagFrame:FillCharAndBank()
+	self:UpdateAssets()
+
+	local spaceUsed = self.currAssets.spaceUsed
+	local spaceMax = self.currAssets.spaceMax
+	local bankMax = GetBagSize(BAG_BANK)
+	if IsESOPlusSubscriber() then
+		bankMax = bankMax + GetBagSize(BAG_SUBSCRIBER_BANK)
+	end
+	local bankUsed = GetNumBagUsedSlots(BAG_BANK)
+	bankUsed = bankUsed + GetNumBagUsedSlots(BAG_SUBSCRIBER_BANK)
+
+	self:SetQty(self.charControl, "spaceUsed", self:ComputeColorAndText(spaceUsed, spaceMax))
+	self:SetQty(self.charControl, "spaceMax", spaceMax)
+
+	self:SetQty(self.bankControl, "spaceUsed", self:ComputeColorAndText(bankUsed, bankMax))
+	self:SetQty(self.bankControl, "spaceMax", bankMax)
+
+	spaceUsed = spaceUsed + bankUsed + self.totSpaceUsed
+	spaceMax = spaceMax + bankMax + self.totSpaceMax
+
+	self:SetQty(self.totControl, "spaceUsed", spaceUsed)
+	self:SetQty(self.totControl, "spaceMax", spaceMax)
+end
+
+function CharBagFrame:RepaintSpaceUsed()
+	-- loop through characters
+	local assets = self.parent.assets
+	for i=1, GetNumCharacters() do
+		local _, _, _, _, _, _, charId, _ = GetCharacterInfo(i)
+		tControl = GetControl("IIFA_GUI_Bag_Grid_Row_" .. i)
+		if charId ~= currId then
+			if assets[charId] ~= nil then
+				if assets[charId].spaceUsed ~= nil then
+					self:SetQty(tControl, "spaceUsed", self:ComputeColorAndText(assets[charId].spaceUsed, assets[charId].spaceMax))
+					self:SetQty(tControl, "spaceMax", assets[charId].spaceMax)
+				end
+			end
+		end
+	end
+end
+
+
+function CharBagFrame:Initialize(objectForAssets)
+	local function ComputeSpaceUsedText(spaceUsed, spaceMax)
+		-- returns color coded
+	end
+
+	self.frame = IIFA_CharBagFrame
+	local tControl
+	local prevControl = self.frame
+	local currId = GetCurrentCharacterId()
+
+	if objectForAssets.assets == nil then
+		objectForAssets.assets = {}
+	end
+	local assets = objectForAssets.assets
+	self.parent = objectForAssets
+
+	if assets[currId] == nil then
+		assets[currId] = {}
+		assets[currId].spaceUsed = 0
+		assets[currId].spaceMax = 0
+	else
+		if assets[currId].spaceUsed == nil then
+			assets[currId].spaceUsed = 0
+		end
+		if assets[currId].spaceMax == nil then
+			assets[currId].spaceMax = 0
+		end
+	end
+	if objectForAssets.BagSpaceWarn == nil then
+		objectForAssets.BagSpaceWarn = { threshold = 85, r = 230 / 255, g = 130 / 255, b = 0 }
+		objectForAssets.BagSpaceAlert = { threshold = 95, r = 1, g = 1, b = 0 }
+		objectForAssets.BagSpaceFull = { r = 1, g = 0, b = 0 }
+	end
+
+	self.ColorWarn = self:rgb2hex(objectForAssets.BagSpaceWarn)
+	self.ColorAlert = self:rgb2hex(objectForAssets.BagSpaceAlert)
+	self.ColorFull = self:rgb2hex(objectForAssets.BagSpaceFull)
+
+	self.currAssets = objectForAssets.assets[currId]
+
+	self.frame:SetAnchor(TOPLEFT, IIFA_GUI_Header_BagButton, TOPRIGHT, 5, 0)
+	self.totSpaceUsed = 0
+	self.totSpaceMax = 0
+
+	for i=1, GetNumCharacters() do
+		local charName, _, _, _, _, alliance, charId, _ = GetCharacterInfo(i)
+		charName = charName:sub(1, charName:find("%^") - 1)
+		tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Grid_Row_" .. i, self.frame, "IIFA_CharBagRow")
+		if i == 1 then
+			tControl:SetAnchor(TOPLEFT, prevControl:GetNamedChild("_Title"), BOTTOMLEFT, 0, 30)
+			prevControl:GetNamedChild("_Title"):SetText("Bag Space")
+			prevControl:GetNamedChild("_TitleCharName"):SetText(GetString(SI_GROUP_LIST_PANEL_NAME_HEADER))
+		else
+			tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 2)
+		end
+		tControl:GetNamedChild("charName"):SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+		tControl:GetNamedChild("charName"):SetText(GetAllianceColor(alliance):Colorize(charName))
+		if charId == currId then
+			self.charControl = tControl
+		else
+			if assets[charId] ~= nil then
+				if assets[charId].spaceUsed ~= nil then
+					self.totSpaceUsed = self.totSpaceUsed + assets[charId].spaceUsed
+					self.totSpaceMax = self.totSpaceMax + assets[charId].spaceMax
+
+					self:SetQty(tControl, "spaceUsed", self:ComputeColorAndText(assets[charId].spaceUsed, assets[charId].spaceMax))
+					self:SetQty(tControl, "spaceMax", assets[charId].spaceMax)
+				end
+			end
+		end
+		prevControl = tControl
+	end
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Divider1", self.frame, "ZO_Options_Divider")
+	tControl:SetDimensions(288, 3)
+    tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 0)
+    tControl:SetAlpha(1)
+	self.divider1 = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Bank", self.frame, "IIFA_CharBagRow")
+	tControl:GetNamedChild("charName"):SetText(GetString(SI_CURRENCYLOCATION1))
+	tControl:SetAnchor(TOPLEFT, self.divider1, BOTTOMLEFT, 0, 0)
+	self.bankControl = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Divider2", self.frame, "ZO_Options_Divider")
+	tControl:SetDimensions(288, 3)
+    tControl:SetAnchor(TOPLEFT, self.bankControl, BOTTOMLEFT, 0, 0)
+    tControl:SetAlpha(1)
+	self.divider2 = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_Bag_Row_Tots", self.frame, "IIFA_CharBagRow")
+	tControl:GetNamedChild("charName"):SetText("Totals")
+	tControl:SetAnchor(TOPLEFT, self.divider2, BOTTOMLEFT, 0, 0)
+	self.totControl = tControl
+
+	self.frame:SetHeight((GetNumCharacters() + 4) * 26)	-- numchars + 4 represents # chars + bank + total + title and col titles
+
+	self:FillCharAndBank()
+
+	self.isInitialized = true
+end
+
+function CharBagFrame:Show(control)
+	if self.isInitialized == nil then return end
+	if not self.isShowing then
+		self.isShowing = true
+		self:FillCharAndBank()
+		self.frame:SetHidden(false)
+	end
+end
+
+function CharBagFrame:Hide(control)
+	if self.isInitialized == nil then return end
+	if self.isShowing then
+		self.isShowing = false
+		self.frame:SetHidden(true)
+	end
+end
+
diff --git a/IIfA/CharCurrencyTooltip.lua b/IIfA/CharCurrencyTooltip.lua
new file mode 100644
index 0000000..2d92da1
--- /dev/null
+++ b/IIfA/CharCurrencyTooltip.lua
@@ -0,0 +1,205 @@
+local CharCurrencyFrame = ZO_Object:Subclass()
+if IIfA == nil then IIfA = {} end
+IIfA.CharCurrencyFrame = CharCurrencyFrame
+
+function CharCurrencyFrame:SetQty(control, field, fieldType, qty)
+	local ctl = control:GetNamedChild(field)
+	if qty == nil then
+		qty = 0
+	end
+	ZO_CurrencyControl_SetSimpleCurrency(ctl, fieldType, qty, ZO_KEYBOARD_CARRIED_CURRENCY_OPTIONS)
+	-- text in control looks like this
+    -- "@|u0:4:currency:1,748,124|u|t12:12:EsoUI/Art/currency/currency_gold.dds|t",
+	-- need to chop off the |t and all after to get rid of the icon
+
+	local ctlText = ctl:GetText()
+	ctl:SetText(ctlText:sub(1, ctlText:find("|t") - 1))
+end
+
+function CharCurrencyFrame:UpdateAssets()
+	if self.currAssets ~= nil then
+		self.currAssets.gold = GetCarriedCurrencyAmount(CURT_MONEY)
+		self.currAssets.tv = GetCarriedCurrencyAmount(CURT_TELVAR_STONES)
+		self.currAssets.ap = GetCarriedCurrencyAmount(CURT_ALLIANCE_POINTS)
+		self.currAssets.wv = GetCarriedCurrencyAmount(CURT_WRIT_VOUCHERS)
+	end
+end
+
+function CharCurrencyFrame:FillCharAndBank()
+	self:UpdateAssets()
+
+	local gold = self.currAssets.gold
+	local tv = self.currAssets.tv
+	local ap = self.currAssets.ap
+	local wv = self.currAssets.wv
+
+	self:SetQty(self.charControl, "qtyGold", CURT_MONEY, gold)
+	self:SetQty(self.charControl, "qtyTV", CURT_TELVAR_STONES, tv)
+	self:SetQty(self.charControl, "qtyAP", CURT_ALLIANCE_POINTS, ap)
+	self:SetQty(self.charControl, "qtyWV", CURT_WRIT_VOUCHERS, wv)
+
+	self:SetQty(self.bankControl, "qtyGold", CURT_MONEY, GetBankedCurrencyAmount(CURT_MONEY))
+	self:SetQty(self.bankControl, "qtyTV", CURT_TELVAR_STONES, GetBankedCurrencyAmount(CURT_TELVAR_STONES))
+	self:SetQty(self.bankControl, "qtyAP", CURT_ALLIANCE_POINTS, GetBankedCurrencyAmount(CURT_ALLIANCE_POINTS))
+	self:SetQty(self.bankControl, "qtyWV", CURT_WRIT_VOUCHERS, GetBankedCurrencyAmount(CURT_WRIT_VOUCHERS))
+
+	gold = gold + GetBankedCurrencyAmount(CURT_MONEY) + self.totGold
+	tv = tv + GetBankedCurrencyAmount(CURT_TELVAR_STONES) + self.totTV
+	ap = ap + GetBankedCurrencyAmount(CURT_ALLIANCE_POINTS) + self.totAP
+	wv = wv + GetBankedCurrencyAmount(CURT_WRIT_VOUCHERS) + self.totWV
+
+	self:SetQty(self.totControl, "qtyGold", CURT_MONEY, gold)
+	self:SetQty(self.totControl, "qtyTV", CURT_TELVAR_STONES, tv)
+	self:SetQty(self.totControl, "qtyAP", CURT_ALLIANCE_POINTS, ap)
+	self:SetQty(self.totControl, "qtyWV", CURT_WRIT_VOUCHERS, wv)
+
+-- field width testing
+--	self:SetQty(self.totControl, "qtyGold", CURT_MONEY, 99999999)
+--	self:SetQty(self.totControl, "qtyTV", CURT_TELVAR_STONES, 99999999)
+--	self:SetQty(self.totControl, "qtyAP", CURT_ALLIANCE_POINTS, 99999999)
+end
+
+
+function CharCurrencyFrame:Initialize(objectForAssets)
+	self.frame = IIFA_CharCurrencyFrame
+	local tControl
+	local prevControl = self.frame
+	local currId = GetCurrentCharacterId()
+
+	local iconSize = 18
+	prevControl:GetNamedChild("CURT_MONEY"):SetTexture(GetCurrencyKeyboardIcon(CURT_MONEY))
+	prevControl:GetNamedChild("CURT_MONEY"):SetDimensions(iconSize, iconSize)
+	prevControl:GetNamedChild("CURT_ALLIANCE_POINTS"):SetTexture(GetCurrencyKeyboardIcon(CURT_ALLIANCE_POINTS))
+	prevControl:GetNamedChild("CURT_ALLIANCE_POINTS"):SetDimensions(iconSize, iconSize)
+	prevControl:GetNamedChild("CURT_TELVAR_STONES"):SetTexture(GetCurrencyKeyboardIcon(CURT_TELVAR_STONES))
+	prevControl:GetNamedChild("CURT_TELVAR_STONES"):SetDimensions(iconSize, iconSize)
+	prevControl:GetNamedChild("CURT_WRIT_VOUCHERS"):SetTexture(GetCurrencyKeyboardIcon(CURT_WRIT_VOUCHERS))
+	prevControl:GetNamedChild("CURT_WRIT_VOUCHERS"):SetDimensions(iconSize, iconSize)
+
+	if objectForAssets.assets == nil then
+		objectForAssets.assets = {}
+	end
+	local assets = objectForAssets.assets
+
+	if assets[currId] == nil then
+		assets[currId] = {}
+		assets[currId].gold = 0
+		assets[currId].tv = 0
+		assets[currId].ap = 0
+		assets[currId].wv = 0
+	else
+		if assets[currId].gold == nil then
+			assets[currId].gold = 0
+		end
+		if assets[currId].tv == nil then
+			assets[currId].tv = 0
+		end
+		if assets[currId].ap == nil then
+			assets[currId].ap = 0
+		end
+		if assets[currId].wv == nil then
+			assets[currId].wv = 0
+		end
+	end
+
+	self.currAssets = assets[currId]
+
+	self.frame:SetAnchor(TOPLEFT, IIFA_GUI_Header_GoldButton, TOPRIGHT, 5, 0)
+	self.totGold = 0
+	self.totTV = 0
+	self.totAP = 0
+	self.totWV = 0
+
+	for i=1, GetNumCharacters() do
+		local charName, _, _, _, _, alliance, charId, _ = GetCharacterInfo(i)
+		charName = charName:sub(1, charName:find("%^") - 1)
+		tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_" .. i, self.frame, "IIFA_CharCurrencyRow")
+		if i == 1 then
+			tControl:SetAnchor(TOPLEFT, prevControl:GetNamedChild("_Title"), BOTTOMLEFT, 0, 26)
+			prevControl:GetNamedChild("_Title"):SetText(GetString(SI_INVENTORY_MODE_CURRENCY))
+			prevControl:GetNamedChild("_TitleCharName"):SetText(GetString(SI_GROUP_LIST_PANEL_NAME_HEADER))
+		else
+			tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 2)
+		end
+		tControl:GetNamedChild("charName"):SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+		tControl:GetNamedChild("charName"):SetText(GetAllianceColor(alliance):Colorize(charName))
+		if GetCurrentCharacterId() == charId then
+			self.charControl = tControl
+		else
+			if assets[charId] ~= nil then
+				if assets[charId].gold == nil then
+					assets[charId].gold = 0
+				end
+				self.totGold = self.totGold + assets[charId].gold
+
+				if assets[charId].tv == nil then
+					assets[charId].tv = 0
+				end
+				self.totTV = self.totTV + assets[charId].tv
+
+				if assets[charId].ap == nil then
+					assets[charId].ap = 0
+				end
+				self.totAP = self.totAP + assets[charId].ap
+
+				if assets[charId].wv == nil then
+					assets[charId].wv = 0
+				end
+				self.totWV = self.totWV + assets[charId].wv
+
+				self:SetQty(tControl, "qtyGold", CURT_MONEY, assets[charId].gold)
+				self:SetQty(tControl, "qtyTV", CURT_TELVAR_STONES, assets[charId].tv)
+				self:SetQty(tControl, "qtyAP", CURT_ALLIANCE_POINTS, assets[charId].ap)
+				self:SetQty(tControl, "qtyWV", CURT_WRIT_VOUCHERS, assets[charId].wv)
+			end
+		end
+		prevControl = tControl
+	end
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Divider1", self.frame, "ZO_Options_Divider")
+	tControl:SetDimensions(490, 3)
+    tControl:SetAnchor(TOPLEFT, prevControl, BOTTOMLEFT, 0, 0)
+    tControl:SetAlpha(1)
+	self.divider1 = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Bank", self.frame, "IIFA_CharCurrencyRow")
+	tControl:GetNamedChild("charName"):SetText(GetString(SI_CURRENCYLOCATION1))
+	tControl:SetAnchor(TOPLEFT, self.divider1, BOTTOMLEFT, 0, 0)
+	self.bankControl = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Divider2", self.frame, "ZO_Options_Divider")
+	tControl:SetDimensions(490, 3)
+    tControl:SetAnchor(TOPLEFT, self.bankControl, BOTTOMLEFT, 0, 0)
+    tControl:SetAlpha(1)
+	self.divider2 = tControl
+
+	tControl = CreateControlFromVirtual("IIFA_GUI_AssetsGrid_Row_Tots", self.frame, "IIFA_CharCurrencyRow")
+	tControl:GetNamedChild("charName"):SetText("Totals")
+	tControl:SetAnchor(TOPLEFT, self.divider2, BOTTOMLEFT, 0, 0)
+	self.totControl = tControl
+
+
+	self.frame:SetHeight((GetNumCharacters() + 4) * 26)	-- numchars + 4 represents # chars + bank + total + title and col titles
+
+	self:FillCharAndBank()
+
+	self.isInitialized = true
+end
+
+function CharCurrencyFrame:Show(control)
+	if self.isInitialized == nil then return end
+	if not self.isShowing then
+		self.isShowing = true
+		self:FillCharAndBank()
+		self.frame:SetHidden(false)
+	end
+end
+
+function CharCurrencyFrame:Hide(control)
+	if self.isInitialized == nil then return end
+	if self.isShowing then
+		self.isShowing = false
+		self.frame:SetHidden(true)
+	end
+end
+
diff --git a/IIfA/IIfA.lua b/IIfA/IIfA.lua
new file mode 100644
index 0000000..608e644
--- /dev/null
+++ b/IIfA/IIfA.lua
@@ -0,0 +1,568 @@
+------------------------------------------------------------------
+--IIfA.lua
+--Original Author: Vicster0
+--v0.8
+-- v1.x and 2.x - rewrites by ManaVortex & AssemblerManiac
+--[[
+	Collects inventory data for all characters on a single account
+	including the shared bank and makes this information available
+	on tooltips across the entire account providing the player
+	with useful insight into their account wide inventory.
+DISCLAIMER
+	This Add-on is not created by, affiliated with or sponsored by
+	ZeniMax Media Inc. or its affiliates. The Elder Scrolls and
+	related logos are registered trademarks or trademarks of
+	ZeniMax Media Inc. in the United States and/or other countries.
+	All rights reserved."
+]]
+------------------------------------------------------------------
+if IIfA == nil then IIfA = {} end
+--local IIfA = IIfA
+
+IIfA.name 				= "Inventory Insight"
+IIfA.version 			= "2.20"
+IIfA.author 			= "AssemblerManiac & manavortex"
+IIfA.defaultAlertType 	= UI_ALERT_CATEGORY_ALERT
+IIfA.defaultAlertSound 	= nil
+IIfA.PlayerLoadedFired 	= false
+IIfA.CharacterNames 	= {}
+IIfA.colorHandler 		= nil
+IIfA.isGuildBankReady 	= false
+IIfA.TooltipLink 		= nil
+IIfA.CurrSceneName 		= "hud"
+IIfA.bFilterOnSetName 	= false
+IIfA.searchFilter 		= ""
+IIfA.searchFilterLower 	= ""
+
+local LMP = LibStub("LibMediaProvider-1.0")
+local BACKPACK = ZO_PlayerInventoryBackpack
+local BANK = ZO_PlayerBankBackpack
+
+local ITEMTOOLTIP = ZO_ItemToolTip
+local POPUPTOOLTIP = ZO_PopupToolTip
+
+local IIFA_COLORDEF_DEFAULT = ZO_ColorDef:New("3399FF")
+
+-- --------------------------------------------------------------
+--	Global Variables and external functions
+-- --------------------------------------------------------------
+
+IIfA.trackedBags = {
+	[BAG_WORN] 					= true,
+	[BAG_BACKPACK] 				= true,
+	[BAG_BANK] 					= true,
+	[BAG_SUBSCRIBER_BANK] 		= true,
+	[BAG_GUILDBANK] 			= true,
+	[BAG_VIRTUAL] 				= true,
+}
+IIfA.dropdownBankNames = {
+	"All",
+	"All Banks",
+	"All Guild Banks",
+	"All Characters",
+	"Bank and Characters",
+	"Bank and Current Character",
+	"Bank Only",
+	"Craft Bag"
+}
+if GetAPIVersion() >= 100022 then
+	IIfA.trackedBags[BAG_SUBSCRIBER_BANK] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_TWO] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_THREE]	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_FOUR] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_FIVE] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_SIX] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_SEVEN] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_EIGHT] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_NINE] 	= true
+	IIfA.trackedBags[BAG_HOUSE_BANK_TEN] 	= true
+	table.insert(IIfA.dropdownBankNames, "Housing Storage")
+end
+
+
+function IIfA:GetItemID(itemLink)
+	local ret = nil
+	if (itemLink) then
+		local data = itemLink:match("|H.:item:(.-)|h.-|h")
+		local itemID = zo_strsplit(':', data)		-- just get the number
+
+		-- because other functions may be comparing string to string, we can't make this be a number or it won't compare properly
+		ret = itemID
+	end
+	return ret
+end
+
+-- 7-26-16 AM - global func, not part of IIfA class, used in IIfA_OnLoad
+function IIfA_SlashCommands(cmd)
+
+	if (cmd == "") then
+    	d("[IIfA]:Please find the majority of options in the addon settings section of the menu under Inventory Insight.")
+    	d(" ")
+    	d("[IIfA]:Usage - ")
+    	d("	/IIfA [options]")
+    	d(" 	")
+    	d("	Options")
+    	d("		debug - Enables debug functionality for the IIfA addon.")
+    	d("		run - Runs the IIfA data collector.")
+		d("		color - Opens the color picker dialog to set tooltip text color.")
+		return
+	end
+
+	if (cmd == "debug") then
+		if (IIfA.data.bDebug) then
+			d("[IIfA]:Debug[Off]")
+			IIfA.data.bDebug = false
+		else
+			d("[IIfA]:Debug[On]")
+			IIfA.data.bDebug = true
+		end
+		return
+	end
+
+	if (cmd == "run") then
+		d("[IIfA]:Running collector...")
+		IIfA:CollectAll()
+		return
+	end
+
+	if (cmd == "color") then
+		local in2ColorPickerOnMouseUp = _in2OptionsColorPicker:GetHandler("OnMouseUp")
+		in2ColorPickerOnMouseUp(_in2OptionsColorPicker, nil, true)
+		return
+	end
+end
+
+function IIfA:DebugOut(output)
+	if (IIfA.data.bDebug) then
+		d(output)
+	end
+end
+
+function IIfA:StatusAlert(message)
+	if (IIfA.data.bDebug) then
+		ZO_Alert(IIfA.defaultAlertType, IIfA.defaultAlertSound, message)
+	end
+end
+
+local function onFirstOpen()
+	IIfA:OnFirstInventoryOpen()
+end
+
+
+function IIfA_onLoad(eventCode, addOnName)
+	if (addOnName ~= "IIfA") then
+		return
+	end
+
+	local valDocked = true
+	local valLocked = false
+	local valMinimized = false
+	local valLastX = 400
+	local valLastY = 300
+	local valHeight = 798
+	local valWidth = 380
+
+	-- initializing default values
+	local defaultGlobal = {
+		saveSettingsGlobally 	= true,
+		bDebug 					= false,
+		in2TextColors 			= IIFA_COLORDEF_DEFAULT:ToHex(),
+		showItemCountOnRight 	= true,
+		ignoredCharEquipment	= {},
+		ignoredCharInventories	= {},
+		frameSettings =
+			{
+			["bank"] =			{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["guildBank"] =  	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["tradinghouse"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["smithing"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["store"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["stables"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["trade"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["inventory"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["hud"] =   		{ hidden = true, docked = false, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["alchemy"] =   	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth }
+			},
+
+		bCollectGuildBankData 			= false,
+		in2DefaultInventoryFrameView 	= "All",
+		in2AgedGuildBankDataWarning 	= true,
+		in2TooltipsFont 				= "ZoFontGame",
+		in2TooltipsFontSize 			= 16,
+		ShowToolTipWhen 				= "Always",
+		DBv3 							= {},
+		}
+
+	-- initializing default values
+	local default = {
+		in2TextColors = IIFA_COLORDEF_DEFAULT:ToHex(),
+		showItemCountOnRight = true,
+
+		frameSettings =
+			{
+			["bank"] =			{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["guildBank"] =  	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["tradinghouse"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["smithing"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["store"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["stables"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["trade"] = 		{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["inventory"] = 	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["hud"] =   		{ hidden = true, docked = false, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth },
+			["alchemy"] =   	{ hidden = false, docked = valDocked, locked = valLocked, minimized = valMinimized, lastX = valLastX, lastY = valLastY, height = valHeight, width = valWidth }
+			},
+
+		bCollectGuildBankData = false,
+		in2DefaultInventoryFrameView = "All",
+		in2AgedGuildBankDataWarning = true,
+		in2TooltipsFont = "ZoFontGame",
+		in2TooltipsFontSize = 16,
+		}
+
+	IIfA.minWidth = 410
+	-- prevent resizing by user to be larger than this
+	IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 300, -1, 1400)
+
+	-- Grab a couple static values that shouldn't change while it's running
+	IIfA.HeaderHeight = IIFA_GUI_Header:GetHeight()
+	IIfA.SearchHeight = IIFA_GUI_Search:GetHeight()
+
+	IIFA_GUI_ListHolder.rowHeight = 52	-- trying to find optimal size for this, set it in one spot for easier adjusting
+
+	IIfA.currentCharacterId = GetCurrentCharacterId()
+	IIfA.currentAccount = GetDisplayName()
+
+	IIfA.filterGroup = "All"
+	IIfA.filterTypes = nil
+
+	-- grabs data from bagpack, and worn bag when we first open the inventory
+	ZO_PreHook(PLAYER_INVENTORY, "ApplyBackpackLayout", IIfA.OnFirstInventoryOpen)
+	ZO_PreHook(BACKPACK_GUILD_BANK_LAYOUT_FRAGMENT, "ApplyBackpackLayout", IIfA.CollectGuildBank)
+
+	-- ZO_PreHook(SHARED_INVENTORY, "GetOrCreateBagCache", function(self, bagId)
+		-- d("SHARED_INVENTORY: GetOrCreateBagCache: " .. tostring(bagId))
+	-- end)
+	-- ZO_PreHook(SHARED_INVENTORY, "PerformFullUpdateOnBagCache", function(self, bagId)
+		-- d("SHARED_INVENTORY: PerformFullUpdateOnBagCache: " .. tostring(bagId))
+	-- end)
+
+
+	-- http://esodata.uesp.net/100016/src/libraries/utility/zo_savedvars.lua.html#67
+
+	IIfA.settings 	= ZO_SavedVars:NewCharacterIdSettings("IIfA_Settings", 1, nil, default)
+	IIfA.data 		= ZO_SavedVars:NewAccountWide("IIfA_Data", 1, "Data", defaultGlobal)
+
+
+	local ObjSettings = IIfA:GetSettings()
+	if ObjSettings.in2InventoryFrameSceneSettings ~= nil then
+		ObjSettings.in2InventoryFrameSceneSettings = nil
+	end
+	if ObjSettings.in2InventoryFrameScenes ~= nil then
+		ObjSettings.in2InventoryFrameScenes = nil
+	end
+	if ObjSettings.valDocked ~= nil then
+		ObjSettings.valDocked = nil
+		ObjSettings.valLocked = nil
+		ObjSettings.valMinimized = nil
+		ObjSettings.valLastX = nil
+		ObjSettings.valLastY = nil
+		ObjSettings.valHeight = nil
+		ObjSettings.valWidth = nil
+		ObjSettings.valWideX = nil
+	end
+
+	if IIfA.settings.in2ToggleGuildBankDataCollection ~= nil then
+		IIfA.settings.in2ToggleGuildBankDataCollection = nil
+	end
+	if IIfA.data.in2ToggleGuildBankDataCollection ~= nil then
+		IIfA.data.bCollectGuildBankData = IIfA.data.in2ToggleGuildBankDataCollection
+		IIfA.data.in2ToggleGuildBankDataCollection = nil
+	end
+
+	if IIfA.data.showToolTipOnIIFAOnly ~= nil then
+		if IIfA.data.showToolTipWhen == nil then		-- safety test - this should be nil at this point, but ya never know
+			if IIfA.data.showToolTipOnIIFAOnly then
+				IIfA.data.showToolTipWhen = "IIfA"
+			else
+				IIfA.data.showToolTipWhen = "Always"
+			end
+		end
+		IIfA.data.showToolTipOnIIFAOnly = nil
+	else
+		if IIfA.data.showToolTipWhen == nil then
+			IIfA.data.showToolTipWhen = "Always"
+		end
+	end
+	if ObjSettings.showToolTipOnIIFAOnly ~= nil then
+		if ObjSettings.showToolTipWhen == nil then		-- safety test - this should be nil at this point, but ya never know
+			if ObjSettings.showToolTipOnIIFAOnly then
+				ObjSettings.showToolTipWhen = "IIfA"
+			else
+				ObjSettings.showToolTipWhen = "Always"
+			end
+		end
+		ObjSettings.showToolTipOnIIFAOnly = nil
+	else
+		if ObjSettings.showToolTipWhen == nil then
+			ObjSettings.showToolTipWhen = IIfA.data.showToolTipWhen
+		end
+	end
+
+	if IIfA.data.showStyleInfo == nil then
+		IIfA.data.showStyleInfo = true
+	end
+	if ObjSettings.showStyleInfo == nil then
+		ObjSettings.showStyleInfo = IIfA.data.showStyleInfo
+	end
+
+
+	-- 2-9-17 AM - convert saved data names into proper language for this session
+    local lang = GetCVar("language.2")
+	if IIfA.data.lastLang == nil or IIfA.data.lastLang ~= lang then
+		IIfA:RenameItems()
+		IIfA.data.lastLang = lang
+	end
+
+	IIfA:SetupCharLookups()
+
+	if IIfA.settings.accountCharacters ~= nil then
+		IIfA.settings.accountCharacters = nil
+	end
+	if IIfA.settings.guildBanks ~= nil then
+		IIfA.settings.guildBanks = nil
+	end
+
+	-- this MUST remain in this location, otherwise it's possible that CollectAll will remove ALL characters data from the list (because they haven't been converted)
+	if IIfA.data.accountCharacters ~= nil then
+		IIfA:ConvertNameToId()
+		IIfA.data.accountCharacters = nil
+	end
+
+	if ObjSettings.bFilterOnSetNameToo == nil then
+		ObjSettings.bFilterOnSetNameToo = false
+		IIfA.data.bFilterOnSetNameToo = false
+	end
+
+	if IIfA.data.guildBanks == nil then
+		IIfA.data.guildBanks = {}
+		local i
+		for i = 1, GetNumGuilds() do
+			local id = GetGuildId(i)
+			local guildName = GetGuildName(id)
+			IIfA.data.guildBanks[guildName] = {bCollectData = true, lastCollected = GetDate() .. "@" .. GetFormattedTime(), items = 0}
+		end
+	end
+
+	if ObjSettings.bInSeparateFrame == nil then
+		ObjSettings.bInSeparateFrame = true
+		IIfA.data.bInSeparateFrame = true
+	end
+
+	IIfA.bFilterOnSetName = ObjSettings.bFilterOnSetName
+	if ObjSettings.bFilterOnSetName == nil then
+		IIfA.bFilterOnSetName = false
+		ObjSettings.bFilterOnSetName = false
+	end
+	IIFA_GUI_SetNameOnly_Checked:SetHidden(not IIfA.bFilterOnSetName)
+
+	IIFA_GUI_Header_Filter_Button0:SetState(BSTATE_PRESSED)
+	IIfA.LastFilterControl = IIFA_GUI_Header_Filter_Button0
+
+	-- save off anchors for the ListHolder
+	local _, point, relTo, relPoint, offsX, offsY = IIFA_GUI_ListHolder:GetAnchor(0)
+	IIFA_GUI_ListHolder.savedAnchor1 = {point, relTo, relPoint, offsX, offsY}
+
+	_, point, relTo, relPoint, offsX, offsY = IIFA_GUI_ListHolder:GetAnchor(1)
+	IIFA_GUI_ListHolder.savedAnchor2 = {point, relTo, relPoint, offsX, offsY}
+
+	IIfA.colorHandler = ZO_ColorDef:New(ObjSettings.in2TextColors)
+	SLASH_COMMANDS["/ii"] = IIfA_SlashCommands
+	IIfA:CreateSettingsWindow(IIfA.settings, default)
+
+	IIfA.CharCurrencyFrame:Initialize(IIfA.data)
+	IIfA.CharBagFrame:Initialize(IIfA.data)
+
+	IIfA:SetupBackpack()	-- setup the inventory frame
+	IIfA:CreateTooltips()	-- setup the tooltip frames
+
+	if (IIfA.data.bConvertedGlyphs == nil or IIfA.data.bConvertedLocType == nil) and IIfA.data.DBv3 == nil then
+		-- glyphs are currently stored by itemid, remove them so it can store them properly by item link
+		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
+			if IIfA.data.bConvertedGlyphs == nil then
+				if DBItem.attributes.itemName:lower():find("glyph") ~= nil and itemLink:find("|") == nil then
+					IIfA.data.DBv2[itemLink] = nil
+				end
+			end
+			for locationName, locData in pairs(DBItem) do
+				if locData.locationType ~= nil then
+					locData.bagID = locData.locationType
+					locData.locationType = nil
+				end
+			end
+		end
+		IIfA.data.bConvertedGlyphs = true
+		IIfA.data.bConvertedLocType = true
+	end
+	if IIfA.data.bConvertedMotifs == nil and IIfA.data.DBv3 == nil then			-- 9-12-16 AM - added whole if to convert motifs to item ids
+		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
+			if itemLink:find("|") ~= nil then			-- not a numeric itemid, it's a link
+				local itemType = GetItemLinkItemType(itemLink)
+				if itemType == ITEMTYPE_RACIAL_STYLE_MOTIF then		-- 9-12-16 AM - added because motifs now appear to have level info in them
+					itemKey = IIfA:GetItemID(itemLink)
+					if IIfA.data.DBv2[itemKey] == nil then
+						IIfA.data.DBv2[itemKey] = DBItem
+						IIfA.data.DBv2[itemLink] = nil
+						IIfA.data.DBv2[itemKey].itemLink = itemLink
+					else
+						for attrib, data in pairs(DBItem) do
+							if data.itemCount ~= nil then
+								if IIfA.data.DBv2[itemKey][attrib].itemCount ~= nil then
+									IIfA.data.DBv2[itemKey][attrib].itemCount = IIfA.data.DBv2[itemKey][attrib].itemCount + data.itemCount
+								else
+									IIfA.data.DBv2[itemKey][attrib] = data
+								end
+							end
+						end
+						IIfA.data.DBv2[itemKey].attributes.itemLink = itemLink
+						IIfA.data.DBv2[itemLink] = nil
+					end
+				end
+			end
+		end
+		IIfA.data.bConvertedMotifs = true
+	end
+
+	if IIfA.data.DBv3 == nil then
+		dbv3 = {}
+		for itemLink, DBItem in pairs(IIfA.data.DBv2) do
+			dbv3[itemLink] = {}
+			dbv3[itemLink].locations = {}
+			dbv3[itemLink].itemQuality = DBItem.attributes.itemQuality
+			dbv3[itemLink].itemName    = DBItem.attributes.itemName
+			dbv3[itemLink].iconFile    = DBItem.attributes.iconFile
+			dbv3[itemLink].filterType  = DBItem.attributes.filterType
+			if DBItem.attributes.itemLink ~= nil then
+				dbv3[itemLink].itemLink = DBItem.attributes.itemLink
+			end
+
+			for locname, locdata in pairs(DBItem) do
+				if locname ~= "attributes" then
+					dbv3[itemLink].locations[locname] = locdata
+				end
+			end
+		end
+		IIfA.data.DBv3 = dbv3
+	end
+
+	IIfA:ActionLayerInventoryUpdate()
+
+	if not ObjSettings.frameSettings.hud.hidden then
+		IIfA:ProcessSceneChange("hud", "showing", "shown")
+	end
+--	IIfA:MakeBSI()
+
+	IIfA:RegisterForEvents()
+	IIfA:RegisterForSceneChanges() -- register for callbacks on scene statechanges using user preferences or defaults
+	IIfA:ScanCurrentCharacter()
+	IIfA:ScanBank()
+end
+
+EVENT_MANAGER:RegisterForEvent("IIfALoaded", EVENT_ADD_ON_LOADED, IIfA_onLoad)
+
+function IIfA:MakeBSI()
+	local bs = {}
+	local idx
+	local itemLink, DBItem, locname, data
+	for itemLink, DBItem in pairs(IIfA.data.DBv3) do
+		for locname, data in pairs(DBItem.locations) do
+			if ((data.bagID == BAG_BACKPACK or data.bagID == BAG_WORN) and locname == IIfA.currentCharacterId) or	-- only index items ON this character if they're in backpack
+				(data.bagID ~= BAG_BACKPACK and data.bagID ~= BAG_WORN) then
+				idx = data.bagID
+				if idx == BAG_GUILDBANK then		-- replace idx with appropriate guild bank name instead of the ID for BAG_GUILDBANK (to differentiate guild banks)
+					idx = locname
+				end
+				if bs[idx] == nil then
+					bs[idx] = {}
+				end
+
+				bs[idx][data.bagSlot] = itemLink
+			end
+		end
+	end
+	IIfA.BagSlotInfo = bs
+end
+
+
+
+--[[
+for reference
+
+GetCurrentCharacterId()
+Returns: string id
+
+GetNumCharacters()
+Returns: integer numCharacters
+
+GetCharacterInfo(luaindex index)
+Returns: string name,
+		[Gender|#Gender] gender,
+		integer level,
+		integer classId,
+		integer raceId,
+		[Alliance|#Alliance] alliance,
+		string id,
+		integer locationId
+__________________
+	--]]
+
+function IIfA:SetupCharLookups()
+
+	IIfA.CharIdToName = {}
+	IIfA.CharNameToId= {}
+	local charInfo = {}
+	-- create transient pair of lookup arrays, CharIdToName and CharNameToId (for use with the dropdown and converting stored data char name to charid)
+	for i=1, GetNumCharacters() do
+		local charName, _, _, _, _, _, charId, _ = GetCharacterInfo(i)
+		charName = charName:sub(1, charName:find("%^") - 1)
+		IIfA.CharIdToName[charId] = charName
+		IIfA.CharNameToId[charName] = charId
+	end
+end
+
+function IIfA:ConvertNameToId()
+	-- run list of dbv2 items, change names to ids
+	-- ignore attributes, and anything that's in guild bank list
+	-- remaining items are character names (or should be)
+	-- if found in CharNameToId, convert it, otherwise erase whole entry (since it's an orphan)
+	-- do same for settings
+	local tbl = IIfA.data.DBv2
+	if nil == tbl or {} == tbl then return end
+	for itemLink, DBItem in pairs(IIfA.data.DBv2) do
+		for itemDetailName, itemInfo in pairs(DBItem) do
+			local bagID = itemInfo.locationType
+			if bagID ~= nil then
+				if bagID == BAG_BACKPACK or bagID == BAG_WORN then
+					if IIfA.CharNameToId[itemDetailName] ~= nil then
+	--					d("Swapping name to # -- " .. itemLink .. ", " )
+						DBItem[IIfA.CharNameToId[itemDetailName] ] = DBItem[itemDetailName]
+						DBItem[itemDetailName] = nil
+					end
+				end
+			end
+		end
+	end
+end
+
+-- used for testing - wipes all craft bag data
+function IIfA:clearvbag()
+	for itemLink, DBItem in pairs(IIfA.data.DBv3) do
+		for locationName, locData in pairs(DBItem.locations) do
+--			if locData.bagID ~= nil then
+				if locData.bagID == BAG_VIRTUAL then
+					locData = nil
+					DBItem[locationName] = nil
+				end
+--			end
+		end
+	end
+end
diff --git a/IIfA/IIfA.txt b/IIfA/IIfA.txt
new file mode 100644
index 0000000..7305e42
--- /dev/null
+++ b/IIfA/IIfA.txt
@@ -0,0 +1,51 @@
+## Title: Inventory Insight
+## Author: manavortex, AssemblerManiac
+## Version: 2.20
+## APIVersion: 100021 100022
+## SavedVariables: IIfA_Settings IIfA_Data
+## OptionalDependsOn: libFilters
+
+libs\LibStub\LibStub.lua
+libs\LibCustomTitles\LibCustomTitles.lua
+libs\LibScroll\LibScroll.lua
+libs\LibMediaProvider-1.0\LibMediaProvider-1.0.lua
+libs\LibAddonMenu-2.0\LibAddonMenu-2.0.lua
+libs\LibAddonMenu-2.0\controls\panel.lua
+libs\LibAddonMenu-2.0\controls\submenu.lua
+libs\LibAddonMenu-2.0\controls\button.lua
+libs\LibAddonMenu-2.0\controls\checkbox.lua
+libs\LibAddonMenu-2.0\controls\colorpicker.lua
+libs\LibAddonMenu-2.0\controls\custom.lua
+libs\LibAddonMenu-2.0\controls\description.lua
+libs\LibAddonMenu-2.0\controls\dropdown.lua
+libs\LibAddonMenu-2.0\controls\editbox.lua
+libs\LibAddonMenu-2.0\controls\header.lua
+libs\LibAddonMenu-2.0\controls\slider.lua
+libs\LibAddonMenu-2.0\controls\texture.lua
+libs\LibAddonMenu-2.0\controls\iconpicker.lua
+libs\LibAddonMenu-2.0\controls\divider.lua
+libs\LibCustomMenu\LibCustomMenu.lua
+
+StringRegistration.lua
+
+IIfA.xml
+Bindings.xml
+CharCurrencyTooltip.lua
+CharBagSpaceTooltip.lua
+IIfA.lua
+Bindings.lua
+IIfASettingsAdapter.lua
+IIfAEvents.lua
+IIfATooltip.lua
+IIfABackpack.lua
+IIfASceneFuncs.lua
+IIfAMenu.lua
+IIfADataCollection.lua
+IIfA_xml_adapter.lua
+
+; DISCLOSURE:
+; This Add-on is not created by, affiliated with or sponsored by ZeniMax
+; Media Inc. or its affiliates. The Elder Scrolls and related logos are
+; registered trademarks or trademarks of ZeniMax Media Inc. in the United
+; States and/or other countries. All rights reserved.
+; You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
diff --git a/IIfA/IIfA.xml b/IIfA/IIfA.xml
new file mode 100644
index 0000000..a349e29
--- /dev/null
+++ b/IIfA/IIfA.xml
@@ -0,0 +1,1123 @@
+<GuiXml>
+	<Controls>
+		<TopLevelControl name="IIFA_GUI" clampedToScreen="true" mouseEnabled="true" moveable="true" hidden="true" resizeHandleSize="10">
+			<DimensionConstraints minX="410" minY="300" maxY="1400"/>
+			<Anchor point="TOPRIGHT" relativeTo="GUI_ROOT" relativePoint="TOPRIGHT" offsetX="-25" offsetY="40" />
+
+			<OnMoveStop>IIfA:SaveFrameInfo("onMoveStop")</OnMoveStop>
+			<OnResizeStop>IIfA:onResizeStop()</OnResizeStop>
+
+			<Controls>
+				<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
+
+				<Control name="$(parent)_Header" hidden="false" resizeToFitDescendents="true" >
+					<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP"/>
+
+					<Controls>
+<!-- Lock/Unlock buttons -->
+						<Button name="$(parent)_Locked" hidden="true">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="5" offsetY="5"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Allow window movement")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GUILock(false)</OnMouseUp>
+							<Dimensions x="24" y="24" />
+							<Textures normal="/esoui/art/miscellaneous/locked_up.dds"
+										pressed="/esoui/art/miscellaneous/locked_down.dds"
+									 mouseOver="/esoui/art/miscellaneous/locked_over.dds"
+							/>
+						</Button>
+
+						<Button name="$(parent)_Unlocked" >
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Locked" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Lock window in place")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GUILock(true)</OnMouseUp>
+							<Dimensions x="24" y="24" />
+							<Textures normal="/esoui/art/miscellaneous/unlocked_up.dds"
+										pressed="/esoui/art/miscellaneous/unlocked_down.dds"
+									 mouseOver="/esoui/art/miscellaneous/unlocked_over.dds"
+							/>
+						</Button>
+<!-- end of Lock/Unlock buttons -->
+
+<!-- Dock/Undock buttons -->
+						<Button name="$(parent)_Docked" hidden="true">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="35"  offsetY="5"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Un-dock window")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GuiDock(false)</OnMouseUp>
+							<Dimensions x="24" y="24" />
+							<Textures normal="IIfA/assets/icons/docked_up.dds"
+										pressed="IIfA/assets/icons/docked_down.dds"
+									 mouseOver="IIfA/assets/icons/docked_over.dds"
+							/>
+						</Button>
+
+						<Button name="$(parent)_Undocked" >
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Docked" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Dock window")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GuiDock(true)</OnMouseUp>
+							<Dimensions x="24" y="24" />
+							<Textures normal="IIfA/assets/icons/undocked_up.dds"
+										pressed="IIfA/assets/icons/undocked_down.dds"
+									 mouseOver="IIfA/assets/icons/undocked_over.dds"
+							/>
+						</Button>
+<!-- end of Dock/Undock buttons -->
+
+						<Label name="$(parent)_Label" mouseEnabled="false" font="ZoFontBookPaper" text="-Inventory Insight-" >
+							<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="0"/>
+						</Label>
+
+						<Button name="$(parent)_Hide">
+							<Anchor point="TOPRIGHT" relativeTo="IIFA_GUI" relativePoint="TOPRIGHT" offsetX="0" offsetY="3"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Hide window")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GUIButtonHideOnMouseUp()</OnMouseUp>
+							<Dimensions x="25" y="25" />
+							<Textures normal="/esoui/art/buttons/decline_up.dds"
+										pressed="/esoui/art/buttons/decline_down.dds"
+									 mouseOver="/esoui/art/buttons/decline_over.dds"
+							/>
+						</Button>
+
+						<Button name="$(parent)_Minimize" >
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Hide" relativePoint="TOPLEFT" offsetX="-5" offsetY="2"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Minimize window")	</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)	</OnMouseExit>
+							<Dimensions x="20" y="20" />
+							<OnMouseUp>IIfA:GUIMinimize(true)</OnMouseUp>
+							<Textures normal="/esoui/art/buttons/minimize_normal.dds"
+										pressed="/esoui/art/buttons/minimize_mousedown.dds"
+									 mouseOver="/esoui/art/buttons/minimize_mousedown.dds"
+							/>
+						</Button>
+
+						<Button name="$(parent)_Maximize" hidden="true">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Minimize" relativePoint="TOPLEFT" />
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Restore window")	</OnMouseEnter>
+							<OnMouseExit> IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<Dimensions x="20" y="20" />
+							<OnMouseUp>IIfA:GUIMinimize(false)</OnMouseUp>
+							<Textures normal="/esoui/art/buttons/maximize_normal.dds"
+										pressed="/esoui/art/buttons/maximize_down.dds"
+									 mouseOver="/esoui/art/buttons/maximize_down.dds"
+							/>
+						</Button>
+
+
+						<Button name="$(parent)_GoldButton" mouseOverBlendMode="ADD" inherits="ZO_RadioButton">
+							<Dimensions x="32" y="32" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="45"/>
+							<OnMouseEnter>IIfA.CharCurrencyFrame:Show(self)</OnMouseEnter>
+							<OnMouseExit>IIfA.CharCurrencyFrame:Hide(self)</OnMouseExit>
+							<Textures normal="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds"
+										pressed="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds"
+									 mouseOver="EsoUI/Art/Bank/bank_tabIcon_gold_up.dds" />
+						</Button>
+
+						<Button name="$(parent)_BagButton" mouseOverBlendMode="ADD" inherits="ZO_RadioButton">
+							<Dimensions x="24" y="24" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_GoldButton" relativePoint="TOPRIGHT" offsetX="4" offsetY="0"/>
+							<OnMouseEnter>IIfA.CharBagFrame:Show(self)</OnMouseEnter>
+							<OnMouseExit>IIfA.CharBagFrame:Hide(self)</OnMouseExit>
+							<Textures normal="EsoUI/Art/Tooltips/icon_bag.dds"
+										pressed="EsoUI/Art/Tooltips/icon_bag.dds"
+ 									 mouseOver="EsoUI/Art/Tooltips/icon_bag.dds" />
+ <!--							<TextureCoords left="0" right="1.25" top="0" bottom="1.25" /> -->
+						</Button>
+
+
+						<Control name="$(parent)_Dropdown" inherits="ZO_ComboBox" mouseEnabled="true" >
+							<Dimensions x="200" y="30" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="110" offsetY="40"/>
+
+							<OnShow>	IIfA:GuiSetupDropdown(self)</OnShow>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Select inventory to view")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+						</Control>
+
+						<Control name="$(parent)_Filter" mouseEnabled="true">
+							<Dimensions x="300" y="30" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="50" offsetY="80"/>
+
+							<Controls>
+								<Button name="$(parent)_Button0">
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Items")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "All", nil)</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds"
+									/>
+
+								</Button>
+								<Button name="$(parent)_Button1">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Weapons")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", nil)</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_weapons_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_weapons_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_weapons_over.dds"
+									/>
+								</Button>
+								<Button name="$(parent)_Button2">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Armor")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", nil)</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_armor_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_armor_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_armor_over.dds"
+									/>
+								</Button>
+								<Button name="$(parent)_Button3">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Consumables")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER, ITEMTYPE_FOOD, ITEMTYPE_DRINK, ITEMTYPE_POTION, ITEMTYPE_POISON, ITEMTYPE_RECIPE, ITEMTYPE_RACIAL_STYLE_MOTIF, ITEMTYPE_AVA_REPAIR, ITEMTYPE_TOOL, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_consumables_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_consumables_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_consumables_over.dds"
+									/>
+								</Button>
+								<Button name="$(parent)_Button4">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Crafting Materials")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER, ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_RUNE_POTENCY, ITEMTYPE_FISH, ITEMTYPE_FLAVORING, ITEMTYPE_INGREDIENT, ITEMTYPE_POISON_BASE, ITEMTYPE_POTION_BASE, ITEMTYPE_REAGENT, ITEMTYPE_RAW_MATERIAL, ITEMTYPE_WEAPON_TRAIT, ITEMTYPE_SPICE, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER, ITEMTYPE_STYLE_MATERIAL})</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_crafting_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_crafting_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_crafting_over.dds"
+									/>
+								</Button>
+
+								<Button name="$(parent)_Button5">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Furniture")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
+									<Textures normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
+												pressed="esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
+												mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds"
+									/>
+
+
+								</Button>
+
+								<Button name="$(parent)_Button6">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="50" offsetY="0"/>
+									<Dimensions x="40" y="40" />
+									<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Miscellaneous")</OnMouseEnter>
+									<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON, ITEMTYPE_SOUL_GEM, ITEMTYPE_SIEGE, ITEMTYPE_LURE, ITEMTYPE_TOOL, ITEMTYPE_REPAIR, ITEMTYPE_TRASH, ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE})</OnMouseUp>
+									<Textures normal="/esoui/art/inventory/inventory_tabicon_misc_up.dds"
+												pressed="/esoui/art/inventory/inventory_tabicon_misc_down.dds"
+												mouseOver="/esoui/art/inventory/inventory_tabicon_misc_over.dds"
+									/>
+								</Button>
+							</Controls>
+						</Control>
+
+<!-- SubFilter Groups -->
+						<Control name="$(parent)_Subfilter" mouseEnabled="true">
+							<Dimensions x="300" y="0" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Filter" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="2"/>
+<!-- SubFilter Group 1 - Weapons -->
+							<Controls>
+								<Control name="$(parent)_1" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Weapons")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", nil)</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "One Handed")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_AXE, WEAPONTYPE_HAMMER, WEAPONTYPE_SWORD, WEAPONTYPE_DAGGER}, {"Axe", "Hammer", "Sword", "Dagger"})</OnMouseUp>
+											<Textures	normal = "IIfA/assets/weapons/onehanded_up.dds"
+															pressed = "IIfA/assets/weapons/onehanded_down.dds"
+															mouseOver = "IIfA/assets/weapons/onehanded_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Two Handed")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_TWO_HANDED_AXE, WEAPONTYPE_TWO_HANDED_HAMMER, WEAPONTYPE_TWO_HANDED_SWORD}, {"Axe 2H", "Hammer 2H", "Sword 2H"})</OnMouseUp>
+											<Textures	normal="IIfA/assets/weapons/twohanded_up.dds"
+															pressed="IIfA/assets/weapons/twohanded_down.dds"
+															mouseOver="IIfA/assets/weapons/twohanded_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Bows")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_BOW})</OnMouseUp>
+											<Textures	normal="IIfA/assets/weapons/bow_up.dds"
+															pressed="IIfA/assets/weapons/bow_down.dds"
+															mouseOver="IIfA/assets/weapons/bow_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Destruction Staves")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_FIRE_STAFF, WEAPONTYPE_FROST_STAFF, WEAPONTYPE_LIGHTNING_STAFF}, {"Flame", "Frost", "Lightning"})</OnMouseUp>
+											<Textures	normal="IIfA/assets/weapons/destruction_up.dds"
+															pressed="IIfA/assets/weapons/destruction_down.dds"
+															mouseOver="IIfA/assets/weapons/destruction_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Healing Staves")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_HEALING_STAFF})</OnMouseUp>
+											<Textures	normal="IIfA/assets/weapons/healing_up.dds"
+															pressed="IIfA/assets/weapons/healing_down.dds"
+															mouseOver="IIfA/assets/weapons/healing_over.dds" />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 1 - Weapons -->
+
+<!-- SubFilter Group 2 - Armor/Clothing -->
+								<Control name="$(parent)_2" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Armor")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", nil)</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Heavy")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_HEAVY, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
+											<Textures	normal="/esoui/art/icons/progression_tabicon_armorheavy_up.dds"
+															pressed="/esoui/art/icons/progression_tabicon_armorheavy_down.dds"
+															mouseOver="/esoui/art/icons/progression_tabicon_armorheavy_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Medium")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_MEDIUM, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
+											<Textures	normal="/esoui/art/icons/progression_tabicon_armormedium_up.dds"
+															pressed="/esoui/art/icons/progression_tabicon_armormedium_down.dds"
+															mouseOver="/esoui/art/icons/progression_tabicon_armormedium_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Light")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_LIGHT, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
+											<Textures	normal="/esoui/art/icons/progression_tabicon_armorlight_up.dds"
+															pressed="/esoui/art/icons/progression_tabicon_armorlight_down.dds"
+															mouseOver="/esoui/art/icons/progression_tabicon_armorlight_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Clothing")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_NONE, EQUIP_TYPE_HEAD, EQUIP_TYPE_SHOULDERS, EQUIP_TYPE_CHEST, EQUIP_TYPE_HAND, EQUIP_TYPE_LEGS, EQUIP_TYPE_FEET, EQUIP_TYPE_WAIST}, {"Placeholder", "Head", "Shoulders", "Chest", "Hands", "Legs", "Feet", "Waist"})</OnMouseUp>
+											<Textures	normal="IIfA/assets/apparel/clothing_up.dds"
+															pressed="IIfA/assets/apparel/clothing_down.dds"
+															mouseOver="IIfA/assets/apparel/clothing_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Shields")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Weapons", {WEAPONTYPE_SHIELD}, nil)</OnMouseUp>
+											<Textures	normal="IIfA/assets/apparel/shield_up.dds"
+															pressed="IIfA/assets/apparel/shield_down.dds"
+															mouseOver="IIfA/assets/apparel/shield_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button6">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Jewelry")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Body", {ARMORTYPE_NONE, EQUIP_TYPE_RING, EQUIP_TYPE_NECK}, {"Placeholder", "Ring", "Necklace"})</OnMouseUp>
+											<Textures	normal="IIfA/assets/apparel/jewelry_up.dds"
+															pressed="IIfA/assets/apparel/jewelry_down.dds"
+															mouseOver="IIfA/assets/apparel/jewelry_over.dds" />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 2 - Armor/Clothing -->
+
+<!-- SubFilter Group 3 - Consumables -->
+								<Control name="$(parent)_3" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-35" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Consumables")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER, ITEMTYPE_FOOD, ITEMTYPE_DRINK, ITEMTYPE_POTION, ITEMTYPE_POISON, ITEMTYPE_RECIPE, ITEMTYPE_RACIAL_STYLE_MOTIF, ITEMTYPE_MASTER_WRIT, ITEMTYPE_AVA_REPAIR, ITEMTYPE_TOOL, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Food")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_FOOD})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/food/food_up.dds"
+												pressed = "IIfA/assets/consumables/food/food_down.dds"
+												mouseOver = "IIfA/assets/consumables/food/food_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Drink")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_DRINK})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/drinks/drink_up.dds"
+												pressed = "IIfA/assets/consumables/drinks/drink_down.dds"
+												mouseOver = "IIfA/assets/consumables/drinks/drink_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Recipes")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_RECIPE, SPECIALIZED_ITEMTYPE_RECIPE_BLACKSMITHING_DIAGRAM_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_CLOTHIER_PATTERN_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_WOODWORKING_BLUEPRINT_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_ENCHANTING_SCHEMATIC_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_ALCHEMY_FORMULA_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_PROVISIONING_DESIGN_FURNISHING, SPECIALIZED_ITEMTYPE_RECIPE_PROVISIONING_STANDARD_FOOD}, {"Placeholder", "Diagrams", "Patterns", "Blueprints", "Schematics", "Formulae", "Faux Food/Candles", "Food/Drink"})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/recipes/recipe_up.dds"
+												pressed = "IIfA/assets/consumables/recipes/recipe_down.dds"
+												mouseOver = "IIfA/assets/consumables/recipes/recipe_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Potions")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_POTION})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/potion/potion_up.dds"
+												pressed = "IIfA/assets/consumables/potion/potion_down.dds"
+												mouseOver = "IIfA/assets/consumables/potion/potion_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Poisons")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_POISON})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/poison/poison_up.dds"
+												pressed = "IIfA/assets/consumables/poison/poison_down.dds"
+												mouseOver = "IIfA/assets/consumables/poison/poison_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button6">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Motifs")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_RACIAL_STYLE_MOTIF})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/motifs/motif_up.dds"
+												pressed = "IIfA/assets/consumables/motifs/motif_down.dds"
+												mouseOver = "IIfA/assets/consumables/motifs/motif_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button7">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Master Writs")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_MASTER_WRIT})</OnMouseUp>
+											<Textures
+												normal = "esoui/art/crafting/formulae_tabicon_up.dds"
+												pressed = "esoui/art/crafting/formulae_tabicon_down.dds"
+												mouseOver = "esoui/art/crafting/formulae_tabicon_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button8">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Containers")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_CONTAINER})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/containers/container_up.dds"
+												pressed = "IIfA/assets/consumables/containers/container_down.dds"
+												mouseOver = "IIfA/assets/consumables/containers/container_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button9">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button8" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Repair")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Consumable", {ITEMTYPE_AVA_REPAIR, ITEMTYPE_CROWN_REPAIR})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/repair/repair_up.dds"
+												pressed = "IIfA/assets/consumables/repair/repair_down.dds"
+												mouseOver = "IIfA/assets/consumables/repair/repair_over.dds" />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 3 - Consumables -->
+
+<!-- SubFilter Group 4 - Crafting Materials -->
+								<Control name="$(parent)_4" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-40" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Materials")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER, ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_RUNE_POTENCY, ITEMTYPE_FISH, ITEMTYPE_FLAVORING, ITEMTYPE_INGREDIENT, ITEMTYPE_POISON_BASE, ITEMTYPE_POTION_BASE, ITEMTYPE_REAGENT, ITEMTYPE_RAW_MATERIAL, ITEMTYPE_WEAPON_TRAIT, ITEMTYPE_SPICE, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER, ITEMTYPE_STYLE_MATERIAL, ITEMTYPE_FURNISHING_MATERIAL})</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Smithing")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_BLACKSMITHING_RAW_MATERIAL, ITEMTYPE_BLACKSMITHING_MATERIAL, ITEMTYPE_BLACKSMITHING_BOOSTER}, {"Raw Material", "Material", "Temper"})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_blacksmithing_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Clothier")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_CLOTHIER_RAW_MATERIAL, ITEMTYPE_CLOTHIER_MATERIAL, ITEMTYPE_CLOTHIER_BOOSTER}, {"Raw Material", "Material", "Tannin"})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_clothing_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Woodworking")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_WOODWORKING_RAW_MATERIAL, ITEMTYPE_WOODWORKING_MATERIAL, ITEMTYPE_WOODWORKING_BOOSTER}, {"Raw Material", "Material", "Resin"})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_woodworking_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Alchemy")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_REAGENT, ITEMTYPE_POTION_BASE, ITEMTYPE_POISON_BASE}, {"Reagent", "Potion Base", "Poison Base"})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_alchemy_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Enchanting")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ENCHANTING_RUNE_ASPECT, ITEMTYPE_ENCHANTING_RUNE_ESSENCE, ITEMTYPE_ENCHANTING_RUNE_POTENCY}, {"Aspect", "Essence", "Potency"})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_enchanting_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button6">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Provisioning")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_INGREDIENT})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_provisioning_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button7">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Styles")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_STYLE_MATERIAL})</OnMouseUp>
+											<Textures
+												normal = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_up.dds"
+												pressed = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_down.dds"
+												mouseOver = "EsoUI/Art/Inventory/inventory_tabIcon_Craftbag_styleMaterial_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button8">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Weapon Traits")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_WEAPON_TRAIT})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/materials/wtrait/wtrait_up.dds"
+												pressed = "IIfA/assets/materials/wtrait/wtrait_down.dds"
+												mouseOver = "IIfA/assets/materials/wtrait/wtrait_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button9">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button8" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Armor Traits")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_ARMOR_TRAIT})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/materials/atrait/atrait_up.dds"
+												pressed = "IIfA/assets/materials/atrait/atrait_down.dds"
+												mouseOver = "IIfA/assets/materials/atrait/atrait_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button10">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button9" relativePoint="TOPRIGHT" offsetX="-1" offsetY="0"/>
+											<Dimensions x="36" y="36"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Furnishing")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Materials", {ITEMTYPE_FURNISHING_MATERIAL})</OnMouseUp>
+											<Textures
+												normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
+												pressed="esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
+												mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds" />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 4 - Crafting Materials -->
+
+<!-- SubFilter Group 5 - Furniture -->
+								<Control name="$(parent)_5" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Furniture")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Crafting Stations")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_CRAFTING_STATION})</OnMouseUp>
+											<Textures	normal = "/esoui/art/treeicons/housing_indexicon_workshop_up.dds"
+															pressed = "/esoui/art/treeicons/housing_indexicon_workshop_down.dds"
+															mouseOver = "/esoui/art/treeicons/housing_indexicon_workshop_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Lights")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_LIGHT})</OnMouseUp>
+											<Textures	normal="/esoui/art/treeicons/housing_indexicon_shrine_up.dds"
+															pressed="/esoui/art/treeicons/housing_indexicon_shrine_down.dds"
+															mouseOver="/esoui/art/treeicons/housing_indexicon_shrine_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Ornamental")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_ORNAMENTAL})</OnMouseUp>
+											<Textures	normal="/esoui/art/treeicons/housing_indexicon_gallery_up.dds"
+															pressed="/esoui/art/treeicons/housing_indexicon_gallery_down.dds"
+															mouseOver="/esoui/art/treeicons/housing_indexicon_gallery_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Seating")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_SEATING})</OnMouseUp>
+											<Textures	normal="/esoui/art/treeicons/collection_indexicon_furnishings_up.dds"
+															pressed="/esoui/art/treeicons/collection_indexicon_furnishings_down.dds"
+															mouseOver="/esoui/art/treeicons/collection_indexicon_furnishings_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Target Dummies")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Specialized", {ITEMTYPE_FURNISHING, SPECIALIZED_ITEMTYPE_FURNISHING_TARGET_DUMMY})</OnMouseUp>
+											<Textures	normal="/esoui/art/treeicons/collection_indexicon_weapons+armor_up.dds"
+															pressed="/esoui/art/treeicons/collection_indexicon_weapons+armor_down.dds"
+															mouseOver="/esoui/art/treeicons/collection_indexicon_weapons+armor_over.dds" />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 5 - Furniture -->
+
+<!-- SubFilter Group 6 - Miscellaneous -->
+								<Control name="$(parent)_6" mouseEnabled="true" hidden="true">
+									<Dimensions x="300" y="0" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-35" offsetY="0"/>
+									<Controls>
+										<Button name="$(parent)_Button0">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "All Misc.")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON, ITEMTYPE_SOUL_GEM, ITEMTYPE_SIEGE, ITEMTYPE_LURE, ITEMTYPE_TOOL, ITEMTYPE_REPAIR, ITEMTYPE_TRASH, ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE})</OnMouseUp>
+											<Textures	normal="/esoui/art/inventory/inventory_tabicon_all_up.dds"
+															pressed="/esoui/art/inventory/inventory_tabicon_all_down.dds"
+															mouseOver="/esoui/art/inventory/inventory_tabicon_all_over.dds" />
+										</Button>
+										<Button name="$(parent)_Button1">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button0" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Glyphs")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_GLYPH_ARMOR, ITEMTYPE_GLYPH_JEWELRY, ITEMTYPE_GLYPH_WEAPON}, {"Glyph - Armor", "Glyph - Jewelry", "Glyph - Weapon"})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/glyphs/glyphs_up.dds"
+												pressed = "IIfA/assets/miscellaneous/glyphs/glyphs_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/glyphs/glyphs_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button2">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button1" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Soul Gems")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_SOUL_GEM})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/soulgem/soulgem_up.dds"
+												pressed = "IIfA/assets/miscellaneous/soulgem/soulgem_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/soulgem/soulgem_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button3">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button2" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Siege")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_SIEGE})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds"
+												pressed = "IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button4">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button3" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Bait")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_LURE})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/bait/bait_up.dds"
+												pressed = "IIfA/assets/miscellaneous/bait/bait_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/bait/bait_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button5">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button4" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Tools")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TOOL})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/consumables/repair/repair_up.dds"
+												pressed = "IIfA/assets/consumables/repair/repair_down.dds"
+												mouseOver = "IIfA/assets/consumables/repair/repair_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button6">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button5" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Trophy")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TROPHY, ITEMTYPE_COLLECTIBLE, ITEMTYPE_FISH, ITEMTYPE_TREASURE}, {"Trophy", "Collectible", "Fish", "Treasure"})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/trophy/trophy_up.dds"
+												pressed = "IIfA/assets/miscellaneous/trophy/trophy_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/trophy/trophy_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button7">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button6" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Stolen")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Stolen", nil)</OnMouseUp>
+											<Textures
+												normal = "/esoui/art/vendor/vendor_tabicon_fence_up.dds"
+												pressed = "/esoui/art/vendor/vendor_tabicon_fence_down.dds"
+												mouseOver = "/esoui/art/vendor/vendor_tabicon_fence_over.dds"
+											 />
+										</Button>
+										<Button name="$(parent)_Button8">
+											<Anchor point="TOPLEFT" relativeTo="$(parent)_Button7" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+											<Dimensions x="38" y="38"/>
+											<OnMouseEnter>IIfA:GuiShowFilterTooltip(self, "Trash")</OnMouseEnter>
+											<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>IIfA:GuiOnFilterButton(self, "Misc", {ITEMTYPE_TRASH})</OnMouseUp>
+											<Textures
+												normal = "IIfA/assets/miscellaneous/trash/trash_up.dds"
+												pressed = "IIfA/assets/miscellaneous/trash/trash_down.dds"
+												mouseOver = "IIfA/assets/miscellaneous/trash/trash_over.dds"
+											 />
+										</Button>
+									</Controls>
+								</Control>
+<!-- End SubFilter Group 6 - Miscellaneous -->
+
+							</Controls>
+						</Control>
+<!-- End SubFilter Groups -->
+
+						<Control name="$(parent)_SortBar" mouseEnabled="true">
+
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Subfilter" relativePoint="BOTTOMLEFT" offsetY="3" offsetX="-50" />
+							<Dimensions y="30" x="110"/>
+
+							<Controls>
+								<Button name="$(parent)_Sort" verticalAlignment="LEFT"  mouseEnabled="true">
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="2" />
+									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="2" />
+									<OnMouseUp>IIfA:GuiOnSort()</OnMouseUp>
+									<Controls>
+
+										<Texture name="$(parent)_Icon">
+											<Dimensions x="30" y="30"/>
+											<Anchor point="LEFT" relativeTo="$(parent)" relativePoint="LEFT" offsetX="10" />
+										</Texture>
+
+										<Label name="$(parent)_SortName" hidden="false" text="Name" mouseEnabled="false" font="ZoFontGameLargeBold">
+											<Anchor point="LEFT" relativeTo="$(parent)_Icon" relativePoint="RIGHT" offsetX="20" />
+										</Label>
+
+									</Controls>
+								</Button>
+
+								<Control name="$(parent)_Subfilter_Dropdown" inherits="ZO_ComboBox" mouseEnabled="true" hidden="true">
+									<Dimensions x="150" y="30" />
+									<Anchor point="TOPLEFT" relativeTo="$(parent)_Sort_SortName" relativePoint="TOPRIGHT" offsetX="90" offsetY="0"/>
+								</Control>
+
+							</Controls>
+
+						</Control>
+
+					</Controls>
+				</Control>
+
+				<Control name="$(parent)_Search" mouseEnabled="true" resizeToFitDescendents="true">
+
+					<Anchor point="BOTTOMLEFT" relativeTo="$(parent)" relativePoint="BOTTOMLEFT" offsetX="16" offsetY="-30"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="-16" offsetY="-30"/>
+
+					<Controls>
+
+						<EditBox name="$(parent)Box"  inherits="ZO_InventorySearchBox" >
+
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="20"/>
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="0" offsetY="20"/>
+
+							<OnTextChanged>IIfA:GuiOnSearchboxText(self)</OnTextChanged>
+							<Controls>
+								<Backdrop name="$(parent)_bg" inherits="ZO_ThinBackdrop" centerColor="591141" >
+								</Backdrop>
+							</Controls>
+						</EditBox>
+						<Button name="$(parent)_Clear">
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-1" offsetY="22"/>
+							<OnMouseEnter>IIfA:GuiShowTooltip(self, "Clear Search Text")</OnMouseEnter>
+							<OnMouseExit>IIfA:GuiHideTooltip(self)</OnMouseExit>
+							<OnMouseUp>IIfA:GuiOnSearchBoxClear()</OnMouseUp>
+							<Dimensions x="23" y="23" />
+							<Textures normal="/esoui/art/buttons/decline_up.dds"
+										pressed="/esoui/art/buttons/decline_down.dds"
+									 mouseOver="/esoui/art/buttons/decline_over.dds"
+							/>
+						</Button>
+					</Controls>
+				</Control>
+
+				<Control name="$(parent)_SetNameOnly" mouseEnabled="true">
+					<Anchor point="BOTTOMLEFT" relativeTo="$(parent)_Search" relativePoint="TOPLEFT" offsetX="0" offsetY="-8"/>
+					<Controls>
+						<Button name="$(parent)_Box">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+							<Dimensions x="20" y="20"/>
+							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
+							<Textures
+								normal = "esoui/art/buttons/swatchframe_down.dds"
+							 />
+						</Button>
+						<Button name="$(parent)_Checked" hidden="true">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0"/>
+							<Dimensions x="20" y="20"/>
+							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
+							<Textures
+								normal = "esoui/art/buttons/decline_up.dds"
+							 />
+						</Button>
+						<Label name="$(parent)_Label" mouseEnabled="true" font="ZoFontGame" text="|cC5C29EFilter on Set Name only|r">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Box" relativePoint="TOPRIGHT" offsetX="5" offsetY="-3"/>
+							<OnMouseUp>IIfA:SetNameFilterToggle()</OnMouseUp>
+						</Label>
+
+					</Controls>
+				</Control>
+
+				<Control name="$(parent)_ListHolder" mouseEnabled="true">
+					<DimensionConstraints  minY="52"/>
+					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="15" offsetY="150"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="-27" offsetY="-75"/>
+					<OnMouseWheel>IIfA:GuiOnScroll(self, delta)</OnMouseWheel>
+
+					<Controls>
+						<Slider name="$(parent)_Slider" mouseEnabled="true" step="1" inherits="ZO_VerticalScrollbarBase">
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="16" offsetY="0"/>
+							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="16" offsetY="0"/>
+
+							<OnMouseDown>self.locked = false</OnMouseDown>
+							<OnMouseUp>self.locked = true</OnMouseUp>
+							<OnValueChanged>IIfA:GuiOnSliderUpdate(self, value)</OnValueChanged>
+						</Slider>
+
+					</Controls>
+
+				</Control>
+
+
+			</Controls>
+
+		</TopLevelControl>
+
+
+		<Control name="IIFA_SlotTemplate" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
+			<Dimensions x="300" y="52" />
+			<Controls>
+				<Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds" alpha="0.4">
+					<AnchorFill />
+					<TextureCoords left="0" right="1" top="0" bottom=".8125" />
+				</Texture>
+
+				<Button name="$(parent)Button" inherits="ZO_InventorySlotNoMouseover">
+					<Dimensions x="40" y="40" />
+					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="0" offsetY="3" />
+				</Button>
+
+				<Label name="$(parent)Qty" font="ZoFontGameShadow" horizontalAlignment="RIGHT" verticalAlignment="CENTER">
+					<Dimensions x="44" y="50"/>
+					<Anchor point="TOPLEFT" relativeTo="$(parent)Button" relativePoint="TOPRIGHT" offsetX="8" offsetY="-3" />
+				</Label>
+
+				<Label name="$(parent)Name" font="ZoFontGameShadow" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
+					<Dimensions y="50" />
+					<Anchor point="TOPLEFT" relativeTo="$(parent)Qty" relativePoint="TOPRIGHT" offsetX="18" offsetY="0"/>
+					<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="0" offsetY="0"/>
+				</Label>
+
+				<Texture name="$(parent)IconWorn" textureFile="esoui/art/campaign/overview_indexicon_bonus_disabled.dds" alpha="0.8" hidden="true">
+					<Dimensions x="20" y="20"/>
+					<Anchor point="TOPRIGHT" relativeTo="$(parent)Button" relativePoint="TOPLEFT" />
+				</Texture>
+
+				<Texture name="$(parent)IconStolen" textureFile="esoui/art/inventory/inventory_stolenitem_icon.dds" alpha="0.4" >
+					<Dimensions x="20" y="20"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)Button" relativePoint="BOTTOMLEFT" />
+				</Texture>
+			</Controls>
+		</Control>
+
+
+
+			<!-- tooltips -->
+			<Tooltip name="IIFA_POPUP_TOOLTIP" hidden="true" mouseEnabled="false" movable="false" clampedToScreen="true" virtual="true" inherits="ItemTooltipBase">
+				<Dimensions  x="416" y="200" />
+				<Anchor point="TOP" relativeTo="PopupTooltip" relativePoint="BOTTOM" offsetX="0" offsetY="0" />
+				<Controls>
+					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="" hidden="true">
+						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
+					</Label>
+					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
+						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
+						<Dimensions x="50" y="50" />
+					</Texture>
+				</Controls>
+			</Tooltip>
+
+			<Tooltip name="IIFA_ITEM_TOOLTIP" hidden="true" mouseEnabled="false" movable="false" clampedToScreen="true" virtual="true" inherits="ItemTooltipBase">
+				<Dimensions  x="200" y="200" />
+				<Anchor point="TOP" relativeTo="ItemTooltip" relativePoint="BOTTOM" offsetX="0" offsetY="0" />
+				<Controls>
+					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="" hidden="true">
+						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
+					</Label>
+					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
+						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
+						<Dimensions x="50" y="50" />
+					</Texture>
+				</Controls>
+			</Tooltip>
+
+			<Control name="IIFA_TT_Template" hidden="true" virtual="true">
+				<Controls>
+					<Label name="$(parent)_StyleLabel" font="ZoFontWinH4" text="">
+						<Anchor point="BOTTOM" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="40" />
+					</Label>
+					<Texture name="$(parent)_StyleIcon" textureFile="IIfA/assets/icons/imperial.dds">
+						<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-2" offsetY="2" />
+						<Dimensions x="64" y="64" />
+					</Texture>
+				</Controls>
+			</Control>
+
+
+			<TopLevelControl name="IIFA_CharCurrencyFrame" clampedToScreen="true" hidden="true">
+				<Dimensions x="467" />
+				<Controls>
+					<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
+					<Label name="$(parent)_Title" font="ZoFontGameShadow" text="" horizontalAlignment="CENTER">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="467" y="26" />
+					</Label>
+					<Label name="$(parent)_TitleCharName" font="ZoFontGameShadow" text="">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_Title" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="165" y="24" />
+					</Label>
+					<Texture name="$(parent)CURT_MONEY">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="TOPRIGHT" offsetX="54" offsetY="4" />
+					</Texture>
+					<Texture name="$(parent)CURT_TELVAR_STONES">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_MONEY" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
+					</Texture>
+					<Texture name="$(parent)CURT_ALLIANCE_POINTS">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_TELVAR_STONES" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
+					</Texture>
+					<Texture name="$(parent)CURT_WRIT_VOUCHERS">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)CURT_ALLIANCE_POINTS" relativePoint="TOPRIGHT" offsetX="59" offsetY="0" />
+					</Texture>
+					<Texture name="$(parent)_Divider" inherits="ZO_Options_Divider">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="490" y="3" />
+					</Texture>
+				</Controls>
+			</TopLevelControl>
+
+			<Control name="IIFA_CharCurrencyRow" virtual="true">
+				<Dimensions x="463" y="24" />
+				<Controls>
+					<Label name="$(parent)charName" font="ZoFontGameShadow" text="">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="165" y="24" />
+					</Label>
+					<Label name="$(parent)qtyGold" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)charName" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="72" y="24" />
+					</Label>
+					<Label name="$(parent)qtyTV" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyGold" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="72" y="24" />
+					</Label>
+					<Label name="$(parent)qtyAP" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyTV" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="72" y="24" />
+					</Label>
+					<Label name="$(parent)qtyWV" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)qtyAP" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="68" y="24" />
+					</Label>
+				</Controls>
+			</Control>
+
+			<TopLevelControl name="IIFA_CharBagFrame" clampedToScreen="true" hidden="true">
+				<Dimensions x="274" />
+				<Controls>
+					<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" ></Backdrop>
+					<Label name="$(parent)_Title" font="ZoFontGameShadow" text="" horizontalAlignment="CENTER">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="274" y="26" />
+					</Label>
+					<Label name="$(parent)_TitleCharName" font="ZoFontGameShadow" text="">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_Title" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="165" y="24" />
+					</Label>
+					<Label name="$(parent)_TitleUsed" font="ZoFontGameShadow" text="Used" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="TOPRIGHT" offsetX="0" offsetY="0" />
+						<Dimensions x="50" y="24" />
+					</Label>
+					<Label name="$(parent)_TitleMax" font="ZoFontGameShadow" text="Size" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleUsed" relativePoint="TOPRIGHT" offsetX="5" offsetY="0" />
+						<Dimensions x="55" y="24" />
+					</Label>
+					<Texture name="$(parent)_Divider" inherits="ZO_Options_Divider">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)_TitleCharName" relativePoint="BOTTOMLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="288" y="3" />
+					</Texture>
+				</Controls>
+			</TopLevelControl>
+
+			<Control name="IIFA_CharBagRow" virtual="true">
+				<Dimensions x="262" y="24" />
+				<Controls>
+					<Label name="$(parent)charName" font="ZoFontGameShadow" text="">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="0" offsetY="0" />
+						<Dimensions x="165" y="24" />
+					</Label>
+					<Label name="$(parent)spaceUsed" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)charName" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="42" y="24" />
+					</Label>
+					<Label name="$(parent)spaceMax" font="ZoFontGameShadow" text="" horizontalAlignment="RIGHT">
+						<Anchor point="TOPLEFT" relativeTo="$(parent)spaceUsed" relativePoint="TOPRIGHT" offsetX="5" offsetY="0"/>
+						<Dimensions x="55" y="24" />
+					</Label>
+				</Controls>
+			</Control>
+
+		</Controls>
+</GuiXml>
diff --git a/IIfA/IIfABackpack.lua b/IIfA/IIfABackpack.lua
new file mode 100644
index 0000000..d6c0211
--- /dev/null
+++ b/IIfA/IIfABackpack.lua
@@ -0,0 +1,938 @@
+local IIfA = IIfA
+
+local LMP = LibStub("LibMediaProvider-1.0")
+
+IIfA.ScrollSortUp = true
+IIfA.ActiveFilter = 0
+IIfA.ActiveSubFilter = 0
+IIfA.InventoryFilter = "All"
+
+IIfA.InventoryListFilter = "All"
+
+-- Get pointer to current settings based on user pref (global or per char)
+function IIfA:GetSettings()
+	if IIfA.data.saveSettingsGlobally then return IIfA.data end
+	return IIfA.settings
+end
+
+-- this is for the dropdown menu
+function IIfA:GetInventoryListFilter()
+	if not IIfA.InventoryListFilter then return "All" end
+	return IIfA.InventoryListFilter
+end
+
+
+-- this is for the buttons
+local function enableFilterButton(num)
+	local buttonName = "Button"..num
+    local button = IIFA_GUI_Header_Filter:GetNamedChild(buttonName)
+    if button then
+        button:SetState(BSTATE_PRESSED)
+    end
+end
+local function disableFilterButton(num)
+    local button = IIFA_GUI_Header_Filter:GetNamedChild("Button"..num)
+    if button then
+        button:SetState(BSTATE_NORMAL)
+    end
+end
+
+function IIfA:GetActiveFilter()
+	if not IIfA.ActiveFilter then return 0 end
+	return tonumber(IIfA.ActiveFilter)
+end
+
+function IIfA:SetActiveFilter(value)
+	if value == nil then
+		value = 0
+	else
+		value = tonumber(value)
+	end
+	local currentFilter = IIfA:GetActiveFilter()
+
+	if tonumber(currentFilter) == value then
+		value = 0
+	end
+
+	IIfA.ActiveFilter = value
+	if currentFilter ~= value then
+		disableFilterButton(currentFilter)
+	end
+
+	enableFilterButton(value)
+
+	IIfA:UpdateScrollDataLinesData()
+
+end
+
+function IIfA:GetActiveSubFilter()
+	if not IIfA.activeSubFilter then return 0 end
+	return tonumber(IIfA.activeSubFilter)
+end
+
+function IIfA:SetActiveSubFilter(value)
+	value = tonumber(value)
+	if IIfA.GetActiveSubFilter() == value then
+		IIfA.activeSubFilter = 0
+	else
+		IIfA.activeSubFilter = value
+	end
+	IIfA:UpdateScrollDataLinesData()
+end
+
+
+function IIfA:SetInventoryListFilter(value)
+	if not value or value == "" then value = "All" end
+	IIfA.InventoryListFilter = value
+
+	IIfA.searchFilter = IIFA_GUI_SearchBox:GetText()
+
+	IIfA:UpdateScrollDataLinesData()
+	IIfA:UpdateInventoryScroll()
+end
+
+
+--[[----------------------------------------------------------------------]]
+--[[----------------------------------------------------------------------]]
+--[[------ GUI functions  ------------------------------------------------]]
+
+function IIfA:GUIDoubleClick(control, button)
+	if button == MOUSE_BUTTON_INDEX_LEFT and control.itemLink then
+		if control.itemLink ~= "" then
+			ZO_ChatWindowTextEntryEditBox:SetText(ZO_ChatWindowTextEntryEditBox:GetText() .. zo_strformat(SI_TOOLTIP_ITEM_NAME, control.itemLink))
+		end
+	end
+end
+
+local function getItemLinkFromDB(itemLink, item)
+	local iLink = ""
+	if zo_strlen(itemLink) < 10 then
+		iLink = item.itemLink
+	else
+		iLink = itemLink
+	end
+	return iLink
+end
+
+
+local function DoesInventoryMatchList(locationName, location)
+	local bagId = location.bagID
+
+--	if locationName == "attributes" then return false end
+	if( IIfA.InventoryListFilter == "All" ) then
+		return true
+
+	elseif(IIfA.InventoryListFilter == "All Banks") then
+		return nil ~= bagId and bagId ~= BAG_BACKPACK and IIfA.trackedBags[bagId]
+		-- (location.bagID == BAG_BANK or location.bagID == BAG_GUILDBANK or location.bagID == BAG_SUBSCRIBER_BANK)
+
+	elseif(IIfA.InventoryListFilter == "All Guild Banks") then
+		return (location.bagID == BAG_GUILDBANK)
+
+	elseif(IIfA.InventoryListFilter == "All Characters") then
+		return (location.bagID == BAG_BACKPACK or location.bagID == BAG_WORN)
+
+	elseif(IIfA.InventoryListFilter == "Bank and Characters") then
+		return (location.bagID == BAG_BANK or
+				location.bagID == BAG_SUBSCRIBER_BANK or
+				location.bagID == BAG_BACKPACK or
+				location.bagID == BAG_WORN)
+
+	elseif(IIfA.InventoryListFilter == "Bank and Current Character") then
+		return (location.bagID == BAG_BANK or
+				location.bagID == BAG_SUBSCRIBER_BANK or
+				((location.bagID == BAG_BACKPACK or
+				  location.bagID == BAG_WORN) and
+				 locationName == IIfA.currentCharacterId))
+
+	elseif(IIfA.InventoryListFilter == "Bank Only") then
+		return (location.bagID == BAG_BANK or
+				location.bagID == BAG_SUBSCRIBER_BANK)
+
+	elseif(IIfA.InventoryListFilter == "Craft Bag") then
+		return (location.bagID == BAG_VIRTUAL)
+
+	else --Not a preset, must be a specific guildbank or character
+		if location.bagID == BAG_BACKPACK or location.bagID == BAG_WORN then
+			-- it's a character name, convert to Id, check that against location Name in the dbv3 table
+			if locationName == IIfA.CharNameToId[IIfA.InventoryListFilter] then return true end
+		else
+			-- it's a bank to compare, do it direct
+			if locationName == IIfA.InventoryListFilter then return true end
+		end
+	end
+end
+
+local function matchCurrentInventory(locationName)
+--	if locationName == "attributes" then return false end
+	local accountInventoryList = IIfA:GetAccountInventoryList()
+
+	for i, inventoryName in ipairs(accountInventoryList) do
+		if inventoryName == locationName then return true end
+	end
+
+	return (IIfA:GetInventoryListFilter() == "All")
+end
+
+local function matchFilter(itemName, itemLink)
+    local ret = true
+	local itemMatch = false
+	local hasSetInfo, setName
+
+	local searchFilter = IIfA.searchFilter
+-- 17-7-30 AM - moved lowercasing to when it's created, it's an extra var overall, but will cut down filtering because it's one less call to lowercase for every item
+--    if not searchFilter then searchFilter = "" end
+--	searchFilter = string.lower(searchFilter)
+    local name = string.lower(itemName)
+    if not name then name = "" end
+
+	-- text filter takes precedence
+	-- 3-6-17 AM - you're either filtering on a set name, or not - much less confusing (hopefully)
+	if IIfA.bFilterOnSetName then
+		hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
+		if hasSetInfo then
+			ret = zo_plainstrfind(setName:lower(), searchFilter)
+		else
+			-- no point in going any further, this item doesn't have set info at all, so return a fail and keep truckin
+			return false
+		end
+	else
+		ret = zo_plainstrfind(name, searchFilter)
+		if IIfA:GetSettings().bFilterOnSetNameToo then
+			hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
+			if hasSetInfo then
+				ret = zo_plainstrfind(setName:lower(), searchFilter) or ret
+			end
+		end
+	end
+
+	local bWorn = false
+	local equipType = 0
+	local itemType = 0
+	local subType
+
+	if IIfA.filterGroup ~= "All" and ret then		-- it's not everything, and text search matches, filter by some more stuff
+		if IIfA.filterGroup == "Weapons" or
+			IIfA.filterGroup == "Consumable" or
+			IIfA.filterGroup == "Materials" or
+			IIfA.filterGroup == "Misc" or
+			IIfA.filterGroup == "Specialized" or
+			IIfA.filterGroup == "Body" then
+			if IIfA.filterGroup == "Weapons" then
+				itemType = GetItemLinkWeaponType(itemLink)
+			elseif IIfA.filterGroup == "Body" then
+				-- Body takes extra arg at beginning of array, if array is used at all
+				-- Item type (armor, non-armor)
+				-- remaining args are the specific type of equipment
+				itemType = 0
+				_, _, _, equipType = GetItemLinkInfo(itemLink)
+				-- pre-qual any body type item, if it's not wearable, it's not included
+
+				if equipType == EQUIP_TYPE_INVALID or
+					equipType == EQUIP_TYPE_POISON or
+					equipType == EQUIP_TYPE_MAIN_HAND or
+					equipType == EQUIP_TYPE_ONE_HAND or
+					equipType == EQUIP_TYPE_TWO_HAND then
+					itemType = 0
+				elseif IIfA.filterTypes == nil then		-- if we're not searching for something specific
+					-- quit searching, we're displaying anything worn
+					itemType = 1		-- number doesn't matter
+				else
+					-- it's a wearable piece of some type
+					bWorn = true
+					itemType = GetItemLinkArmorType(itemLink)
+				end
+			elseif	IIfA.filterGroup == "Consumable" or
+					IIfA.filterGroup == "Materials" or
+					IIfA.filterGroup == "Specialized" or
+					IIfA.filterGroup == "Misc" then
+				itemType, subType = GetItemLinkItemType(itemLink)
+				if IIfA.filterGroup ~= "Specialized" then
+					subType = nil
+				end
+			end
+
+			if itemType == 0 and not bWorn then		-- it's not worn or armor and no type assigned, ret false
+				ret = false
+			else
+				if IIfA.filterTypes ~= nil then
+					if bWorn then
+						if itemType == IIfA.filterTypes[1] then
+							for i=2, #IIfA.filterTypes do
+								if(equipType == IIfA.filterTypes[i]) then
+									itemMatch = true
+									break
+								end
+							end
+						end
+					elseif IIfA.filterGroup == "Specialized" then
+						if itemType == IIfA.filterTypes[1] then
+							for i=2, #IIfA.filterTypes do
+								if(subType == IIfA.filterTypes[i]) then
+									itemMatch = true
+									break
+								end
+							end
+						end
+					else
+						for i=1, #IIfA.filterTypes do
+							if (subType == nil and itemType == IIfA.filterTypes[i]) or
+							   (subType ~= nil and subType == IIfA.filterTypes[i]) then
+								itemMatch = true
+								break
+							end
+						end
+					end
+				else
+					itemMatch = true
+				end
+				ret = ret and itemMatch
+			end
+		elseif IIfA.filterGroup == "Stolen" then
+			ret = ret and IsItemLinkStolen(itemLink)
+		end
+	end
+    return ret
+end
+
+
+--sort datalines
+local function IIfA_FilterCompareUp(a, b)
+	--local _, _, name1 = a.itemLink:match("|H(.-):(.-)|h(.-)|h")
+	--local _, _, name2 = b.itemLink:match("|H(.-):(.-)|h(.-)|h")
+	local name1 = a.name
+	local name2 = b.name
+	return (name1 or "") < (name2 or "")
+end
+local function IIfA_FilterCompareDown(a, b)
+	return IIfA_FilterCompareUp(b, a)
+end
+
+local function sort(dataLines)
+	if dataLines == nil then dataLines = IIFA_GUI_ListHolder.dataLines end
+
+	if (IIfA.ScrollSortUp) then
+		dataLines = table.sort(dataLines, IIfA_FilterCompareUp)
+	elseif (not IIfA.ScrollSortUp) then
+		dataLines = table.sort(dataLines, IIfA_FilterCompareDown)
+	end
+end
+
+-- fill the shown item list with items that match current filter(s)
+function IIfA:UpdateScrollDataLinesData()
+	IIfA:DebugOut("UpdateScrollDataLinesData")
+
+	if (not IIfA.searchFilter) or IIfA.searchFilter == "Click to search..." then
+		IIfA.searchFilter = IIFA_GUI_SearchBox:GetText()
+	end
+
+	local index = 0
+	local dataLines = {}
+	local DBv3 = IIfA.data.DBv3
+	local iLink, itemLink, iconFile, itemQuality, tempDataLine = nil
+	local itemTypeFilter, itemCount = 0
+	local match = false
+	local bWorn = false
+
+	if(DBv3)then
+		for itemLink, item in pairs(DBv3) do
+			iLink = getItemLinkFromDB(itemLink, item)
+
+			if (itemLink ~= "") then
+
+				itemTypeFilter = 0
+				if (item.filterType) then
+					itemTypeFilter = item.filterType
+				end
+
+				itemCount = 0
+				bWorn = false
+
+				local locationName, locData
+				for locationName, locData in pairs(item.locations) do
+					itemCount = itemCount + (locData.itemCount or 0)
+					if DoesInventoryMatchList(locationName, locData) then
+						match = true
+					end
+					bWorn = bWorn or (locData.bagID == BAG_WORN)
+				end
+
+				tempDataLine = {
+					link = iLink, 		-- getItemLinkFromDB(itemLink, item),
+					qty = itemCount,
+					icon = item.iconFile,
+					name = item.itemName,
+					quality = item.itemQuality,
+					filter = itemTypeFilter,
+					worn = bWorn
+				}
+
+				if(itemCount > 0) and matchFilter(item.itemName, iLink) and match then
+					table.insert(dataLines, tempDataLine)
+				end
+				match = false
+			end
+		end
+	end
+
+	IIFA_GUI_ListHolder.dataLines = dataLines
+	sort(IIFA_GUI_ListHolder.dataLines)
+	IIFA_GUI_ListHolder.dataOffset = 0
+	IIfA:UpdateInventoryScroll()
+end
+
+
+local function fillLine(curLine, curItem)
+	if curItem == nil then
+		curLine.itemLink = ""
+		curLine.icon:SetTexture(nil)
+		curLine.icon:SetAlpha(0)
+		curLine.text:SetText("")
+		curLine.qty:SetText("")
+		curLine.worn:SetHidden(true)
+		curLine.stolen:SetHidden(true)
+	else
+		local r, g, b, a = 255, 255, 255, 1
+		if (curItem.quality) then
+			color = GetItemQualityColor(curItem.quality)
+			r, g, b, a = color:UnpackRGBA()
+		end
+		curLine.itemLink = curItem.link
+		curLine.icon:SetTexture(curItem.icon)
+		curLine.icon:SetAlpha(1)
+		local text = zo_strformat(SI_TOOLTIP_ITEM_NAME, curItem.name)
+		curLine.text:SetText(text)
+		curLine.text:SetColor(r, g, b, a)
+		curLine.qty:SetText(curItem.qty)
+		curLine.worn:SetHidden(not curItem.worn)
+		curLine.stolen:SetHidden(not IsItemLinkStolen(curItem.link))
+	end
+end
+
+function IIfA:InitializeInventoryLines()
+	IIfA:DebugOut("InitializeInventoryLines")
+
+	local curLine, curData
+	for i = 1, IIFA_GUI_ListHolder.maxLines do
+
+		curLine = IIFA_GUI_ListHolder.lines[i]
+		curData = IIFA_GUI_ListHolder.dataLines[IIFA_GUI_ListHolder.dataOffset + i]
+		IIFA_GUI_ListHolder.lines[i] = curLine
+
+		if( curData ~= nil) then
+			fillLine(curLine, curData)
+		else
+			fillLine(curLine, nil)
+		end
+	end
+end
+
+function IIfA:UpdateInventoryScroll()
+	local index = 0
+
+	IIfA:DebugOut("UpdateInventoryScroll")
+
+	------------------------------------------------------
+	if IIFA_GUI_ListHolder.dataOffset < 0 then IIFA_GUI_ListHolder.dataOffset = 0 end
+	if IIFA_GUI_ListHolder.maxLines == nil then
+		IIFA_GUI_ListHolder.maxLines = 35
+	end
+	IIfA:InitializeInventoryLines()
+
+	local total = #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines
+	IIFA_GUI_ListHolder_Slider:SetMinMax(0, total)
+end
+
+
+function IIfA:SetItemCountPosition()
+	for i=1, IIFA_GUI_ListHolder.maxLines do
+		line = IIFA_GUI_ListHolder.lines[i]
+		line.text:ClearAnchors()
+		line.qty:ClearAnchors()
+		if IIfA:GetSettings().showItemCountOnRight then
+			line.qty:SetAnchor(TOPRIGHT, line, TOPRIGHT, 0, 0)
+			line.text:SetAnchor(TOPLEFT, line:GetNamedChild("Button"), TOPRIGHT, 18, 0)
+			line.text:SetAnchor(TOPRIGHT, line.qty, TOPLEFT, -10, 0)
+		else
+			line.qty:SetAnchor(TOPLEFT, line:GetNamedChild("Button"), TOPRIGHT, 8, -3)
+			line.text:SetAnchor(TOPLEFT, line.qty, TOPRIGHT, 18, 0)
+			line.text:SetAnchor(TOPRIGHT, line, TOPLEFT, 0, 0)
+		end
+	end
+end
+
+
+function IIfA:CreateLine(i, predecessor, parent)
+	local line = WINDOW_MANAGER:CreateControlFromVirtual("IIFA_ListItem_".. i, parent, "IIFA_SlotTemplate")
+
+	line.icon = line:GetNamedChild("Button"):GetNamedChild("Icon")
+	line.text = line:GetNamedChild("Name")
+	line.qty = line:GetNamedChild("Qty")
+	line.worn = line:GetNamedChild("IconWorn")
+	line.stolen = line:GetNamedChild("IconStolen")
+
+--	line.text:SetText(text)
+--	line.itemLink = text
+--	text=""
+
+	line:SetHidden(false)
+	line:SetMouseEnabled(true)
+	line:SetHeight(IIFA_GUI_ListHolder.rowHeight)
+
+	if i == 1 then
+		line:SetAnchor(TOPLEFT, IIFA_GUI_ListHolder, TOPLEFT, 0, 0)
+		line:SetAnchor(TOPRIGHT, IIFA_GUI_ListHolder, TOPRIGHT, 0, 0)
+	else
+		line:SetAnchor(TOPLEFT, predecessor, BOTTOMLEFT, 0, 0)
+		line:SetAnchor(TOPRIGHT, predecessor, BOTTOMRIGHT, 0, 0)
+	end
+
+	line:SetHandler("OnMouseEnter", function(self) IIfA:GuiLineOnMouseEnter(self) end )
+	line:SetHandler("OnMouseExit", function(self) IIfA:GuiLineOnMouseExit(self) end )
+	line:SetHandler("OnMouseDoubleClick", function(...) IIfA:GUIDoubleClick(...) end )
+
+	return line
+end
+
+
+function IIfA:CreateInventoryScroll()
+	IIfA:DebugOut("CreateInventoryScroll")
+
+	IIFA_GUI_ListHolder.dataOffset = 0
+
+	IIFA_GUI_ListHolder.dataLines = {}
+	IIFA_GUI_ListHolder.lines = {}
+	IIFA_GUI_Header_SortBar.Icon = IIFA_GUI_Header_SortBar:GetNamedChild("_Sort"):GetNamedChild("_Icon")
+
+	--local width = 250 -- IIFA_GUI_ListHolder:GetWidth()
+	local text = "       No Collected Data"
+
+
+	-- we set those to 35 because that's the amount of lines we can show
+	-- within the dimension constraints
+	IIFA_GUI_ListHolder.maxLines = 35
+	local predecessor = nil
+	for i=1, IIFA_GUI_ListHolder.maxLines do
+		IIFA_GUI_ListHolder.lines[i] = IIfA:CreateLine(i, predecessor, IIFA_GUI_ListHolder)
+		predecessor = IIFA_GUI_ListHolder.lines[i]
+	end
+
+	if IIfA:GetSettings().showItemCountOnRight then
+		IIfA:SetItemCountPosition()
+	end
+
+	IIfA:UpdateScrollDataLinesData()
+
+	-- setup slider
+--	local tex = "/esoui/art/miscellaneous/scrollbox_elevator.dds"
+--	IIFA_GUI_ListHolder_Slider:SetThumbTexture(tex, tex, tex, 16, 50, 0, 0, 1, 1)
+	IIFA_GUI_ListHolder_Slider:SetMinMax(0, #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines)
+
+	return IIFA_GUI_ListHolder.lines
+end
+
+function IIfA:GetCharacterList()
+	local charInventories = {}
+	for i=1, GetNumCharacters() do
+		local charName, _, _, _, _, _, _, _ = GetCharacterInfo(i)
+		charName = charName:sub(1, charName:find("%^") - 1)
+		if (nil == charInventories[charName]) then
+			table.insert(charInventories, charName)
+		end
+	end
+	return charInventories
+end
+
+function IIfA:GetAccountInventoryList()
+	local accountInventories = IIfA.dropdownBankNames
+
+
+-- get character names, will present in same order as character selection screen
+	for idx, charName in ipairs(IIfA:GetCharacterList()) do
+		if (nil == accountInventories[charName]) then
+			table.insert(accountInventories, charName)
+		end
+	end
+
+-- banks are same as toons, same order as player normally sees them
+	if IIfA.data.bCollectGuildBankData then
+		for i = 1, GetNumGuilds() do
+			id = GetGuildId(i)
+			guildName = GetGuildName(id)
+
+			-- on the off chance that this doesn't exist already, create it
+			if IIfA.data.guildBanks == nil then
+				IIfA.data.guildBanks = {}
+			end
+
+			if IIfA.data.guildBanks[guildName] ~= nil then
+				table.insert(accountInventories, guildName)
+			end
+		end
+	end
+	return accountInventories
+end
+
+function IIfA:QueryAccountInventory(itemLink)
+	if itemLink ~= nil then
+		itemLink = string.gsub(itemLink, '|H0', '|H1')
+	end
+
+	local queryItem = {
+		link = itemLink,
+		locations = {},
+	}
+
+	local queryItemsFound = 0
+	local AlreadySavedLoc = false
+	local newLocation = {}
+
+	itemType = GetItemLinkItemType(itemLink)
+	if itemType == ITEMTYPE_BLACKSMITHING_MATERIAL or
+		itemType == ITEMTYPE_ARMOR_TRAIT or
+		itemType == ITEMTYPE_BLACKSMITHING_BOOSTER or
+		itemType == ITEMTYPE_BLACKSMITHING_RAW_MATERIAL or
+		itemType == ITEMTYPE_CLOTHIER_BOOSTER or
+		itemType == ITEMTYPE_CLOTHIER_MATERIAL or
+		itemType == ITEMTYPE_CLOTHIER_RAW_MATERIAL or
+		itemType == ITEMTYPE_ENCHANTING_RUNE_ASPECT or
+		itemType == ITEMTYPE_ENCHANTING_RUNE_ESSENCE or
+		itemType == ITEMTYPE_ENCHANTING_RUNE_POTENCY or
+		itemType == ITEMTYPE_FLAVORING or
+		itemType == ITEMTYPE_INGREDIENT or
+		itemType == ITEMTYPE_LOCKPICK or
+		itemType == ITEMTYPE_LURE or
+		itemType == ITEMTYPE_POISON_BASE or
+		itemType == ITEMTYPE_POTION_BASE or
+		itemType == ITEMTYPE_RAW_MATERIAL or
+		itemType == ITEMTYPE_REAGENT or
+		itemType == ITEMTYPE_RECIPE or
+		itemType == ITEMTYPE_SPICE or
+		itemType == ITEMTYPE_STYLE_MATERIAL or
+		itemType == ITEMTYPE_WEAPON_TRAIT or
+		itemType == ITEMTYPE_WOODWORKING_BOOSTER or
+		itemType == ITEMTYPE_WOODWORKING_MATERIAL or
+		itemType == ITEMTYPE_WOODWORKING_RAW_MATERIAL or
+		itemType == ITEMTYPE_RACIAL_STYLE_MOTIF then
+		itemLink = IIfA:GetItemID(itemLink)
+	end
+
+	local item = IIfA.data.DBv3[itemLink]
+
+	if ((queryItem.link ~= nil) and (item ~= nil)) then
+		for locationName, location in pairs(item.locations) do
+			AlreadySavedLoc = false
+			if location.bagID == BAG_WORN or location.bagID == BAG_BACKPACK then
+				locationName = IIfA.CharIdToName[locationName]
+			end
+			if locationName ~= nil then
+				for x, QILocation in pairs(queryItem.locations) do
+					if (QILocation.name == locationName)then
+						QILocation.itemsFound = QILocation.itemsFound + location.itemCount
+						AlreadySavedLoc = true
+					end
+				end
+				if location.itemCount then
+					if (not AlreadySavedLoc) and (location.itemCount > 0) then
+						newLocation = {}
+						newLocation.name = locationName
+						newLocation.itemsFound = location.itemCount
+						if location.bagID == BAG_WORN then
+							newLocation.worn = true
+						end
+						table.insert(queryItem.locations, newLocation)
+					end
+				end
+			end
+		end
+	end
+	return queryItem
+end
+
+function IIfA:CreateInventoryDropdown()
+	local comboBox, i
+
+	if IIFA_GUI_Header_Dropdown.comboBox ~= nil then
+		comboBox = IIFA_GUI_Header_Dropdown.comboBox
+	else
+		comboBox = ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_Dropdown)
+		IIFA_GUI_Header_Dropdown.comboBox = comboBox
+	end
+
+	function OnItemSelect(_, choiceText, choice)
+--		d("OnItemSelect", choiceText, choice)
+		IIfA:SetInventoryListFilter(choiceText)
+	  	PlaySound(SOUNDS.POSITIVE_CLICK)
+	end
+
+	comboBox:SetSortsItems(false)
+
+	local validChoices =  IIfA:GetAccountInventoryList()
+
+	for i = 1, #validChoices do
+       	entry = comboBox:CreateItemEntry(validChoices[i], OnItemSelect)
+		comboBox:AddItem(entry)
+		if validChoices[i] == IIfA:GetInventoryListFilter() then
+			comboBox:SetSelectedItem(validChoices[i])
+		end
+	end
+
+	return IIFA_GUI_Header_Dropdown
+end
+
+function IIfA:SetSceneVisible(name, value)
+	IIfA:GetSettings().frameSettings[name].hidden = not value
+end
+
+function IIfA:GetSceneVisible(name)
+	if IIfA:GetSettings().frameSettings then
+		return (not IIfA:GetSettings().frameSettings[name].hidden)
+	else
+		return true
+	end
+end
+
+function IIfA:SetupBackpack()
+	IIfA.InventoryListFilter = IIfA.data.in2DefaultInventoryFrameView
+	IIfA:CreateInventoryScroll()
+	IIfA:CreateInventoryDropdown()
+	IIfA:GuiOnSort(true)
+end
+
+function IIfA:ProcessRightClick(control)
+	if control == nil then
+		return
+	end
+
+	control = control:GetParent()
+	if control:GetName():match("IIFA_ListItem") == nil or
+		control.itemLink == nil then
+		return
+	end
+
+	-- it's an IIFA list item, lets see if it has data, and allow menu if it does
+
+	if control.itemLink ~= "" then
+		zo_callLater(function()
+			AddCustomMenuItem(GetString(SI_ITEM_ACTION_LINK_TO_CHAT), function() IIfA:GUIDoubleClick(control, MOUSE_BUTTON_INDEX_LEFT) end, MENU_ADD_OPTION_LABEL)
+			AddCustomMenuItem("Missing Motifs to text", function() IIfA:FMC(control, "Private") end, MENU_ADD_OPTION_LABEL)
+			AddCustomMenuItem("Missing Motifs to Chat", function() IIfA:FMC(control, "Public") end, MENU_ADD_OPTION_LABEL)
+			AddCustomMenuItem("Filter by Item Name", function() IIfA:FilterByItemName(control) end, MENU_ADD_OPTION_LABEL)
+			AddCustomMenuItem("Filter by Item Set Name", function() IIfA:FilterByItemSet(control) end, MENU_ADD_OPTION_LABEL)
+			ShowMenu(control)
+			end, 50
+			)
+	end
+end
+
+
+-- paste missing motif chapters to chat based on currently displayed list of items
+function IIfA:FMC(control, WhoSeesIt)
+--[[
+-- next block taken from AI Research Grid
+-- not helpful in that it gives back singular versions of everything, and breastplate instead of chest
+-- Display Order in tooltip
+	local styleChaptersLookup =
+		{
+		[1] = ITEM_STYLE_CHAPTER_AXES,
+		[2] = ITEM_STYLE_CHAPTER_BELTS,
+		[3] = ITEM_STYLE_CHAPTER_BOOTS,
+		[4] = ITEM_STYLE_CHAPTER_BOWS,
+		[5] = ITEM_STYLE_CHAPTER_CHESTS,
+		[6] = ITEM_STYLE_CHAPTER_DAGGERS,
+		[7] = ITEM_STYLE_CHAPTER_GLOVES,
+		[8] = ITEM_STYLE_CHAPTER_HELMETS,
+		[9] = ITEM_STYLE_CHAPTER_LEGS,
+		[10] = ITEM_STYLE_CHAPTER_MACES,
+		[11] = ITEM_STYLE_CHAPTER_SHIELDS,
+		[12] = ITEM_STYLE_CHAPTER_SHOULDERS,
+		[13] = ITEM_STYLE_CHAPTER_STAVES,
+		[14] = ITEM_STYLE_CHAPTER_SWORDS,
+		}
+--]]
+
+-- following lookup turns a motif number "Crafting Motif 33: Thieves Guild Axes" into an achieve lookup
+-- |H1:achievement:1318:16383:1431113493|h|h
+	local motifAchieves =
+		{
+		[15] = 1144,	-- Dwemer
+		[16] = 1319, 	-- Glass
+		[17] = 1181,	-- Xivkyn
+		[18] = 1318,	-- Akaviri
+		[19] = 1348,	-- Mercenary
+		[20] = 1713,	-- Yokudan
+		[21] = 1341,	-- Ancient Orc
+		[22] = 1411,	-- Trinimac
+		[23] = 1412,	-- Malacath
+		[24] = 1417,	-- Outlaw
+		[25] = 1415,	-- Aldmeri Dominion
+		[26] = 1416,	-- Daggerfall Covenant
+		[27] = 1414,	-- Ebonheart Pact
+		[28] = 1797,	-- Ra Gada
+--		[29] = 0,		-- Soul-Shriven
+		[30] = 1933,	-- Morag Tong
+		[31] = 1676, 	-- Skinchanger
+		[32] = 1422, 	-- Abah's Watch
+		[33] = 1423,	-- Thieves Guild
+		[34] = 1424,	-- Assasins League
+		[35] = 1659,	-- Dro-m'Athra
+		[36] = 1661,	-- Dark Brotherhood
+		[37] = 1798,	-- Ebony
+		[38] = 1715,	-- Draugr
+		[39] = 1662,	-- Minotaur
+		[40] = 1660,	-- Order Hour
+		[41] = 1714,	-- Celestial
+		[42] = 1545,	-- Hollowjack
+--		[43] = 0,		-- Harlequin
+		[44] = 1796,	-- Silken Ring
+		[45] = 1795,	-- Mazzatun
+--		[46] = 0,		-- Stahlrim
+		[47] = 1934,	-- Bouyant Armiger
+		[48] = 1932,	-- Ashlander
+		[49] = 1935,	-- Militant Ordinator
+		[50] = 2023,	-- Telvani
+		[51] = 2021,	-- Hlaalu
+		[52] = 2022,	-- Redoran
+		[54] = 2098,	-- Bloodforge
+		[55] = 2097,	-- Dreadhorn
+		[56] = 2044,	-- Apostle
+		[57] = 2045,	-- Ebonshadow
+		}
+
+--		local i, a
+--		for i,a in pairs(motifAchieves) do
+--			d(i .. " = |H1:achievement:" .. a .. ":16383:1431113493|h|h")
+--		end
+
+	local langChapNames = {}
+	langChapNames["EN"] = {"Axes", "Belts", "Boots", "Bows", "Chests", "Daggers", "Gloves", "Helmets", "Legs", "Maces", "Shields", "Shoulders", "Staves", "Swords" }
+	langChapNames["DE"] = {"xte", "Grtel", "Stiefel", "Bogen", "Torsi", "Dolche", "Handschuhe", "Helme", "Beine", "Keulen", "Schilde", "Schultern", "Stbe", "Schwerter" }
+	local chapnames = langChapNames[GetCVar("language.2")]
+	if chapnames == nil then
+		chapnames = langChapNames["EN"]
+	end
+
+	if control.itemLink == nil or control.itemLink == "" then
+		d("Invalid item. Right-Click ignored.")
+		return
+	end
+
+	local motifNum
+	motifNum = GetItemLinkName(control.itemLink):match("%d+")
+	motifNum = tonumber(motifNum)
+	if motifAchieves[motifNum] == nil then
+		d(control.itemLink .. " is not a valid motif chapter")
+		return
+	end
+
+--	local chapnames = {}, idx, chapType
+--	for idx, chapType in pairs(styleChaptersLookup) do
+--		chapnames[idx - 1] = GetString("SI_ITEMSTYLECHAPTER", chapType)
+--	end
+
+	local idx, data, i, val
+	local chapVal
+	chapVal = 0
+	for idx, data in pairs(IIFA_GUI_ListHolder.dataLines) do
+		for i, val in pairs(chapnames) do
+			if chapnames[i] ~= nil then
+				if zo_plainstrfind(data.name, val) and zo_plainstrfind(data.name, tostring(motifNum)) then
+					chapnames[i] = nil
+					chapVal = chapVal + (2 ^ (i - 1))
+				end
+			end
+		end
+	end
+
+	local s = ""
+	for i, val in pairs(chapnames) do
+		if val ~= nil then
+			if s == "" then
+				s = val
+			else
+				s = s .. ", " .. val
+			end
+		end
+	end
+
+	if s == "" then
+		d("No motif chapters missing")
+	else
+		-- incomplete motif achieve
+		-- |H1:achievement:1416:0:0|h|h
+		local motifStr = "|H1:achievement:" .. motifAchieves[motifNum] .. ":" .. chapVal .. ":0|h|h"
+
+		if WhoSeesIt == "Private" then
+			d("Missing " .. motifStr .. " chapters: " .. s)
+		end
+
+		if WhoSeesIt == "Public" then
+			d("Missing motif chapters are in the chat text edit area")
+			ZO_ChatWindowTextEntryEditBox:SetText("Looking for " .. motifStr .. " missing chapters: " .. s)
+		end
+
+	end
+	--d(chapnames)
+
+end
+
+function IIfA:FilterByItemName(control)
+
+	local itemName
+	itemName = GetItemLinkName(control.itemLink)
+
+	IIfA.searchFilter = itemName
+	IIFA_GUI_SetNameOnly_Checked:SetHidden(true)
+	IIFA_GUI_SearchBox:SetText(itemName)
+	IIFA_GUI_SearchBoxText:SetHidden(true)
+	IIfA.bFilterOnSetName = false
+    IIfA:UpdateScrollDataLinesData()
+    IIfA:UpdateInventoryScroll()
+
+end
+
+function IIfA:FilterByItemSet(control)
+
+	local itemLink
+	itemLink = control.itemLink
+	if itemLink == nil then
+		return
+	end
+	local hasSetInfo, setName
+	hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
+	if hasSetInfo then
+		IIfA.searchFilter = setName
+		-- fill in the GUI portion here
+	else
+		d("Item is not part of a set. Filter not changed.")
+		return
+	end
+
+	IIfA.searchFilter = setName
+	IIFA_GUI_SetNameOnly_Checked:SetHidden(false)
+	IIFA_GUI_SearchBox:SetText(setName)
+	IIFA_GUI_SearchBoxText:SetHidden(true)
+	IIfA.bFilterOnSetName = true
+    IIfA:UpdateScrollDataLinesData()
+    IIfA:UpdateInventoryScroll()
+
+end
+
+
+
+--[[
+misc musings
+
+--|H1:item:45350:365:50:0:0:0:0:0:0:0:0:0:0:0:0:7:0:0:0:10000:0|h|h
+
+ww writ
+ruby ash healing staff, epic, nirnhoned, magnus gift set, glass, 48 writ voucher reward
+/script local i for i=1,100 do d(i .. " = " .. GenerateMasterWritBaseText("|H1:item:119681:6:1:0:0:0:" .. i .. ":192:4:48:26:28:0:0:0:0:0:0:0:0:480000|h|h")) end
+
+maple resto staff
+|H1:item:43560:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0|h|h
+
+nobles conquest robe
+|H1:item:59965:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:10000:0|h|h
+|H1:item:60000:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:10000:0|h|h
+]]
diff --git a/IIfA/IIfADataCollection.lua b/IIfA/IIfADataCollection.lua
new file mode 100644
index 0000000..f90535b
--- /dev/null
+++ b/IIfA/IIfADataCollection.lua
@@ -0,0 +1,551 @@
+local IIfA = IIfA
+local EMPTY_STRING = ""
+
+function IIfA:DeleteCharacterData(name)
+	if (name) then
+		--delete selected character
+		for characterName, character in pairs(IIfA.data.accountCharacters) do
+			if(characterName == name) then
+				IIfA.data.accountCharacters[name] = nil
+			end
+		end
+	end
+end
+
+function IIfA:DeleteGuildData(name)
+	if (name) then
+		--delete selected guild
+		for guildName, guild in pairs(IIfA.data.guildBanks) do
+			if guildName == name then
+				IIfA.data.guildBanks[name] = nil
+			end
+        end
+		IIfA:ClearUnowned()
+	end
+end
+
+function IIfA:CollectGuildBank()
+
+
+	-- add roomba support
+	if Roomba and Roomba.WorkInProgress and Roomba.WorkInProgress() then return  end
+
+	local curGB = GetSelectedGuildBankId()
+
+	if not IIfA.data.bCollectGuildBankData or curGB == nil then
+		return
+	end
+
+	if not IIfA.data.guildBanks then IIfA.data.guildBanks = {} end
+	local curGuild = GetGuildName(curGB)
+
+	IIfA:DebugOut("Collecting Guild Bank Data for " .. curGuild)
+
+	if IIfA.data.guildBanks[curGuild] ~= nil then
+		if not IIfA.data.guildBanks[curGuild].bCollectData then
+			return
+		end
+	end
+
+	SelectGuildBank(CurGB)
+	local count = 0
+
+	if(IIfA.data.guildBanks[curGuild] == nil) then
+		IIfA.data.guildBanks[curGuild] = {}
+		IIfA.data.guildBanks[curGuild].bCollectData = true		-- default to true just so it's here and ok
+	end
+	local guildData = IIfA.data.guildBanks[curGuild]
+	guildData.items = #ZO_GuildBankBackpack.data
+	guildData.lastCollected = GetDate() .. "@" .. GetFormattedTime();
+	IIfA:ClearLocationData(curGuild)
+	IIfA:DebugOut(" - " .. #ZO_GuildBankBackpack.data .. " items")
+	for i=1, #ZO_GuildBankBackpack.data do
+		local slotIndex = ZO_GuildBankBackpack.data[i].data.slotIndex
+		IIfA:EvalBagItem(BAG_GUILDBANK, slotIndex)
+	end
+--	d("IIfA - Guild Bank Collected - " .. curGuild)
+end
+
+
+local function grabBagContent(bagId)
+	local bagItems = GetBagSize(BAG_BAGPACK)
+	for slotNum=0, bagItems, 1 do
+		dbItem, itemKey = IIfA:EvalBagItem(bagId, slotNum)
+	end
+end
+
+local function scanBags()
+	local playerName = GetUnitName('player')
+
+	IIfA.data.accountCharacters 			= IIfA.data.accountCharacters or {}
+	IIfA.data.accountCharacters[playerName] = IIfA.data.accountCharacters[playerName] or {}
+
+
+
+	IIfA:ClearLocationData(IIfA.currentCharacterId)
+
+	if not IIfA:IsCharacterEquipIgnored(playerName) then
+		grabBagContent(BAG_WORN)
+	end
+	if not IIfA:IsCharacterInventoryIgnored(playerName) then
+		grabBagContent(BAG_BACKPACK)
+	end
+end
+IIfA.ScanCurrentCharacter = scanBags
+
+function IIfA:ScanBank()
+	IIfA:ClearLocationData(GetString(IIFA_BAG_BANK))
+	grabBagContent(BAG_BANK)
+
+	local slotNum = nil
+	if HasCraftBagAccess() then
+		grabBagContent(BAG_SUBSCRIBER_BANK)
+		IIfA:ClearLocationData(GetString(IIFA_BAG_CRAFTBAG))
+		slotNum = GetNextVirtualBagSlotId(slotNum)
+		while slotNum ~= nil do
+			IIfA:EvalBagItem(BAG_VIRTUAL, slotNum)
+			slotNum = GetNextVirtualBagSlotId(slotNum)
+		end
+	end
+end
+
+-- only grabs the content of bagpack and worn on the first login - hence we set the function to insta-return below.
+function IIfA:OnFirstInventoryOpen()
+	scanBags()
+	IIfA:ScanBank()
+	IIfA.OnFirstInventoryOpen = function() return end
+end
+
+
+function IIfA:CheckForAgedGuildBankData( days )
+	local results = false
+	local days = days or 5
+	if IIfA.data.bCollectGuildBankData then
+		IIfA:CleanEmptyGuildBug()
+		for guildName, guildData in pairs(IIfA.data.guildBanks)do
+			local today = GetDate()
+			local lastCollected = guildData.lastCollected:match('(........)')
+			if(lastCollected and lastCollected ~= EMPTY_STRING)then
+				if(today - lastCollected >= days)then
+					d("[IIfA]:Warning - " .. guildName .. " Guild Bank data not collected in " .. days .. " or more days!")
+					results = true
+				end
+			else
+				d("[IIfA]:Warning - " .. guildName .. " Guild Bank data has not been collected!")
+				results = true
+			end
+		end
+		return results
+	end
+	return true
+end
+
+function IIfA:UpdateGuildBankData()
+	if IIfA.data.bCollectGuildBankData then
+		local tempGuildBankBag = {
+			items = 0;
+			lastCollected = EMPTY_STRING;
+		}
+		for index=1, GetNumGuilds() do
+			local guildName = GetGuildName(index)
+			local guildBank = IIfA.data.guildBanks[guildName]
+			if(not guildBank) then
+				IIfA.data.guildBanks[guildName] = tempGuildBankBag
+			end
+		end
+	end
+end
+
+function IIfA:CleanEmptyGuildBug()
+	local emptyGuild = IIfA.data.guildBanks[EMPTY_STRING]
+	if(emptyGuild)then
+		IIfA.data.guildBanks[EMPTY_STRING] = nil
+	end
+end
+
+function IIfA:GuildBankReady()
+	IIfA:DebugOut("GuildBankReady...")
+	IIfA.isGuildBankReady = false
+	IIfA:UpdateGuildBankData()
+	IIfA:CleanEmptyGuildBug()
+	IIfA:CollectGuildBank()
+end
+
+function IIfA:GuildBankDelayReady()
+	IIfA:DebugOut("GuildBankDelayReady...")
+	if not IIfA.isGuildBankReady then
+		IIfA.isGuildBankReady = true
+		zo_callLater(function() IIfA:GuildBankReady() end, 1750)
+	end
+end
+
+function IIfA:GuildBankAddRemove(eventID, slotNum)
+	IIfA:DebugOut("Guild Bank Add or Remove...")
+	IIfA:UpdateGuildBankData()
+	IIfA:CleanEmptyGuildBug()
+	--IIfA:CollectGuildBank()
+	local dbItem, itemKey
+	if eventID == EVENT_GUILD_BANK_ITEM_ADDED then
+--		d("GB Add")
+		dbItem, itemKey = IIfA:EvalBagItem(BAG_GUILDBANK, slotNum, true, 0)
+		IIfA:ValidateItemCounts(BAG_GUILDBANK, slotNum, dbItem, itemKey)
+	else
+--		d("GB Remove")
+--		d(GetItemLink(BAG_GUILDBANK, slotNum))
+--		dbItem, itemKey = IIfA:EvalBagItem(BAG_BACKPACK, slotNum)
+--		IIfA:ValidateItemCounts(BAG_GUILDBANK, slotNum, dbItem, itemKey)
+	end
+end
+
+function IIfA:ActionLayerInventoryUpdate()
+	-- IIfA:CollectAll()
+end
+
+
+--[[
+Data collection notes:
+	Currently crafting items are coming back from getitemlink with level info in them.
+	If it's a crafting item, strip the level info and store only the item number as the itemKey
+	Use function GetItemCraftingInfo, if usedInCraftingType indicates it's NOT a material, check for other item types
+
+	When showing items in tooltips, check for both stolen & owned, show both
+--]]
+
+
+-- used by an event function - see iifaevents.lua for call
+function IIfA:InventorySlotUpdate(eventCode, bagId, slotNum, isNewItem, itemSoundCategory, inventoryUpdateReason, qty)
+	if isNewItem then
+		isNewItem = "True"
+	else
+		isNewItem = "False"
+	end
+
+	IIfA:DebugOut(zo_strformat("Inv Slot Upd - <<1>>, <<2>>, <<3>>, <<4>>, <<5>>, <<6>>, <<7>>", GetItemLink(bagId, slotNum, LINK_STYLE_NORMAL), eventCode, bagId, slotNum, inventoryUpdateReason, qty, isNewItem))
+	local dbItem, itemKey
+	dbItem, itemKey = self:EvalBagItem(bagId, slotNum, true, qty)
+--	if dbItem ~= nil and (bagId == BAG_BANK or bagId == BAG_SUBSCRIBER_BANK or bagId == BAG_BACKPACK) then
+--		IIfA:ValidateItemCounts(bagId, slotNum, dbItem, itemKey)
+--	end
+end
+
+local function assertValue(value, itemLink, getFunc)
+	if value then return value end
+	if getFunc == EMPTY_STRING then return EMPTY_STRING end
+	return getFunc(itemLink)
+end
+
+local function IIfA_assertItemLink(itemLink, bagId, slotIndex)
+	if itemLink ~= nil then
+		return itemLink
+	else
+		if (bagId ~= nil and slotIndex ~= nil) then
+			return GetItemLink(tonumber(bagId), tonumber(slotIndex))
+		end
+	end
+
+	return nil
+end
+
+local function setItemFileEntry(array, key, value)
+	if not value then return end
+	if not array then return end
+	if not array[key] then
+		array[key] = {}
+	end
+
+	array[key] = value
+end
+
+
+function IIfA:EvalBagItem(bagId, slotNum, fromXfer, qty)
+	if not IIfA.trackedBags[bagId] then return end
+	local DBv3 = IIfA.data.DBv3
+	if fromXfer == nil then
+		fromXfer = false
+	end
+
+	if(not DBv3)then
+		IIfA.data.DBv3 = {}
+		DBv3 = IIfA.data.DBv3
+	end
+	itemName = GetItemName(bagId, slotNum) or EMPTY_STRING
+
+	IIfA:DebugOut(zo_strformat("EvalBagItem - <<1>>/<<2>> <<3>>", bagId, slotNum, itemName))
+
+	if itemName > EMPTY_STRING then
+		itemLink = GetItemLink(bagId, slotNum, LINK_STYLE_BRACKETS)
+		itemKey = itemLink
+		local usedInCraftingType, itemType, extraInfo1, extraInfo2, extraInfo3 = GetItemCraftingInfo(bagId, slotNum)
+
+		if usedInCraftingType ~= CRAFTING_TYPE_INVALID and
+		   itemType ~= ITEMTYPE_GLYPH_ARMOR and
+		   itemType ~= ITEMTYPE_GLYPH_JEWELRY and
+		   itemType ~= ITEMTYPE_GLYPH_WEAPON then
+		   itemKey = IIfA:GetItemID(itemLink)
+		else
+			itemType = GetItemLinkItemType(itemLink)
+			if  itemType == ITEMTYPE_STYLE_MATERIAL or
+				itemType == ITEMTYPE_ARMOR_TRAIT or
+				itemType == ITEMTYPE_WEAPON_TRAIT or
+				itemType == ITEMTYPE_LOCKPICK or
+				itemType == ITEMTYPE_RAW_MATERIAL or
+				itemType == ITEMTYPE_RACIAL_STYLE_MOTIF or		-- 9-12-16 AM - added because motifs now appear to have level info in them
+				itemType == ITEMTYPE_RECIPE then
+				itemKey = IIfA:GetItemID(itemLink)
+			end
+		end
+
+		local itemIconFile, itemCount, _, _, _, equipType, _, itemQuality = GetItemInfo(bagId, slotNum)
+		itemCount = itemCount or qty
+		itemFilterType = GetItemFilterTypeInfo(bagId, slotNum) or 0
+		DBitem = DBv3[itemKey]
+		location = EMPTY_STRING
+		if(equipType == 0 or bagId ~= BAG_WORN) then equipType = false end
+		if(bagId == BAG_BACKPACK or bagId == BAG_WORN) then
+			location = IIfA.currentCharacterId
+
+		elseif(bagId == BAG_BANK or bagId == BAG_SUBSCRIBER_BANK) then
+			location = GetString(IIFA_BAG_BANK)
+		elseif(bagId == BAG_VIRTUAL) then
+			location =GetString(IIFA_BAG_CRAFTBAG)
+		elseif(bagId == BAG_GUILDBANK) then
+			location = GetGuildName(GetSelectedGuildBankId())
+		else
+			local collectibleId = GetCollectibleForHouseBankBag(GetBankingBag())
+			location = GetCollectibleNickname(collectibleId)
+			if location == EMPTY_STRING then location = GetCollectibleName(collectibleId) end
+		end
+		if(DBitem) then
+			DBitemlocation = DBitem.locations[location]
+			if DBitemlocation then
+				DBitemlocation.itemCount = DBitemlocation.itemCount + itemCount
+				DBitemlocation.bagSlot = DBitemlocation.bagSlot or slotNum
+			else
+				DBitem.locations[location] = {}
+				DBitem.locations[location].bagID = bagId
+				DBitem.locations[location].bagSlot = slotNum
+				DBitem.locations[location].itemCount = itemCount
+			end
+		else
+			DBv3[itemKey] = {}
+			DBv3[itemKey].iconFile = itemIconFile
+			DBv3[itemKey].filterType = itemFilterType
+			DBv3[itemKey].itemQuality = itemQuality
+			DBv3[itemKey].itemName = itemName
+			DBv3[itemKey].locations = {}
+			DBv3[itemKey].locations[location] = {}
+			DBv3[itemKey].locations[location].bagID = bagId
+			DBv3[itemKey].locations[location].bagSlot = slotNum
+			DBv3[itemKey].locations[location].itemCount = itemCount
+		end
+		if zo_strlen(itemKey) < 10 then
+			DBv3[itemKey].itemLink = itemLink
+		end
+		if (IIfA.trackedBags[bagId]) and fromXfer then
+			IIfA:ValidateItemCounts(bagId, slotNum, DBv3[itemKey], itemKey)
+		end
+
+	  	return DBv3[itemKey], itemKey
+	else
+		return nil
+	end
+end
+
+function IIfA:ValidateItemCounts(bagID, slotNum, dbItem, itemKey)
+	local itemLink, itemLinkCheck
+	if zo_strlen(itemKey) < 10 then
+		itemLink = dbItem.itemLink
+	else
+		itemLink = itemKey
+	end
+	IIfA:DebugOut("ValidateItemCounts: <<1>>x<<3>> in <<2>>", itemLink, bagID, slotNum)
+
+	for locName, data in pairs(dbItem.locations) do
+--		if data.bagID ~= nil then	-- it's an item, not attribute
+			if (data.bagID == BAG_GUILDBANK and locName == GetGuildName(GetSelectedGuildBankId())) or
+			-- we're looking at the right guild bank
+			    data.bagID == BAG_VIRTUAL or
+				data.bagID == BAG_BANK or
+				data.bagID == BAG_SUBSCRIBER_BANK or
+				nil ~= GetCollectibleForHouseBankBag and nil ~= GetCollectibleForHouseBankBag(data.bagID) or -- is housing bank, manaeeee
+			   ((data.bagID == BAG_BACKPACK or data.bagID == BAG_WORN) and locName == GetCurrentCharacterId()) then
+--		d(locName)
+--		d(data)
+--		d(GetItemLink(data.bagID, data.bagSlot, LINK_STYLE_BRACKETS))
+				itemLinkCheck = GetItemLink(data.bagID, data.bagSlot, LINK_STYLE_BRACKETS)
+				if itemLinkCheck == nil then
+					itemLinkCheck = EMPTY_STRING
+				end
+--				d("ItemlinkCheck = " .. itemLinkCheck)
+				if itemLinkCheck ~= itemLink then
+					if bagID ~= data.bagID and slotNum ~= data.bagSlot then
+--						d("should remove " .. itemLink .. " from " .. locName)
+					-- it's no longer the same item, or it's not there at all
+						self.data.DBv3[itemKey].locations[locName] = nil
+					end
+				end
+			end
+--		end
+	end
+end
+
+function IIfA:CollectAll()
+	local bagItems = nil
+	local itemLink, dbItem = nil
+	local itemKey
+	local location = EMPTY_STRING
+	local BagList = IIfA.trackedBags -- 20.1. mana: Iterating over a list now
+
+	for bagId, tracked in ipairs(BagList) do
+
+		bagItems = GetBagSize(bagId)
+		if(bagId == BAG_WORN)then	--location for BAG_BACKPACK and BAG_WORN is the same so only reset once
+			IIfA:ClearLocationData(IIfA.currentCharacterId)
+		elseif(bagId == BAG_BANK) then	-- do NOT add BAG_SUBSCRIBER_BANK here, it'll wipe whatever already got put into the bank on first hit
+			IIfA:ClearLocationData(GetString(IIFA_BAG_BANK))
+		elseif(bagId == BAG_VIRTUAL)then
+			IIfA:ClearLocationData(GetString(IIFA_BAG_CRAFTBAG))
+		elseif GetAPIVersion() >= 100022 then -- 20.1. mana: bag bag bag
+			local collectibleId = GetCollectibleForHouseBankBag(bagId)
+			if IsCollectibleUnlocked(collectibleId) then
+				local name = GetCollectibleNickname(collectibleId) or GetCollectibleName(collectibleId)
+				IIfA:ClearLocationData(name)
+			end
+		end
+--		d("  BagItemCount=" .. bagItems)
+		if bagId ~= BAG_VIRTUAL and tracked then
+			for slotNum=0, bagItems, 1 do
+				dbItem, itemKey = IIfA:EvalBagItem(bagId, slotNum)
+			end
+		else
+			if HasCraftBagAccess() then
+				slotNum = GetNextVirtualBagSlotId(nil)
+				while slotNum ~= nil do
+					IIfA:EvalBagItem(bagId, slotNum)
+					slotNum = GetNextVirtualBagSlotId(slotNum)
+				end
+			end
+		end
+	end
+
+	-- 6-3-17 AM - need to clear unowned items when deleting char/guildbank too
+	IIfA:ClearUnowned()
+end
+
+function IIfA:TrySaveBagInfo()
+
+end
+
+function IIfA:ClearUnowned()
+-- 2015-3-7 Assembler Maniac - new code added to go through full inventory list, remove any un-owned items
+	local DBv3 = IIfA.data.DBv3
+	local n, ItemLink, DBItem
+	local ItemOwner, ItemData
+	for ItemLink, DBItem in pairs(DBv3) do
+		n = 0
+		for ItemOwner, ItemData in pairs(DBItem.locations) do
+			n = n + 1
+			if ItemOwner ~= "Bank" and ItemOwner ~= "CraftBag" then
+				if ItemData.bagID == BAG_BACKPACK or ItemData.bagID == BAG_WORN then
+					if IIfA.CharIdToName[ItemOwner] == nil then
+						DBItem[ItemOwner] = nil
+	  				end
+				elseif ItemData.bagID == BAG_GUILDBANK then
+					if IIfA.data.guildBanks[ItemOwner] == nil then
+						DBItem[ItemOwner] = nil
+					end
+				end
+			end
+		end
+		if (n == 0) then
+			DBv3[ItemLink] = nil
+		end
+	end
+-- 2015-3-7 end of addition
+end
+
+
+function IIfA:ClearLocationData(location)
+	local DBv3 = IIfA.data.DBv3
+	local itemLocation = nil
+	local LocationCount = 0
+	local itemName, itemData
+
+	if(DBv3)then
+		for itemName, itemData in pairs(IIfA.data.DBv3) do
+			itemLocation = itemData.locations[location]
+			if (itemLocation) then
+				itemData.locations[location] = nil
+			end
+			LocationCount = 0
+			for locName, location in pairs(itemData.locations) do
+				LocationCount = LocationCount + 1
+				break
+			end
+			if(LocationCount == 0)then
+				DBv3[itemName] = nil
+			end
+		end
+	end
+end
+
+-- rewrite item links with proper level value in them, instead of random value based on who knows what
+-- written by SirInsidiator
+local function RewriteItemLink(itemLink)
+    local requiredLevel = select(6, ZO_LinkHandler_ParseLink(itemLink))
+    requiredLevel = tonumber(requiredLevel)
+    local trueRequiredLevel = GetItemLinkRequiredLevel(itemLink)
+
+    itemLink = string.gsub(itemLink, "|H(%d):item:(.*)" , "|H0:item:%2")
+
+    if requiredLevel ~= trueRequiredLevel then
+        itemLink = string.gsub(itemLink, "|H0:item:(%d+):(%d+):(%d+)(.*)" , "|H0:item:%1:%2:".. trueRequiredLevel .."%4")
+    end
+
+    return itemLink
+end
+
+local function GetItemIdentifier(itemLink)
+    local itemType = GetItemLinkItemType(itemLink)
+    local data = {zo_strsplit(":", itemLink:match("|H(.-)|h.-|h"))}
+    local itemId = data[3]
+    local level = GetItemLinkRequiredLevel(itemLink)
+    local cp = GetItemLinkRequiredChampionPoints(itemLink)
+--	local results
+--	results.itemId = itemId
+--	results.itemType = itemType
+--	results.level = level
+--	results.cp = cp
+    if(itemType == ITEMTYPE_WEAPON or itemType == ITEMTYPE_ARMOR) then
+        local trait = GetItemLinkTraitInfo(itemLink)
+        return string.format("%s,%s,%d,%d,%d", itemId, data[4], trait, level, cp)
+    elseif(itemType == ITEMTYPE_POISON or itemType == ITEMTYPE_POTION) then
+        return string.format("%s,%d,%d,%s", itemId, level, cp, data[23])
+    elseif(hasDifferentQualities[itemType]) then
+        return string.format("%s,%s", itemId, data[4])
+    else
+        return itemId
+    end
+end
+
+function IIfA:RenameItems()
+	local DBv3 = IIfA.data.DBv3
+	local item = nil
+	local itemName
+
+	if(DBv3)then
+		for item, itemData in pairs(DBv3) do
+			itemName = nil
+			if item:match("|H") then
+				itemName = GetItemLinkName(item)
+			else
+				itemName = GetItemLinkName(itemData.itemLink)
+			end
+			if itemName ~= nil then
+				itemData.itemName = itemName
+			end
+		end
+	end
+end
+
+
diff --git a/IIfA/IIfAEvents.lua b/IIfA/IIfAEvents.lua
new file mode 100644
index 0000000..cbbd6b8
--- /dev/null
+++ b/IIfA/IIfAEvents.lua
@@ -0,0 +1,195 @@
+local IIfA = IIfA
+
+-- 2016-7-26 AM - added global funcs for events
+-- the following functions are all globals, not tied to the IIfA class, but call the IIfA class member functions for event processing
+
+-- 2015-3-7 AssemblerManiac - added code to collect inventory data at char disconnect
+local function IIfA_EventOnPlayerUnloaded()
+	-- update the stored inventory every time character logs out, will assure it's always right when viewing from other chars
+	IIfA:CollectAll()
+
+	IIfA.CharCurrencyFrame:UpdateAssets()
+	IIfA.CharBagFrame:UpdateAssets()
+end
+
+local function IIfA_GuildBankDelayReady()
+	IIfA:GuildBankDelayReady()
+end
+
+local function IIfA_GuildBankAddRemove(...)
+	IIfA:GuildBankAddRemove(...)
+end
+
+local function IIfA_ActionLayerInventoryUpdate()
+	IIfA:ActionLayerInventoryUpdate()
+end
+
+local function IIfA_InventorySlotUpdate(...)
+	IIfA:InventorySlotUpdate(...)
+end
+
+local function IIfA_OnRightClickUp(rowControl)
+	IIfA:ProcessRightClick(rowControl)
+end
+
+
+local function IIfA_EventProc(...)
+	--d(...)
+	local l = {...}
+	local s = ""
+	for name, data in pairs(l) do
+		if type(data) ~= "table" then
+			s = s .. name .. " = " .. tostring(data) .. "\r\n"
+		else
+			s = s .. name .. " = {" .. "\r\n"
+			for name1, data1 in pairs(data) do
+				if type(data1) ~= "table" then
+					s = s .. "\t" .. name1 .. " = " .. tostring(data1) .. "\r\n"
+				else
+					s = s .. "\t" .. name1 .. " = {}" .. "\r\n"
+				end
+			end
+			s = s .. "}\r\n"
+		end
+	end
+	d(s)
+end
+
+local function finv1(...)
+	d("inventory open error")
+	IIfA_EventDump(...)
+end
+
+
+local function fgb1(...)
+	d("gb open error")
+	IIfA_EventDump(...)
+end
+local function fgb2(...)
+	d("gb updated qty")
+	IIfA_EventDump(...)
+end
+local function fgb3(...)
+	d("gb selected")
+	IIfA_EventDump(...)
+end
+local function fgb4(...)
+	d("gb deselected")
+	IIfA_EventDump(...)
+end
+local function fgb5(...)
+	d("gb items ready")
+	IIfA_EventDump(...)
+end
+
+function IIfA:RegisterForEvents()
+	-- 2016-6-24 AM - commented this out, doing nothing at the moment, revisit later
+	-- EVENT_MANAGER:RegisterForEvent("IIFA_PLAYER_LOADED_EVENTS", EVENT_PLAYER_ACTIVATED, IIfA_EventOnPlayerloaded)
+
+	-- 2015-3-7 AssemblerManiac - added EVENT_PLAYER_DEACTIVATED event
+	EVENT_MANAGER:RegisterForEvent("IIFA_PLAYER_UNLOADED_EVENTS", EVENT_PLAYER_DEACTIVATED, IIfA_EventOnPlayerUnloaded)
+
+	-- when item comes into inventory
+	EVENT_MANAGER:RegisterForEvent("IIFA_InventorySlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE, IIfA_InventorySlotUpdate)
+	EVENT_MANAGER:AddFilterForEvent("IIFA_InventorySlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE, REGISTER_FILTER_INVENTORY_UPDATE_REASON, INVENTORY_UPDATE_REASON_DEFAULT)
+
+--	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_ITEM_SLOT_CHANGED, IIfA_EventDump)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_INVENTORY_ITEM_USED, IIfA_EventDump)	-- arg 1 = event id, arg 2 = 27 (no clue)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_INVENTORY_ITEM_DESTROYED, IIfA_EventDump)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_JUSTICE_FENCE_UPDATE, IIfA_EventDump) -- # sold, # laundered is sent to event handler
+
+-- not helpful, no link at all on this callback
+--	SHARED_INVENTORY:RegisterCallback("SlotRemoved", IIfA_EventDump)
+--	SHARED_INVENTORY:RegisterCallback("SingleSlotInventoryUpdate", IIfA_EventDump)
+
+	-- Events for data collection
+	EVENT_MANAGER:RegisterForEvent("IIFA_ALPUSH", EVENT_ACTION_LAYER_PUSHED, IIfA_ActionLayerInventoryUpdate)
+
+	-- on opening guild bank:
+	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_LOADED", EVENT_GUILD_BANK_ITEMS_READY, IIfA_GuildBankDelayReady)
+
+--	EVENT_MANAGER:RegisterForEvent("IIFA_gb1", EVENT_GUILD_BANK_OPEN_ERROR, fgb1)
+	EVENT_MANAGER:RegisterForEvent("IIFA_gb2", EVENT_GUILD_BANK_UPDATED_QUANTITY, fgb2)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_gb3", EVENT_GUILD_BANK_SELECTED, fgb3)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_gb4", EVENT_GUILD_BANK_DESELECTED, fgb4)
+--	EVENT_MANAGER:RegisterForEvent("IIFA_gb5", EVENT_GUILD_BANK_ITEMS_READY, fgb5)
+
+
+	-- on adding or removing an item from the guild bank:
+	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_ITEM_ADDED", EVENT_GUILD_BANK_ITEM_ADDED, IIfA_GuildBankAddRemove)
+	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_ITEM_REMOVED", EVENT_GUILD_BANK_ITEM_REMOVED, IIfA_GuildBankAddRemove)
+
+	local function RebuildOptionsMenu()
+		self:CreateOptionsMenu()
+	end
+	EVENT_MANAGER:RegisterForEvent("IIFA_GuildJoin", EVENT_GUILD_SELF_JOINED_GUILD, RebuildOptionsMenu)
+	EVENT_MANAGER:RegisterForEvent("IIFA_GuildLeave", EVENT_GUILD_SELF_LEFT_GUILD, RebuildOptionsMenu)
+
+--    ZO_QuickSlot:RegisterForEvent(EVENT_ABILITY_COOLDOWN_UPDATED, IIfA_EventDump)
+
+	ZO_PreHook('ZO_InventorySlot_ShowContextMenu', function(rowControl) IIfA_OnRightClickUp(rowControl) end)
+end
+
+--[[ maybe revisit this in the future
+function IIfA_EventOnPlayerloaded()
+	--Do these things only on the first load
+	if(not IIfA.PlayerLoadedFired)then
+		--if(IIfA.data.in2AgedGuildBankDataWarning) then IIfA:CheckForAgedGuildBankData() end
+		--Set PlayerLoadedFired = true to prevent future execution during this session
+		IIfA.PlayerLoadedFired = true
+	end
+	--Do these things on any load
+	--Do a little dance...
+	--Make a little love...
+	--Get down tonight...
+end
+ --]]
+
+
+
+--[[ registerfilter & events
+define HOW to listen for events (minimize # of calls to event handler, less overhead of eso internals)
+EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE, OnInventorySlotUpdate)
+EVENT_MANAGER:AddFilterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE,  REGISTER_FILTER_BAG_ID, BAG_BACKPACK)
+EVENT_MANAGER:AddFilterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE,  REGISTER_FILTER_INVENTORY_UPDATE_REASON, INVENTORY_UPDATE_REASON_DEFAULT)
+--]]
+
+
+--[[ event for SHARED_INVENTORY:RegisterCallback sends as follows, and has no itemlink :(
+arg 1 = 5		-- bag id
+arg 2 = 71198		-- slot number
+arg 3 = {
+  inventory = {}
+  condition = 100
+  age = 6702.2509765625
+  isPlaceableFurniture = false
+  searchData = {}
+  requiredLevel = 1
+  stackCount = 1426
+  stolen = false
+  isPlayerLocked = false
+  brandNew = true
+  sellPrice = 2
+  itemInstanceId = 3340100312
+  statValue = 0
+  rawName = rubedite ore
+  locked = false
+  isJunk = false
+  stackSellPrice = 2852
+  slotIndex = 71198
+  specializedItemType = 0
+  isBoPTradeable = false
+  meetsUsageRequirement = true
+  quality = 1
+  filterData = {}
+  equipType = 0
+  name = Rubedite Ore
+  itemType = 35
+  bagId = 5
+  stackLaunderPrice = 0
+  uniqueId = 3.5176485852605e-319
+  iconFile = /esoui/art/icons/crafting_jewelry_base_ruby_r1.dds
+  launderPrice = 0
+  }
+
+--]]
diff --git a/IIfA/IIfAMenu.lua b/IIfA/IIfAMenu.lua
new file mode 100644
index 0000000..0943b90
--- /dev/null
+++ b/IIfA/IIfAMenu.lua
@@ -0,0 +1,541 @@
+--this creates a menu for the addon.
+IIfA = IIfA
+
+local LAM = LibStub("LibAddonMenu-2.0")
+local LMP = LibStub("LibMediaProvider-1.0")
+
+local function getCharacterInventories()
+
+	local accountInventories = {}
+
+	if nil ~= IIfA:GetCharacterList() then
+		for characterName, character in pairs(IIfA:GetCharacterList()) do
+			d("inserting " .. characterName)
+			table.insert(accountInventories, characterName)
+		end
+	end
+
+	return accountInventories
+end
+
+local function getGuildBanks()
+	local guildBanks = {}
+	if(IIfA.data.guildBanks) then
+		for guildName, guildData in pairs(IIfA.data.guildBanks) do
+			if guildData.bCollectData == nil then
+				guildData.bCollectData = true
+			end
+			table.insert(guildBanks, guildName)
+		end
+	end
+	return guildBanks
+end
+
+--[[checkboxData = {
+	type = "checkbox",
+	name = "My Checkbox", -- or string id or function returning a string
+	getFunc = function() return db.var end,
+	setFunc = function(value) db.var = value doStuff() end,
+	tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
+	width = "full", -- or "half" (optional)
+	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
+	warning = "Will need to reload the UI.", -- or string id or function returning a string (optional)
+	default = defaults.var,	-- a boolean or function that returns a boolean (optional)
+	reference = "MyAddonCheckbox", -- unique global reference to control (optional)
+}	]]
+
+local function getGuildBankName(guildNum)
+	if guildNum > GetNumGuilds() then return end
+	id = GetGuildId(guildNum)
+	return GetGuildName(id)
+end
+
+local function getGuildBankKeepDataSetting(guildNum)
+	guildName = getGuildBankName(guildNum)
+
+	if IIfA.data.guildBanks[guildName] == nil then return false end
+
+	if IIfA.data.guildBanks[guildName].bCollectData == nil then
+		IIfA.data.guildBanks[guildName].bCollectData = true
+	end
+
+	return IIfA.data.guildBanks[guildName].bCollectData
+end
+
+local function setGuildBankKeepDataSetting(guildNum, newSetting)
+	guildName = getGuildBankName(guildNum)
+	if guildName ~= nil then
+		IIfA.data.guildBanks[guildName].bCollectData = newSetting
+	end
+end
+
+function IIfA:CreateOptionsMenu()
+	local deleteChar, deleteGBank, undeleteChar
+
+	local optionsData = {
+		{	type = "header",
+			name = "Global Settings",
+		},
+		{
+			type = "checkbox",
+			tooltip = "Should you really wish to move your window around a hundred times, uncheck this box",
+			name = "Use same settings for all characters?",
+			getFunc = function() return IIfA.data.saveSettingsGlobally end,
+			setFunc = function(value)
+				IIfA.data.saveSettingsGlobally = value
+			end
+		},
+		{
+			type = "checkbox",
+			tooltip = "Prints verbose debugging to the ChatFrame. '/ii debug' for quick toggle",
+			name = "Debugging",
+			getFunc = function() return IIfA.data.bDebug end,
+			setFunc = function(value) IIfA.data.bDebug = value end
+		},
+
+		{
+			type = "submenu",
+			name = "Manage Collected Data",
+			tooltip = "Manage collected Characters and Guild Banks. Delete data you no longer need (old guilds or deleted characters)",	--(optional)
+			controls = {
+				{	type 	= "description",
+					title 	= "Ignore or delete characters",
+					text 	= "removes or un-tracks a character. \nWarning: This change will be applied immediately.",
+				},
+				{
+					type 	= "dropdown",
+					name 	= "characters to delete or un-track",
+					choices = IIfA:GetCharacterList(),
+					getFunc = function() return end,
+					setFunc = function(choice) deleteChar = nil; deleteChar = choice end
+				}, --dropdown end
+
+				{  -- button begin
+					type = "button",
+					width = "half",
+					name = "Delete Character",
+					tooltip = "Delete Inventory Insight data for the character selected above",
+					func = function() IIfA:DeleteCharacterData(deleteChar) end,
+
+				}, -- button end
+				{  -- button begin
+					type = "button",
+					width = "half",
+					name = "Ignore Equipment",
+					tooltip = "All items equipped by the current character will be ignored",
+					func = function() IIfA:IgnoreCharacterEquip(deleteChar, true) end,
+
+				}, -- button end
+				{  -- button begin
+					type = "button",
+					width = "half",
+					name = "Ignore Inventory",
+					tooltip = "This character's carried inventory will be ignored",
+					func = function() IIfA:IgnoreCharacterInventory(deleteChar, true) end,
+				}, -- button end
+
+				{	type 	= "description",
+					title 	= "Unignore characters",
+					text 	= "Adds an ignored character back to the tracking lists",
+				},
+				{
+					type = "dropdown",
+					name = "Character to unignore",
+					choices = IIfA:GetIgnoredCharacterList(),
+					getFunc = function() return end,
+					setFunc = function(choice) undeleteChar = nil; undeleteChar = choice end
+				}, --dropdown end
+
+				{  -- button begin
+					type = "button",
+					width = "half",
+					name = "Unignore",
+					tooltip = "All items equipped by the current character will be tracked again",
+					func = function()
+						IIfA:IgnoreCharacterEquip(undeleteChar, false)
+						IIfA:IgnoreCharacterInventory(undeleteChar, false)
+					end,
+				}, -- button end
+
+				{	type 	= "description",
+					title 	= "Guild Bank To Delete",
+					text 	= "Delete Inventory Insight data for guild. \nWarning: This change will be applied immediately.",
+				},
+				{ -- dropdown begin
+					 type = "dropdown",
+					 name = 'Guild Bank To Delete',
+					 choices = getGuildBanks(),
+					 getFunc = function() return end,
+					 setFunc = function(choice) deleteGBank = nil; deleteGBank = choice end
+
+				}, -- dropdown end
+
+				{	-- button begin
+					type = "button",
+					name = "Delete Guild Bank",
+					tooltip = "Delete Inventory Insight data for the guild selected above",
+					func = function() IIfA:DeleteGuildData(deleteGBank) end,
+				}, -- button end
+
+
+			}, -- Collected Guild Bank Data controls end
+
+		}, -- Collected Guild Bank Data submenu end
+
+		{
+			type = "submenu",
+			name = "Guild Bank Options",
+			tooltip = "Manage data collection options for Guild Banks",
+			controls = {}
+		},
+
+		{
+			type = "submenu",
+			name = "Pack Use/Size highlites",
+			tooltip = "Set the counts/colors for 2 the levels of count warnings",	--(optional)
+			controls = {
+				{
+				type = "slider",
+				name = "Used Space Warning Threshold",
+				getFunc = function() return IIfA.data.BagSpaceWarn.threshold end,
+				setFunc = function(choice) IIfA.data.BagSpaceWarn.threshold = choice end,
+				min = 1,
+				max = 100,
+				step = 1, --(optional)
+				clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
+				decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
+				tooltip = "Percent Value: if bag space used is above threshold, it will be shown in the below color",
+				default = 85, -- default value or function that returns the default value (optional)
+				}, -- slider end
+
+				{
+				type = "colorpicker",
+				name = "Used Space Warning Color",
+				getFunc = function() return IIfA.data.BagSpaceWarn.r, IIfA.data.BagSpaceWarn.g, IIfA.data.BagSpaceWarn.b end,
+				setFunc = function(r,g,b,a) IIfA.data.BagSpaceWarn.r = r
+						IIfA.data.BagSpaceWarn.g = g
+						IIfA.data.BagSpaceWarn.b = b
+						IIfA.CharBagFrame.ColorWarn = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceWarn)
+						IIfA.CharBagFrame:RepaintSpaceUsed()
+				end, --(alpha is optional)
+				tooltip = "Color used to show bag space when greater than the designated threshold",
+				default = {r = 230 / 255, g = 130 / 255, b = 0},
+				}, -- colorpicker end
+
+				{
+				type = "slider",
+				name = "Used Space Alert Threshold",
+				getFunc = function() return IIfA.data.BagSpaceAlert.threshold end,
+				setFunc = function(choice) IIfA.data.BagSpaceAlert.threshold = choice end,
+				min = 1,
+				max = 100,
+				step = 1, --(optional)
+				clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
+				decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
+				tooltip = "Percent Value: if bag space used is above threshold, it will be shown in the below color",
+				default = 95, -- default value or function that returns the default value (optional)
+				}, -- slider end
+
+				{
+				type = "colorpicker",
+				name = "Used Space Alert Color",
+				getFunc = function() return IIfA.data.BagSpaceAlert.r, IIfA.data.BagSpaceAlert.g, IIfA.data.BagSpaceAlert.b end,
+				setFunc = function(r,g,b,a) IIfA.data.BagSpaceAlert.r = r
+						IIfA.data.BagSpaceAlert.g = g
+						IIfA.data.BagSpaceAlert.b = b
+						IIfA.CharBagFrame.ColorAlert = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceAlert)
+						IIfA.CharBagFrame:RepaintSpaceUsed()
+				end, --(alpha is optional)
+				tooltip = "Color used to show bag space when greater than the designated threshold",
+				default = {r = 1, g = 1, b = 0},
+				}, -- colorpicker end
+
+				{
+				type = "colorpicker",
+				name = "Used Space Full Color",
+				getFunc = function() return IIfA.data.BagSpaceFull.r, IIfA.data.BagSpaceFull.g, IIfA.data.BagSpaceFull.b end,
+				setFunc = function(r,g,b,a) IIfA.data.BagSpaceFull.r = r
+						IIfA.data.BagSpaceFull.g = g
+						IIfA.data.BagSpaceFull.b = b
+						IIfA.CharBagFrame.ColorFull = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceFull)
+						IIfA.CharBagFrame:RepaintSpaceUsed()
+				end, --(alpha is optional)
+				tooltip = "Color used to show bag space when it's full",
+--				width = "full", --or "half" (optional)
+				default = {r = 255, g = 0, b = 0},
+				}, -- colorpicker end
+
+			},
+		},
+
+		{
+			type = "header",
+			name = "Global/Per Char settings",
+		},
+
+		{
+			type = "submenu",
+			name = "Tooltips",
+			tooltip = "Manage tooltip options for both default and custom IIfA tooltips",
+			controls = {
+				{
+					type = "dropdown",
+					name = "Show IIfA Tooltips",
+					choices = {"Always", "IIfA", "Never" },
+					tooltip = "Choose when to display IIfA info on Tooltips",
+					getFunc = function() return IIfA:GetSettings().showToolTipWhen end,
+					setFunc = function(value) 	IIfA:GetSettings().showToolTipWhen = value end,
+				}, -- checkbox end
+
+				{
+					type = "checkbox",
+					name = "Show Info in Separate Frame",
+					tooltip = "Enables/Disables display of Style Info and Location info in a separate frame, or within the tooltip",
+					getFunc = function() return 	IIfA:GetSettings().bInSeparateFrame end,
+					setFunc = function(value)		IIfA:GetSettings().bInSeparateFrame = value end,
+				}, -- checkbox end
+
+				{
+					type = "checkbox",
+					name = "Show Style Info",
+					tooltip = "Enables/Disables display of Style Info on the tooltips",
+					getFunc = function() return IIfA:GetSettings().showStyleInfo end,
+					setFunc = function(value) 	IIfA:GetSettings().showStyleInfo = value end,
+				}, -- checkbox end
+
+				 {
+					type = "colorpicker",
+					name = 'Tooltip Inventory Information Text Color',
+					tooltip = 'Sets the color of the text for the inventory information that gets added to Tooltips.',
+					getFunc = function() return IIfA.colorHandler:UnpackRGBA() end,
+					setFunc = function(...)
+						IIfA.colorHandler:SetRGBA(...)
+						IIfA:GetSettings().in2TextColors = IIfA.colorHandler:ToHex()
+					end
+				},
+
+				{
+					type = "dropdown",
+					name = "Tooltips Font",
+					tooltip = "The font used for location information added to both default and custom IN2 tooltips",
+					choices = LMP:List('font'),
+					getFunc = function() return (IIfA:GetSettings().in2TooltipsFont or "ZoFontGame") end,
+					setFunc = function( choice )
+						IIfA:StatusAlert("[IIfA]:TooltipsFontChanged["..choice.."]")
+						IIfA:SetTooltipFont(choice)
+					end
+				},
+
+				{
+					type = "slider",
+					name = "Tooltip Font Size",
+					tooltip = "The font size used for location information added to both default and custom IIfA tooltips",
+					min = 5,
+					max = 40,
+					step = 1,
+					getFunc = function() return IIfA:GetSettings().in2TooltipsFontSize end,
+					setFunc = function(value)
+						IIfA:GetSettings().in2TooltipsFontSize = value
+					end,
+				},
+
+			}, -- controls end
+
+
+		}, -- tooltipOptionsSubWindow end
+
+		{
+			type = "checkbox",
+			tooltip = "Show Item Count on Right side of list",
+			name = "Item Count on Right",
+			getFunc = function() return IIfA:GetSettings().showItemCountOnRight end,
+			setFunc = function(value)
+					IIfA:StatusAlert("[IIfA]:ItemCountOnRight[" .. tostring(value) .. "]")
+					IIfA:GetSettings().showItemCountOnRight = value
+					IIfA:SetItemCountPosition()
+			end,
+		},
+
+		{
+			type = "dropdown",
+			name =  "Default Inventory Frame View",
+			tooltip =  "The default view (in the dropdown) set when the inventory frame loads",
+			choices = IIfA.dropdownBankNames,
+			default = IIfA:GetSettings().in2DefaultInventoryFrameView,
+			getFunc = function() return IIfA:GetSettings().in2DefaultInventoryFrameView end,
+			setFunc = function( value )
+				IIfA:StatusAlert("[IIfA]:DefaultInventoryFrameView["..value.."]")
+				IIfA:GetSettings().in2DefaultInventoryFrameView = value
+				-- 2015-3-9 Assembler Maniac - next line changed to stop crash
+				ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_Dropdown):SetSelectedItem(value)
+				IIfA:SetInventoryListFilter(value)
+				return
+			end
+			-- warning = "Will need to reload the UI",	--(optional)
+		},
+
+		{
+			type = "checkbox",
+			name = "Search Set Names when using Text Filter",
+			tooltip = "Enables/Disables set name inclusion in searches",
+			getFunc = function() return IIfA:GetSettings().bFilterOnSetNameToo end,
+			setFunc = function(value)
+				IIfA:GetSettings().bFilterOnSetNameToo = value
+			end,
+		}, -- checkbox end
+
+		{
+			type = "checkbox",
+			name = "Default to search only Set Names when using Text Filter",
+			tooltip = "Enables/Disables set name inclusion in searches",
+			getFunc = function() return IIfA:GetSettings().bFilterOnSetName end,
+			setFunc = function(value)
+				IIfA:GetSettings().bFilterOnSetName = value
+				IIfA.bFilterOnSetName = value
+				IIFA_GUI_SetNameOnly_Checked:SetHidden(not value)
+			end,
+		}, -- checkbox end
+
+		{
+			type = "header",
+			name = "Major Scene Toggles",
+		},
+
+		{
+			type = "checkbox",
+			name = "Inventory scene",
+			tooltip = "Makes the Inventory Frame visible while viewing your inventory",
+			getFunc = function() return IIfA:GetSceneVisible("inventory") end,
+			setFunc = function(value) IIfA:SetSceneVisible("inventory", value) end,
+
+			},
+
+		{
+			type = "checkbox",
+			tooltip = "Makes the Inventory Frame visible while viewing your bank",
+			name = "Bank scene",
+			getFunc = function() return IIfA:GetSceneVisible("bank") end,
+			setFunc = function(value) IIfA:SetSceneVisible("bank", value) end,
+		},
+
+		{
+			type = "checkbox",
+			name = "Guild Bank scene",
+			tooltip = "Makes the Inventory Frame visible while viewing your guild vault",
+			getFunc = function() return IIfA:GetSceneVisible("guildBank") end,
+			setFunc = function(value) IIfA:SetSceneVisible("guildBank", value) end,
+		},
+
+		{
+			type = "checkbox",
+			name = "Guild Store scene",
+			tooltip = "Makes the Inventory Frame visible while accessing the guild store",
+			getFunc = function() return IIfA:GetSceneVisible("tradinghouse") end,
+			setFunc = function(value) IIfA:SetSceneVisible("tradinghouse", value) end,
+		},
+
+		 {
+			type = "checkbox",
+			name = "Crafting scene",
+			tooltip = "Makes the Inventory Frame visible while Crafting",
+			getFunc = function() return IIfA:GetSceneVisible("smithing") end,
+			setFunc = function(value) IIfA:SetSceneVisible("smithing", value) end,
+		},
+
+		 {
+			type = "checkbox",
+			name = "Vendor scene",
+			tooltip = "Makes the Inventory Frame visible while buying/selling",
+			getFunc = function() return IIfA:GetSceneVisible("store") end,
+			setFunc = function(value)	IIfA:SetSceneVisible("store", value) end,
+		},
+
+		 {
+			type = "checkbox",
+			name = "Stables scene",
+			tooltip = "Makes the Inventory Frame visible while talking with the Stablemaster",
+			getFunc = function() return IIfA:GetSceneVisible("stables") end,
+			setFunc = function(value) IIfA:SetSceneVisible("stables", value) end,
+		},
+
+
+		 {
+			type = "checkbox",
+			name = "Trading scene",
+			tooltip = "Makes the Inventory Frame visible while trading",
+			getFunc = function() return IIfA:GetSceneVisible("trade") end,
+			setFunc = function(value) IIfA:SetSceneVisible("trade", value) end,
+		},
+
+	-- options data end
+	}
+
+	-- run through list of options, find one with empty controls, add in the submenu for guild banks options
+	local i, data
+	for i, data in ipairs(optionsData) do
+		if data.controls ~= nil then
+			if #data.controls == 0 then
+				data.controls[1] =
+					{
+						type = "checkbox",
+						name = "Guild Bank Data Collection",
+						tooltip = "Enables/Disables data collection for all guild banks on this account",
+						warning = "Guild bank information will not be updated if this option is turned off!",
+						getFunc = function() return IIfA.data.bCollectGuildBankData end,
+						setFunc = function(value)
+							IIfA.data.bCollectGuildBankData = value
+							IIfA.trackedBags[BAG_GUILDBANK] = value
+						end,
+					}
+				for i = 1, GetNumGuilds() do
+					local id = GetGuildId(i)
+					local guildName = GetGuildName(id)
+					data.controls[i + 1] =
+					{
+						type = "checkbox",
+						name = "Collect data for " .. guildName .. "?",
+						tooltip = "Enables/Disables data collection for this guild bank",
+						warning = "Guild bank information for this guild bank will not be updated if this option is turned off!",
+						getFunc = function() return getGuildBankKeepDataSetting(i) end,
+						setFunc = function(value) setGuildBankKeepDataSetting(i, value) end,
+						disabled = function() return (not IIfA.data.bCollectGuildBankData) end,
+					}
+	--[[
+					{
+						type = "checkbox",
+						name = "Old Guild Bank Data Alert",
+						tooltip = "Enables/Disables an alert that will notify you once, when you first log in, if one or more guild banks contain data that is 5 days or older",
+						-- 3-29-15 - AssemblerManiac - changed .data. to :GetSettings(). next 2 occurances
+						getFunc = function() return IIfA:GetSettings().in2AgedGuildBankDataWarning end,
+						setFunc = function(value)
+							IIfA:GetSettings().in2AgedGuildBankDataWarning = value
+							end,
+					}, -- checkbox end
+	]]--
+				end
+			end
+		end
+	end
+
+	LAM:RegisterOptionControls("IIfA_OptionsPanel", optionsData)
+
+end
+
+function IIfA:CreateSettingsWindow(savedVars, defaults)
+
+	local panelData = {
+		type = "panel",
+		name = IIfA.name,
+		displayName = name,
+		author = IIfA.author,
+		version = IIfA.version,
+		slashCommand = "/iifa",	--(optional) will register a keybind to open to this panel
+		registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
+		registerForDefaults = true	--boolean (optional) (will set all options controls back to default values)
+	}
+
+	LAM:RegisterAddonPanel("IIfA_OptionsPanel", panelData)
+
+	self:CreateOptionsMenu()
+
+   end
diff --git a/IIfA/IIfASceneFuncs.lua b/IIfA/IIfASceneFuncs.lua
new file mode 100644
index 0000000..36d55cb
--- /dev/null
+++ b/IIfA/IIfASceneFuncs.lua
@@ -0,0 +1,124 @@
+-- scene related functions (show/hide/determine/register)
+
+
+function IIfA:GetCurrentSceneName()
+	local ret = ""
+
+	-- [16:20] scene name: 65553, hidden: false
+	if not SCENE_MANAGER or not SCENE_MANAGER:GetCurrentScene() then
+		ret = "hud"
+	elseif SCENE_MANAGER:GetCurrentScene().name == "hudui" then
+		ret = "hud"
+	else
+		ret = SCENE_MANAGER:GetCurrentScene().name
+	end
+
+	if tostring(ret) == "65553" then ret = "hud" end
+
+	return ret
+end
+
+function IIfA:RegisterForSceneChanges()
+	local scenes = IIfA:GetSettings().frameSettings
+	for sceneName, settings in pairs(scenes) do
+		if (sceneName ~= "hudui") then
+			local scene = SCENE_MANAGER:GetScene(sceneName)
+			if scene then
+				scene:RegisterCallback("StateChange", function(...)
+					IIfA:ProcessSceneChange(sceneName, ...)
+				end)
+			end
+-- for reasons unknown, hudui doesn't always appear to be "found" for items in the list (get cur scene from scene_manager sometimes says hud, when it's hudui), force it to work same as HUD here
+			if (sceneName == "hud") then
+				local scene = SCENE_MANAGER:GetScene("hudui")
+				scene:RegisterCallback("StateChange", function(...)
+					IIfA:ProcessSceneChange(sceneName, ...)
+				end)
+			end
+		end
+	end
+end
+
+function IIfA:GetSceneSettings(sceneName)
+
+	sceneName = sceneName or IIfA:GetCurrentSceneName()
+
+
+	local settings = IIfA:GetSettings().frameSettings
+
+	if not settings[sceneName] then
+		-- if we have to create a new set of scene info, register it in the scene change too, it'll be set again during next opening
+
+		local scene = SCENE_MANAGER:GetScene(sceneName)
+		scene:RegisterCallback("StateChange", function(...)
+				IIfA:ProcessSceneChange(sceneName, ...)
+			end)
+		-- save the settings in the settings table, base it on HUD
+		settings[sceneName] = ZO_DeepTableCopy(settings["hud"])
+		settings[sceneName].hidden = true
+		settings[sceneName].docked = false
+	end
+
+	return settings[sceneName]
+
+end
+
+
+function IIfA:ProcessSceneChange(sceneName, oldState, newState)
+
+
+	-- IIfA:DebugOut(zo_strformat("ProcessSceneChange <<1>>: <<2>> -> <<3>>", sceneName, oldState, newState))
+	if (tostring(newState) == "shown") then
+		sceneName = IIfA:GetCurrentSceneName()
+		local settings = IIfA:GetSceneSettings(sceneName)
+		self:RePositionFrame(settings)
+
+	elseif (tostring(newState) == "hidden") then
+		IIFA_GUI:SetHidden(true)
+	end
+end
+
+
+function IIfA:SaveFrameInfo(calledFrom)
+	if (calledFrom == "onHide") then return end
+
+	local sceneName = IIfA:GetCurrentSceneName()
+	local settings = IIfA:GetSceneSettings(sceneName)
+
+    settings.hidden    	=  IIFA_GUI:IsControlHidden()
+--    settings.locked    	=  IIFA_GUI.locked
+--    settings.minimized 	=  IIFA_GUI.minimized
+--	settings.docked		=  IIFA_GUI.docked
+
+--	if sceneName ~= "hud" then
+--		settings.docked = IIFA_GUI.docked
+--	else
+--		settings.docked = false
+--	end
+
+	if (not settings.docked and (calledFrom == "onMoveStop" or calledFrom == "onResizeStop")) then
+    	settings.lastX	= IIFA_GUI:GetLeft()
+    	settings.lastY	= IIFA_GUI:GetTop()
+		if not settings.minimized then
+			settings.width	= IIFA_GUI:GetWidth()
+    		settings.height	= IIFA_GUI:GetHeight()
+		end
+	end
+end
+
+-- called only from bindings.xml on keypress
+function IIfA:ToggleInventoryFrame()
+	IIFA_GUI:SetHidden(not IIFA_GUI:IsControlHidden())
+	if not IIFA_GUI:IsControlHidden() then
+		IIfA:OnFirstInventoryOpen()
+		-- get current camera mode so when we toggle off, we put it back to where it was (maybe, can think of some weird circumstances where it might screw it up)
+		SetGameCameraUIMode(true)
+		IIfA:GuiResizeScroll()
+    	IIfA:UpdateScrollDataLinesData()
+    	IIfA:UpdateInventoryScroll()
+	end
+
+	IIfA:SaveFrameInfo("ToggleInventoryFrame")
+end
+
+
diff --git a/IIfA/IIfASettingsAdapter.lua b/IIfA/IIfASettingsAdapter.lua
new file mode 100644
index 0000000..2ea520b
--- /dev/null
+++ b/IIfA/IIfASettingsAdapter.lua
@@ -0,0 +1,37 @@
+ local IIfA = IIfA
+
+
+function IIfA:IsCharacterInventoryIgnored(ignoreChar)
+	return IIfA.data.ignoredCharEquipment[ignoreChar]
+end
+
+function IIfA:IsCharacterEquipIgnored(ignoreChar)
+	return IIfA.data.ignoredCharInventories[ignoreChar]
+end
+
+function IIfA:IgnoreCharacterEquip(ignoreChar, value)
+	IIfA.data.ignoredCharEquipment[ignoreChar] = value
+	IIfA:ScanCurrentCharacter()
+end
+function IIfA:IgnoreCharacterInventory(ignoreChar, value)
+	IIfA.data.ignoredCharInventories[ignoreChar] = value
+	IIfA:ScanCurrentCharacter()
+end
+function IIfA:GetCharacterList()
+	return IIfA.data.accountCharacters
+end
+
+function IIfA:GetIgnoredCharacterList()
+	local ret = {}
+	local wasAdded = {}
+	for characterName, characterData in pairs(IIfA.data.ignoredCharEquipment) do
+		table.insert(ret, characterName)
+		wasAdded[characterName] = true
+	end
+	for characterName, characterData in pairs(IIfA.data.ignoredCharInventories) do
+		if not wasAdded[characterName] then
+			table.insert(ret, characterName)
+		end
+	end
+	return ret
+end
\ No newline at end of file
diff --git a/IIfA/IIfATooltip.lua b/IIfA/IIfATooltip.lua
new file mode 100644
index 0000000..3949c7d
--- /dev/null
+++ b/IIfA/IIfATooltip.lua
@@ -0,0 +1,553 @@
+local IIfA = IIfA
+IIfA.LastActiveRowControl = nil
+
+function IIfA:addStatsPopupTooltip(...)
+	d("IIFA - Popup tooltip OnUpdate hit")
+	d(...)
+end
+
+
+function IIfA:CreateTooltips()
+	WINDOW_MANAGER:CreateControlFromVirtual("IIFA_ITEM_TOOLTIP", ItemTooltipTopLevel, "IIFA_ITEM_TOOLTIP")
+	WINDOW_MANAGER:CreateControlFromVirtual("IIFA_POPUP_TOOLTIP", ItemTooltipTopLevel, "IIFA_POPUP_TOOLTIP")
+
+--	zo_callLater(function() ZO_PreHookHandler(PopupTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch) end , 7000)
+--	ZO_PreHookHandler(PopupTooltip, 'OnUpdate', function() self:addStatsPopupTooltip() end)
+	ZO_PreHookHandler(PopupTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch)
+	ZO_PreHookHandler(PopupTooltip, 'OnHide', IIfA_HideTooltip)
+
+	ZO_PreHookHandler(ItemTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch)
+	ZO_PreHookHandler(ItemTooltip, 'OnHide', IIfA_HideTooltip)
+
+	ZO_PreHook("ZO_PopupTooltip_SetLink", function(itemLink) IIfA.TooltipLink = itemLink end)
+
+	IIfA:SetTooltipFont(IIfA:GetSettings().in2TooltipsFont)
+end
+
+function IIfA:SetTooltipFont(font)
+	if not font or font == "" then font = "ZoFontGameMedium" end
+--	d("SetTooltipFont called with " .. tostring(font))
+	IIfA:GetSettings().in2TooltipsFont = font
+--	IIFA_ITEM_TOOLTIP:GetNamedChild("_Label"):SetFont(font)
+--	IIFA_POPUP_TOOLTIP:GetNamedChild("_Label"):SetFont(font)
+end
+
+local function getTex(name)
+	return ("IIfA/assets/icons/" .. name .. ".dds")
+end
+
+IIfA.racialTextures = {
+	[0]		= { styleName = "", styleTexture = ""},
+	[1]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(1)), styleTexture = getTex("breton")}, 				-- Breton
+	[2]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(2)), styleTexture = getTex("redguard")}, 			-- Redguard
+	[3]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(3)), styleTexture = getTex("orsimer")}, 				-- Orc
+	[4]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(4)), styleTexture = getTex("dunmer")}, 				-- Dark Elf
+	[5]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(5)), styleTexture = getTex("nord")}, 				-- Nord
+	[6]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(6)), styleTexture = getTex("argonian")}, 			-- Argonian
+	[7]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(7)), styleTexture = getTex("altmer")}, 				-- High Elf
+	[8]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(8)), styleTexture = getTex("bosmer")}, 				-- Wood Elf
+	[9]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(9)), styleTexture = getTex("khajit")}, 				-- Khajiit
+	[10]  	= { styleName = zo_strformat("<<1>>", GetItemStyleName(10)), styleTexture = getTex("telvanni")}, 			-- Unique
+	[11] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(11)), styleTexture = getTex("thief")}, 				-- Thieves Guild
+	[12] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(12)), styleTexture = getTex("darkbrotherhood")}, 	-- Dark Brotherhood
+	[13] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(13)), styleTexture = getTex("malacath")}, 			-- Malacath
+	[14] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(14)), styleTexture = getTex("dwemer")}, 				-- Dwemer
+	[15] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(15)), styleTexture = getTex("ancient")}, 			-- Ancient Elf
+	[16] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(16)), styleTexture = getTex("akatosh")}, 			-- Akatosh
+	[17] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(17)), styleTexture = getTex("reach")}, 				-- Reach
+	[18] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(18)), styleTexture = getTex("bandit")}, 				-- Bandit
+	[19] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(19)), styleTexture = getTex("primitive")}, 			-- Primitive
+	[20] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(20)), styleTexture = getTex("daedric")}, 			-- Daedric
+	[21] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(21)), styleTexture = getTex("trinimac")}, 			-- Trinimac
+	[22] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(22)), styleTexture = getTex("orsimer")}, 			-- Ancient Orc
+	[23] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(23)), styleTexture = getTex("daggerfall")}, 			-- Daggerfall Covenant - "Ding-a-ling Smurf"
+	[24] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(24)), styleTexture = getTex("ebonheart")}, 			-- Ebonheart Pact - "Funny Tomato"
+	[25] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(25)), styleTexture = getTex("ancient")}, 			-- Aldmeri Dominion - "chiquita banana"
+	[26] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(26)), styleTexture = getTex("laurel")}, 				-- Undaunted
+	[27] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(27)), styleTexture = getTex("dragonknight")}, 		-- Craglorn
+	[28] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(28)), styleTexture = getTex("templar")}, 			-- Glass
+	[29] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(29)), styleTexture = getTex("nightblade")}, 			-- Xivkyn
+	[30] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(30)), styleTexture = getTex("soulshriven")}, 		-- Soul Shriven
+	[31] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(31)), styleTexture = getTex("skull")},  				-- Draugr
+	[32] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(32)), styleTexture = getTex("maormer")},  			-- Maormer
+	[33] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(33)), styleTexture = getTex("akaviri")},  			-- Akaviri
+	[34] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(34)), styleTexture = getTex("imperial")}, 			-- Imperial
+	[35] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(35)), styleTexture = getTex("akaviri")}, 			-- Yokudan
+	[36] 	= { styleName = "Universal", styleTexture = getTex("imperial")}, 											-- "Universal" what the hell
+	[37] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(37)), styleTexture = getTex("reach")}, 				-- Reach Winter
+	[38] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(38)), styleTexture = getTex("tsaesci")}, 			-- Tsaesci
+	[39] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(39)), styleTexture = getTex("minotaur")}, 			-- Minotaur
+	[40] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(40)), styleTexture = getTex("ebony")}, 				-- Ebony
+	[41] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(41)), styleTexture = getTex("abahswatch")}, 			-- Abah's Watch
+	[42] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(42)), styleTexture = getTex("skinchanger")}, 		-- Skinchanger
+	[43] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(43)), styleTexture = getTex("moragtong")}, 			-- Morag Tong
+	[44] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(44)), styleTexture = getTex("ragada")}, 				-- Ra Gada
+	[45] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(45)), styleTexture = getTex("dromathra")}, 			-- Dro-m'Athra
+	[46] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(46)), styleTexture = getTex("assassin")}, 			-- Assassins League
+	[47] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(47)), styleTexture = getTex("outlaw")}, 				-- Outlaw
+	[48] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(48)), styleTexture = getTex("redoran")}, 			-- Redoran
+	[49] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(49)), styleTexture = getTex("hlaalu")}, 				-- Hlaalu
+	[50] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(50)), styleTexture = getTex("ordinator")}, 			-- Ordinator **
+	[51] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(51)), styleTexture = getTex("telvanni")}, 			-- Telvanni
+	[52] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(52)), styleTexture = getTex("buoyantarmiger")}, 		-- Buoyant Armiger
+	[53] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(53)), styleTexture = getTex("frostcaster")}, 		-- Frostcaster
+	[54] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(54)), styleTexture = getTex("cliffracer")}, 			-- Ashlander
+	[55] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(55)), styleTexture = getTex("skull_nice")}, 			-- Worm Cult
+	[56] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(56)), styleTexture = getTex("kothringi")}, 			-- Silken Ring
+	[57] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(57)), styleTexture = getTex("lizard")}, 				-- Mazzatun
+	[58] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(58)), styleTexture = getTex("harlequin")}, 			-- Grim Harlequin
+	[59] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(59)), styleTexture = getTex("hollowjack")}, 			-- Hollowjack
+	[60] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(60)), styleTexture = getTex("clockwork")}, 			-- Clockwork
+	[61] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(61)), styleTexture = getTex("bloodforge")}, 			-- Bloodforge
+	[62] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(62)), styleTexture = getTex("dreadhorn")}, 			-- Dreadhorn / Falkreath
+	[63] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(63)), styleTexture = getTex("")}, 					-- Unused
+	[64] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(64)), styleTexture = getTex("")},					-- Unused
+	[65] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(65)), styleTexture = getTex("apostle")},				-- Apostle
+	[66] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(66)), styleTexture = getTex("ebonshadow")},			-- Ebonshadow
+	[67] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(67)), styleTexture = getTex("")}, 					-- Unused
+	[68] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(68)), styleTexture = getTex("")}, 					-- Unused
+	[69] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(69)), styleTexture = getTex("")}, 					-- Unused
+	[70] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(70)), styleTexture = getTex("")}, 					-- Unused
+	[71] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(71)), styleTexture = getTex("")}, 					-- Unused
+	[72] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(72)), styleTexture = getTex("")}, 					-- Unused
+	[73] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(73)), styleTexture = getTex("")}, 					-- Unused
+	[74] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(74)), styleTexture = getTex("")}, 					-- Unused
+	[75] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(75)), styleTexture = getTex("")}, 					-- Unused
+	[76] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(76)), styleTexture = getTex("")}, 					-- Unused
+	[77] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(77)), styleTexture = getTex("")}, 					-- Unused
+	[78] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(78)), styleTexture = getTex("")}, 					-- Unused
+	[79] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(79)), styleTexture = getTex("")}, 					-- Unused
+}
+
+-- check on icons Hlaalu, Redoran and Morag Tong not loading properly
+
+--[[ -- these aren't used right now. Not sure whether or not we actually want to.
+IIfA.itemEquipTypeTextures = {
+	[EQUIP_TYPE_CHEST]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_COSTUME]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_FEET]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_HAND]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_HEAD]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_INVALID]  =   "",
+	[EQUIP_TYPE_LEGS]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_MAIN_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
+	[EQUIP_TYPE_NECK]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_OFF_HAND]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_ONE_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
+	[EQUIP_TYPE_RING]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_SHOULDERS]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
+	[EQUIP_TYPE_TWO_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
+	[EQUIP_TYPE_WAIST]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds"
+}
+
+IIfA.gearslotTextures = {
+	[EQUIP_TYPE_CHEST] = "/esoui/art/characterwindow/gearslot_chest.dds",
+	[EQUIP_TYPE_COSTUME] = "/esoui/art/characterwindow/gearslot_costume.dds",
+	[EQUIP_TYPE_FEET] = "/esoui/art/characterwindow/gearslot_feet.dds",
+	[EQUIP_TYPE_HAND] = "/esoui/art/characterwindow/gearslot_hands.dds",
+	[EQUIP_TYPE_HEAD] = "/esoui/art/characterwindow/gearslot_head.dds",
+	[EQUIP_TYPE_LEGS] = "/esoui/art/characterwindow/gearslot_legs.dds",
+	[EQUIP_TYPE_MAIN_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
+	[EQUIP_TYPE_NECK] = "/esoui/art/characterwindow/gearslot_neck.dds",
+	[EQUIP_TYPE_OFF_HAND] = "/esoui/art/characterwindow/gearslot_offhand.dds",
+	[EQUIP_TYPE_ONE_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
+	[EQUIP_TYPE_RING] = "/esoui/art/characterwindow/gearslot_ring.dds",
+	[EQUIP_TYPE_SHOULDERS] = "/esoui/art/characterwindow/gearslot_shoulders.dds",
+	[EQUIP_TYPE_TWO_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
+	[EQUIP_TYPE_WAIST] = "/esoui/art/characterwindow/gearslot_belt.dds",
+	[15] = "/esoui/art/characterwindow/gearslot_tabard.dds"
+}
+--]]
+
+local controlTooltips = {
+	["LineShare"] 	= "Doubleclick an item to add link to chat.",
+	["close"] 		= "close",
+	["toggle"] 		= "toggle",
+	["Search"] 		= "Search item name..."
+}
+
+local function getStyleIntel(itemLink)
+	if not itemLink then
+		return nil
+	end
+	if IIfA:GetSettings().showStyleInfo == false then
+		return nil
+	end
+
+	local data = itemLink:match("|H.:item:(.-)|h.-|h")
+	-- d(data)
+	-- d(zo_strsplit(':', data))
+	local itemID,
+		_,
+		itemLevel,
+		itemEnchantmentType,
+		itemEnchantmentStrength1,
+		itemEnchantmentStrength2,
+		_, _, _, _, _, _, _, _, _,
+		itemStyle,
+		_,
+		itemIsBound,
+		itemChargeStatus = zo_strsplit(':', data)
+
+	itemStyle = tonumber(itemStyle)
+
+	if itemStyle == ITEMSTYLE_UNIVERSAL then
+		return nil
+	else
+		return IIfA.racialTextures[itemStyle]
+	end
+end
+
+function IIfA:AnchorFrame(frame, parentTooltip)
+	if frame:GetTop() < parentTooltip:GetBottom() then
+		frame:ClearAnchors()
+		frame:SetAnchor(BOTTOM, parentTooltip, TOP, 0, 0)
+	elseif frame:GetBottom() > parentTooltip:GetTop() then
+		frame:ClearAnchors()
+		frame:SetAnchor(TOP, parentTooltip, BOTTOM, 0, 0)
+	end
+end
+
+-- do NOT local this function
+function IIfA_HideTooltip(control, ...)
+	if IIfA:GetSettings().bInSeparateFrame then
+		if control == ItemTooltip then
+			IIFA_ITEM_TOOLTIP:SetHidden(true)
+		elseif control == PopupTooltip then
+			IIFA_POPUP_TOOLTIP:SetHidden(true)
+		end
+	else
+		if control.IIfA_TT_Ext then
+			control.IIfAPool:ReleaseAllObjects()
+			control.IIfA_TT_Ext = nil
+		end
+	end
+end
+
+-- do NOT local this function
+function IIfA_TooltipOnTwitch(control, eventNum)
+	if IIfA:GetSettings().bInSeparateFrame then
+		if eventNum == 7 then
+			if control == ItemTooltip then
+				-- item tooltips appear where mouse is
+				return IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP)
+			elseif control == PopupTooltip then
+				-- popup tooltips have the X in the corner and usually pop up in center screen
+				IIfA.TooltipLink = PopupTooltip.lastLink
+				return IIfA:UpdateTooltip(IIFA_POPUP_TOOLTIP)
+			end
+		end
+	else
+		if control == PopupTooltip and control.IIfA_TT_Ext then
+			return
+		end
+		-- this is called whenever there's any data added to the ingame tooltip
+		if eventNum == TOOLTIP_GAME_DATA_MAX_VALUE then		-- hopefully always called on last data add
+--			IIfA:DebugOut("Tooltip On Twitch - " .. control:GetName() .. ", " .. eventNum)
+			IIfA:UpdateTooltip(control)
+		end
+	end
+end
+
+
+function IIfA:GetEquippedItemLink(mouseOverControl)
+	local fullSlotName = mouseOverControl:GetName()
+	local slotName = string.gsub(fullSlotName, "ZO_CharacterEquipmentSlots", "")
+	local index = 0
+
+	if 		(slotName == "Head")		then index = 0
+	elseif	(slotName == "Neck") 		then index = 1
+	elseif	(slotName == "Chest") 		then index = 2
+	elseif	(slotName == "Shoulder") 	then index = 3
+	elseif	(slotName == "MainHand") 	then index = 4
+	elseif	(slotName == "OffHand") 	then index = 5
+	elseif	(slotName == "Belt") 		then index = 6
+	elseif	(slotName == "Costume") 	then index = 7
+	elseif	(slotName == "Leg") 		then index = 8
+	elseif	(slotName == "Foot") 		then index = 9
+	elseif	(slotName == "Ring1") 		then index = 11
+	elseif	(slotName == "Ring2") 		then index = 12
+	elseif	(slotName == "Glove") 		then index = 16
+	elseif	(slotName == "BackupMain") 	then index = 20
+	elseif	(slotName == "BackupOff") 	then index = 20
+	end
+
+	local itemLink = GetItemLink(0, index, LINK_STYLE_BRACKETS)
+	return itemLink
+end
+
+
+function IIfA:getMouseoverLink()
+	local data
+	local mouseOverControl = moc()
+	if not mouseOverControl then return end
+
+	local name = nil
+	if mouseOverControl:GetParent() then
+		name = mouseOverControl:GetParent():GetName()
+	else
+		name = mouseOverControl:GetName()
+	end
+
+	-- do we show IIfA info?
+	if IIfA:GetSettings().showToolTipWhen == "Never" or
+		(IIfA:GetSettings().showToolTipWhen == "IIfA" and name ~= "IIFA_GUI_ListHolder") then
+		return nil
+	end
+
+	if	name == 'ZO_CraftBagListContents' or
+		name == 'ZO_EnchantingTopLevelInventoryBackpackContents' or
+		name == 'ZO_GuildBankBackpackContents' or
+		name == 'ZO_PlayerBankBackpackContents' or
+		name == 'ZO_PlayerInventoryListContents' or
+		name == 'ZO_QuickSlotListContents' or
+		name == 'ZO_SmithingTopLevelDeconstructionPanelInventoryBackpackContents' or
+		name == 'ZO_SmithingTopLevelImprovementPanelInventoryBackpackContents' or
+		name == 'ZO_SmithingTopLevelRefinementPanelInventoryBackpackContents' or
+		name == 'ZO_HouseBankBackpackContents' or
+		name == 'ZO_PlayerInventoryBackpackContents' then
+		if not mouseOverControl.dataEntry then return end
+		data = mouseOverControl.dataEntry.data
+		return GetItemLink(data.bagId, data.slotIndex, LINK_STYLE_BRACKETS)
+
+	elseif name == "ZO_LootAlphaContainerListContents" then						-- is loot item
+		if not mouseOverControl.dataEntry then return end
+		data = mouseOverControl.dataEntry.data
+		return GetLootItemLink(data.lootId, LINK_STYLE_BRACKETS)
+
+	elseif name == "ZO_InteractWindowRewardArea" then							-- is reward item
+		return GetQuestRewardItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
+
+	elseif name == "ZO_Character" then											-- is worn item
+		return IIfA:GetEquippedItemLink(mouseOverControl)
+
+	elseif name == "ZO_StoreWindowListContents" then							-- is store item
+		return GetStoreItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
+
+	elseif name == "ZO_BuyBackListContents" then								-- is buyback item
+		return GetBuybackItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
+
+	-- following 4 if's derived directly from MasterMerchant
+	elseif string.sub(name, 1, 14) == "MasterMerchant" then
+		local mocGPGP = mouseOverControl:GetParent():GetParent()
+		if mocGPGP then
+			name = mocGPGP:GetName()
+			if	name == 'MasterMerchantWindowListContents' or
+				name == 'MasterMerchantWindowList' or
+				name == 'MasterMerchantGuildWindowListContents' then
+				if mouseOverControl.GetText then
+					return mouseOverControl:GetText()
+				end
+			end
+		end
+	elseif name == 'ZO_LootAlphaContainerListContents' then
+		return GetLootItemLink(mouseOverControl.dataEntry.data.lootId)
+	elseif name == 'ZO_MailInboxMessageAttachments' then
+		return GetAttachedItemLink(MAIL_INBOX:GetOpenMailId(), mouseOverControl.id, LINK_STYLE_DEFAULT)
+	elseif name == 'ZO_MailSendAttachments' then
+		return GetMailQueuedAttachmentLink(mouseOverControl.id, LINK_STYLE_DEFAULT)
+
+	elseif name == "ZO_MailInboxMessageAttachments" then
+		return nil
+
+	elseif name == "IIFA_GUI_ListHolder" then
+		-- falls out, returns default current link
+
+	elseif name:sub(1, 13) == "IIFA_ListItem" then
+		return mouseOverControl.itemLink
+
+	elseif name:sub(1, 44) == "ZO_TradingHouseItemPaneSearchResultsContents" then
+		data = mouseOverControl.dataEntry
+		if data then data = data.data end
+	    -- The only thing with 0 time remaining should be guild tabards, no
+    	-- stats on those!
+    	if not data or data.timeRemaining == 0 then return nil end
+		return GetTradingHouseSearchResultItemLink(data.slotIndex)
+
+	elseif name == "ZO_TradingHousePostedItemsListContents" then
+		return GetTradingHouseListingItemLink(mouseOverControl.dataEntry.data.slotIndex)
+
+  	elseif name == 'ZO_TradingHouseLeftPanePostItemFormInfo' then
+    	if mouseOverControl.slotIndex and mouseOverControl.bagId then
+			return GetItemLink(mouseOverControl.bagId, mouseOverControl.slotIndex)
+		end
+
+	else
+--		d(mouseOverControl:GetName(), mouseOverControl)
+		IIfA:DebugOut("Tooltip not processed - '" .. name .. "'")
+
+		if IIfA.TooltipLink then
+			IIfA:DebugOut("Current Link - " .. IIfA.TooltipLink)
+		end
+
+		return nil
+	end
+
+	return IIfA.TooltipLink
+end
+
+function IIfA:getLastLink(tooltip)
+	local ret = nil
+	if IIfA:GetSettings().bInSeparateFrame then
+		if tooltip == IIFA_POPUP_TOOLTIP then
+			ret = IIfA.TooltipLink
+		elseif tooltip == IIFA_ITEM_TOOLTIP then
+			ret = self:getMouseoverLink()
+		end
+	else
+		if tooltip == PopupTooltip then
+			ret = IIfA.TooltipLink		-- this gets set on the prehook of PopupTooltip:SetLink
+		elseif tooltip == ItemTooltip then
+			ret = self:getMouseoverLink()
+			IIfA.TooltipLink = ret		-- make sure it's set right always
+		end
+	end
+
+	if (not ret) then
+		if not IIfA.LastActiveRowControl then return ret end
+		ret = IIfA.LastActiveRowControl:GetText()
+	end
+
+	return ret
+end
+
+function IIfA:UpdateTooltip(tooltip)
+	local itemLink
+	itemLink = self:getLastLink(tooltip)
+
+	local queryResults = IIfA:QueryAccountInventory(itemLink)
+	local itemStyleTexArray = getStyleIntel(itemLink)
+
+	if not itemStyleTexArray then itemStyleTexArray = {["styleTexture"] = "", ["styleName"] = ""} end
+	if itemStyleTexArray.styleName == nil then itemStyleTexArray = {["styleTexture"] = "", ["styleName"] = ""} end
+
+	if IIfA:GetSettings().bInSeparateFrame then
+		local parentTooltip = nil
+		if tooltip == IIFA_POPUP_TOOLTIP then parentTooltip = PopupTooltip end
+		if tooltip == IIFA_ITEM_TOOLTIP then parentTooltip = ItemTooltip end
+
+		if (not itemLink) or ((#queryResults.locations == 0) and (itemStyleTexArray.styleName == "")) then
+			tooltip:SetHidden(true)
+			return
+		end
+
+		tooltip:ClearLines()
+		tooltip:SetHidden(false)
+		tooltip:SetHeight(0)
+
+		tooltip:SetWidth(parentTooltip:GetWidth())
+
+		if itemStyleTexArray.styleName ~= "" then
+			tooltip:AddLine(" ");
+		end
+
+		if(queryResults) then
+			if #queryResults.locations > 0 then
+				if itemStyleTexArray.styleName ~= "" then
+					ZO_Tooltip_AddDivider(tooltip)
+				end
+				for x, location in pairs(queryResults.locations) do
+					local textOut
+					if location.name == nil or location.itemsFound == nil then
+						d(location)
+						textOut = 'Error occurred'
+					else
+						textOut = location.name .. " x" .. location.itemsFound
+					end
+					IIfA:DebugOut(textOut)
+					if location.worn then
+						textOut = textOut .. " *"
+					end
+					textOut = IIfA.colorHandler:Colorize(textOut)
+					tooltip:AddLine(textOut)
+				end
+			end
+		end
+
+		local styleIcon = tooltip:GetNamedChild("_StyleIcon")
+		local styleLabel = tooltip:GetNamedChild("_StyleLabel")
+
+		-- update the style icon
+		styleIcon:SetTexture(itemStyleTexArray.styleTexture)
+		styleLabel:SetText(itemStyleTexArray.styleName)
+
+		styleLabel:SetHidden(itemStyleTexArray.styleName == "")
+		styleIcon:SetHidden(itemStyleTexArray.styleName == "")
+		IIfA:AnchorFrame(tooltip, parentTooltip)
+	else
+		if (not itemLink) or ((#queryResults.locations == 0) and (itemStyleTexArray.styleName == "")) then
+			IIfA_HideTooltip(tooltip)
+			return
+		end
+
+		local bHasStyle
+		bHasStyle = not (itemStyleTexArray.styleName == nil or itemStyleTexArray.styleName == "")
+
+		-- only add/show the style info if it's got style
+		if bHasStyle then
+			if tooltip.IIfAPool == nil then
+				tooltip.IIfAPool = ZO_ControlPool:New("IIFA_TT_Template", tooltip, "IIFA_TT_Ext")
+			end
+
+			if tooltip.IIfAPool then
+				tooltip.IIfA_TT_Ext = tooltip.IIfAPool:AcquireObject()
+				tooltip.IIfA_TT_Ext:SetWidth(tooltip:GetWidth())
+			end
+
+			if tooltip.IIfA_TT_Ext then
+				ZO_Tooltip_AddDivider(tooltip)
+				tooltip:AddControl(tooltip.IIfA_TT_Ext)
+				tooltip.IIfA_TT_Ext:SetAnchor(TOP)
+
+				local styleIcon = tooltip.IIfA_TT_Ext:GetNamedChild("_StyleIcon")
+				local styleLabel = tooltip.IIfA_TT_Ext:GetNamedChild("_StyleLabel")
+				-- update the style icon
+				styleIcon:SetTexture(itemStyleTexArray.styleTexture)
+				styleLabel:SetText(itemStyleTexArray.styleName)
+			end
+		end
+
+		if(queryResults) then
+			if #queryResults.locations > 0 then
+				ZO_Tooltip_AddDivider(tooltip)
+				for x, location in pairs(queryResults.locations) do
+					local textOut
+					if location.name == nil or location.itemsFound == nil then
+						d(location)
+						textOut = 'Error occurred'
+					else
+						textOut = location.name .. " x" .. location.itemsFound
+					end
+					if location.worn then
+						textOut = textOut .. " *"
+					end
+					textOut = IIfA.colorHandler:Colorize(textOut)
+					tooltip:AddLine(textOut)
+				end
+			end
+		end
+	end
+end
+
+
+--[[
+on pts
+/script d("|H1:item:122828:362:50:00000:0:0:0:0:0:0:0:0:0:0:0:38:0:0:0:10000:0|h|h |H1:item:048760:029:04:26848:2:1:0:0:0:0:0:0:0:0:1:06:1:1:0:00053:0|h|h")
+
+
+/script d("Redoran: |H1:item:122627:359:50:0:0:0:0:0:0:0:0:0:0:0:0:48:0:0:0:10000:0|h|h")
+/script d("Buoyant Armiger: |H1:item:126064:358:50:0:0:0:0:0:0:0:0:0:0:0:0:52:0:0:0:10000:0|h|h")
+/script d("MoragTong: |H1:item:45349:308:50:0:0:0:0:0:0:0:0:0:0:0:1:43:0:1:0:10000:0|h|h")
+
+red mountain - no icon, no style text - use get style func to find out what # it really is
+"of the worm" - same issue
+"ebon armory"
+hircine
+withered hand - same problem (of the necromancer)
+
+/script PopupTooltipIIFA_TT_Ext1_StyleIcon.idx=48 PopupTooltipIIFA_TT_Ext1_StyleIcon:SetTexture(IIfA.racialTextures[PopupTooltipIIFA_TT_Ext1_StyleIcon.idx].styleTexture) d(IIfA.racialTextures[PopupTooltipIIFA_TT_Ext1_StyleIcon.idx].styleName ..", "..PopupTooltipIIFA_TT_Ext1_StyleIcon.idx)
+
+/script PopupTooltipIIFA_TT_Ext1_StyleIcon:SetTexture("IIfA/assets/icons/ordinator.dds") PopupTooltipIIFA_TT_Ext1_StyleLabel:SetText("Ordinator")
+
+]]--
+
diff --git a/IIfA/IIfA_xml_adapter.lua b/IIfA/IIfA_xml_adapter.lua
new file mode 100644
index 0000000..8b2ee48
--- /dev/null
+++ b/IIfA/IIfA_xml_adapter.lua
@@ -0,0 +1,568 @@
+local IIfA = IIfA
+
+function IIfA:GUILock(bLock)
+	-- if we're docked, we can't very well lock it in place too
+	-- this IF might go away providing the lock button turns on/off as it's supposed to (then it'll never be able to get here)
+	if self:GetSceneSettings().docked then return end
+
+	IIFA_GUI_Header_Locked:SetHidden(not bLock)
+	IIFA_GUI_Header_Unlocked:SetHidden(bLock)
+
+	self:GetSceneSettings().locked = bLock
+
+	IIFA_GUI:SetMovable(not bLock)
+	if bLock then
+		IIFA_GUI:SetResizeHandleSize(0)
+	else
+		IIFA_GUI:SetResizeHandleSize(12)
+	end
+end
+
+--[[
+function IIfA:DisplayDockButton(settings, sceneName)
+
+	if not sceneName then
+		sceneName = IIfA:GetCurrentSceneName()
+	end
+
+	if not settings then
+		settings = IIfA:GetSceneSettings(sceneName)
+	end
+
+	if sceneName == "hud" then
+		IIFA_GUI_Header_Docked:SetHidden(true)
+		IIFA_GUI_Header_Undocked:SetHidden(true)
+	else
+		IIFA_GUI_Header_Docked:SetHidden(not settings.docked)
+		IIFA_GUI_Header_Undocked:SetHidden(settings.docked)
+	end
+end
+ --]]
+
+function IIfA:GuiDock(bDock)
+	sceneName = IIfA:GetCurrentSceneName()
+	-- docking not allowed when hud is active (it has no clue what it's docking to)
+	if bDock and sceneName == "hud" then
+		return
+	end
+
+	local settings = IIfA:GetSceneSettings()
+
+	settings.docked = bDock
+
+	IIfA:RePositionFrame(settings)
+
+--[[
+
+	IIfA:DisplayDockButton(settings, nil)
+
+	IIFA_GUI:ClearAnchors()
+	IIFA_GUI:SetMovable(not bDock)
+	--IIFA_GUI_Header_Lockedndson:SetHidden(bDock)
+	--IIFA_GUI_Header_Unlocked:SetHidden(bDock)
+	if bDock then
+		-- two diff backgrouns on the right, figure out which is to be used
+		local RightBackground = ZO_SharedRightPanelBackground
+		if not ZO_SharedRightBackground:IsControlHidden() then
+			RightBackground = ZO_SharedRightBackground
+		end
+		local parentHeight = RightBackground:GetHeight()
+		IIFA_GUI:SetDimensionConstraints(410, parentHeight, -1, parentHeight)
+		local windowOffset = -20
+		if sceneName == "mailInbox" or sceneName == "mailSend" then
+			windowOffset = -40
+		end
+		IIFA_GUI:SetAnchor(TOPRIGHT, RightBackground, TOPLEFT, windowOffset, 16)
+		IIFA_GUI:SetAnchor(BOTTOMRIGHT, RightBackground, BOTTOMLEFT, windowOffset, 16)
+		IIFA_GUI:SetResizeHandleSize(0)
+		IIFA_GUI:SetWidth(settings.width)
+		IIFA_GUI_Header_Unlocked:SetHidden(true)
+		IIFA_GUI_Header_Locked:SetHidden(true)
+	else
+		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 1400)
+		IIFA_GUI:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, settings.lastX, settings.lastY)
+		if not settings.minimized then
+			IIFA_GUI:SetHeight(settings.height)
+			IIFA_GUI:SetWidth(settings.width)
+			IIFA_GUI:SetResizeHandleSize(12)
+		else
+			IIFA_GUI:SetHeight(33)
+			IIFA_GUI:SetWidth(settings.width)
+			IIFA_GUI:SetResizeHandleSize(0)
+		end
+		self:GUILock(settings.locked)
+	end
+
+	IIfA:GuiResizeScroll()
+	--]]
+end
+
+function IIfA:GUIMinimize(bMinimize)
+	local settings = IIfA:GetSceneSettings()
+
+	settings.minimized = bMinimize
+
+	IIfA:RePositionFrame(settings)
+--[[
+
+
+	ZO_Tooltips_HideTextTooltip()
+	IIFA_GUI_Header_Minimize:SetHidden(bMinimize)
+	IIFA_GUI_Header_Maximize:SetHidden(not bMinimize)
+
+	IIFA_GUI.minimized = bMinimize
+
+	local settings = IIfA:GetSceneSettings()
+	local lastX = IIFA_GUI:GetLeft()
+	local lastY = IIFA_GUI:GetTop()
+
+	settings.minimized = bMinimize
+
+	if bMinimize then
+		IIFA_GUI:SetResizeHandleSize(0)
+		settings.width	= IIFA_GUI:GetWidth()
+		settings.height = IIFA_GUI:GetHeight()
+		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 33)
+		IIFA_GUI:SetHeight(33)
+		PlaySound(SOUNDS.BACKPACK_WINDOW_CLOSE)
+	else
+		IIFA_GUI:SetResizeHandleSize(12)
+		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 1400)
+		IIFA_GUI:SetHeight(settings.height)
+		PlaySound(SOUNDS.BACKPACK_WINDOW_OPEN)
+	end
+
+	IIFA_GUI_ListHolder:SetHidden(bMinimize)
+	IIFA_GUI_Header_Filter:SetHidden(bMinimize)
+	IIFA_GUI_Header_Dropdown:SetHidden(bMinimize)
+	IIFA_GUI_Search:SetHidden(bMinimize)
+	IIFA_GUI_Header_GoldButton:SetHidden(bMinimize)
+	IIFA_GUI_Header_SortBar:SetHidden(bMinimize)
+
+	IIFA_GUI:ClearAnchors()
+	IIFA_GUI:SetAnchor(TOPLEFT, nil, TOPLEFT, lastX, lastY)
+	--]]
+end
+
+function IIfA:GUIButtonHideOnMouseUp()
+	IIFA_GUI:SetHidden(true)
+	local settings = IIfA:GetSceneSettings()
+	settings.hidden = true
+end
+
+-- dropdown
+function IIfA:GuiSetupDropdown(dropdown)
+	local selectedItem = IIfA:GetInventoryListFilter()
+	dropdown.comboBox:SetSelectedItem(selectedItem)
+end
+
+-- click functions
+function IIfA:GuiOnFilterButton(control, filterGroup, filterTypes, filterTypeNames)
+	-- identify if this is main or sub filter clicked
+	local b_isMain = control:GetName():find("Sub") == nil
+
+	if b_isMain then
+		if IIfA.LastFilterControl ~= nil then
+			IIfA.LastFilterControl:SetState(BSTATE_NORMAL)
+		end
+		IIfA.LastFilterControl = control
+
+		if IIfA.LastSubFilterControl ~= nil then
+		   IIfA.LastSubFilterControl:SetState(BSTATE_NORMAL)
+		   IIfA.LastSubFilterControl:GetParent():SetHidden(true)
+		end
+		if filterGroup ~= "All" then
+			IIfA.LastSubFilterControl = IIFA_GUI_Header:GetNamedChild(control:GetName():gsub("IIFA_GUI_Header", ""):gsub("Filter_Button", "Subfilter_") .. "_Button0")
+			IIfA.LastSubFilterControl:SetState(BSTATE_PRESSED)
+		else
+			IIfA.LastSubFilterControl = nil
+		end
+	else
+		if IIfA.LastSubFilterControl ~= nil then
+			IIfA.LastSubFilterControl:SetState(BSTATE_NORMAL)
+			if IIfA.LastSubFilterControl:GetParent() ~= control:GetParent() then
+				IIfA.LastSubFilterControl:GetParent():SetHidden(true)
+			end
+		end
+		IIfA.LastSubFilterControl = control
+	end
+
+	control:SetState(BSTATE_PRESSED)
+
+	if IIfA.LastSubFilterControl == nil then
+		IIFA_GUI_Header_Subfilter:SetHidden(true)
+		IIFA_GUI_Header_Subfilter:SetHeight(0)
+	else
+		IIFA_GUI_Header_Subfilter:SetHidden(false)
+		IIFA_GUI_Header_Subfilter:SetHeight(38)
+		local SubFilt = IIfA.LastSubFilterControl:GetParent()
+		SubFilt:SetHidden(false)
+		SubFilt:SetHeight(38)
+	end
+	IIfA.filterGroup = filterGroup
+	IIfA.filterTypes = filterTypes
+
+	function SetSubSubFilters(_, subFiltName, choice)
+		IIfA.filterTypes = choice.subFiltTypes
+		IIfA:UpdateScrollDataLinesData()
+	end
+
+	if filterTypeNames ~= nil then
+		local comboBox
+		if IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox ~= nil then
+			comboBox = IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox
+		else
+			comboBox = ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_SortBar_Subfilter_Dropdown)
+			IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox = comboBox
+		end
+		comboBox:ClearItems()
+		comboBox:SetSortsItems(false)
+		entry = comboBox:CreateItemEntry("All", SetSubSubFilters)
+		entry.subFiltTypes = IIfA.filterTypes
+		comboBox:AddItem(entry)
+		if IIfA.filterGroup == "Body" or		--:find("Body") ~= nil or
+		   IIfA.filterGroup == "Specialized" then
+			for i = 2, #filterTypes do
+				entry = comboBox:CreateItemEntry(filterTypeNames[i], SetSubSubFilters)
+				entry.subFiltTypes = { filterTypes[1], filterTypes[i] }
+				comboBox:AddItem(entry)
+			end
+		else
+			for i = 1, #filterTypes do
+				entry = comboBox:CreateItemEntry(filterTypeNames[i], SetSubSubFilters)
+				entry.subFiltTypes = { filterTypes[i] }
+				comboBox:AddItem(entry)
+			end
+		end
+		comboBox:SetSelectedItem("All")
+		IIFA_GUI_Header_SortBar_Subfilter_Dropdown:SetHidden(false)
+	else
+		IIFA_GUI_Header_SortBar_Subfilter_Dropdown:SetHidden(true)
+	end
+
+
+	local X_OFFSET_INDEX = 4
+	local Y_OFFSET_INDEX = 5
+	IIFA_GUI_ListHolder:ClearAnchors()
+
+	local newAnchor = ZO_Anchor:New(unpack(IIFA_GUI_ListHolder.savedAnchor1))
+	newAnchor:SetOffsets(IIFA_GUI_ListHolder.savedAnchor1[X_OFFSET_INDEX], IIFA_GUI_ListHolder.savedAnchor1[Y_OFFSET_INDEX] + IIFA_GUI_Header_Subfilter:GetHeight())
+	newAnchor:AddToControl(IIFA_GUI_ListHolder)
+
+	newAnchor = ZO_Anchor:New(unpack(IIFA_GUI_ListHolder.savedAnchor2))
+	newAnchor:SetOffsets(IIFA_GUI_ListHolder.savedAnchor2[X_OFFSET_INDEX], IIFA_GUI_ListHolder.savedAnchor2[Y_OFFSET_INDEX])
+	newAnchor:AddToControl(IIFA_GUI_ListHolder)
+
+	IIfA:GuiResizeScroll()
+
+	IIfA:UpdateScrollDataLinesData()
+end
+
+-- IIFA_GUI_SearchBox is the input field
+-- IIFA_GUI_SearchBoxText is the "Filter by text search" text msg
+function IIfA:GuiOnSearchboxText(control)
+	local text = control:GetText()
+	IIFA_GUI_SearchBoxText:SetHidden(text ~= nil and text > "")
+	IIfA.searchFilter = zo_strlower(text)
+    IIfA:UpdateScrollDataLinesData()
+    IIfA:UpdateInventoryScroll()
+end
+
+function IIfA:GuiOnSearchBoxClear(control)
+	IIFA_GUI_SearchBox:SetText("")
+	IIFA_GUI_SearchBoxText:SetHidden(false)
+	IIfA.searchFilter = ""
+    IIfA:UpdateScrollDataLinesData()
+    IIfA:UpdateInventoryScroll()
+end
+
+
+-- IIFA_GUI_ListHolder sort
+function IIfA:GuiOnSort(initialised)
+	if (initialised ~= true) then
+		IIfA.ScrollSortUp = not IIfA.ScrollSortUp
+	end
+
+	local icon = IIFA_GUI_Header_SortBar.Icon
+
+	if(IIfA.ScrollSortUp)then
+		icon:SetTexture("/esoui/art/miscellaneous/list_sortheader_icon_sortup.dds")
+		icon:SetAlpha(1)
+	else
+		icon:SetTexture("/esoui/art/miscellaneous/list_sortheader_icon_sortdown.dds")
+		icon:SetAlpha(1)
+	end
+	IIfA:UpdateScrollDataLinesData()
+end
+
+function IIfA:GuiOnScroll(control, delta)
+--	IIfA:DebugOut("guionscroll called")
+
+	if not delta then return end
+	if delta == 0 then return end
+
+	local slider = IIFA_GUI_ListHolder_Slider
+--	slider.locked = true
+	-- negative delta means scrolling down
+
+	local value = (IIFA_GUI_ListHolder.dataOffset - delta)
+	local total = #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines
+
+	if value < 0 then value = 0 end
+	if value > total then value = total end
+	IIFA_GUI_ListHolder.dataOffset  = value
+
+	IIfA:UpdateInventoryScroll()
+
+	slider:SetValue(IIFA_GUI_ListHolder.dataOffset)
+
+	IIfA:GuiLineOnMouseEnter(moc())
+	--IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP, true)
+
+
+--	slider.locked = false
+end
+
+-- IIFA_GUI_ListHolder.lines
+function IIfA:GuiLineOnMouseEnter(lineControl)
+	if not lineControl then return end
+
+	if( lineControl.itemLink ~= nil and lineControl.itemLink ~= "") then
+		IIfA.TooltipLink = lineControl.itemLink
+		InitializeTooltip(ItemTooltip, lineControl, LEFT, 0, 0, 0)
+		ItemTooltip:SetLink(lineControl.itemLink)
+--		IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP)
+	end
+end
+
+function IIfA:GuiLineOnMouseExit(control)
+	ClearTooltip(ItemTooltip)
+end
+
+
+function IIfA:GuiOnSliderUpdate(slider, value)
+	if not value or slider.locked then return end
+	local relativeValue = math.floor(IIFA_GUI_ListHolder.dataOffset - value)
+	IIfA:GuiOnScroll(slider, relativeValue)
+end
+
+function IIfA:GuiResizeScroll()		-- returns true if it had to be resized, otherwise false
+	if IIFA_GUI.minimized then return end		-- no point trying to resize if there's no scroll bar displayed
+
+	local regionHeight = IIFA_GUI_ListHolder:GetHeight()
+	local newLines = math.floor(regionHeight / IIFA_GUI_ListHolder.rowHeight)
+
+	if IIFA_GUI_ListHolder.maxLines == nil or IIFA_GUI_ListHolder.maxLines ~= newLines then
+		IIFA_GUI_ListHolder.maxLines = newLines
+		IIfA:GuiResizeLines()
+	end
+end
+
+function IIfA:GuiShowTooltip(control, tooltiptext)
+	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
+	InformationTooltip:SetHidden(false)
+	InformationTooltip:ClearLines()
+	InformationTooltip:AddLine(tooltiptext)
+end
+
+function IIfA:GuiShowFilterTooltip(control, tooltiptext)
+	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
+	InformationTooltip:SetHidden(false)
+	InformationTooltip:ClearLines()
+	InformationTooltip:AddLine(tooltiptext)
+end
+
+function IIfA:GuiHideTooltip(control)
+	InformationTooltip:SetHidden(true)
+	InformationTooltip:ClearLines()
+end
+
+-- resize to saved settings
+function IIfA:GuiReloadDimensions(settings, sceneName)
+
+	if not settings then
+		settings = IIfA:GetSceneSettings(sceneName)
+	end
+
+	IIfA:DisplayDockButton(settings, sceneName)
+
+	if not settings.docked then
+		if settings.minimized then
+			IIFA_GUI:SetHeight(33)
+		else
+			IIFA_GUI:SetHeight(settings.height)
+		end
+	end
+	IIfA:GuiResizeScroll()
+	IIFA_GUI:SetWidth(settings.width)
+end
+
+function IIfA:GuiResizeLines()
+	if not IIFA_GUI_ListHolder.lines then
+		lines = IIfA:CreateInventoryScroll()
+	end
+	if IIFA_GUI_ListHolder.lines ~= {} then
+		lines = IIFA_GUI_ListHolder.lines
+	end
+
+--	local linewidth =  (IIFA_GUI_ListHolder:GetWidth()-20)
+--	local qtywidth = lines[1].qty:GetWidth()
+--	local iconwidth = lines[1].icon:GetWidth()
+--	local textwidth = linewidth - qtywidth - iconwidth
+
+	for index, line in ipairs(lines) do
+--		line.text:SetWidth(textwidth)
+--		line:SetWidth(linewidth)
+		line:SetHidden(index > IIFA_GUI_ListHolder.maxLines)
+	end
+end
+
+function IIfA:onResizeStop()
+	-- if you resize the box, you need to resize the list to go with it
+	-- local sceneName = IIfA:GetCurrentSceneName()
+	local settings = IIfA:GetSceneSettings()
+
+	IIfA:SaveFrameInfo("onResizeStop")
+
+	IIfA:GuiResizeScroll()
+	if not settings.docked then
+		IIfA:UpdateInventoryScroll()
+	end
+end
+
+
+
+-- put separate dock/minimize/restore sizing code into unified function so all resizing gets done in one place, one time
+function IIfA:RePositionFrame(settings)
+	--[[
+	re-position frame based on current settings
+	- docked - no sizing handles, no moving, anchor to left edge of conrols on right side of screen, width at minimum, height determined by right hand control
+	- locked - no sizing handles, no moving, anchor to GUIRoot, pos/size based on last known info
+	- minimized - no sizing handles, anchor to GUIRoot, height 33, width at minimum, pos based on last known info
+	- hidden - just hide the whole works as is
+	- none of the above, sizing handles 12, anchor to GUIRoot, pos/size based on last known info
+	--]]
+
+
+	ZO_Tooltips_HideTextTooltip()
+	local sceneName = IIfA:GetCurrentSceneName()
+	if settings == nil then
+		settings = IIfA:GetSceneSettings()
+	end
+
+-- revisit - also look at toggleinventoryframe (it *should* be doing more than just show when it's not vis, like re-applying everything)
+--	if settings.hidden == true and IIFA_GUI:IsHidden() then
+--		return
+--	end
+
+	local bIsHud = (sceneName == "hud")
+
+	local bMinimize = settings.minimized
+
+	-- all of these go away if we're minimizing, otherwise they're shown
+	IIFA_GUI_ListHolder:SetHidden(bMinimize)
+	IIFA_GUI_Header_Filter:SetHidden(bMinimize)
+	if IIfA.LastSubFilterControl == nil or bMinimize then
+		IIFA_GUI_Header_Subfilter:SetHidden(true)
+		IIFA_GUI_Header_Subfilter:SetHeight(0)
+	else
+		IIFA_GUI_Header_Subfilter:SetHidden(false)
+		IIFA_GUI_Header_Subfilter:SetHeight(38)
+	end
+	IIFA_GUI_Header_Dropdown:SetHidden(bMinimize)
+	IIFA_GUI_Search:SetHidden(bMinimize)
+	IIFA_GUI_Header_GoldButton:SetHidden(bMinimize)
+	IIFA_GUI_Header_BagButton:SetHidden(bMinimize)
+	IIFA_GUI_Header_SortBar:SetHidden(bMinimize)
+	IIFA_GUI_SetNameOnly:SetHidden(bMinimize)
+
+	IIFA_GUI:ClearAnchors()
+	if bMinimize then
+		IIFA_GUI:SetResizeHandleSize(0)
+		-- have to change the constraints, it even constrains resizing by code, not just resize by sizing handles
+   		IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 33, -1, 1400)
+
+		IIFA_GUI:SetHeight(33)
+		IIFA_GUI:SetWidth(settings.width)
+		IIFA_GUI:SetAnchor(TOPLEFT, GUIRoot, TOPLEFT, settings.lastX, settings.lastY)
+
+		-- no docking while minimized
+		IIFA_GUI_Header_Docked:SetHidden(true)
+		IIFA_GUI_Header_Undocked:SetHidden(true)
+
+		-- flip the min/max buttons
+		IIFA_GUI_Header_Minimize:SetHidden(true)
+		IIFA_GUI_Header_Maximize:SetHidden(false)
+	else
+   		IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 300, -1, 1400)
+		if settings.docked then
+			-- no resizing handles
+			IIFA_GUI:SetResizeHandleSize(0)
+
+			-- no min/max buttons
+			IIFA_GUI_Header_Minimize:SetHidden(true)
+			IIFA_GUI_Header_Maximize:SetHidden(true)
+
+			-- no lock/unlock buttons
+			IIFA_GUI_Header_Locked:SetHidden(true)
+			IIFA_GUI_Header_Unlocked:SetHidden(true)
+			IIFA_GUI:SetMovable(false)
+
+			-- set docked buttons properly
+			IIFA_GUI_Header_Docked:SetHidden(false)
+			IIFA_GUI_Header_Undocked:SetHidden(true)
+
+			local RightBackground = ZO_SharedRightPanelBackground
+			if not ZO_SharedRightBackground:IsControlHidden() then
+				RightBackground = ZO_SharedRightBackground
+			end
+			local parentHeight = RightBackground:GetHeight()
+			local windowOffset = -20
+			if sceneName == "mailInbox" or sceneName == "mailSend" then
+				windowOffset = -40
+			end
+			IIFA_GUI:SetHeight(parentheight)
+			IIFA_GUI:SetWidth(self.minWidth)
+			IIFA_GUI:SetAnchor(TOPRIGHT, RightBackground, TOPLEFT, windowOffset, 16)
+			IIFA_GUI:SetAnchor(BOTTOMRIGHT, RightBackground, BOTTOMLEFT, windowOffset, 16)
+		else
+			IIFA_GUI:SetHeight(settings.height)
+			IIFA_GUI:SetWidth(settings.width)
+			if not settings.locked then
+				IIFA_GUI:SetResizeHandleSize(12)
+			else
+				IIFA_GUI:SetResizeHandleSize(0)
+			end
+
+			-- set the min/max buttons
+			IIFA_GUI_Header_Minimize:SetHidden(false)
+			IIFA_GUI_Header_Maximize:SetHidden(true)
+
+			-- display lock/unlock buttons
+			IIFA_GUI_Header_Locked:SetHidden(not settings.locked)
+			IIFA_GUI_Header_Unlocked:SetHidden(settings.locked)
+			IIFA_GUI:SetMovable(not settings.locked)
+
+			-- set docked buttons properly
+			IIFA_GUI_Header_Docked:SetHidden(true)
+			IIFA_GUI_Header_Undocked:SetHidden(bIsHud)
+
+			-- different anchor point
+			IIFA_GUI:SetAnchor(TOPLEFT, GUIRoot, TOPLEFT, settings.lastX, settings.lastY)
+		end
+	end
+
+	if not settings.hidden then
+		IIfA:GuiResizeScroll()
+    	IIfA:UpdateScrollDataLinesData()
+    	IIfA:UpdateInventoryScroll()
+	end
+	IIFA_GUI:SetHidden(settings.hidden)
+end
+
+function IIfA:SetNameFilterToggle()
+	IIFA_GUI_SetNameOnly_Checked:SetHidden(IIfA.bFilterOnSetName)
+	IIfA.bFilterOnSetName = not IIfA.bFilterOnSetName
+    IIfA:UpdateScrollDataLinesData()
+    IIfA:UpdateInventoryScroll()
+end
diff --git a/IIfA/README.md b/IIfA/README.md
new file mode 100644
index 0000000..30602cc
--- /dev/null
+++ b/IIfA/README.md
@@ -0,0 +1,3 @@
+# InventoryInsight
+
+This is the git repository for the eso addon [InventoryInsight](http://www.esoui.com/downloads/info731-InventoryInsight.html "IIfA on esoui.com")
diff --git a/IIfA/StringRegistration.lua b/IIfA/StringRegistration.lua
new file mode 100644
index 0000000..ed9ad57
--- /dev/null
+++ b/IIfA/StringRegistration.lua
@@ -0,0 +1,14 @@
+ --this creates a menu for the addon.
+local IIfA = IIfA
+
+local strings = {
+	IIFA_BAG_BAGPACK 	= "Inventar",
+	IIFA_BAG_BANK 		= "Bank",
+	IIFA_BAG_CRAFTBAG 	= "CraftBag",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 1)
+end
\ No newline at end of file
diff --git a/IIfA/assets/apparel/clothing_down.dds b/IIfA/assets/apparel/clothing_down.dds
new file mode 100644
index 0000000..ef6375a
Binary files /dev/null and b/IIfA/assets/apparel/clothing_down.dds differ
diff --git a/IIfA/assets/apparel/clothing_over.dds b/IIfA/assets/apparel/clothing_over.dds
new file mode 100644
index 0000000..6a22d0d
Binary files /dev/null and b/IIfA/assets/apparel/clothing_over.dds differ
diff --git a/IIfA/assets/apparel/clothing_up.dds b/IIfA/assets/apparel/clothing_up.dds
new file mode 100644
index 0000000..fd583d4
Binary files /dev/null and b/IIfA/assets/apparel/clothing_up.dds differ
diff --git a/IIfA/assets/apparel/jewelry_down.dds b/IIfA/assets/apparel/jewelry_down.dds
new file mode 100644
index 0000000..9e80bc1
Binary files /dev/null and b/IIfA/assets/apparel/jewelry_down.dds differ
diff --git a/IIfA/assets/apparel/jewelry_over.dds b/IIfA/assets/apparel/jewelry_over.dds
new file mode 100644
index 0000000..7146414
Binary files /dev/null and b/IIfA/assets/apparel/jewelry_over.dds differ
diff --git a/IIfA/assets/apparel/jewelry_up.dds b/IIfA/assets/apparel/jewelry_up.dds
new file mode 100644
index 0000000..ca66730
Binary files /dev/null and b/IIfA/assets/apparel/jewelry_up.dds differ
diff --git a/IIfA/assets/apparel/shield_down.dds b/IIfA/assets/apparel/shield_down.dds
new file mode 100644
index 0000000..cb98b00
Binary files /dev/null and b/IIfA/assets/apparel/shield_down.dds differ
diff --git a/IIfA/assets/apparel/shield_over.dds b/IIfA/assets/apparel/shield_over.dds
new file mode 100644
index 0000000..61c5c6b
Binary files /dev/null and b/IIfA/assets/apparel/shield_over.dds differ
diff --git a/IIfA/assets/apparel/shield_up.dds b/IIfA/assets/apparel/shield_up.dds
new file mode 100644
index 0000000..de0dc58
Binary files /dev/null and b/IIfA/assets/apparel/shield_up.dds differ
diff --git a/IIfA/assets/consumables/containers/container_down.dds b/IIfA/assets/consumables/containers/container_down.dds
new file mode 100644
index 0000000..b55c106
Binary files /dev/null and b/IIfA/assets/consumables/containers/container_down.dds differ
diff --git a/IIfA/assets/consumables/containers/container_over.dds b/IIfA/assets/consumables/containers/container_over.dds
new file mode 100644
index 0000000..58ef270
Binary files /dev/null and b/IIfA/assets/consumables/containers/container_over.dds differ
diff --git a/IIfA/assets/consumables/containers/container_up.dds b/IIfA/assets/consumables/containers/container_up.dds
new file mode 100644
index 0000000..804e124
Binary files /dev/null and b/IIfA/assets/consumables/containers/container_up.dds differ
diff --git a/IIfA/assets/consumables/drinks/drink_down.dds b/IIfA/assets/consumables/drinks/drink_down.dds
new file mode 100644
index 0000000..c246c01
Binary files /dev/null and b/IIfA/assets/consumables/drinks/drink_down.dds differ
diff --git a/IIfA/assets/consumables/drinks/drink_over.dds b/IIfA/assets/consumables/drinks/drink_over.dds
new file mode 100644
index 0000000..989ec36
Binary files /dev/null and b/IIfA/assets/consumables/drinks/drink_over.dds differ
diff --git a/IIfA/assets/consumables/drinks/drink_up.dds b/IIfA/assets/consumables/drinks/drink_up.dds
new file mode 100644
index 0000000..730d728
Binary files /dev/null and b/IIfA/assets/consumables/drinks/drink_up.dds differ
diff --git a/IIfA/assets/consumables/food/food_down.dds b/IIfA/assets/consumables/food/food_down.dds
new file mode 100644
index 0000000..ede82d3
Binary files /dev/null and b/IIfA/assets/consumables/food/food_down.dds differ
diff --git a/IIfA/assets/consumables/food/food_over.dds b/IIfA/assets/consumables/food/food_over.dds
new file mode 100644
index 0000000..7302ac0
Binary files /dev/null and b/IIfA/assets/consumables/food/food_over.dds differ
diff --git a/IIfA/assets/consumables/food/food_up.dds b/IIfA/assets/consumables/food/food_up.dds
new file mode 100644
index 0000000..74fe517
Binary files /dev/null and b/IIfA/assets/consumables/food/food_up.dds differ
diff --git a/IIfA/assets/consumables/motifs/motif_down.dds b/IIfA/assets/consumables/motifs/motif_down.dds
new file mode 100644
index 0000000..ae95c4a
Binary files /dev/null and b/IIfA/assets/consumables/motifs/motif_down.dds differ
diff --git a/IIfA/assets/consumables/motifs/motif_over.dds b/IIfA/assets/consumables/motifs/motif_over.dds
new file mode 100644
index 0000000..0c3bf7c
Binary files /dev/null and b/IIfA/assets/consumables/motifs/motif_over.dds differ
diff --git a/IIfA/assets/consumables/motifs/motif_up.dds b/IIfA/assets/consumables/motifs/motif_up.dds
new file mode 100644
index 0000000..17b9c83
Binary files /dev/null and b/IIfA/assets/consumables/motifs/motif_up.dds differ
diff --git a/IIfA/assets/consumables/poison/poison_down.dds b/IIfA/assets/consumables/poison/poison_down.dds
new file mode 100644
index 0000000..12e9dac
Binary files /dev/null and b/IIfA/assets/consumables/poison/poison_down.dds differ
diff --git a/IIfA/assets/consumables/poison/poison_over.dds b/IIfA/assets/consumables/poison/poison_over.dds
new file mode 100644
index 0000000..7ff30e4
Binary files /dev/null and b/IIfA/assets/consumables/poison/poison_over.dds differ
diff --git a/IIfA/assets/consumables/poison/poison_up.dds b/IIfA/assets/consumables/poison/poison_up.dds
new file mode 100644
index 0000000..cf0d602
Binary files /dev/null and b/IIfA/assets/consumables/poison/poison_up.dds differ
diff --git a/IIfA/assets/consumables/potion/potion_down.dds b/IIfA/assets/consumables/potion/potion_down.dds
new file mode 100644
index 0000000..70941de
Binary files /dev/null and b/IIfA/assets/consumables/potion/potion_down.dds differ
diff --git a/IIfA/assets/consumables/potion/potion_over.dds b/IIfA/assets/consumables/potion/potion_over.dds
new file mode 100644
index 0000000..e49c955
Binary files /dev/null and b/IIfA/assets/consumables/potion/potion_over.dds differ
diff --git a/IIfA/assets/consumables/potion/potion_up.dds b/IIfA/assets/consumables/potion/potion_up.dds
new file mode 100644
index 0000000..e11b347
Binary files /dev/null and b/IIfA/assets/consumables/potion/potion_up.dds differ
diff --git a/IIfA/assets/consumables/recipes/recipe_down.dds b/IIfA/assets/consumables/recipes/recipe_down.dds
new file mode 100644
index 0000000..0f2dbc7
Binary files /dev/null and b/IIfA/assets/consumables/recipes/recipe_down.dds differ
diff --git a/IIfA/assets/consumables/recipes/recipe_over.dds b/IIfA/assets/consumables/recipes/recipe_over.dds
new file mode 100644
index 0000000..ccff653
Binary files /dev/null and b/IIfA/assets/consumables/recipes/recipe_over.dds differ
diff --git a/IIfA/assets/consumables/recipes/recipe_up.dds b/IIfA/assets/consumables/recipes/recipe_up.dds
new file mode 100644
index 0000000..44e2451
Binary files /dev/null and b/IIfA/assets/consumables/recipes/recipe_up.dds differ
diff --git a/IIfA/assets/consumables/repair/repair_down.dds b/IIfA/assets/consumables/repair/repair_down.dds
new file mode 100644
index 0000000..5c5f5e3
Binary files /dev/null and b/IIfA/assets/consumables/repair/repair_down.dds differ
diff --git a/IIfA/assets/consumables/repair/repair_over.dds b/IIfA/assets/consumables/repair/repair_over.dds
new file mode 100644
index 0000000..c599fc4
Binary files /dev/null and b/IIfA/assets/consumables/repair/repair_over.dds differ
diff --git a/IIfA/assets/consumables/repair/repair_up.dds b/IIfA/assets/consumables/repair/repair_up.dds
new file mode 100644
index 0000000..d38166a
Binary files /dev/null and b/IIfA/assets/consumables/repair/repair_up.dds differ
diff --git a/IIfA/assets/icons/Akaviri.dds b/IIfA/assets/icons/Akaviri.dds
new file mode 100644
index 0000000..30409c5
Binary files /dev/null and b/IIfA/assets/icons/Akaviri.dds differ
diff --git a/IIfA/assets/icons/Bandit.dds b/IIfA/assets/icons/Bandit.dds
new file mode 100644
index 0000000..cf0a3a3
Binary files /dev/null and b/IIfA/assets/icons/Bandit.dds differ
diff --git a/IIfA/assets/icons/BuoyantArmiger.dds b/IIfA/assets/icons/BuoyantArmiger.dds
new file mode 100644
index 0000000..9333584
Binary files /dev/null and b/IIfA/assets/icons/BuoyantArmiger.dds differ
diff --git a/IIfA/assets/icons/Maormer.dds b/IIfA/assets/icons/Maormer.dds
new file mode 100644
index 0000000..9aac4fc
Binary files /dev/null and b/IIfA/assets/icons/Maormer.dds differ
diff --git a/IIfA/assets/icons/Primitive.dds b/IIfA/assets/icons/Primitive.dds
new file mode 100644
index 0000000..f7fed38
Binary files /dev/null and b/IIfA/assets/icons/Primitive.dds differ
diff --git a/IIfA/assets/icons/Reach.dds b/IIfA/assets/icons/Reach.dds
new file mode 100644
index 0000000..47f7b16
Binary files /dev/null and b/IIfA/assets/icons/Reach.dds differ
diff --git a/IIfA/assets/icons/Soulshriven.dds b/IIfA/assets/icons/Soulshriven.dds
new file mode 100644
index 0000000..5e0e45f
Binary files /dev/null and b/IIfA/assets/icons/Soulshriven.dds differ
diff --git a/IIfA/assets/icons/abahswatch.dds b/IIfA/assets/icons/abahswatch.dds
new file mode 100644
index 0000000..42c13f7
Binary files /dev/null and b/IIfA/assets/icons/abahswatch.dds differ
diff --git a/IIfA/assets/icons/akatosh.dds b/IIfA/assets/icons/akatosh.dds
new file mode 100644
index 0000000..df2d207
Binary files /dev/null and b/IIfA/assets/icons/akatosh.dds differ
diff --git a/IIfA/assets/icons/altmer.dds b/IIfA/assets/icons/altmer.dds
new file mode 100644
index 0000000..036c746
Binary files /dev/null and b/IIfA/assets/icons/altmer.dds differ
diff --git a/IIfA/assets/icons/ancient.dds b/IIfA/assets/icons/ancient.dds
new file mode 100644
index 0000000..9240a9d
Binary files /dev/null and b/IIfA/assets/icons/ancient.dds differ
diff --git a/IIfA/assets/icons/apostle.dds b/IIfA/assets/icons/apostle.dds
new file mode 100644
index 0000000..0d7e260
Binary files /dev/null and b/IIfA/assets/icons/apostle.dds differ
diff --git a/IIfA/assets/icons/argonian.dds b/IIfA/assets/icons/argonian.dds
new file mode 100644
index 0000000..1319590
Binary files /dev/null and b/IIfA/assets/icons/argonian.dds differ
diff --git a/IIfA/assets/icons/assassin.dds b/IIfA/assets/icons/assassin.dds
new file mode 100644
index 0000000..f480732
Binary files /dev/null and b/IIfA/assets/icons/assassin.dds differ
diff --git a/IIfA/assets/icons/bloodforge.dds b/IIfA/assets/icons/bloodforge.dds
new file mode 100644
index 0000000..007fda5
Binary files /dev/null and b/IIfA/assets/icons/bloodforge.dds differ
diff --git a/IIfA/assets/icons/bosmer.dds b/IIfA/assets/icons/bosmer.dds
new file mode 100644
index 0000000..c92d595
Binary files /dev/null and b/IIfA/assets/icons/bosmer.dds differ
diff --git a/IIfA/assets/icons/breton.dds b/IIfA/assets/icons/breton.dds
new file mode 100644
index 0000000..d32e08b
Binary files /dev/null and b/IIfA/assets/icons/breton.dds differ
diff --git a/IIfA/assets/icons/broken.dds b/IIfA/assets/icons/broken.dds
new file mode 100644
index 0000000..9770828
Binary files /dev/null and b/IIfA/assets/icons/broken.dds differ
diff --git a/IIfA/assets/icons/cliffracer.dds b/IIfA/assets/icons/cliffracer.dds
new file mode 100644
index 0000000..1cd03eb
Binary files /dev/null and b/IIfA/assets/icons/cliffracer.dds differ
diff --git a/IIfA/assets/icons/clockwork.dds b/IIfA/assets/icons/clockwork.dds
new file mode 100644
index 0000000..2f4dfbc
Binary files /dev/null and b/IIfA/assets/icons/clockwork.dds differ
diff --git a/IIfA/assets/icons/daedric.dds b/IIfA/assets/icons/daedric.dds
new file mode 100644
index 0000000..18b6ad0
Binary files /dev/null and b/IIfA/assets/icons/daedric.dds differ
diff --git a/IIfA/assets/icons/daggerfall.dds b/IIfA/assets/icons/daggerfall.dds
new file mode 100644
index 0000000..6af5bed
Binary files /dev/null and b/IIfA/assets/icons/daggerfall.dds differ
diff --git a/IIfA/assets/icons/darkbrotherhood.dds b/IIfA/assets/icons/darkbrotherhood.dds
new file mode 100644
index 0000000..db38123
Binary files /dev/null and b/IIfA/assets/icons/darkbrotherhood.dds differ
diff --git a/IIfA/assets/icons/docked_down.dds b/IIfA/assets/icons/docked_down.dds
new file mode 100644
index 0000000..5dcce13
Binary files /dev/null and b/IIfA/assets/icons/docked_down.dds differ
diff --git a/IIfA/assets/icons/docked_over.dds b/IIfA/assets/icons/docked_over.dds
new file mode 100644
index 0000000..8014ba3
Binary files /dev/null and b/IIfA/assets/icons/docked_over.dds differ
diff --git a/IIfA/assets/icons/docked_up.dds b/IIfA/assets/icons/docked_up.dds
new file mode 100644
index 0000000..e690d21
Binary files /dev/null and b/IIfA/assets/icons/docked_up.dds differ
diff --git a/IIfA/assets/icons/dragonknight.dds b/IIfA/assets/icons/dragonknight.dds
new file mode 100644
index 0000000..9eca10c
Binary files /dev/null and b/IIfA/assets/icons/dragonknight.dds differ
diff --git a/IIfA/assets/icons/dreadhorn.dds b/IIfA/assets/icons/dreadhorn.dds
new file mode 100644
index 0000000..3f1af48
Binary files /dev/null and b/IIfA/assets/icons/dreadhorn.dds differ
diff --git a/IIfA/assets/icons/dromathra.dds b/IIfA/assets/icons/dromathra.dds
new file mode 100644
index 0000000..d9b3530
Binary files /dev/null and b/IIfA/assets/icons/dromathra.dds differ
diff --git a/IIfA/assets/icons/dunmer.dds b/IIfA/assets/icons/dunmer.dds
new file mode 100644
index 0000000..a88f98a
Binary files /dev/null and b/IIfA/assets/icons/dunmer.dds differ
diff --git a/IIfA/assets/icons/dwemer.dds b/IIfA/assets/icons/dwemer.dds
new file mode 100644
index 0000000..7c56666
Binary files /dev/null and b/IIfA/assets/icons/dwemer.dds differ
diff --git a/IIfA/assets/icons/ebonheart.dds b/IIfA/assets/icons/ebonheart.dds
new file mode 100644
index 0000000..9a83476
Binary files /dev/null and b/IIfA/assets/icons/ebonheart.dds differ
diff --git a/IIfA/assets/icons/ebonshadow.dds b/IIfA/assets/icons/ebonshadow.dds
new file mode 100644
index 0000000..0cf3ef3
Binary files /dev/null and b/IIfA/assets/icons/ebonshadow.dds differ
diff --git a/IIfA/assets/icons/ebony.dds b/IIfA/assets/icons/ebony.dds
new file mode 100644
index 0000000..511639d
Binary files /dev/null and b/IIfA/assets/icons/ebony.dds differ
diff --git a/IIfA/assets/icons/frostcaster.dds b/IIfA/assets/icons/frostcaster.dds
new file mode 100644
index 0000000..60286ce
Binary files /dev/null and b/IIfA/assets/icons/frostcaster.dds differ
diff --git a/IIfA/assets/icons/harlequin.dds b/IIfA/assets/icons/harlequin.dds
new file mode 100644
index 0000000..2d89b8c
Binary files /dev/null and b/IIfA/assets/icons/harlequin.dds differ
diff --git a/IIfA/assets/icons/hlaalu.dds b/IIfA/assets/icons/hlaalu.dds
new file mode 100644
index 0000000..5697297
Binary files /dev/null and b/IIfA/assets/icons/hlaalu.dds differ
diff --git a/IIfA/assets/icons/hollowjack.dds b/IIfA/assets/icons/hollowjack.dds
new file mode 100644
index 0000000..0c21e51
Binary files /dev/null and b/IIfA/assets/icons/hollowjack.dds differ
diff --git a/IIfA/assets/icons/imperial.dds b/IIfA/assets/icons/imperial.dds
new file mode 100644
index 0000000..ad2c9d8
Binary files /dev/null and b/IIfA/assets/icons/imperial.dds differ
diff --git a/IIfA/assets/icons/inventoryinsight_icon.dds b/IIfA/assets/icons/inventoryinsight_icon.dds
new file mode 100644
index 0000000..f5b6800
Binary files /dev/null and b/IIfA/assets/icons/inventoryinsight_icon.dds differ
diff --git a/IIfA/assets/icons/khajit.dds b/IIfA/assets/icons/khajit.dds
new file mode 100644
index 0000000..3608358
Binary files /dev/null and b/IIfA/assets/icons/khajit.dds differ
diff --git a/IIfA/assets/icons/kothringi.dds b/IIfA/assets/icons/kothringi.dds
new file mode 100644
index 0000000..5437cd0
Binary files /dev/null and b/IIfA/assets/icons/kothringi.dds differ
diff --git a/IIfA/assets/icons/laurel.dds b/IIfA/assets/icons/laurel.dds
new file mode 100644
index 0000000..5220df4
Binary files /dev/null and b/IIfA/assets/icons/laurel.dds differ
diff --git a/IIfA/assets/icons/lizard.dds b/IIfA/assets/icons/lizard.dds
new file mode 100644
index 0000000..d5f1f2b
Binary files /dev/null and b/IIfA/assets/icons/lizard.dds differ
diff --git a/IIfA/assets/icons/malacath.dds b/IIfA/assets/icons/malacath.dds
new file mode 100644
index 0000000..4bab1ed
Binary files /dev/null and b/IIfA/assets/icons/malacath.dds differ
diff --git a/IIfA/assets/icons/minotaur.dds b/IIfA/assets/icons/minotaur.dds
new file mode 100644
index 0000000..f070aac
Binary files /dev/null and b/IIfA/assets/icons/minotaur.dds differ
diff --git a/IIfA/assets/icons/moragtong.dds b/IIfA/assets/icons/moragtong.dds
new file mode 100644
index 0000000..54e28df
Binary files /dev/null and b/IIfA/assets/icons/moragtong.dds differ
diff --git a/IIfA/assets/icons/necromancer.dds b/IIfA/assets/icons/necromancer.dds
new file mode 100644
index 0000000..7fdc860
Binary files /dev/null and b/IIfA/assets/icons/necromancer.dds differ
diff --git a/IIfA/assets/icons/nightblade.dds b/IIfA/assets/icons/nightblade.dds
new file mode 100644
index 0000000..066b58e
Binary files /dev/null and b/IIfA/assets/icons/nightblade.dds differ
diff --git a/IIfA/assets/icons/nord.dds b/IIfA/assets/icons/nord.dds
new file mode 100644
index 0000000..c8ab9de
Binary files /dev/null and b/IIfA/assets/icons/nord.dds differ
diff --git a/IIfA/assets/icons/ordinator.dds b/IIfA/assets/icons/ordinator.dds
new file mode 100644
index 0000000..589ae0a
Binary files /dev/null and b/IIfA/assets/icons/ordinator.dds differ
diff --git a/IIfA/assets/icons/orsimer.dds b/IIfA/assets/icons/orsimer.dds
new file mode 100644
index 0000000..80b59d2
Binary files /dev/null and b/IIfA/assets/icons/orsimer.dds differ
diff --git a/IIfA/assets/icons/outlaw.dds b/IIfA/assets/icons/outlaw.dds
new file mode 100644
index 0000000..b1f2c93
Binary files /dev/null and b/IIfA/assets/icons/outlaw.dds differ
diff --git a/IIfA/assets/icons/ragada.dds b/IIfA/assets/icons/ragada.dds
new file mode 100644
index 0000000..65d7d19
Binary files /dev/null and b/IIfA/assets/icons/ragada.dds differ
diff --git a/IIfA/assets/icons/redguard.dds b/IIfA/assets/icons/redguard.dds
new file mode 100644
index 0000000..6bfec2c
Binary files /dev/null and b/IIfA/assets/icons/redguard.dds differ
diff --git a/IIfA/assets/icons/redoran.dds b/IIfA/assets/icons/redoran.dds
new file mode 100644
index 0000000..be4c4f3
Binary files /dev/null and b/IIfA/assets/icons/redoran.dds differ
diff --git a/IIfA/assets/icons/skinchanger.dds b/IIfA/assets/icons/skinchanger.dds
new file mode 100644
index 0000000..38027e0
Binary files /dev/null and b/IIfA/assets/icons/skinchanger.dds differ
diff --git a/IIfA/assets/icons/skull.dds b/IIfA/assets/icons/skull.dds
new file mode 100644
index 0000000..7fdc860
Binary files /dev/null and b/IIfA/assets/icons/skull.dds differ
diff --git a/IIfA/assets/icons/skull_nice.dds b/IIfA/assets/icons/skull_nice.dds
new file mode 100644
index 0000000..105b589
Binary files /dev/null and b/IIfA/assets/icons/skull_nice.dds differ
diff --git a/IIfA/assets/icons/sorcerer.dds b/IIfA/assets/icons/sorcerer.dds
new file mode 100644
index 0000000..1509f09
Binary files /dev/null and b/IIfA/assets/icons/sorcerer.dds differ
diff --git a/IIfA/assets/icons/telvanni.dds b/IIfA/assets/icons/telvanni.dds
new file mode 100644
index 0000000..97631be
Binary files /dev/null and b/IIfA/assets/icons/telvanni.dds differ
diff --git a/IIfA/assets/icons/templar.dds b/IIfA/assets/icons/templar.dds
new file mode 100644
index 0000000..989c0c9
Binary files /dev/null and b/IIfA/assets/icons/templar.dds differ
diff --git a/IIfA/assets/icons/thief.dds b/IIfA/assets/icons/thief.dds
new file mode 100644
index 0000000..da1c61f
Binary files /dev/null and b/IIfA/assets/icons/thief.dds differ
diff --git a/IIfA/assets/icons/triangle.dds b/IIfA/assets/icons/triangle.dds
new file mode 100644
index 0000000..1fea9b7
Binary files /dev/null and b/IIfA/assets/icons/triangle.dds differ
diff --git a/IIfA/assets/icons/trinimac.dds b/IIfA/assets/icons/trinimac.dds
new file mode 100644
index 0000000..eb1c987
Binary files /dev/null and b/IIfA/assets/icons/trinimac.dds differ
diff --git a/IIfA/assets/icons/tsaesci.dds b/IIfA/assets/icons/tsaesci.dds
new file mode 100644
index 0000000..ac3909e
Binary files /dev/null and b/IIfA/assets/icons/tsaesci.dds differ
diff --git a/IIfA/assets/icons/undocked_down.dds b/IIfA/assets/icons/undocked_down.dds
new file mode 100644
index 0000000..df1fd8e
Binary files /dev/null and b/IIfA/assets/icons/undocked_down.dds differ
diff --git a/IIfA/assets/icons/undocked_over.dds b/IIfA/assets/icons/undocked_over.dds
new file mode 100644
index 0000000..9319337
Binary files /dev/null and b/IIfA/assets/icons/undocked_over.dds differ
diff --git a/IIfA/assets/icons/undocked_up.dds b/IIfA/assets/icons/undocked_up.dds
new file mode 100644
index 0000000..0a38f4b
Binary files /dev/null and b/IIfA/assets/icons/undocked_up.dds differ
diff --git a/IIfA/assets/icons/wheel.dds b/IIfA/assets/icons/wheel.dds
new file mode 100644
index 0000000..2a61dc5
Binary files /dev/null and b/IIfA/assets/icons/wheel.dds differ
diff --git a/IIfA/assets/materials/atrait/atrait_down.dds b/IIfA/assets/materials/atrait/atrait_down.dds
new file mode 100644
index 0000000..298c340
Binary files /dev/null and b/IIfA/assets/materials/atrait/atrait_down.dds differ
diff --git a/IIfA/assets/materials/atrait/atrait_over.dds b/IIfA/assets/materials/atrait/atrait_over.dds
new file mode 100644
index 0000000..9335b04
Binary files /dev/null and b/IIfA/assets/materials/atrait/atrait_over.dds differ
diff --git a/IIfA/assets/materials/atrait/atrait_up.dds b/IIfA/assets/materials/atrait/atrait_up.dds
new file mode 100644
index 0000000..1cf2479
Binary files /dev/null and b/IIfA/assets/materials/atrait/atrait_up.dds differ
diff --git a/IIfA/assets/materials/wtrait/wtrait_down.dds b/IIfA/assets/materials/wtrait/wtrait_down.dds
new file mode 100644
index 0000000..6feea5a
Binary files /dev/null and b/IIfA/assets/materials/wtrait/wtrait_down.dds differ
diff --git a/IIfA/assets/materials/wtrait/wtrait_over.dds b/IIfA/assets/materials/wtrait/wtrait_over.dds
new file mode 100644
index 0000000..bd364ef
Binary files /dev/null and b/IIfA/assets/materials/wtrait/wtrait_over.dds differ
diff --git a/IIfA/assets/materials/wtrait/wtrait_up.dds b/IIfA/assets/materials/wtrait/wtrait_up.dds
new file mode 100644
index 0000000..59f2ef1
Binary files /dev/null and b/IIfA/assets/materials/wtrait/wtrait_up.dds differ
diff --git a/IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds b/IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds
new file mode 100644
index 0000000..6ab5ab6
Binary files /dev/null and b/IIfA/assets/miscellaneous/avaweapon/avaweapon_down.dds differ
diff --git a/IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds b/IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds
new file mode 100644
index 0000000..deb14e4
Binary files /dev/null and b/IIfA/assets/miscellaneous/avaweapon/avaweapon_over.dds differ
diff --git a/IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds b/IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds
new file mode 100644
index 0000000..859ffaf
Binary files /dev/null and b/IIfA/assets/miscellaneous/avaweapon/avaweapon_up.dds differ
diff --git a/IIfA/assets/miscellaneous/bait/bait_down.dds b/IIfA/assets/miscellaneous/bait/bait_down.dds
new file mode 100644
index 0000000..0c67eb8
Binary files /dev/null and b/IIfA/assets/miscellaneous/bait/bait_down.dds differ
diff --git a/IIfA/assets/miscellaneous/bait/bait_over.dds b/IIfA/assets/miscellaneous/bait/bait_over.dds
new file mode 100644
index 0000000..21cc4a0
Binary files /dev/null and b/IIfA/assets/miscellaneous/bait/bait_over.dds differ
diff --git a/IIfA/assets/miscellaneous/bait/bait_up.dds b/IIfA/assets/miscellaneous/bait/bait_up.dds
new file mode 100644
index 0000000..8e8e053
Binary files /dev/null and b/IIfA/assets/miscellaneous/bait/bait_up.dds differ
diff --git a/IIfA/assets/miscellaneous/glyphs/glyphs_down.dds b/IIfA/assets/miscellaneous/glyphs/glyphs_down.dds
new file mode 100644
index 0000000..283aed6
Binary files /dev/null and b/IIfA/assets/miscellaneous/glyphs/glyphs_down.dds differ
diff --git a/IIfA/assets/miscellaneous/glyphs/glyphs_over.dds b/IIfA/assets/miscellaneous/glyphs/glyphs_over.dds
new file mode 100644
index 0000000..b701af4
Binary files /dev/null and b/IIfA/assets/miscellaneous/glyphs/glyphs_over.dds differ
diff --git a/IIfA/assets/miscellaneous/glyphs/glyphs_up.dds b/IIfA/assets/miscellaneous/glyphs/glyphs_up.dds
new file mode 100644
index 0000000..6d8cdf5
Binary files /dev/null and b/IIfA/assets/miscellaneous/glyphs/glyphs_up.dds differ
diff --git a/IIfA/assets/miscellaneous/soulgem/soulgem_down.dds b/IIfA/assets/miscellaneous/soulgem/soulgem_down.dds
new file mode 100644
index 0000000..c3988d0
Binary files /dev/null and b/IIfA/assets/miscellaneous/soulgem/soulgem_down.dds differ
diff --git a/IIfA/assets/miscellaneous/soulgem/soulgem_over.dds b/IIfA/assets/miscellaneous/soulgem/soulgem_over.dds
new file mode 100644
index 0000000..4d26d0b
Binary files /dev/null and b/IIfA/assets/miscellaneous/soulgem/soulgem_over.dds differ
diff --git a/IIfA/assets/miscellaneous/soulgem/soulgem_up.dds b/IIfA/assets/miscellaneous/soulgem/soulgem_up.dds
new file mode 100644
index 0000000..6dfbe32
Binary files /dev/null and b/IIfA/assets/miscellaneous/soulgem/soulgem_up.dds differ
diff --git a/IIfA/assets/miscellaneous/trash/trash_down.dds b/IIfA/assets/miscellaneous/trash/trash_down.dds
new file mode 100644
index 0000000..eb8d1b1
Binary files /dev/null and b/IIfA/assets/miscellaneous/trash/trash_down.dds differ
diff --git a/IIfA/assets/miscellaneous/trash/trash_over.dds b/IIfA/assets/miscellaneous/trash/trash_over.dds
new file mode 100644
index 0000000..2184ed2
Binary files /dev/null and b/IIfA/assets/miscellaneous/trash/trash_over.dds differ
diff --git a/IIfA/assets/miscellaneous/trash/trash_up.dds b/IIfA/assets/miscellaneous/trash/trash_up.dds
new file mode 100644
index 0000000..8dc9ac1
Binary files /dev/null and b/IIfA/assets/miscellaneous/trash/trash_up.dds differ
diff --git a/IIfA/assets/miscellaneous/trophy/trophy_down.dds b/IIfA/assets/miscellaneous/trophy/trophy_down.dds
new file mode 100644
index 0000000..64e2512
Binary files /dev/null and b/IIfA/assets/miscellaneous/trophy/trophy_down.dds differ
diff --git a/IIfA/assets/miscellaneous/trophy/trophy_over.dds b/IIfA/assets/miscellaneous/trophy/trophy_over.dds
new file mode 100644
index 0000000..a2bd140
Binary files /dev/null and b/IIfA/assets/miscellaneous/trophy/trophy_over.dds differ
diff --git a/IIfA/assets/miscellaneous/trophy/trophy_up.dds b/IIfA/assets/miscellaneous/trophy/trophy_up.dds
new file mode 100644
index 0000000..39e9dfa
Binary files /dev/null and b/IIfA/assets/miscellaneous/trophy/trophy_up.dds differ
diff --git a/IIfA/assets/weapons/bow_down.dds b/IIfA/assets/weapons/bow_down.dds
new file mode 100644
index 0000000..73c0f5a
Binary files /dev/null and b/IIfA/assets/weapons/bow_down.dds differ
diff --git a/IIfA/assets/weapons/bow_over.dds b/IIfA/assets/weapons/bow_over.dds
new file mode 100644
index 0000000..eac0968
Binary files /dev/null and b/IIfA/assets/weapons/bow_over.dds differ
diff --git a/IIfA/assets/weapons/bow_up.dds b/IIfA/assets/weapons/bow_up.dds
new file mode 100644
index 0000000..9a5892f
Binary files /dev/null and b/IIfA/assets/weapons/bow_up.dds differ
diff --git a/IIfA/assets/weapons/destruction_down.dds b/IIfA/assets/weapons/destruction_down.dds
new file mode 100644
index 0000000..0e4cfe7
Binary files /dev/null and b/IIfA/assets/weapons/destruction_down.dds differ
diff --git a/IIfA/assets/weapons/destruction_over.dds b/IIfA/assets/weapons/destruction_over.dds
new file mode 100644
index 0000000..88db22c
Binary files /dev/null and b/IIfA/assets/weapons/destruction_over.dds differ
diff --git a/IIfA/assets/weapons/destruction_up.dds b/IIfA/assets/weapons/destruction_up.dds
new file mode 100644
index 0000000..fc26c06
Binary files /dev/null and b/IIfA/assets/weapons/destruction_up.dds differ
diff --git a/IIfA/assets/weapons/healing_down.dds b/IIfA/assets/weapons/healing_down.dds
new file mode 100644
index 0000000..d07892a
Binary files /dev/null and b/IIfA/assets/weapons/healing_down.dds differ
diff --git a/IIfA/assets/weapons/healing_over.dds b/IIfA/assets/weapons/healing_over.dds
new file mode 100644
index 0000000..7409cdb
Binary files /dev/null and b/IIfA/assets/weapons/healing_over.dds differ
diff --git a/IIfA/assets/weapons/healing_up.dds b/IIfA/assets/weapons/healing_up.dds
new file mode 100644
index 0000000..7c5767a
Binary files /dev/null and b/IIfA/assets/weapons/healing_up.dds differ
diff --git a/IIfA/assets/weapons/onehanded_down.dds b/IIfA/assets/weapons/onehanded_down.dds
new file mode 100644
index 0000000..8266507
Binary files /dev/null and b/IIfA/assets/weapons/onehanded_down.dds differ
diff --git a/IIfA/assets/weapons/onehanded_over.dds b/IIfA/assets/weapons/onehanded_over.dds
new file mode 100644
index 0000000..6d1ecf7
Binary files /dev/null and b/IIfA/assets/weapons/onehanded_over.dds differ
diff --git a/IIfA/assets/weapons/onehanded_up.dds b/IIfA/assets/weapons/onehanded_up.dds
new file mode 100644
index 0000000..d9797b5
Binary files /dev/null and b/IIfA/assets/weapons/onehanded_up.dds differ
diff --git a/IIfA/assets/weapons/twohanded_down.dds b/IIfA/assets/weapons/twohanded_down.dds
new file mode 100644
index 0000000..df881aa
Binary files /dev/null and b/IIfA/assets/weapons/twohanded_down.dds differ
diff --git a/IIfA/assets/weapons/twohanded_over.dds b/IIfA/assets/weapons/twohanded_over.dds
new file mode 100644
index 0000000..fc1c255
Binary files /dev/null and b/IIfA/assets/weapons/twohanded_over.dds differ
diff --git a/IIfA/assets/weapons/twohanded_up.dds b/IIfA/assets/weapons/twohanded_up.dds
new file mode 100644
index 0000000..a5c3dac
Binary files /dev/null and b/IIfA/assets/weapons/twohanded_up.dds differ
diff --git a/IIfA/libs/LibAddonMenu-2.0/LICENSE b/IIfA/libs/LibAddonMenu-2.0/LICENSE
new file mode 100644
index 0000000..f69cbd4
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/LICENSE
@@ -0,0 +1,201 @@
+               The Artistic License 2.0
+
+           Copyright (c) 2016 Ryan Lakanen (Seerah)
+
+     Everyone is permitted to copy and distribute verbatim copies
+      of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package.  If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+    "Copyright Holder" means the individual(s) or organization(s)
+    named in the copyright notice for the entire Package.
+
+    "Contributor" means any party that has contributed code or other
+    material to the Package, in accordance with the Copyright Holder's
+    procedures.
+
+    "You" and "your" means any person who would like to copy,
+    distribute, or modify the Package.
+
+    "Package" means the collection of files distributed by the
+    Copyright Holder, and derivatives of that collection and/or of
+    those files. A given Package may consist of either the Standard
+    Version, or a Modified Version.
+
+    "Distribute" means providing a copy of the Package or making it
+    accessible to anyone else, or in the case of a company or
+    organization, to others outside of your company or organization.
+
+    "Distributor Fee" means any fee that you charge for Distributing
+    this Package or providing support for this Package to another
+    party.  It does not mean licensing fees.
+
+    "Standard Version" refers to the Package if it has not been
+    modified, or has been modified only in ways explicitly requested
+    by the Copyright Holder.
+
+    "Modified Version" means the Package, if it has been changed, and
+    such changes were not explicitly requested by the Copyright
+    Holder.
+
+    "Original License" means this Artistic License as Distributed with
+    the Standard Version of the Package, in its current version or as
+    it may be modified by The Perl Foundation in the future.
+
+    "Source" form means the source code, documentation source, and
+    configuration files for the Package.
+
+    "Compiled" form means the compiled bytecode, object code, binary,
+    or any other form resulting from mechanical transformation or
+    translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1)  You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2)  You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers.  At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3)  You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder.  The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4)  You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+    (a)  make the Modified Version available to the Copyright Holder
+    of the Standard Version, under the Original License, so that the
+    Copyright Holder may include your modifications in the Standard
+    Version.
+
+    (b)  ensure that installation of your Modified Version does not
+    prevent the user installing or running the Standard Version. In
+    addition, the Modified Version must bear a name that is different
+    from the name of the Standard Version.
+
+    (c)  allow anyone who receives a copy of the Modified Version to
+    make the Source form of the Modified Version available to others
+    under
+
+    (i)  the Original License or
+
+    (ii)  a license that permits the licensee to freely copy,
+    modify and redistribute the Modified Version using the same
+    licensing terms that apply to the copy that the licensee
+    received, and requires that the Source form of the Modified
+    Version, and of any works derived from it, be made freely
+    available in that license fees are prohibited but Distributor
+    Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5)  You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version.  Such instructions must be
+valid at the time of your distribution.  If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6)  You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7)  You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package.  Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version.  In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10)  Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11)  If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12)  This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13)  This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14)  Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/IIfA/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/IIfA/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
new file mode 100644
index 0000000..cb97a2e
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
@@ -0,0 +1,1186 @@
+-- LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)         --
+-- Distributed under The Artistic License 2.0 (see LICENSE)     --
+------------------------------------------------------------------
+
+
+--Register LAM with LibStub
+local MAJOR, MINOR = "LibAddonMenu-2.0", 23
+local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not lam then return end --the same or newer version of this lib is already loaded into memory
+
+local messages = {}
+local MESSAGE_PREFIX = "[LAM2] "
+local function PrintLater(msg)
+    if CHAT_SYSTEM.primaryContainer then
+        d(MESSAGE_PREFIX .. msg)
+    else
+        messages[#messages + 1] = msg
+    end
+end
+
+local function FlushMessages()
+    for i = 1, #messages do
+        d(MESSAGE_PREFIX .. messages[i])
+    end
+    messages = {}
+end
+
+if LAMSettingsPanelCreated and not LAMCompatibilityWarning then
+    PrintLater("An old version of LibAddonMenu with compatibility issues was detected. For more information on how to proceed search for LibAddonMenu on esoui.com")
+    LAMCompatibilityWarning = true
+end
+
+--UPVALUES--
+local wm = WINDOW_MANAGER
+local em = EVENT_MANAGER
+local sm = SCENE_MANAGER
+local cm = CALLBACK_MANAGER
+local tconcat = table.concat
+local tinsert = table.insert
+
+local MIN_HEIGHT = 26
+local HALF_WIDTH_LINE_SPACING = 2
+local OPTIONS_CREATION_RUNNING = 1
+local OPTIONS_CREATED = 2
+local LAM_CONFIRM_DIALOG = "LAM_CONFIRM_DIALOG"
+local LAM_DEFAULTS_DIALOG = "LAM_DEFAULTS"
+local LAM_RELOAD_DIALOG = "LAM_RELOAD_DIALOG"
+
+local addonsForList = {}
+local addonToOptionsMap = {}
+local optionsState = {}
+lam.widgets = lam.widgets or {}
+local widgets = lam.widgets
+lam.util = lam.util or {}
+local util = lam.util
+lam.controlsForReload = lam.controlsForReload or {}
+local controlsForReload = lam.controlsForReload
+
+local function GetDefaultValue(default)
+    if type(default) == "function" then
+        return default()
+    end
+    return default
+end
+
+local function GetStringFromValue(value)
+    if type(value) == "function" then
+        return value()
+    elseif type(value) == "number" then
+        return GetString(value)
+    end
+    return value
+end
+
+local function CreateBaseControl(parent, controlData, controlName)
+    local control = wm:CreateControl(controlName or controlData.reference, parent.scroll or parent, CT_CONTROL)
+    control.panel = parent.panel or parent -- if this is in a submenu, panel is the submenu's parent
+    control.data = controlData
+
+    control.isHalfWidth = controlData.width == "half"
+    local width = 510 -- set default width in case a custom parent object is passed
+    if control.panel.GetWidth ~= nil then width = control.panel:GetWidth() - 60 end
+    control:SetWidth(width)
+    return control
+end
+
+local function CreateLabelAndContainerControl(parent, controlData, controlName)
+    local control = CreateBaseControl(parent, controlData, controlName)
+    local width = control:GetWidth()
+
+    local container = wm:CreateControl(nil, control, CT_CONTROL)
+    container:SetDimensions(width / 3, MIN_HEIGHT)
+    control.container = container
+
+    local label = wm:CreateControl(nil, control, CT_LABEL)
+    label:SetFont("ZoFontWinH4")
+    label:SetHeight(MIN_HEIGHT)
+    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+    label:SetText(GetStringFromValue(controlData.name))
+    control.label = label
+
+    if control.isHalfWidth then
+        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
+        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+        label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
+        container:SetAnchor(TOPRIGHT, control.label, BOTTOMRIGHT, 0, HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetDimensions(width, MIN_HEIGHT)
+        container:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
+        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+        label:SetAnchor(TOPRIGHT, container, TOPLEFT, 5, 0)
+    end
+
+    control.data.tooltipText = GetStringFromValue(control.data.tooltip)
+    control:SetMouseEnabled(true)
+    control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+    control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    return control
+end
+
+local function GetTopPanel(panel)
+    while panel.panel and panel.panel ~= panel do
+        panel = panel.panel
+    end
+    return panel
+end
+
+local function IsSame(objA, objB)
+    if #objA ~= #objB then return false end
+    for i = 1, #objA do
+        if objA[i] ~= objB[i] then return false end
+    end
+    return true
+end
+
+local function RefreshReloadUIButton()
+    lam.requiresReload = false
+
+    for i = 1, #controlsForReload do
+        local reloadControl = controlsForReload[i]
+        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
+            lam.requiresReload = true
+            break
+        end
+    end
+
+    lam.applyButton:SetHidden(not lam.requiresReload)
+end
+
+local function RequestRefreshIfNeeded(control)
+    -- if our parent window wants to refresh controls, then fire the callback
+    local panel = GetTopPanel(control.panel)
+    local panelData = panel.data
+    if panelData.registerForRefresh then
+        cm:FireCallbacks("LAM-RefreshPanel", control)
+    end
+    RefreshReloadUIButton()
+end
+
+local function RegisterForRefreshIfNeeded(control)
+    -- if our parent window wants to refresh controls, then add this to the list
+    local panel = GetTopPanel(control.panel)
+    local panelData = panel.data
+    if panelData.registerForRefresh or panelData.registerForDefaults then
+        tinsert(panel.controlsToRefresh or {}, control) -- prevent errors on custom panels
+    end
+end
+
+local function RegisterForReloadIfNeeded(control)
+    if control.data.requiresReload then
+        tinsert(controlsForReload, control)
+        control.startValue = {control.data.getFunc()}
+    end
+end
+
+local function GetConfirmDialog()
+    if(not ESO_Dialogs[LAM_CONFIRM_DIALOG]) then
+        ESO_Dialogs[LAM_CONFIRM_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = "",
+            },
+            mainText = {
+                text = "",
+            },
+            buttons = {
+                [1] = {
+                    text = SI_DIALOG_CONFIRM,
+                    callback = function(dialog) end,
+                },
+                [2] = {
+                    text = SI_DIALOG_CANCEL,
+                }
+            }
+        }
+    end
+    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
+end
+
+local function ShowConfirmationDialog(title, body, callback)
+    local dialog = GetConfirmDialog()
+    dialog.title.text = title
+    dialog.mainText.text = body
+    dialog.buttons[1].callback = callback
+    ZO_Dialogs_ShowDialog(LAM_CONFIRM_DIALOG)
+end
+
+local function GetDefaultsDialog()
+    if(not ESO_Dialogs[LAM_DEFAULTS_DIALOG]) then
+        ESO_Dialogs[LAM_DEFAULTS_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP,
+            },
+            mainText = {
+                text = SI_OPTIONS_RESET_PROMPT,
+            },
+            buttons = {
+                [1] = {
+                    text = SI_OPTIONS_RESET,
+                    callback = function(dialog) end,
+                },
+                [2] = {
+                    text = SI_DIALOG_CANCEL,
+                }
+            }
+        }
+    end
+    return ESO_Dialogs[LAM_DEFAULTS_DIALOG]
+end
+
+local function ShowDefaultsDialog(panel)
+    local dialog = GetDefaultsDialog()
+    dialog.buttons[1].callback = function()
+        panel:ForceDefaults()
+        RefreshReloadUIButton()
+    end
+    ZO_Dialogs_ShowDialog(LAM_DEFAULTS_DIALOG)
+end
+
+local function DiscardChangesOnReloadControls()
+    for i = 1, #controlsForReload do
+        local reloadControl = controlsForReload[i]
+        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
+            reloadControl:UpdateValue(false, unpack(reloadControl.startValue))
+        end
+    end
+    lam.requiresReload = false
+    lam.applyButton:SetHidden(true)
+end
+
+local function StorePanelForReopening()
+    local saveData = ZO_Ingame_SavedVariables["LAM"] or {}
+    saveData.reopenPanel = lam.currentAddonPanel:GetName()
+    ZO_Ingame_SavedVariables["LAM"] = saveData
+end
+
+local function RetrievePanelForReopening()
+    local saveData = ZO_Ingame_SavedVariables["LAM"]
+    if(saveData) then
+        ZO_Ingame_SavedVariables["LAM"] = nil
+        return _G[saveData.reopenPanel]
+    end
+end
+
+local function HandleReloadUIPressed()
+    StorePanelForReopening()
+    ReloadUI()
+end
+
+local function HandleLoadDefaultsPressed()
+    ShowDefaultsDialog(lam.currentAddonPanel)
+end
+
+local function GetReloadDialog()
+    if(not ESO_Dialogs[LAM_RELOAD_DIALOG]) then
+        ESO_Dialogs[LAM_RELOAD_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = util.L["RELOAD_DIALOG_TITLE"],
+            },
+            mainText = {
+                text = util.L["RELOAD_DIALOG_TEXT"],
+            },
+            buttons = {
+                [1] = {
+                    text = util.L["RELOAD_DIALOG_RELOAD_BUTTON"],
+                    callback = function() ReloadUI() end,
+                },
+                [2] = {
+                    text = util.L["RELOAD_DIALOG_DISCARD_BUTTON"],
+                    callback = DiscardChangesOnReloadControls,
+                }
+            },
+            noChoiceCallback = DiscardChangesOnReloadControls,
+        }
+    end
+    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
+end
+
+local function ShowReloadDialogIfNeeded()
+    if lam.requiresReload then
+        local dialog = GetReloadDialog()
+        ZO_Dialogs_ShowDialog(LAM_RELOAD_DIALOG)
+    end
+end
+
+local function UpdateWarning(control)
+    local warning
+    if control.data.warning ~= nil then
+        warning = util.GetStringFromValue(control.data.warning)
+    end
+
+    if control.data.requiresReload then
+        if not warning then
+            warning = string.format("|cff0000%s", util.L["RELOAD_UI_WARNING"])
+        else
+            warning = string.format("%s\n\n|cff0000%s", warning, util.L["RELOAD_UI_WARNING"])
+        end
+    end
+
+    if not warning then
+        control.warning:SetHidden(true)
+    else
+        control.warning.data = {tooltipText = warning}
+        control.warning:SetHidden(false)
+    end
+end
+
+local localization = {
+    en = {
+        PANEL_NAME = "Addons",
+        AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Author: <<X:1>>"
+        VERSION = "Version: <<X:1>>",
+        WEBSITE = "Visit Website",
+        PANEL_INFO_FONT = "$(CHAT_FONT)|14|soft-shadow-thin",
+        RELOAD_UI_WARNING = "Changes to this setting require an UI reload in order to take effect.",
+        RELOAD_DIALOG_TITLE = "UI Reload required",
+        RELOAD_DIALOG_TEXT = "Some changes require an UI reload in order to take effect. Do you want to reload now or discard the changes?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Reload",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Discard",
+    },
+    fr = { -- provided by Ayantir
+        PANEL_NAME = "Extensions",
+        WEBSITE = "Visiter le site Web",
+        RELOAD_UI_WARNING = "La modification de ce paramètre requiert un rechargement de l'UI pour qu'il soit pris en compte.",
+        RELOAD_DIALOG_TITLE = "Reload UI requis",
+        RELOAD_DIALOG_TEXT = "Certaines modifications requièrent un rechargement de l'UI pour qu'ils soient pris en compte. Souhaitez-vous recharger l'interface maintenant ou annuler les modifications ?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Recharger",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Annuler",
+    },
+    de = { -- provided by sirinsidiator
+        PANEL_NAME = "Erweiterungen",
+        WEBSITE = "Webseite besuchen",
+        RELOAD_UI_WARNING = "Änderungen an dieser Option werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird.",
+        RELOAD_DIALOG_TITLE = "Neuladen benötigt",
+        RELOAD_DIALOG_TEXT = "Einige Änderungen werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird. Wollt Ihr sie jetzt neu laden oder die Änderungen verwerfen?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Neu laden",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Verwerfen",
+    },
+    ru = { -- provided by TERAB1T
+        PANEL_NAME = "Дополнения",
+        VERSION = "Версия: <<X:1>>",
+        WEBSITE = "Посетить сайт",
+        PANEL_INFO_FONT = "RuESO/fonts/Univers57.otf|14|soft-shadow-thin",
+    },
+    es = { -- provided by silvereyes333
+        WEBSITE = "Vaya al sitio web",
+    },
+    jp = { -- provided by k0ta0uchi
+        PANEL_NAME = "アドオン設定",
+        WEBSITE = "ウェブサイトを見る",
+    },
+    zh = { -- provided by bssthu
+        PANEL_NAME = "插件",
+        VERSION = "版本: <<X:1>>",
+        WEBSITE = "访问网站",
+        PANEL_INFO_FONT = "EsoZh/fonts/univers57.otf|14|soft-shadow-thin",
+    },
+}
+
+util.L = ZO_ShallowTableCopy(localization[GetCVar("Language.2")], localization["en"])
+util.GetTooltipText = GetStringFromValue -- deprecated, use util.GetStringFromValue instead
+util.GetStringFromValue = GetStringFromValue
+util.GetDefaultValue = GetDefaultValue
+util.CreateBaseControl = CreateBaseControl
+util.CreateLabelAndContainerControl = CreateLabelAndContainerControl
+util.RequestRefreshIfNeeded = RequestRefreshIfNeeded
+util.RegisterForRefreshIfNeeded = RegisterForRefreshIfNeeded
+util.RegisterForReloadIfNeeded = RegisterForReloadIfNeeded
+util.GetTopPanel = GetTopPanel
+util.ShowConfirmationDialog = ShowConfirmationDialog
+util.UpdateWarning = UpdateWarning
+
+local ADDON_DATA_TYPE = 1
+local RESELECTING_DURING_REBUILD = true
+local USER_REQUESTED_OPEN = true
+
+
+--INTERNAL FUNCTION
+--scrolls ZO_ScrollList `list` to move the row corresponding to `data`
+-- into view (does nothing if there is no such row in the list)
+--unlike ZO_ScrollList_ScrollDataIntoView, this function accounts for
+-- fading near the list's edges - it avoids the fading area by scrolling
+-- a little further than the ZO function
+local function ScrollDataIntoView(list, data)
+    local targetIndex = data.sortIndex
+    if not targetIndex then return end
+
+    local scrollMin, scrollMax = list.scrollbar:GetMinMax()
+    local scrollTop = list.scrollbar:GetValue()
+    local controlHeight = list.controlHeight
+    local targetMin = controlHeight * (targetIndex - 1) - 64
+    -- subtracting 64 ain't arbitrary, it's the maximum fading height
+    -- (libraries/zo_templates/scrolltemplates.lua/UpdateScrollFade)
+
+    if targetMin < scrollTop then
+        ZO_ScrollList_ScrollAbsolute(list, zo_max(targetMin, scrollMin))
+    else
+        local listHeight = ZO_ScrollList_GetHeight(list)
+        local targetMax = controlHeight * targetIndex + 64 - listHeight
+
+        if targetMax > scrollTop then
+            ZO_ScrollList_ScrollAbsolute(list, zo_min(targetMax, scrollMax))
+        end
+    end
+end
+
+
+--INTERNAL FUNCTION
+--constructs a string pattern from the text in `searchEdit` control
+-- * metacharacters are escaped, losing their special meaning
+-- * whitespace matches anything (including empty substring)
+--if there is nothing but whitespace, returns nil
+--otherwise returns a filter function, which takes a `data` table argument
+-- and returns true iff `data.filterText` matches the pattern
+local function GetSearchFilterFunc(searchEdit)
+    local text = searchEdit:GetText():lower()
+    local pattern = text:match("(%S+.-)%s*$")
+
+    if not pattern then -- nothing but whitespace
+        return nil
+    end
+
+    -- escape metacharacters, e.g. "ESO-Datenbank.de" => "ESO%-Datenbank%.de"
+    pattern = pattern:gsub("[-*+?^$().[%]%%]", "%%%0")
+
+    -- replace whitespace with "match shortest anything"
+    pattern = pattern:gsub("%s+", ".-")
+
+    return function(data)
+        return data.filterText:lower():find(pattern) ~= nil
+    end
+end
+
+
+--INTERNAL FUNCTION
+--populates `addonList` with entries from `addonsForList`
+-- addonList = ZO_ScrollList control
+-- filter = [optional] function(data)
+local function PopulateAddonList(addonList, filter)
+    local entryList = ZO_ScrollList_GetDataList(addonList)
+    local numEntries = 0
+    local selectedData = nil
+
+    ZO_ScrollList_Clear(addonList)
+
+    for i, data in ipairs(addonsForList) do
+        if not filter or filter(data) then
+            local dataEntry = ZO_ScrollList_CreateDataEntry(ADDON_DATA_TYPE, data)
+            numEntries = numEntries + 1
+            data.sortIndex = numEntries
+            entryList[numEntries] = dataEntry
+            -- select the first panel passing the filter, or the currently
+            -- shown panel, but only if it passes the filter as well
+            if selectedData == nil or data.panel == lam.currentAddonPanel then
+                selectedData = data
+            end
+        else
+            data.sortIndex = nil
+        end
+    end
+
+    ZO_ScrollList_Commit(addonList)
+
+    if selectedData then
+        if selectedData.panel == lam.currentAddonPanel then
+            ZO_ScrollList_SelectData(addonList, selectedData, nil, RESELECTING_DURING_REBUILD)
+        else
+            ZO_ScrollList_SelectData(addonList, selectedData, nil)
+        end
+        ScrollDataIntoView(addonList, selectedData)
+    end
+end
+
+
+--METHOD: REGISTER WIDGET--
+--each widget has its version checked before loading,
+--so we only have the most recent one in memory
+--Usage:
+-- widgetType = "string"; the type of widget being registered
+-- widgetVersion = integer; the widget's version number
+LAMCreateControl = LAMCreateControl or {}
+local lamcc = LAMCreateControl
+
+function lam:RegisterWidget(widgetType, widgetVersion)
+    if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
+        return false
+    else
+        widgets[widgetType] = widgetVersion
+        return true
+    end
+end
+
+-- INTERNAL METHOD: hijacks the handlers for the actions in the OptionsWindow layer if not already done
+local function InitKeybindActions()
+    if not lam.keybindsInitialized then
+        lam.keybindsInitialized = true
+        ZO_PreHook(KEYBOARD_OPTIONS, "ApplySettings", function()
+            if lam.currentPanelOpened then
+                if not lam.applyButton:IsHidden() then
+                    HandleReloadUIPressed()
+                end
+                return true
+            end
+        end)
+        ZO_PreHook("ZO_Dialogs_ShowDialog", function(dialogName)
+            if lam.currentPanelOpened and dialogName == "OPTIONS_RESET_TO_DEFAULTS" then
+                if not lam.defaultButton:IsHidden() then
+                    HandleLoadDefaultsPressed()
+                end
+                return true
+            end
+        end)
+    end
+end
+
+-- INTERNAL METHOD: fires the LAM-PanelOpened callback if not already done
+local function OpenCurrentPanel()
+    if lam.currentAddonPanel and not lam.currentPanelOpened then
+        lam.currentPanelOpened = true
+        lam.defaultButton:SetHidden(not lam.currentAddonPanel.data.registerForDefaults)
+        cm:FireCallbacks("LAM-PanelOpened", lam.currentAddonPanel)
+    end
+end
+
+-- INTERNAL METHOD: fires the LAM-PanelClosed callback if not already done
+local function CloseCurrentPanel()
+    if lam.currentAddonPanel and lam.currentPanelOpened then
+        lam.currentPanelOpened = false
+        cm:FireCallbacks("LAM-PanelClosed", lam.currentAddonPanel)
+    end
+end
+
+--METHOD: OPEN TO ADDON PANEL--
+--opens to a specific addon's option panel
+--Usage:
+-- panel = userdata; the panel returned by the :RegisterOptionsPanel method
+local locSettings = GetString(SI_GAME_MENU_SETTINGS)
+function lam:OpenToPanel(panel)
+
+    -- find and select the panel's row in addon list
+
+    local addonList = lam.addonList
+    local selectedData = nil
+
+    for _, addonData in ipairs(addonsForList) do
+        if addonData.panel == panel then
+            selectedData = addonData
+            ScrollDataIntoView(addonList, selectedData)
+            break
+        end
+    end
+
+    ZO_ScrollList_SelectData(addonList, selectedData)
+    ZO_ScrollList_RefreshVisible(addonList, selectedData)
+
+    local srchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
+    srchEdit:Clear()
+
+    -- note that ZO_ScrollList doesn't require `selectedData` to be actually
+    -- present in the list, and that the list will only be populated once LAM
+    -- "Addon Settings" menu entry is selected for the first time
+
+    local function openAddonSettingsMenu()
+        local gameMenu = ZO_GameMenu_InGame.gameMenu
+        local settingsMenu = gameMenu.headerControls[locSettings]
+
+        if settingsMenu then -- an instance of ZO_TreeNode
+            local children = settingsMenu:GetChildren()
+            for i = 1, (children and #children or 0) do
+                local childNode = children[i]
+                local data = childNode:GetData()
+                if data and data.id == lam.panelId then
+                    -- found LAM "Addon Settings" node, yay!
+                    childNode:GetTree():SelectNode(childNode)
+                    break
+                end
+            end
+        end
+    end
+
+    if sm:GetScene("gameMenuInGame"):GetState() == SCENE_SHOWN then
+        openAddonSettingsMenu()
+    else
+        sm:CallWhen("gameMenuInGame", SCENE_SHOWN, openAddonSettingsMenu)
+        sm:Show("gameMenuInGame")
+    end
+end
+
+local TwinOptionsContainer_Index = 0
+local function TwinOptionsContainer(parent, leftWidget, rightWidget)
+    TwinOptionsContainer_Index = TwinOptionsContainer_Index + 1
+    local cParent = parent.scroll or parent
+    local panel = parent.panel or cParent
+    local container = wm:CreateControl("$(parent)TwinContainer" .. tostring(TwinOptionsContainer_Index),
+        cParent, CT_CONTROL)
+    container:SetResizeToFitDescendents(true)
+    container:SetAnchor(select(2, leftWidget:GetAnchor(0) ))
+
+    leftWidget:ClearAnchors()
+    leftWidget:SetAnchor(TOPLEFT, container, TOPLEFT)
+    rightWidget:SetAnchor(TOPLEFT, leftWidget, TOPRIGHT, 5, 0)
+
+    leftWidget:SetWidth( leftWidget:GetWidth() - 2.5 ) -- fixes bad alignment with 'full' controls
+    rightWidget:SetWidth( rightWidget:GetWidth() - 2.5 )
+
+    leftWidget:SetParent(container)
+    rightWidget:SetParent(container)
+
+    container.data = {type = "container"}
+    container.panel = panel
+    return container
+end
+
+--INTERNAL FUNCTION
+--creates controls when options panel is first shown
+--controls anchoring of these controls in the panel
+local function CreateOptionsControls(panel)
+    local addonID = panel:GetName()
+    if(optionsState[addonID] == OPTIONS_CREATED) then
+        return false
+    elseif(optionsState[addonID] == OPTIONS_CREATION_RUNNING) then
+        return true
+    end
+    optionsState[addonID] = OPTIONS_CREATION_RUNNING
+
+    local function CreationFinished()
+        optionsState[addonID] = OPTIONS_CREATED
+        cm:FireCallbacks("LAM-PanelControlsCreated", panel)
+        OpenCurrentPanel()
+    end
+
+    local optionsTable = addonToOptionsMap[addonID]
+    if optionsTable then
+        local function CreateAndAnchorWidget(parent, widgetData, offsetX, offsetY, anchorTarget, wasHalf)
+            local widget
+            local status, err = pcall(function() widget = LAMCreateControl[widgetData.type](parent, widgetData) end)
+            if not status then
+                return err or true, offsetY, anchorTarget, wasHalf
+            else
+                local isHalf = (widgetData.width == "half")
+                if not anchorTarget then -- the first widget in a panel is just placed in the top left corner
+                    widget:SetAnchor(TOPLEFT)
+                    anchorTarget = widget
+                elseif wasHalf and isHalf then -- when the previous widget was only half width and this one is too, we place it on the right side
+                    widget.lineControl = anchorTarget
+                    isHalf = false
+                    offsetY = 0
+                    anchorTarget = TwinOptionsContainer(parent, anchorTarget, widget)
+                else -- otherwise we just put it below the previous one normally
+                    widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15)
+                    offsetY = 0
+                    anchorTarget = widget
+                end
+                return false, offsetY, anchorTarget, isHalf
+            end
+        end
+
+        local THROTTLE_TIMEOUT, THROTTLE_COUNT = 10, 20
+        local fifo = {}
+        local anchorOffset, lastAddedControl, wasHalf
+        local CreateWidgetsInPanel, err
+
+        local function PrepareForNextPanel()
+            anchorOffset, lastAddedControl, wasHalf = 0, nil, false
+        end
+
+        local function SetupCreationCalls(parent, widgetDataTable)
+            fifo[#fifo + 1] = PrepareForNextPanel
+            local count = #widgetDataTable
+            for i = 1, count, THROTTLE_COUNT do
+                fifo[#fifo + 1] = function()
+                    CreateWidgetsInPanel(parent, widgetDataTable, i, zo_min(i + THROTTLE_COUNT - 1, count))
+                end
+            end
+            return count ~= NonContiguousCount(widgetDataTable)
+        end
+
+        CreateWidgetsInPanel = function(parent, widgetDataTable, startIndex, endIndex)
+            for i=startIndex,endIndex do
+                local widgetData = widgetDataTable[i]
+                if not widgetData then
+                    PrintLater("Skipped creation of missing entry in the settings menu of " .. addonID .. ".")
+                else
+                    local widgetType = widgetData.type
+                    local offsetX = 0
+                    local isSubmenu = (widgetType == "submenu")
+                    if isSubmenu then
+                        wasHalf = false
+                        offsetX = 5
+                    end
+
+                    err, anchorOffset, lastAddedControl, wasHalf = CreateAndAnchorWidget(parent, widgetData, offsetX, anchorOffset, lastAddedControl, wasHalf)
+                    if err then
+                        PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, widgetData.name or "unnamed", addonID))
+                    end
+
+                    if isSubmenu then
+                        if SetupCreationCalls(lastAddedControl, widgetData.controls) then
+                            PrintLater(("The sub menu '%s' of %s is missing some entries."):format(widgetData.name or "unnamed", addonID))
+                        end
+                    end
+                end
+            end
+        end
+
+        local function DoCreateSettings()
+            if #fifo > 0 then
+                local nextCall = table.remove(fifo, 1)
+                nextCall()
+                if(nextCall == PrepareForNextPanel) then
+                    DoCreateSettings()
+                else
+                    zo_callLater(DoCreateSettings, THROTTLE_TIMEOUT)
+                end
+            else
+                CreationFinished()
+            end
+        end
+
+        if SetupCreationCalls(panel, optionsTable) then
+            PrintLater(("The settings menu of %s is missing some entries."):format(addonID))
+        end
+        DoCreateSettings()
+    else
+        CreationFinished()
+    end
+
+    return true
+end
+
+--INTERNAL FUNCTION
+--handles switching between panels
+local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel
+    local currentlySelected = lam.currentAddonPanel
+    if currentlySelected and currentlySelected ~= panel then
+        currentlySelected:SetHidden(true)
+        CloseCurrentPanel()
+    end
+    lam.currentAddonPanel = panel
+
+    -- refresh visible rows to reflect panel IsHidden status
+    ZO_ScrollList_RefreshVisible(lam.addonList)
+
+    if not CreateOptionsControls(panel) then
+        OpenCurrentPanel()
+    end
+
+    cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+
+local CheckSafetyAndInitialize
+
+--METHOD: REGISTER ADDON PANEL
+--registers your addon with LibAddonMenu and creates a panel
+--Usage:
+-- addonID = "string"; unique ID which will be the global name of your panel
+-- panelData = table; data object for your panel - see controls\panel.lua
+function lam:RegisterAddonPanel(addonID, panelData)
+    CheckSafetyAndInitialize(addonID)
+    local container = lam:GetAddonPanelContainer()
+    local panel = lamcc.panel(container, panelData, addonID) --addonID==global name of panel
+    panel:SetHidden(true)
+    panel:SetAnchorFill(container)
+    panel:SetHandler("OnShow", ToggleAddonPanels)
+
+    local function stripMarkup(str)
+        return str:gsub("|[Cc]%x%x%x%x%x%x", ""):gsub("|[Rr]", "")
+    end
+
+    local filterParts = {panelData.name, nil, nil}
+    -- append keywords and author separately, the may be nil
+    filterParts[#filterParts + 1] = panelData.keywords
+    filterParts[#filterParts + 1] = panelData.author
+
+    local addonData = {
+        panel = panel,
+        name = stripMarkup(panelData.name),
+        filterText = stripMarkup(tconcat(filterParts, "\t")):lower(),
+    }
+
+    tinsert(addonsForList, addonData)
+
+    if panelData.slashCommand then
+        SLASH_COMMANDS[panelData.slashCommand] = function()
+            lam:OpenToPanel(panel)
+        end
+    end
+
+    return panel --return for authors creating options manually
+end
+
+
+--METHOD: REGISTER OPTION CONTROLS
+--registers the options you want shown for your addon
+--these are stored in a table where each key-value pair is the order
+--of the options in the panel and the data for that control, respectively
+--see exampleoptions.lua for an example
+--see controls\<widget>.lua for each widget type
+--Usage:
+-- addonID = "string"; the same string passed to :RegisterAddonPanel
+-- optionsTable = table; the table containing all of the options controls and their data
+function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sliderData, buttonData, etc}
+    addonToOptionsMap[addonID] = optionsTable
+end
+
+--INTERNAL FUNCTION
+--creates LAM's Addon Settings entry in ZO_GameMenu
+local function CreateAddonSettingsMenuEntry()
+    local panelData = {
+        id = KEYBOARD_OPTIONS.currentPanelId,
+        name = util.L["PANEL_NAME"],
+    }
+
+    KEYBOARD_OPTIONS.currentPanelId = panelData.id + 1
+    KEYBOARD_OPTIONS.panelNames[panelData.id] = panelData.name
+
+    lam.panelId = panelData.id
+
+    local addonListSorted = false
+
+    function panelData.callback()
+        sm:AddFragment(lam:GetAddonSettingsFragment())
+        KEYBOARD_OPTIONS:ChangePanels(lam.panelId)
+
+        local title = LAMAddonSettingsWindow:GetNamedChild("Title")
+        title:SetText(panelData.name)
+
+        if not addonListSorted and #addonsForList > 0 then
+            local searchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
+            --we're about to show our list for the first time - let's sort it
+            table.sort(addonsForList, function(a, b) return a.name < b.name end)
+            PopulateAddonList(lam.addonList, GetSearchFilterFunc(searchEdit))
+            addonListSorted = true
+        end
+    end
+
+    function panelData.unselectedCallback()
+        sm:RemoveFragment(lam:GetAddonSettingsFragment())
+        if SetCameraOptionsPreviewModeEnabled then -- available since API version 100011
+            SetCameraOptionsPreviewModeEnabled(false)
+        end
+    end
+
+    ZO_GameMenu_AddSettingPanel(panelData)
+end
+
+
+--INTERNAL FUNCTION
+--creates the left-hand menu in LAM's window
+local function CreateAddonList(name, parent)
+    local addonList = wm:CreateControlFromVirtual(name, parent, "ZO_ScrollList")
+
+    local function addonListRow_OnMouseDown(control, button)
+        if button == 1 then
+            local data = ZO_ScrollList_GetData(control)
+            ZO_ScrollList_SelectData(addonList, data, control)
+        end
+    end
+
+    local function addonListRow_OnMouseEnter(control)
+        ZO_ScrollList_MouseEnter(addonList, control)
+    end
+
+    local function addonListRow_OnMouseExit(control)
+        ZO_ScrollList_MouseExit(addonList, control)
+    end
+
+    local function addonListRow_Select(previouslySelectedData, selectedData, reselectingDuringRebuild)
+        if not reselectingDuringRebuild then
+            if previouslySelectedData then
+                previouslySelectedData.panel:SetHidden(true)
+            end
+            if selectedData then
+                selectedData.panel:SetHidden(false)
+                PlaySound(SOUNDS.MENU_SUBCATEGORY_SELECTION)
+            end
+        end
+    end
+
+    local function addonListRow_Setup(control, data)
+        control:SetText(data.name)
+        control:SetSelected(not data.panel:IsHidden())
+    end
+
+    ZO_ScrollList_AddDataType(addonList, ADDON_DATA_TYPE, "ZO_SelectableLabel", 28, addonListRow_Setup)
+    -- I don't know how to make highlights clear properly; they often
+    -- get stuck and after a while the list is full of highlighted rows
+    --ZO_ScrollList_EnableHighlight(addonList, "ZO_ThinListHighlight")
+    ZO_ScrollList_EnableSelection(addonList, "ZO_ThinListHighlight", addonListRow_Select)
+
+    local addonDataType = ZO_ScrollList_GetDataTypeTable(addonList, ADDON_DATA_TYPE)
+    local addonListRow_CreateRaw = addonDataType.pool.m_Factory
+
+    local function addonListRow_Create(pool)
+        local control = addonListRow_CreateRaw(pool)
+        control:SetHandler("OnMouseDown", addonListRow_OnMouseDown)
+        --control:SetHandler("OnMouseEnter", addonListRow_OnMouseEnter)
+        --control:SetHandler("OnMouseExit", addonListRow_OnMouseExit)
+        control:SetHeight(28)
+        control:SetFont("ZoFontHeader")
+        control:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
+        control:SetVerticalAlignment(TEXT_ALIGN_CENTER)
+        control:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+        return control
+    end
+
+    addonDataType.pool.m_Factory = addonListRow_Create
+
+    return addonList
+end
+
+
+--INTERNAL FUNCTION
+local function CreateSearchFilterBox(name, parent)
+    local boxControl = wm:CreateControl(name, parent, CT_CONTROL)
+
+    local srchButton =  wm:CreateControl("$(parent)Button", boxControl, CT_BUTTON)
+    srchButton:SetDimensions(32, 32)
+    srchButton:SetAnchor(LEFT, nil, LEFT, 2, 0)
+    srchButton:SetNormalTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_up.dds")
+    srchButton:SetPressedTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_down.dds")
+    srchButton:SetMouseOverTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_over.dds")
+
+    local srchEdit = wm:CreateControlFromVirtual("$(parent)Edit", boxControl, "ZO_DefaultEdit")
+    srchEdit:SetAnchor(LEFT, srchButton, RIGHT, 4, 1)
+    srchEdit:SetAnchor(RIGHT, nil, RIGHT, -4, 1)
+    srchEdit:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+
+    local srchBg = wm:CreateControl("$(parent)Bg", boxControl, CT_BACKDROP)
+    srchBg:SetAnchorFill()
+    srchBg:SetAlpha(0)
+    srchBg:SetCenterColor(0, 0, 0, 0.5)
+    srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
+    srchBg:SetEdgeTexture("", 1, 1, 0, 0)
+
+    -- search backdrop should appear whenever you hover over either
+    -- the magnifying glass button or the edit field (which is only
+    -- visible when it contains some text), and also while the edit
+    -- field has keyboard focus
+
+    local srchActive = false
+    local srchHover = false
+
+    local function srchBgUpdateAlpha()
+        if srchActive or srchEdit:HasFocus() then
+            srchBg:SetAlpha(srchHover and 0.8 or 0.6)
+        else
+            srchBg:SetAlpha(srchHover and 0.6 or 0.0)
+        end
+    end
+
+    local function srchMouseEnter(control)
+        srchHover = true
+        srchBgUpdateAlpha()
+    end
+
+    local function srchMouseExit(control)
+        srchHover = false
+        srchBgUpdateAlpha()
+    end
+
+    boxControl:SetMouseEnabled(true)
+    boxControl:SetHitInsets(1, 1, -1, -1)
+    boxControl:SetHandler("OnMouseEnter", srchMouseEnter)
+    boxControl:SetHandler("OnMouseExit", srchMouseExit)
+
+    srchButton:SetHandler("OnMouseEnter", srchMouseEnter)
+    srchButton:SetHandler("OnMouseExit", srchMouseExit)
+
+    local focusLostTime = 0
+
+    srchButton:SetHandler("OnClicked", function(self)
+        srchEdit:Clear()
+        if GetFrameTimeMilliseconds() - focusLostTime < 100 then
+            -- re-focus the edit box if it lost focus due to this
+            -- button click (note that this handler may run a few
+            -- frames later)
+            srchEdit:TakeFocus()
+        end
+    end)
+
+    srchEdit:SetHandler("OnMouseEnter", srchMouseEnter)
+    srchEdit:SetHandler("OnMouseExit", srchMouseExit)
+    srchEdit:SetHandler("OnFocusGained", srchBgUpdateAlpha)
+
+    srchEdit:SetHandler("OnFocusLost", function()
+        focusLostTime = GetFrameTimeMilliseconds()
+        srchBgUpdateAlpha()
+    end)
+
+    srchEdit:SetHandler("OnEscape", function(self)
+        self:Clear()
+        self:LoseFocus()
+    end)
+
+    srchEdit:SetHandler("OnTextChanged", function(self)
+        local filterFunc = GetSearchFilterFunc(self)
+        if filterFunc then
+            srchActive = true
+            srchBg:SetEdgeColor(ZO_SECOND_CONTRAST_TEXT:UnpackRGBA())
+            srchButton:SetState(BSTATE_PRESSED)
+        else
+            srchActive = false
+            srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
+            srchButton:SetState(BSTATE_NORMAL)
+        end
+        srchBgUpdateAlpha()
+        PopulateAddonList(lam.addonList, filterFunc)
+        PlaySound(SOUNDS.SPINNER_DOWN)
+    end)
+
+    return boxControl
+end
+
+
+--INTERNAL FUNCTION
+--creates LAM's Addon Settings top-level window
+local function CreateAddonSettingsWindow()
+    local tlw = wm:CreateTopLevelWindow("LAMAddonSettingsWindow")
+    tlw:SetHidden(true)
+    tlw:SetDimensions(1010, 914) -- same height as ZO_OptionsWindow
+
+    ZO_ReanchorControlForLeftSidePanel(tlw)
+
+    -- create black background for the window (mimic ZO_RightFootPrintBackground)
+
+    local bgLeft = wm:CreateControl("$(parent)BackgroundLeft", tlw, CT_TEXTURE)
+    bgLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_left.dds")
+    bgLeft:SetDimensions(1024, 1024)
+    bgLeft:SetAnchor(TOPLEFT, nil, TOPLEFT)
+    bgLeft:SetDrawLayer(DL_BACKGROUND)
+    bgLeft:SetExcludeFromResizeToFitExtents(true)
+
+    local bgRight = wm:CreateControl("$(parent)BackgroundRight", tlw, CT_TEXTURE)
+    bgRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_right.dds")
+    bgRight:SetDimensions(64, 1024)
+    bgRight:SetAnchor(TOPLEFT, bgLeft, TOPRIGHT)
+    bgRight:SetDrawLayer(DL_BACKGROUND)
+    bgRight:SetExcludeFromResizeToFitExtents(true)
+
+    -- create gray background for addon list (mimic ZO_TreeUnderlay)
+
+    local underlayLeft = wm:CreateControl("$(parent)UnderlayLeft", tlw, CT_TEXTURE)
+    underlayLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_left.dds")
+    underlayLeft:SetDimensions(256, 1024)
+    underlayLeft:SetAnchor(TOPLEFT, bgLeft, TOPLEFT)
+    underlayLeft:SetDrawLayer(DL_BACKGROUND)
+    underlayLeft:SetExcludeFromResizeToFitExtents(true)
+
+    local underlayRight = wm:CreateControl("$(parent)UnderlayRight", tlw, CT_TEXTURE)
+    underlayRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_right.dds")
+    underlayRight:SetDimensions(128, 1024)
+    underlayRight:SetAnchor(TOPLEFT, underlayLeft, TOPRIGHT)
+    underlayRight:SetDrawLayer(DL_BACKGROUND)
+    underlayRight:SetExcludeFromResizeToFitExtents(true)
+
+    -- create title bar (mimic ZO_OptionsWindow)
+
+    local title = wm:CreateControl("$(parent)Title", tlw, CT_LABEL)
+    title:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 70)
+    title:SetFont("ZoFontWinH1")
+    title:SetModifyTextType(MODIFY_TEXT_TYPE_UPPERCASE)
+
+    local divider = wm:CreateControlFromVirtual("$(parent)Divider", tlw, "ZO_Options_Divider")
+    divider:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 108)
+
+    -- create search filter box
+
+    local srchBox = CreateSearchFilterBox("$(parent)SearchFilter", tlw)
+    srchBox:SetAnchor(TOPLEFT, nil, TOPLEFT, 63, 120)
+    srchBox:SetDimensions(260, 30)
+
+    -- create scrollable addon list
+
+    local addonList = CreateAddonList("$(parent)AddonList", tlw)
+    addonList:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 160)
+    addonList:SetDimensions(285, 665)
+
+    lam.addonList = addonList -- for easy access from elsewhere
+
+    -- create container for option panels
+
+    local panelContainer = wm:CreateControl("$(parent)PanelContainer", tlw, CT_CONTROL)
+    panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
+    panelContainer:SetDimensions(645, 675)
+
+    local defaultButton = wm:CreateControlFromVirtual("$(parent)ResetToDefaultButton", tlw, "ZO_DialogButton")
+    ZO_KeybindButtonTemplate_Setup(defaultButton, "OPTIONS_LOAD_DEFAULTS", HandleLoadDefaultsPressed, GetString(SI_OPTIONS_DEFAULTS))
+    defaultButton:SetAnchor(TOPLEFT, panelContainer, BOTTOMLEFT, 0, 2)
+    lam.defaultButton = defaultButton
+
+    local applyButton = wm:CreateControlFromVirtual("$(parent)ApplyButton", tlw, "ZO_DialogButton")
+    ZO_KeybindButtonTemplate_Setup(applyButton, "OPTIONS_APPLY_CHANGES", HandleReloadUIPressed, GetString(SI_ADDON_MANAGER_RELOAD))
+    applyButton:SetAnchor(TOPRIGHT, panelContainer, BOTTOMRIGHT, 0, 2)
+    applyButton:SetHidden(true)
+    lam.applyButton = applyButton
+
+    return tlw
+end
+
+
+--INITIALIZING
+local safeToInitialize = false
+local hasInitialized = false
+
+local eventHandle = table.concat({MAJOR, MINOR}, "r")
+local function OnLoad(_, addonName)
+    -- wait for the first loaded event
+    em:UnregisterForEvent(eventHandle, EVENT_ADD_ON_LOADED)
+    safeToInitialize = true
+end
+em:RegisterForEvent(eventHandle, EVENT_ADD_ON_LOADED, OnLoad)
+
+local function OnActivated(_, initial)
+    em:UnregisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED)
+    FlushMessages()
+
+    local reopenPanel = RetrievePanelForReopening()
+    if not initial and reopenPanel then
+        lam:OpenToPanel(reopenPanel)
+    end
+end
+em:RegisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED, OnActivated)
+
+function CheckSafetyAndInitialize(addonID)
+    if not safeToInitialize then
+        local msg = string.format("The panel with id '%s' was registered before addon loading has completed. This might break the AddOn Settings menu.", addonID)
+        PrintLater(msg)
+    end
+    if not hasInitialized then
+        hasInitialized = true
+    end
+end
+
+
+--TODO documentation
+function lam:GetAddonPanelContainer()
+    local fragment = lam:GetAddonSettingsFragment()
+    local window = fragment:GetControl()
+    return window:GetNamedChild("PanelContainer")
+end
+
+
+--TODO documentation
+function lam:GetAddonSettingsFragment()
+    assert(hasInitialized or safeToInitialize)
+    if not LAMAddonSettingsFragment then
+        local window = CreateAddonSettingsWindow()
+        LAMAddonSettingsFragment = ZO_FadeSceneFragment:New(window, true, 100)
+        LAMAddonSettingsFragment:RegisterCallback("StateChange", function(oldState, newState)
+            if(newState == SCENE_FRAGMENT_SHOWN) then
+                InitKeybindActions()
+                PushActionLayerByName("OptionsWindow")
+                OpenCurrentPanel()
+            elseif(newState == SCENE_FRAGMENT_HIDDEN) then
+                CloseCurrentPanel()
+                RemoveActionLayerByName("OptionsWindow")
+                ShowReloadDialogIfNeeded()
+            end
+        end)
+        CreateAddonSettingsMenuEntry()
+    end
+    return LAMAddonSettingsFragment
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/button.lua b/IIfA/libs/LibAddonMenu-2.0/controls/button.lua
new file mode 100644
index 0000000..89d5b08
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/button.lua
@@ -0,0 +1,91 @@
+--[[buttonData = {
+    type = "button",
+    name = "My Button", -- string id or function returning a string
+    func = function() end,
+    tooltip = "Button's tooltip text.", -- string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    icon = "icon/path.dds", --(optional)
+    isDangerous = false, -- boolean, if set to true, the button text will be red and a confirmation dialog with the button label and warning text will show on click before the callback is executed (optional)
+    warning = "Will need to reload the UI.", --(optional)
+    reference = "MyAddonButton", -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 11
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("button", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable = control.data.disabled
+    if type(disable) == "function" then
+        disable = disable()
+    end
+    control.button:SetEnabled(not disable)
+end
+
+--controlName is optional
+local MIN_HEIGHT = 28 -- default_button height
+local HALF_WIDTH_LINE_SPACING = 2
+function LAMCreateControl.button(parent, buttonData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, buttonData, controlName)
+    control:SetMouseEnabled(true)
+
+    local width = control:GetWidth()
+    if control.isHalfWidth then
+        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetDimensions(width, MIN_HEIGHT)
+    end
+
+    if buttonData.icon then
+        control.button = wm:CreateControl(nil, control, CT_BUTTON)
+        control.button:SetDimensions(26, 26)
+        control.button:SetNormalTexture(buttonData.icon)
+        control.button:SetPressedOffset(2, 2)
+    else
+        --control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
+        control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
+        control.button:SetWidth(width / 3)
+        control.button:SetText(LAM.util.GetStringFromValue(buttonData.name))
+        if buttonData.isDangerous then control.button:SetNormalFontColor(ZO_ERROR_COLOR:UnpackRGBA()) end
+    end
+    local button = control.button
+    button:SetAnchor(control.isHalfWidth and CENTER or RIGHT)
+    button:SetClickSound("Click")
+    button.data = {tooltipText = LAM.util.GetStringFromValue(buttonData.tooltip)}
+    button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+    button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    button:SetHandler("OnClicked", function(...)
+        local args = {...}
+        local function callback()
+            buttonData.func(unpack(args))
+            LAM.util.RequestRefreshIfNeeded(control)
+        end
+
+        if(buttonData.isDangerous) then
+            local title = LAM.util.GetStringFromValue(buttonData.name)
+            local body = LAM.util.GetStringFromValue(buttonData.warning)
+            LAM.util.ShowConfirmationDialog(title, body, callback)
+        else
+            callback()
+        end
+    end)
+
+    if buttonData.warning ~= nil then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    if buttonData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/checkbox.lua b/IIfA/libs/LibAddonMenu-2.0/controls/checkbox.lua
new file mode 100644
index 0000000..6696dd7
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/checkbox.lua
@@ -0,0 +1,142 @@
+--[[checkboxData = {
+    type = "checkbox",
+    name = "My Checkbox", -- or string id or function returning a string
+    getFunc = function() return db.var end,
+    setFunc = function(value) db.var = value doStuff() end,
+    tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", -- or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- a boolean or function that returns a boolean (optional)
+    reference = "MyAddonCheckbox", -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 14
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+--label
+local enabledColor = ZO_DEFAULT_ENABLED_COLOR
+local enabledHLcolor = ZO_HIGHLIGHT_TEXT
+local disabledColor = ZO_DEFAULT_DISABLED_COLOR
+local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
+--checkbox
+local checkboxColor = ZO_NORMAL_TEXT
+local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
+
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
+    control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
+    --control:SetMouseEnabled(not disable)
+    --control:SetMouseEnabled(true)
+
+    control.isDisabled = disable
+end
+
+local function ToggleCheckbox(control)
+    if control.value then
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.checkbox:SetText(control.checkedText)
+    else
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.checkbox:SetText(control.uncheckedText)
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+    elseif value ~= nil then --our value could be false
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+    end
+    control.value = value
+
+    ToggleCheckbox(control)
+end
+
+local function OnMouseEnter(control)
+    ZO_Options_OnMouseEnter(control)
+
+    if control.isDisabled then return end
+
+    local label = control.label
+    if control.value then
+        label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+    else
+        label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    end
+    control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+end
+
+local function OnMouseExit(control)
+    ZO_Options_OnMouseExit(control)
+
+    if control.isDisabled then return end
+
+    local label = control.label
+    if control.value then
+        label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    else
+        label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    end
+    control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+end
+
+--controlName is optional
+function LAMCreateControl.checkbox(parent, checkboxData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, checkboxData, controlName)
+    control:SetHandler("OnMouseEnter", OnMouseEnter)
+    control:SetHandler("OnMouseExit", OnMouseExit)
+    control:SetHandler("OnMouseUp", function(control)
+        if control.isDisabled then return end
+        PlaySound(SOUNDS.DEFAULT_CLICK)
+        control.value = not control.value
+        control:UpdateValue(false, control.value)
+    end)
+
+    control.checkbox = wm:CreateControl(nil, control.container, CT_LABEL)
+    local checkbox = control.checkbox
+    checkbox:SetAnchor(LEFT, control.container, LEFT, 0, 0)
+    checkbox:SetFont("ZoFontGameBold")
+    checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+    control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
+    control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
+
+    if checkboxData.warning ~= nil or checkboxData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.data.tooltipText = LAM.util.GetStringFromValue(checkboxData.tooltip)
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if checkboxData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/colorpicker.lua b/IIfA/libs/LibAddonMenu-2.0/controls/colorpicker.lua
new file mode 100644
index 0000000..a57aab0
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/colorpicker.lua
@@ -0,0 +1,106 @@
+--[[colorpickerData = {
+    type = "colorpicker",
+    name = "My Color Picker", -- or string id or function returning a string
+    getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional)
+    setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional)
+    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color
+    reference = "MyAddonColorpicker" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 13
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+
+    control.isDisabled = disable
+end
+
+local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
+    if forceDefault then --if we are forcing defaults
+        local color = LAM.util.GetDefaultValue(control.data.default)
+        valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
+        control.data.setFunc(valueR, valueG, valueB, valueA)
+    elseif valueR and valueG and valueB then
+        control.data.setFunc(valueR, valueG, valueB, valueA or 1)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        valueR, valueG, valueB, valueA = control.data.getFunc()
+    end
+
+    control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
+end
+
+function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, colorpickerData, controlName)
+
+    control.color = control.container
+    local color = control.color
+
+    control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
+    local thumb = control.thumb
+    thumb:SetDimensions(36, 18)
+    thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
+
+    color.border = wm:CreateControl(nil, color, CT_TEXTURE)
+    local border = color.border
+    border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
+    border:SetTextureCoords(0, .625, 0, .8125)
+    border:SetDimensions(40, 22)
+    border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
+
+    local function ColorPickerCallback(r, g, b, a)
+        control:UpdateValue(false, r, g, b, a)
+    end
+
+    control:SetHandler("OnMouseUp", function(self, btn, upInside)
+        if self.isDisabled then return end
+
+        if upInside then
+            local r, g, b, a = colorpickerData.getFunc()
+            COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name))
+        end
+    end)
+
+    if colorpickerData.warning ~= nil or colorpickerData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip)
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if colorpickerData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/custom.lua b/IIfA/libs/LibAddonMenu-2.0/controls/custom.lua
new file mode 100644
index 0000000..40a7c42
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/custom.lua
@@ -0,0 +1,35 @@
+--[[customData = {
+    type = "custom",
+    reference = "MyAddonCustomControl", --(optional) unique name for your control to use as reference
+    refreshFunc = function(customControl) end, --(optional) function to call when panel/controls refresh
+    width = "full", --or "half" (optional)
+} ]]
+
+local widgetVersion = 7
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("custom", widgetVersion) then return end
+
+local function UpdateValue(control)
+    if control.data.refreshFunc then
+        control.data.refreshFunc(control)
+    end
+end
+
+local MIN_HEIGHT = 26
+function LAMCreateControl.custom(parent, customData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, customData, controlName)
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if control.isHalfWidth then --note these restrictions
+        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
+    else
+        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
+    end
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/description.lua b/IIfA/libs/LibAddonMenu-2.0/controls/description.lua
new file mode 100644
index 0000000..da207a0
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/description.lua
@@ -0,0 +1,60 @@
+--[[descriptionData = {
+    type = "description",
+    text = "My description text to display.", -- or string id or function returning a string
+    title = "My Title", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    reference = "MyAddonDescription" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("description", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateValue(control)
+    if control.title then
+        control.title:SetText(LAM.util.GetStringFromValue(control.data.title))
+    end
+    control.desc:SetText(LAM.util.GetStringFromValue(control.data.text))
+end
+
+function LAMCreateControl.description(parent, descriptionData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, descriptionData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if isHalfWidth then
+        control:SetDimensionConstraints(width / 2, 0, width / 2, 0)
+    else
+        control:SetDimensionConstraints(width, 0, width, 0)
+    end
+
+    control.desc = wm:CreateControl(nil, control, CT_LABEL)
+    local desc = control.desc
+    desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
+    desc:SetFont("ZoFontGame")
+    desc:SetText(LAM.util.GetStringFromValue(descriptionData.text))
+    desc:SetWidth(isHalfWidth and width / 2 or width)
+
+    if descriptionData.title then
+        control.title = wm:CreateControl(nil, control, CT_LABEL)
+        local title = control.title
+        title:SetWidth(isHalfWidth and width / 2 or width)
+        title:SetAnchor(TOPLEFT, control, TOPLEFT)
+        title:SetFont("ZoFontWinH4")
+        title:SetText(LAM.util.GetStringFromValue(descriptionData.title))
+        desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
+    else
+        desc:SetAnchor(TOPLEFT)
+    end
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/divider.lua b/IIfA/libs/LibAddonMenu-2.0/controls/divider.lua
new file mode 100644
index 0000000..8089539
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/divider.lua
@@ -0,0 +1,45 @@
+--[[dividerData = {
+    type = "divider",
+    width = "full", --or "half" (optional)
+    height = 10, (optional)
+    alpha = 0.25, (optional)
+    reference = "MyAddonDivider" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 2
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("divider", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local MIN_HEIGHT = 10
+local MAX_HEIGHT = 50
+local MIN_ALPHA = 0
+local MAX_ALPHA = 1
+local DEFAULT_ALPHA = 0.25
+
+local function GetValueInRange(value, min, max, default)
+    if not value or type(value) ~= "number" then
+        return default
+    end
+    return math.min(math.max(min, value), max)
+end
+
+function LAMCreateControl.divider(parent, dividerData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, dividerData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    local height = GetValueInRange(dividerData.height, MIN_HEIGHT, MAX_HEIGHT, MIN_HEIGHT)
+    local alpha = GetValueInRange(dividerData.alpha, MIN_ALPHA, MAX_ALPHA, DEFAULT_ALPHA)
+
+    control:SetDimensions(isHalfWidth and width / 2 or width, height)
+
+    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
+    local divider = control.divider
+    divider:SetWidth(isHalfWidth and width / 2 or width)
+    divider:SetAnchor(TOPLEFT)
+    divider:SetAlpha(alpha)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/dropdown.lua b/IIfA/libs/LibAddonMenu-2.0/controls/dropdown.lua
new file mode 100644
index 0000000..2349ba6
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/dropdown.lua
@@ -0,0 +1,211 @@
+--[[dropdownData = {
+    type = "dropdown",
+    name = "My Dropdown", -- or string id or function returning a string
+    choices = {"table", "of", "choices"},
+    choicesValues = {"foo", 2, "three"}, -- if specified, these values will get passed to setFunc instead (optional)
+    getFunc = function() return db.var end,
+    setFunc = function(var) db.var = var doStuff() end,
+    tooltip = "Dropdown's tooltip text.", -- or string id or function returning a string (optional)
+    choicesTooltips = {"tooltip 1", "tooltip 2", "tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
+    sort = "name-up", --or "name-down", "numeric-up", "numeric-down", "value-up", "value-down", "numericvalue-up", "numericvalue-down" (optional) - if not provided, list will not be sorted
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonDropdown" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 16
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local SORT_BY_VALUE         = { ["value"] = {} }
+local SORT_BY_VALUE_NUMERIC = { ["value"] = { isNumeric = true } }
+local SORT_TYPES = {
+    name = ZO_SORT_BY_NAME,
+    numeric = ZO_SORT_BY_NAME_NUMERIC,
+    value = SORT_BY_VALUE,
+    numericvalue = SORT_BY_VALUE_NUMERIC,
+}
+local SORT_ORDERS = {
+    up = ZO_SORT_ORDER_UP,
+    down = ZO_SORT_ORDER_DOWN,
+}
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.dropdown:SetEnabled(not disable)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.dropdown:SetSelectedItem(control.choices[value])
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.dropdown:SetSelectedItem(control.choices[value])
+    end
+end
+
+local function DropdownCallback(control, choiceText, choice)
+    choice.control:UpdateValue(false, choice.value or choiceText)
+end
+
+local function SetupTooltips(comboBox, choicesTooltips)
+    local function ShowTooltip(control)
+        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
+        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.tooltip))
+        InformationTooltipTopLevel:BringWindowToTop()
+    end
+    local function HideTooltip(control)
+        ClearTooltip(InformationTooltip)
+    end
+
+    -- allow for tooltips on the drop down entries
+    local originalShow = comboBox.ShowDropdownInternal
+    comboBox.ShowDropdownInternal = function(comboBox)
+        originalShow(comboBox)
+        local entries = ZO_Menu.items
+        for i = 1, #entries do
+            local entry = entries[i]
+            local control = entries[i].item
+            control.tooltip = choicesTooltips[i]
+            entry.onMouseEnter = control:GetHandler("OnMouseEnter")
+            entry.onMouseExit = control:GetHandler("OnMouseExit")
+            ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
+            ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
+        end
+    end
+
+    local originalHide = comboBox.HideDropdownInternal
+    comboBox.HideDropdownInternal = function(self)
+        local entries = ZO_Menu.items
+        for i = 1, #entries do
+            local entry = entries[i]
+            local control = entries[i].item
+            control:SetHandler("OnMouseEnter", entry.onMouseEnter)
+            control:SetHandler("OnMouseExit", entry.onMouseExit)
+            control.tooltip = nil
+        end
+        originalHide(self)
+    end
+end
+
+local function UpdateChoices(control, choices, choicesValues, choicesTooltips)
+    control.dropdown:ClearItems() --remove previous choices --(need to call :SetSelectedItem()?)
+    ZO_ClearTable(control.choices)
+
+    --build new list of choices
+    local choices = choices or control.data.choices
+    local choicesValues = choicesValues or control.data.choicesValues
+    local choicesTooltips = choicesTooltips or control.data.choicesTooltips
+
+    if choicesValues then
+        assert(#choices == #choicesValues, "choices and choicesValues need to have the same size")
+    end
+
+    if choicesTooltips then
+        assert(#choices == #choicesTooltips, "choices and choicesTooltips need to have the same size")
+        SetupTooltips(control.dropdown, choicesTooltips)
+    end
+
+    for i = 1, #choices do
+        local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
+        entry.control = control
+        if choicesValues then
+            entry.value = choicesValues[i]
+        end
+        control.choices[entry.value or entry.name] = entry.name
+        control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE) --if sort type/order isn't specified, then don't sort
+    end
+end
+
+local function GrabSortingInfo(sortInfo)
+    local t, i = {}, 1
+    for info in string.gmatch(sortInfo, "([^%-]+)") do
+        t[i] = info
+        i = i + 1
+    end
+
+    return t
+end
+
+function LAMCreateControl.dropdown(parent, dropdownData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, dropdownData, controlName)
+    control.choices = {}
+
+    local countControl = parent
+    local name = parent:GetName()
+    if not name or #name == 0 then
+        countControl = LAMCreateControl
+        name = "LAM"
+    end
+    local comboboxCount = (countControl.comboboxCount or 0) + 1
+    countControl.comboboxCount = comboboxCount
+    control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, "ZO_ComboBox")
+
+    local combobox = control.combobox
+    combobox:SetAnchor(TOPLEFT)
+    combobox:SetDimensions(control.container:GetDimensions())
+    combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+    control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
+    local dropdown = control.dropdown
+    dropdown:SetSortsItems(false) -- need to sort ourselves in order to be able to sort by value
+
+    ZO_PreHook(dropdown, "UpdateItems", function(self)
+        assert(not self.m_sortsItems, "built-in dropdown sorting was reactivated, sorting is handled by LAM")
+        if control.m_sortOrder ~= nil and control.m_sortType then
+            local sortKey = next(control.m_sortType)
+            local sortFunc = function(item1, item2) return ZO_TableOrderingFunction(item1, item2, sortKey, control.m_sortType, control.m_sortOrder) end
+            table.sort(self.m_sortedItems, sortFunc)
+        end
+    end)
+
+    if dropdownData.sort then
+        local sortInfo = GrabSortingInfo(dropdownData.sort)
+        control.m_sortType, control.m_sortOrder = SORT_TYPES[sortInfo[1]], SORT_ORDERS[sortInfo[2]]
+    elseif dropdownData.choicesValues then
+        control.m_sortType, control.m_sortOrder = ZO_SORT_ORDER_UP, SORT_BY_VALUE
+    end
+
+    if dropdownData.warning ~= nil or dropdownData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateChoices = UpdateChoices
+    control:UpdateChoices(dropdownData.choices, dropdownData.choicesValues)
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if dropdownData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/editbox.lua b/IIfA/libs/LibAddonMenu-2.0/controls/editbox.lua
new file mode 100644
index 0000000..d6baf11
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/editbox.lua
@@ -0,0 +1,156 @@
+--[[editboxData = {
+    type = "editbox",
+    name = "My Editbox", -- or string id or function returning a string
+    getFunc = function() return db.text end,
+    setFunc = function(text) db.text = text doStuff() end,
+    tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional)
+    isMultiline = true, --boolean (optional)
+    isExtraWide = true, --boolean (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.text, -- default value or function that returns the default value (optional)
+    reference = "MyAddonEditbox" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 14
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("editbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+    --control.editbox:SetEditEnabled(not disable)
+    control.editbox:SetMouseEnabled(not disable)
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.editbox:SetText(value)
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.editbox:SetText(value)
+    end
+end
+
+local MIN_HEIGHT = 24
+local HALF_WIDTH_LINE_SPACING = 2
+function LAMCreateControl.editbox(parent, editboxData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName)
+
+    local container = control.container
+    control.bg = wm:CreateControlFromVirtual(nil, container, "ZO_EditBackdrop")
+    local bg = control.bg
+    bg:SetAnchorFill()
+
+    if editboxData.isMultiline then
+        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
+        control.editbox:SetHandler("OnMouseWheel", function(self, delta)
+            if self:HasFocus() then --only set focus to new spots if the editbox is currently in use
+                local cursorPos = self:GetCursorPosition()
+                local text = self:GetText()
+                local textLen = text:len()
+                local newPos
+                if delta > 0 then --scrolling up
+                    local reverseText = text:reverse()
+                    local revCursorPos = textLen - cursorPos
+                    local revPos = reverseText:find("\n", revCursorPos+1)
+                    newPos = revPos and textLen - revPos
+                else --scrolling down
+                    newPos = text:find("\n", cursorPos+1)
+                end
+                if newPos then --if we found a new line, then scroll, otherwise don't
+                    self:SetCursorPosition(newPos)
+                end
+            end
+        end)
+    else
+        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
+    end
+    local editbox = control.editbox
+    editbox:SetText(editboxData.getFunc())
+    editbox:SetMaxInputChars(3000)
+    editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
+    editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
+    editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    local MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0
+
+    control.label:ClearAnchors()
+    container:ClearAnchors()
+
+    control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
+
+    if control.isHalfWidth then
+        container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
+    end
+
+    if editboxData.isExtraWide then
+        container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0)
+    else
+        container:SetWidth(MIN_WIDTH * 3.2)
+    end
+
+    if editboxData.isMultiline then
+        container:SetHeight(MIN_HEIGHT * 3)
+    else
+        container:SetHeight(MIN_HEIGHT)
+    end
+
+    if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then
+        control:SetHeight(container:GetHeight())
+    else
+        control:SetHeight(container:GetHeight() + control.label:GetHeight())
+    end
+
+    editbox:ClearAnchors()
+    editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2)
+    editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2)
+
+    if editboxData.warning ~= nil or editboxData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        if editboxData.isExtraWide then
+            control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0)
+        else
+            control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
+        end
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if editboxData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/header.lua b/IIfA/libs/LibAddonMenu-2.0/controls/header.lua
new file mode 100644
index 0000000..eadff38
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/header.lua
@@ -0,0 +1,42 @@
+--[[headerData = {
+    type = "header",
+    name = "My Header", -- or string id or function returning a string
+    width = "full", --or "half" (optional)
+    reference = "MyAddonHeader" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("header", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateValue(control)
+    control.header:SetText(LAM.util.GetStringFromValue(control.data.name))
+end
+
+local MIN_HEIGHT = 30
+function LAMCreateControl.header(parent, headerData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, headerData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    control:SetDimensions(isHalfWidth and width / 2 or width, MIN_HEIGHT)
+
+    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
+    local divider = control.divider
+    divider:SetWidth(isHalfWidth and width / 2 or width)
+    divider:SetAnchor(TOPLEFT)
+
+    control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local header = control.header
+    header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
+    header:SetAnchor(BOTTOMRIGHT)
+    header:SetText(LAM.util.GetStringFromValue(headerData.name))
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/iconpicker.lua b/IIfA/libs/LibAddonMenu-2.0/controls/iconpicker.lua
new file mode 100644
index 0000000..65c7782
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/iconpicker.lua
@@ -0,0 +1,436 @@
+--[[iconpickerData = {
+    type = "iconpicker",
+    name = "My Icon Picker", -- or string id or function returning a string
+    choices = {"texture path 1", "texture path 2", "texture path 3"},
+    getFunc = function() return db.var end,
+    setFunc = function(var) db.var = var doStuff() end,
+    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
+    choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
+    maxColumns = 5, -- number of icons in one row (optional)
+    visibleRows = 4.5, -- number of visible rows (optional)
+    iconSize = 28, -- size of the icons (optional)
+    defaultColor = ZO_ColorDef:New("FFFFFF"), -- default color of the icons (optional)
+    width = "full", --or "half" (optional)
+    beforeShow = function(control, iconPicker) return preventShow end, --(optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonIconPicker" -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("iconpicker", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local IconPickerMenu = ZO_Object:Subclass()
+local iconPicker
+LAM.util.GetIconPickerMenu = function()
+    if not iconPicker then
+        iconPicker = IconPickerMenu:New("LAMIconPicker")
+        local sceneFragment = LAM:GetAddonSettingsFragment()
+        ZO_PreHook(sceneFragment, "OnHidden", function()
+            if not iconPicker.control:IsHidden() then
+                iconPicker:Clear()
+            end
+        end)
+    end
+    return iconPicker
+end
+
+function IconPickerMenu:New(...)
+    local object = ZO_Object.New(self)
+    object:Initialize(...)
+    return object
+end
+
+function IconPickerMenu:Initialize(name)
+    local control = wm:CreateTopLevelWindow(name)
+    control:SetDrawTier(DT_HIGH)
+    control:SetHidden(true)
+    self.control = control
+
+    local scrollContainer = wm:CreateControlFromVirtual(name .. "ScrollContainer", control, "ZO_ScrollContainer")
+    -- control:SetDimensions(control.container:GetWidth(), height) -- adjust to icon size / col count
+    scrollContainer:SetAnchorFill()
+    ZO_Scroll_SetUseFadeGradient(scrollContainer, false)
+    ZO_Scroll_SetHideScrollbarOnDisable(scrollContainer, false)
+    ZO_VerticalScrollbarBase_OnMouseExit(scrollContainer:GetNamedChild("ScrollBar")) -- scrollbar initialization seems to be broken so we force it to update the correct alpha value
+    local scroll = GetControl(scrollContainer, "ScrollChild")
+    self.scroll = scroll
+    self.scrollContainer = scrollContainer
+
+    local bg = wm:CreateControl(nil, scrollContainer, CT_BACKDROP)
+    bg:SetAnchor(TOPLEFT, scrollContainer, TOPLEFT, 0, -3)
+    bg:SetAnchor(BOTTOMRIGHT, scrollContainer, BOTTOMRIGHT, 2, 5)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+
+    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
+    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
+    mungeOverlay:SetDrawLevel(1)
+    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
+    mungeOverlay:SetAnchorFill()
+
+    local mouseOver = wm:CreateControl(nil, scrollContainer, CT_TEXTURE)
+    mouseOver:SetDrawLevel(2)
+    mouseOver:SetTexture("EsoUI/Art/Buttons/minmax_mouseover.dds")
+    mouseOver:SetHidden(true)
+
+    local function IconFactory(pool)
+        local icon = wm:CreateControl(name .. "Entry" .. pool:GetNextControlId(), scroll, CT_TEXTURE)
+        icon:SetMouseEnabled(true)
+        icon:SetDrawLevel(3)
+        icon:SetHandler("OnMouseEnter", function()
+            mouseOver:SetAnchor(TOPLEFT, icon, TOPLEFT, 0, 0)
+            mouseOver:SetAnchor(BOTTOMRIGHT, icon, BOTTOMRIGHT, 0, 0)
+            mouseOver:SetHidden(false)
+            if self.customOnMouseEnter then
+                self.customOnMouseEnter(icon)
+            else
+                self:OnMouseEnter(icon)
+            end
+        end)
+        icon:SetHandler("OnMouseExit", function()
+            mouseOver:ClearAnchors()
+            mouseOver:SetHidden(true)
+            if self.customOnMouseExit then
+                self.customOnMouseExit(icon)
+            else
+                self:OnMouseExit(icon)
+            end
+        end)
+        icon:SetHandler("OnMouseUp", function(control, ...)
+            PlaySound("Click")
+            icon.OnSelect(icon, icon.texture)
+            self:Clear()
+        end)
+        return icon
+    end
+
+    local function ResetFunction(icon)
+        icon:ClearAnchors()
+    end
+
+    self.iconPool = ZO_ObjectPool:New(IconFactory, ResetFunction)
+    self:SetMaxColumns(1)
+    self.icons = {}
+    self.color = ZO_DEFAULT_ENABLED_COLOR
+
+    EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
+        if self.refCount ~= nil then
+            local moc = wm:GetMouseOverControl()
+            if(moc:GetOwningWindow() ~= control) then
+                self.refCount = self.refCount - 1
+                if self.refCount <= 0 then
+                    self:Clear()
+                end
+            end
+        end
+    end)
+end
+
+function IconPickerMenu:OnMouseEnter(icon)
+    InitializeTooltip(InformationTooltip, icon, TOPLEFT, 0, 0, BOTTOMRIGHT)
+    SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(icon.tooltip))
+    InformationTooltipTopLevel:BringWindowToTop()
+end
+
+function IconPickerMenu:OnMouseExit(icon)
+    ClearTooltip(InformationTooltip)
+end
+
+function IconPickerMenu:SetMaxColumns(value)
+    self.maxCols = value ~= nil and value or 5
+end
+
+local DEFAULT_SIZE = 28
+function IconPickerMenu:SetIconSize(value)
+    local iconSize = DEFAULT_SIZE
+    if value ~= nil then iconSize = math.max(iconSize, value) end
+    self.iconSize = iconSize
+end
+
+function IconPickerMenu:SetVisibleRows(value)
+    self.visibleRows = value ~= nil and value or 4.5
+end
+
+function IconPickerMenu:SetMouseHandlers(onEnter, onExit)
+    self.customOnMouseEnter = onEnter
+    self.customOnMouseExit = onExit
+end
+
+function IconPickerMenu:UpdateDimensions()
+    local iconSize = self.iconSize
+    local width = iconSize * self.maxCols + 20
+    local height = iconSize * self.visibleRows
+    self.control:SetDimensions(width, height)
+
+    local icons = self.icons
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:SetDimensions(iconSize, iconSize)
+    end
+end
+
+function IconPickerMenu:UpdateAnchors()
+    local iconSize = self.iconSize
+    local col, maxCols = 1, self.maxCols
+    local previousCol, previousRow
+    local scroll = self.scroll
+    local icons = self.icons
+
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:ClearAnchors()
+        if i == 1 then
+            icon:SetAnchor(TOPLEFT, scroll, TOPLEFT, 0, 0)
+            previousRow = icon
+        elseif col == 1 then
+            icon:SetAnchor(TOPLEFT, previousRow, BOTTOMLEFT, 0, 0)
+            previousRow = icon
+        else
+            icon:SetAnchor(TOPLEFT, previousCol, TOPRIGHT, 0, 0)
+        end
+        previousCol = icon
+        col = col >= maxCols and 1 or col + 1
+    end
+end
+
+function IconPickerMenu:Clear()
+    self.icons = {}
+    self.iconPool:ReleaseAllObjects()
+    self.control:SetHidden(true)
+    self.color = ZO_DEFAULT_ENABLED_COLOR
+    self.refCount = nil
+    self.parent = nil
+    self.customOnMouseEnter = nil
+    self.customOnMouseExit = nil
+end
+
+function IconPickerMenu:AddIcon(texturePath, callback, tooltip)
+    local icon, key = self.iconPool:AcquireObject()
+    icon:SetTexture(texturePath)
+    icon:SetColor(self.color:UnpackRGBA())
+    icon.texture = texturePath
+    icon.tooltip = tooltip
+    icon.OnSelect = callback
+    self.icons[#self.icons + 1] = icon
+end
+
+function IconPickerMenu:Show(parent)
+    if #self.icons == 0 then return false end
+    if not self.control:IsHidden() then self:Clear() return false end
+    self:UpdateDimensions()
+    self:UpdateAnchors()
+
+    local control = self.control
+    control:ClearAnchors()
+    control:SetAnchor(TOPLEFT, parent, BOTTOMLEFT, 0, 8)
+    control:SetHidden(false)
+    control:BringWindowToTop()
+    self.parent = parent
+    self.refCount = 2
+
+    return true
+end
+
+function IconPickerMenu:SetColor(color)
+    local icons = self.icons
+    self.color = color
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:SetColor(color:UnpackRGBA())
+    end
+end
+
+-------------------------------------------------------------
+
+local function UpdateChoices(control, choices, choicesTooltips)
+    local data = control.data
+    if not choices then
+        choices, choicesTooltips = data.choices, data.choicesTooltips or {}
+    end
+    local addedChoices = {}
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    iconPicker:Clear()
+    for i = 1, #choices do
+        local texture = choices[i]
+        if not addedChoices[texture] then -- remove duplicates
+            iconPicker:AddIcon(choices[i], function(self, texture)
+                control.icon:SetTexture(texture)
+                data.setFunc(texture)
+                LAM.util.RequestRefreshIfNeeded(control)
+            end, LAM.util.GetStringFromValue(choicesTooltips[i]))
+        addedChoices[texture] = true
+        end
+    end
+end
+
+local function IsDisabled(control)
+    if type(control.data.disabled) == "function" then
+        return control.data.disabled()
+    else
+        return control.data.disabled
+    end
+end
+
+local function SetColor(control, color)
+    local icon = control.icon
+    if IsDisabled(control) then
+        icon:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        icon.color = color or control.data.defaultColor or ZO_DEFAULT_ENABLED_COLOR
+        icon:SetColor(icon.color:UnpackRGBA())
+    end
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:SetColor(icon.color)
+    end
+end
+
+local function UpdateDisabled(control)
+    local disable = IsDisabled(control)
+
+    control.dropdown:SetMouseEnabled(not disable)
+    control.dropdownButton:SetEnabled(not disable)
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:Clear()
+    end
+
+    SetColor(control, control.icon.color)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.icon:SetTexture(value)
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.icon:SetTexture(value)
+    end
+end
+
+local MIN_HEIGHT = 26
+local HALF_WIDTH_LINE_SPACING = 2
+local function SetIconSize(control, size)
+    local icon = control.icon
+    icon.size = size
+    icon:SetDimensions(size, size)
+
+    local height = size + 4
+    control.dropdown:SetDimensions(size + 20, height)
+    height = math.max(height, MIN_HEIGHT)
+    control.container:SetHeight(height)
+    if control.lineControl then
+        control.lineControl:SetHeight(MIN_HEIGHT + size + HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetHeight(height)
+    end
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:SetIconSize(size)
+        iconPicker:UpdateDimensions()
+        iconPicker:UpdateAnchors()
+    end
+end
+
+function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, iconpickerData, controlName)
+
+    local function ShowIconPicker()
+        local iconPicker = LAM.util.GetIconPickerMenu()
+        if iconPicker.parent == control.container then
+            iconPicker:Clear()
+        else
+            iconPicker:SetMaxColumns(iconpickerData.maxColumns)
+            iconPicker:SetVisibleRows(iconpickerData.visibleRows)
+            iconPicker:SetIconSize(control.icon.size)
+            UpdateChoices(control)
+            iconPicker:SetColor(control.icon.color)
+            if iconpickerData.beforeShow then
+                if iconpickerData.beforeShow(control, iconPicker) then
+                    iconPicker:Clear()
+                    return
+                end
+            end
+            iconPicker:Show(control.container)
+        end
+    end
+
+    local iconSize = iconpickerData.iconSize ~= nil and iconpickerData.iconSize or DEFAULT_SIZE
+    control.dropdown = wm:CreateControl(nil, control.container, CT_CONTROL)
+    local dropdown = control.dropdown
+    dropdown:SetAnchor(LEFT, control.container, LEFT, 0, 0)
+    dropdown:SetMouseEnabled(true)
+    dropdown:SetHandler("OnMouseUp", ShowIconPicker)
+    dropdown:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    dropdown:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    control.icon = wm:CreateControl(nil, dropdown, CT_TEXTURE)
+    local icon = control.icon
+    icon:SetAnchor(LEFT, dropdown, LEFT, 3, 0)
+    icon:SetDrawLevel(2)
+
+    local dropdownButton = wm:CreateControlFromVirtual(nil, dropdown, "ZO_DropdownButton")
+    dropdownButton:SetDimensions(16, 16)
+    dropdownButton:SetHandler("OnClicked", ShowIconPicker)
+    dropdownButton:SetAnchor(RIGHT, dropdown, RIGHT, -3, 0)
+    control.dropdownButton = dropdownButton
+
+    control.bg = wm:CreateControl(nil, dropdown, CT_BACKDROP)
+    local bg = control.bg
+    bg:SetAnchor(TOPLEFT, dropdown, TOPLEFT, 0, -3)
+    bg:SetAnchor(BOTTOMRIGHT, dropdown, BOTTOMRIGHT, 2, 5)
+    bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
+    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
+    mungeOverlay:SetDrawLevel(1)
+    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
+    mungeOverlay:SetAnchorFill()
+
+    if iconpickerData.warning ~= nil or iconpickerData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, control.container, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateChoices = UpdateChoices
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    control.SetColor = SetColor
+    control:SetColor()
+    control.SetIconSize = SetIconSize
+    control:SetIconSize(iconSize)
+
+    if iconpickerData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/panel.lua b/IIfA/libs/LibAddonMenu-2.0/controls/panel.lua
new file mode 100644
index 0000000..1404686
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/panel.lua
@@ -0,0 +1,126 @@
+--[[panelData = {
+    type = "panel",
+    name = "Window Title", -- or string id or function returning a string
+    displayName = "My Longer Window Title",  -- or string id or function returning a string (optional) (can be useful for long addon names or if you want to colorize it)
+    author = "Seerah",  -- or string id or function returning a string (optional)
+    version = "2.0",  -- or string id or function returning a string (optional)
+    website = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where the addon can be updated (optional)
+    keywords = "settings", -- additional keywords for search filter (it looks for matches in name..keywords..author) (optional)
+    slashCommand = "/myaddon", -- will register a keybind to open to this panel (don't forget to include the slash!) (optional)
+    registerForRefresh = true, --boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
+    registerForDefaults = true, --boolean (optional) (will set all options controls back to default values)
+    resetFunc = function() print("defaults reset") end, --(optional) custom function to run after settings are reset to defaults
+} ]]
+
+
+local widgetVersion = 13
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("panel", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+
+local function RefreshPanel(control)
+    local panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
+    local panelControls = panel.controlsToRefresh
+
+    for i = 1, #panelControls do
+        local updateControl = panelControls[i]
+        if updateControl ~= control and updateControl.UpdateValue then
+            updateControl:UpdateValue()
+        end
+        if updateControl.UpdateDisabled then
+            updateControl:UpdateDisabled()
+        end
+        if updateControl.UpdateWarning then
+            updateControl:UpdateWarning()
+        end
+    end
+end
+
+local function ForceDefaults(panel)
+    local panelControls = panel.controlsToRefresh
+
+    for i = 1, #panelControls do
+        local updateControl = panelControls[i]
+        if updateControl.UpdateValue and updateControl.data.default ~= nil then
+            updateControl:UpdateValue(true)
+        end
+    end
+
+    if panel.data.resetFunc then
+        panel.data.resetFunc()
+    end
+
+    cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+
+local callbackRegistered = false
+LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
+local SEPARATOR = " - "
+local LINK_COLOR = ZO_ColorDef:New("5959D5")
+local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
+
+function LAMCreateControl.panel(parent, panelData, controlName)
+    local control = wm:CreateControl(controlName, parent, CT_CONTROL)
+
+    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local label = control.label
+    label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 4)
+    label:SetText(LAM.util.GetStringFromValue(panelData.displayName or panelData.name))
+
+    if panelData.author or panelData.version then
+        control.info = wm:CreateControl(nil, control, CT_LABEL)
+        local info = control.info
+        info:SetFont(LAM.util.L["PANEL_INFO_FONT"])
+        info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
+
+        local output = {}
+        if panelData.author then
+            output[#output + 1] = zo_strformat(LAM.util.L["AUTHOR"], LAM.util.GetStringFromValue(panelData.author))
+        end
+        if panelData.version then
+            output[#output + 1] = zo_strformat(LAM.util.L["VERSION"], LAM.util.GetStringFromValue(panelData.version))
+        end
+        info:SetText(table.concat(output, SEPARATOR))
+    end
+
+    if panelData.website then
+        control.website = wm:CreateControl(nil, control, CT_BUTTON)
+        local website = control.website
+        website:SetClickSound("Click")
+        website:SetFont(LAM.util.L["PANEL_INFO_FONT"])
+        website:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
+        website:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
+        if(control.info) then
+            website:SetAnchor(TOPLEFT, control.info, TOPRIGHT, 0, 0)
+            website:SetText(string.format("|cffffff%s|r%s", SEPARATOR, LAM.util.L["WEBSITE"]))
+        else
+            website:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
+            website:SetText(LAM.util.L["WEBSITE"])
+        end
+        website:SetDimensions(website:GetLabelControl():GetTextDimensions())
+        website:SetHandler("OnClicked", function()
+            RequestOpenUnsafeURL(panelData.website)
+        end)
+    end
+
+    control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
+    LAMCreateControl.scrollCount = LAMCreateControl.scrollCount + 1
+    local container = control.container
+    container:SetAnchor(TOPLEFT, control.info or label, BOTTOMLEFT, 0, 20)
+    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
+    control.scroll = GetControl(control.container, "ScrollChild")
+    control.scroll:SetResizeToFitPadding(0, 20)
+
+    if panelData.registerForRefresh and not callbackRegistered then --don't want to register our callback more than once
+        cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
+        callbackRegistered = true
+    end
+
+    control.ForceDefaults = ForceDefaults
+    control.data = panelData
+    control.controlsToRefresh = {}
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/separator.dds b/IIfA/libs/LibAddonMenu-2.0/controls/separator.dds
new file mode 100644
index 0000000..02bb2ab
Binary files /dev/null and b/IIfA/libs/LibAddonMenu-2.0/controls/separator.dds differ
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/slider.lua b/IIfA/libs/LibAddonMenu-2.0/controls/slider.lua
new file mode 100644
index 0000000..209a7e7
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/slider.lua
@@ -0,0 +1,212 @@
+--[[sliderData = {
+    type = "slider",
+    name = "My Slider", -- or string id or function returning a string
+    getFunc = function() return db.var end,
+    setFunc = function(value) db.var = value doStuff() end,
+    min = 0,
+    max = 20,
+    step = 1, --(optional)
+    clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
+    decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
+    autoSelect = false, -- boolean, automatically select everything in the text input field when it gains focus (optional)
+    inputLocation = "below", -- or "right", determines where the input field is shown. This should not be used within the addon menu and is for custom sliders (optional)
+    tooltip = "Slider's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonSlider" -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 12
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("slider", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local strformat = string.format
+
+local function RoundDecimalToPlace(d, place)
+    return tonumber(strformat("%." .. tostring(place) .. "f", d))
+end
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.slider:SetEnabled(not disable)
+    control.slidervalue:SetEditEnabled(not disable)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+    elseif value then
+        if control.data.decimals then
+            value = RoundDecimalToPlace(value, control.data.decimals)
+        end
+        if control.data.clampInput ~= false then
+            value = math.max(math.min(value, control.data.max), control.data.min)
+        end
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+    end
+
+    control.slider:SetValue(value)
+    control.slidervalue:SetText(value)
+end
+
+function LAMCreateControl.slider(parent, sliderData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, sliderData, controlName)
+    local isInputOnRight = sliderData.inputLocation == "right"
+
+    --skipping creating the backdrop...  Is this the actual slider texture?
+    control.slider = wm:CreateControl(nil, control.container, CT_SLIDER)
+    local slider = control.slider
+    slider:SetAnchor(TOPLEFT)
+    slider:SetHeight(14)
+    if(isInputOnRight) then
+        slider:SetAnchor(TOPRIGHT, nil, nil, -60)
+    else
+        slider:SetAnchor(TOPRIGHT)
+    end
+    slider:SetMouseEnabled(true)
+    slider:SetOrientation(ORIENTATION_HORIZONTAL)
+    --put nil for highlighted texture file path, and what look to be texture coords
+    slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
+    local minValue = sliderData.min
+    local maxValue = sliderData.max
+    slider:SetMinMax(minValue, maxValue)
+    slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    slider:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
+    local bg = slider.bg
+    bg:SetCenterColor(0, 0, 0)
+    bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
+    bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
+
+    control.minText = wm:CreateControl(nil, slider, CT_LABEL)
+    local minText = control.minText
+    minText:SetFont("ZoFontGameSmall")
+    minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
+    minText:SetText(sliderData.min)
+
+    control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
+    local maxText = control.maxText
+    maxText:SetFont("ZoFontGameSmall")
+    maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
+    maxText:SetText(sliderData.max)
+
+    control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
+    if(isInputOnRight) then
+        control.slidervalueBG:SetDimensions(60, 26)
+        control.slidervalueBG:SetAnchor(LEFT, slider, RIGHT, 5, 0)
+    else
+        control.slidervalueBG:SetDimensions(50, 18)
+        control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
+    end
+    control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
+    local slidervalue = control.slidervalue
+    slidervalue:ClearAnchors()
+    slidervalue:SetAnchor(TOPLEFT, control.slidervalueBG, TOPLEFT, 3, 1)
+    slidervalue:SetAnchor(BOTTOMRIGHT, control.slidervalueBG, BOTTOMRIGHT, -3, -1)
+    slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
+    if(isInputOnRight) then
+        slidervalue:SetFont("ZoFontGameLarge")
+    else
+        slidervalue:SetFont("ZoFontGameSmall")
+    end
+
+    local isHandlingChange = false
+    local function HandleValueChanged(value)
+        if isHandlingChange then return end
+        if sliderData.decimals then
+            value = RoundDecimalToPlace(value, sliderData.decimals)
+        end
+        isHandlingChange = true
+        slider:SetValue(value)
+        slidervalue:SetText(value)
+        isHandlingChange = false
+    end
+
+    slidervalue:SetHandler("OnEscape", function(self)
+        HandleValueChanged(sliderData.getFunc())
+        self:LoseFocus()
+    end)
+    slidervalue:SetHandler("OnEnter", function(self)
+        self:LoseFocus()
+    end)
+    slidervalue:SetHandler("OnFocusLost", function(self)
+        local value = tonumber(self:GetText())
+        control:UpdateValue(false, value)
+    end)
+    slidervalue:SetHandler("OnTextChanged", function(self)
+        local input = self:GetText()
+        if(#input > 1 and not input:sub(-1):match("[0-9]")) then return end
+        local value = tonumber(input)
+        if(value) then
+            HandleValueChanged(value)
+        end
+    end)
+    if(sliderData.autoSelect) then
+        ZO_PreHookHandler(slidervalue, "OnFocusGained", function(self)
+            self:SelectAll()
+        end)
+    end
+
+    local range = maxValue - minValue
+    slider:SetValueStep(sliderData.step or 1)
+    slider:SetHandler("OnValueChanged", function(self, value, eventReason)
+        if eventReason == EVENT_REASON_SOFTWARE then return end
+        HandleValueChanged(value)
+    end)
+    slider:SetHandler("OnSliderReleased", function(self, value)
+        control:UpdateValue(false, value)
+    end)
+    slider:SetHandler("OnMouseWheel", function(self, value)
+        if(not self:GetEnabled()) then return end
+        local new_value = (tonumber(slidervalue:GetText()) or sliderData.min or 0) + ((sliderData.step or 1) * value)
+        control:UpdateValue(false, new_value)
+    end)
+
+    if sliderData.warning ~= nil or sliderData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+
+    if sliderData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/submenu.lua b/IIfA/libs/LibAddonMenu-2.0/controls/submenu.lua
new file mode 100644
index 0000000..1766a1f
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/submenu.lua
@@ -0,0 +1,108 @@
+--[[submenuData = {
+    type = "submenu",
+    name = "Submenu Title", -- or string id or function returning a string
+    tooltip = "My submenu tooltip", -- -- or string id or function returning a string (optional)
+    controls = {sliderData, buttonData} --(optional) used by LAM
+    reference = "MyAddonSubmenu" --(optional) unique global reference to control
+} ]]
+
+local widgetVersion = 11
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("submenu", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local am = ANIMATION_MANAGER
+
+local function UpdateValue(control)
+    control.label:SetText(LAM.util.GetStringFromValue(control.data.name))
+    if control.data.tooltip then
+        control.label.data.tooltipText = LAM.util.GetStringFromValue(control.data.tooltip)
+    end
+end
+
+local function AnimateSubmenu(clicked)
+    local control = clicked:GetParent()
+    control.open = not control.open
+
+    if control.open then
+        control.animation:PlayFromStart()
+    else
+        control.animation:PlayFromEnd()
+    end
+end
+
+function LAMCreateControl.submenu(parent, submenuData, controlName)
+    local width = parent:GetWidth() - 45
+    local control = wm:CreateControl(controlName or submenuData.reference, parent.scroll or parent, CT_CONTROL)
+    control.panel = parent
+    control.data = submenuData
+
+    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local label = control.label
+    label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
+    label:SetDimensions(width, 30)
+    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+    label:SetText(LAM.util.GetStringFromValue(submenuData.name))
+    label:SetMouseEnabled(true)
+    if submenuData.tooltip then
+        label.data = {tooltipText = LAM.util.GetStringFromValue(submenuData.tooltip)}
+        label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+        label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    end
+
+    control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
+    local scroll = control.scroll
+    scroll:SetParent(control)
+    scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
+    scroll:SetDimensionConstraints(width + 5, 0, width + 5, 0)
+
+    control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
+    local bg = control.bg
+    bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
+    bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+
+    control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
+    local arrow = control.arrow
+    arrow:SetDimensions(28, 28)
+    arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds") --list_sortup for the other way
+    arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
+
+    --figure out the cool animation later...
+    control.animation = am:CreateTimeline()
+    local animation = control.animation
+    animation:SetPlaybackType(ANIMATION_SIZE, 0) --2nd arg = loop count
+
+    control:SetResizeToFitDescendents(true)
+    control.open = false
+    label:SetHandler("OnMouseUp", AnimateSubmenu)
+    animation:SetHandler("OnStop", function(self, completedPlaying)
+        scroll:SetResizeToFitDescendents(control.open)
+        if control.open then
+            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
+            scroll:SetResizeToFitPadding(5, 20)
+        else
+            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
+            scroll:SetResizeToFitPadding(5, 0)
+            scroll:SetHeight(0)
+        end
+    end)
+
+    --small strip at the bottom of the submenu that you can click to close it
+    control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
+    local btmToggle = control.btmToggle
+    btmToggle:SetMouseEnabled(true)
+    btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
+    btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
+    btmToggle:SetHeight(15)
+    btmToggle:SetAlpha(0)
+    btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/IIfA/libs/LibAddonMenu-2.0/controls/texture.lua b/IIfA/libs/LibAddonMenu-2.0/controls/texture.lua
new file mode 100644
index 0000000..29dda7c
--- /dev/null
+++ b/IIfA/libs/LibAddonMenu-2.0/controls/texture.lua
@@ -0,0 +1,45 @@
+--[[textureData = {
+    type = "texture",
+    image = "file/path.dds",
+    imageWidth = 64, --max of 250 for half width, 510 for full
+    imageHeight = 32, --max of 100
+    tooltip = "Image's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    reference = "MyAddonTexture" --(optional) unique global reference to control
+} ]]
+
+--add texture coords support?
+
+local widgetVersion = 9
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("texture", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local MIN_HEIGHT = 26
+function LAMCreateControl.texture(parent, textureData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, textureData, controlName)
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if control.isHalfWidth then --note these restrictions
+        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
+    else
+        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
+    end
+
+    control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
+    local texture = control.texture
+    texture:SetAnchor(CENTER)
+    texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
+    texture:SetTexture(textureData.image)
+
+    if textureData.tooltip then
+        texture:SetMouseEnabled(true)
+        texture.data = {tooltipText = LAM.util.GetStringFromValue(textureData.tooltip)}
+        texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+        texture:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    end
+
+    return control
+end
diff --git a/IIfA/libs/LibCustomMenu/LibCustomMenu.lua b/IIfA/libs/LibCustomMenu/LibCustomMenu.lua
new file mode 100644
index 0000000..b4a003d
--- /dev/null
+++ b/IIfA/libs/LibCustomMenu/LibCustomMenu.lua
@@ -0,0 +1,570 @@
+-- authors: votan, sirinsidiator
+-- thanks to: baertram & circonian
+
+-- Register with LibStub
+local MAJOR, MINOR = "LibCustomMenu", 5
+local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not lib then return end -- the same or newer version of this lib is already loaded into memory
+
+local wm = WINDOW_MANAGER
+
+----- Common -----
+local function SetupDivider(pool, control)
+	local function GetTextDimensions(self)
+		return 32, 7
+	end
+	local function Noop(self)
+	end
+
+	local label = wm:CreateControlFromVirtual("$(parent)Name", control, "ZO_BaseTooltipDivider")
+	label:ClearAnchors()
+	label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 2)
+	label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 2)
+	-- First and last time the anchors are set
+	label.ClearAnchors = Noop
+	label.SetAnchor = Noop
+
+	label.SetText = Noop
+	label.SetFont = Noop
+	label.GetTextDimensions = GetTextDimensions
+	label.SetHorizontalAlignment = Noop
+	label:SetHidden(false)
+	control.nameLabel = label
+
+	control:SetMouseEnabled(false)
+end
+
+lib.DIVIDER = "-"
+
+----- Sub Menu -----
+
+local Submenu = ZO_Object:Subclass()
+
+local SUBMENU_ITEM_MOUSE_ENTER = 1
+local SUBMENU_ITEM_MOUSE_EXIT = 2
+local SUBMENU_SHOW_TIMEOUT = 350
+local SUBMENU_HIDE_TIMEOUT = 350
+
+local submenuCallLaterHandle
+local nextId = 1
+local function ClearTimeout()
+	if (submenuCallLaterHandle ~= nil) then
+		EVENT_MANAGER:UnregisterForUpdate(submenuCallLaterHandle)
+		submenuCallLaterHandle = nil
+	end
+end
+
+local function SetTimeout(callback)
+	if (submenuCallLaterHandle ~= nil) then ClearTimeout() end
+	submenuCallLaterHandle = "LibCustomMenuSubMenuTimeout" .. nextId
+	nextId = nextId + 1
+
+	EVENT_MANAGER:RegisterForUpdate(submenuCallLaterHandle, SUBMENU_SHOW_TIMEOUT, function()
+		ClearTimeout()
+		if callback then callback() end
+	end )
+end
+
+local function GetValueOrCallback(arg, ...)
+	if type(arg) == "function" then
+		return arg(...)
+	else
+		return arg
+	end
+end
+
+function Submenu:New(...)
+	local object = ZO_Object.New(self)
+	object:Initialize(...)
+	return object
+end
+
+function Submenu:Initialize(name)
+	self.window = ZO_Menus
+
+	local submenuControl = self.window:CreateControl(name, CT_CONTROL)
+	submenuControl:SetClampedToScreen(true)
+	submenuControl:SetMouseEnabled(true)
+	submenuControl:SetHidden(true)
+	-- OnMouseEnter: Stop hiding of submenu initiated by mouse exit of parent
+	submenuControl:SetHandler("OnMouseEnter", ClearTimeout)
+
+	local function ExitSubMenu() if self.parent and self.parent.OnSelect then self.parent:OnSelect(SUBMENU_ITEM_MOUSE_EXIT) end end
+	submenuControl:SetHandler("OnMouseExit", function(control) SetTimeout(ExitSubMenu) end)
+
+	submenuControl:SetHandler("OnHide", function(control) ClearTimeout() self:Clear() end)
+	submenuControl:SetDrawLevel(ZO_Menu:GetDrawLevel() + 1)
+
+	local bg = submenuControl:CreateControl("$(parent)BG", CT_BACKDROP)
+	-- bg:SetCenterColor(0, 0, 0, .93)
+	bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
+	bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
+	bg:SetInsets(16, 16, -16, -16)
+	bg:SetAnchorFill()
+
+	local overlay = bg:CreateControl("$(parent)MungeOverlay", CT_TEXTURE)
+	overlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
+	overlay:SetAddressMode(TEX_MODE_WRAP)
+	overlay:SetAnchor(TOPLEFT)
+	overlay:SetAnchor(BOTTOMRIGHT)
+
+	self.highlight = CreateControlFromVirtual("$(parent)Highlight", submenuControl, "ZO_SelectionHighlight")
+	self.highlight:SetHidden(true)
+
+	self.control = submenuControl
+
+	local upInside = false
+	local function MouseEnter(control)
+		upInside = true
+		ClearTimeout()
+		self:SetSelectedIndex(control.index)
+	end
+	local function MouseExit(control)
+		upInside = false
+		if (self.selectedIndex == control.index) then
+			self:SetSelectedIndex(nil)
+		end
+	end
+	local function MouseUp(control, button)
+		if upInside == true and button == MOUSE_BUTTON_INDEX_LEFT then
+			ZO_Menu_SetLastCommandWasFromMenu(true)
+			if control.checkbox then
+				-- The checkbox click handler will handle it
+				ZO_CheckButton_OnClicked(control.checkbox, button)
+			else
+				if not control.OnSelect() then
+					ClearMenu()
+				end
+			end
+		end
+	end
+
+	local function ItemFactory(pool)
+		local control = CreateControlFromVirtual("ZO_SubMenuItem", submenuControl, "ZO_MenuItem", pool:GetNextControlId())
+		control.nameLabel = GetControl(control, "Name")
+
+		control:SetHandler("OnMouseEnter", MouseEnter)
+		control:SetHandler("OnMouseExit", MouseExit)
+		control:SetHandler("OnMouseDown", IgnoreMouseDownEditFocusLoss)
+		control:SetHandler("OnMouseUp", MouseUp)
+
+		return control
+	end
+
+	local function ResetFunction(control)
+		control:SetHidden(true)
+		control:ClearAnchors()
+		control.OnSelect = nil
+		control.menuIndex = nil
+	end
+
+	local function DividerFactory(pool)
+		local control = CreateControlFromVirtual("ZO_CustomSubMenuDivider", submenuControl, "ZO_NotificationsRowButton", pool:GetNextControlId())
+		SetupDivider(pool, control)
+		return control
+	end
+
+	local function ResetCheckbox(checkbox)
+		ResetFunction(checkbox)
+	end
+
+	local function CheckBoxMouseEnter(control)
+		MouseEnter(control:GetParent())
+	end
+	local function CheckBoxMouseExit(control)
+		MouseExit(control:GetParent())
+	end
+	local function CheckBoxMouseUp(control)
+		self.refCount =(self.refCount or 0) + 1
+		local parent = control:GetParent()
+		parent.OnSelect(ZO_CheckButton_IsChecked(control))
+	end
+	local function CheckBoxFactory(pool)
+		local control = CreateControlFromVirtual("ZO_CustomSubMenuItemCheckButton", submenuControl, "ZO_CheckButton", pool:GetNextControlId())
+		control.nameLabel = control
+
+		control:SetHandler("OnMouseEnter", CheckBoxMouseEnter)
+		control:SetHandler("OnMouseExit", CheckBoxMouseExit)
+
+		ZO_CheckButton_SetToggleFunction(control, CheckBoxMouseUp)
+
+		return control
+	end
+
+
+	self.itemPool = ZO_ObjectPool:New(ItemFactory, ResetFunction)
+	self.dividerPool = ZO_ObjectPool:New(DividerFactory, ResetFunction)
+	self.checkBoxPool = ZO_ObjectPool:New(CheckBoxFactory, ResetCheckbox)
+	self.items = { }
+
+	EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
+		if self.refCount ~= nil then
+			local moc = wm:GetMouseOverControl()
+			if (moc:GetOwningWindow() ~= submenuControl) then
+				self.refCount = self.refCount - 1
+				if self.refCount <= 0 then
+					self:Clear()
+				end
+			end
+		end
+	end )
+end
+
+function Submenu:SetSelectedIndex(index)
+	if (index) then
+		index = zo_max(zo_min(index, #self.items), 1)
+	end
+
+	if (self.selectedIndex ~= index) then
+		self:UnselectItem(self.selectedIndex)
+		self:SelectItem(index)
+	end
+end
+
+function Submenu:UnselectItem(index)
+	local item = self.items[index]
+	if item then
+		self.highlight:SetHidden(true)
+		local nameControl = item.nameLabel
+		nameControl:SetColor(nameControl.normalColor:UnpackRGBA())
+
+		self.selectedIndex = nil
+	end
+end
+
+function Submenu:SelectItem(index)
+	local item = self.items[index]
+	if item then
+		local highlight = self.highlight
+
+		highlight:ClearAnchors()
+
+		highlight:SetAnchor(TOPLEFT, item, TOPLEFT, -2, -2)
+		highlight:SetAnchor(BOTTOMRIGHT, item, BOTTOMRIGHT, 2, 2)
+
+		highlight:SetHidden(false)
+
+		local nameControl = item.nameLabel
+		nameControl:SetColor(nameControl.highlightColor:UnpackRGBA())
+
+		self.selectedIndex = index
+	end
+end
+
+function Submenu:UpdateAnchors()
+	local iconSize = self.iconSize
+	local previousItem = self.control
+	local items = self.items
+	local width, height = 0, 0
+	local padding = ZO_Menu.menuPad
+
+	for i = 1, #items do
+		local item = items[i]
+		local textWidth, textHeight = item.nameLabel:GetTextDimensions()
+		width = math.max(textWidth + padding * 2, width)
+		height = height + textHeight
+		item:ClearAnchors()
+		if i == 1 then
+			item:SetAnchor(TOPLEFT, previousItem, TOPLEFT, padding, padding)
+			item:SetAnchor(TOPRIGHT, previousItem, TOPRIGHT, - padding, padding)
+		else
+			item:SetAnchor(TOPLEFT, previousItem, BOTTOMLEFT, 0, item.itemYPad)
+			item:SetAnchor(TOPRIGHT, previousItem, BOTTOMRIGHT, 0, item.itemYPad)
+		end
+
+		item:SetHidden(false)
+		item:SetDimensions(textWidth, textHeight)
+		previousItem = item
+	end
+
+	self.control:SetDimensions(width + padding * 2, height + padding * 2)
+end
+
+function Submenu:Clear()
+	self:UnselectItem(self.selectedIndex)
+	self.items = { }
+	self.itemPool:ReleaseAllObjects()
+	self.dividerPool:ReleaseAllObjects()
+	self.checkBoxPool:ReleaseAllObjects()
+	self.control:SetHidden(true)
+	self.refCount = nil
+end
+
+local DEFAULT_TEXT_COLOR = ZO_ColorDef:New(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_NORMAL))
+local DEFAULT_TEXT_HIGHLIGHT = ZO_ColorDef:New(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_CONTEXT_HIGHLIGHT))
+
+function Submenu:AddItem(entry, myfont, normalColor, highlightColor, itemYPad)
+	local visible
+	if entry.visible ~= nil then visible = entry.visible else visible = true end
+	if not GetValueOrCallback(visible, ZO_Menu) then return end
+
+	local item, key
+	local itemType = entry.itemType or MENU_ADD_OPTION_LABEL
+	if itemType == MENU_ADD_OPTION_LABEL then
+		item, key = entry.label ~= lib.DIVIDER and self.itemPool:AcquireObject() or self.dividerPool:AcquireObject()
+	elseif itemType == MENU_ADD_OPTION_CHECKBOX then
+		item, key = self.itemPool:AcquireObject()
+	else
+		error(string.format("Unknown menu entry itemType: %s", itemType))
+	end
+
+	item.OnSelect = entry.callback
+	item.index = #self.items + 1
+	self.items[item.index] = item
+
+	local nameControl = item.nameLabel
+
+	local entryFont = GetValueOrCallback(entry.myfont, ZO_Menu, item) or myfont
+	local normColor = GetValueOrCallback(entry.normalColor, ZO_Menu, item) or normalColor
+	local highColor = GetValueOrCallback(entry.highlightColor, ZO_Menu, item) or highlightColor
+	myfont = entryFont or "ZoFontGame"
+	nameControl.normalColor = normColor or DEFAULT_TEXT_COLOR
+	nameControl.highlightColor = highColor or DEFAULT_TEXT_HIGHLIGHT
+
+	nameControl:SetFont(myfont)
+
+	local text = GetValueOrCallback(entry.label, ZO_Menu, item)
+
+	local checkboxItemControl = nil
+	if itemType == MENU_ADD_OPTION_CHECKBOX then
+		checkboxItemControl = self.checkBoxPool:AcquireObject()
+		checkboxItemControl:SetParent(item)
+		checkboxItemControl.menuIndex = item.index
+		checkboxItemControl:ClearAnchors()
+		checkboxItemControl:SetHidden(false)
+		checkboxItemControl:SetAnchor(LEFT, nil, LEFT, 2, -1)
+		text = string.format(" |u18:0::|u%s", text)
+		ZO_CheckButton_SetCheckState(checkboxItemControl, GetValueOrCallback(entry.checked, ZO_Menu, item) or false)
+	end
+	item.checkbox = checkboxItemControl
+
+	nameControl:SetText(text)
+
+	local enabled = not GetValueOrCallback(entry.disabled or false, ZO_Menu, item)
+	nameControl:SetColor((enabled and nameControl.normalColor or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
+	item:SetMouseEnabled(enabled)
+end
+
+function Submenu:Show(parent)
+	if not self.control:IsHidden() then self:Clear() return false end
+	self:UpdateAnchors()
+
+	local padding = ZO_Menu.menuPad
+	local control = self.control
+	control:ClearAnchors()
+	-- If there is not enough space on the right side, use the left side. Like Windows.
+	if (parent:GetRight() + control:GetWidth()) < GuiRoot:GetRight() then
+		control:SetAnchor(TOPLEFT, parent, TOPRIGHT, -1, - padding)
+	else
+		control:SetAnchor(TOPRIGHT, parent, TOPLEFT, 1, - padding)
+	end
+	control:SetHidden(false)
+	self.parent = parent
+	self.refCount = 2
+
+	return true
+end
+
+local function SubMenuItemFactory(pool)
+	local control = CreateControlFromVirtual("ZO_CustomSubMenuItem", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
+
+	local arrowContainer = control:CreateControl("$(parent)Arrow", CT_CONTROL)
+	-- we need this in order to control the menu with independently of the texture size
+	arrowContainer:SetAnchor(RIGHT, control, RIGHT, 0, 0)
+	arrowContainer:SetDimensions(32, 16)
+
+	local arrow = arrowContainer:CreateControl("$(parent)Texture", CT_TEXTURE)
+	arrow:SetAnchor(RIGHT, arrowContainer, RIGHT, 0, 0)
+	arrow:SetDimensions(16, 20)
+	arrow:SetTexture("EsoUI/Art/Miscellaneous/colorPicker_slider_vertical.dds")
+	arrow:SetTextureCoords(0, 0.5, 0, 1)
+
+	-- we assign the submenu arrow to checkbox because the context menu will add the desired width automatically that way
+	control.checkbox = arrowContainer
+
+	local clicked = false
+	local function MouseEnter(control)
+		ZO_Menu_EnterItem(control)
+		clicked = false
+		SetTimeout( function() if control.OnSelect then control:OnSelect(SUBMENU_ITEM_MOUSE_ENTER) end end)
+	end
+	local function MouseExit(control)
+		ZO_Menu_ExitItem(control)
+		if not clicked then
+			SetTimeout( function() if control.OnSelect then control:OnSelect(SUBMENU_ITEM_MOUSE_EXIT) end end)
+		end
+	end
+	local function MouseDown(control)
+		IgnoreMouseDownEditFocusLoss()
+		-- re-open sub menu on click
+		clicked = true
+		control:OnSelect(SUBMENU_ITEM_MOUSE_ENTER)
+	end
+
+	local label = wm:CreateControl("$(parent)Name", control, CT_LABEL)
+	label:SetAnchor(TOPLEFT)
+	control.nameLabel = label
+
+	control:SetHandler("OnMouseEnter", MouseEnter)
+	control:SetHandler("OnMouseExit", MouseExit)
+	control:SetHandler("OnMouseDown", MouseDown)
+
+	return control
+end
+
+----- Standard Menu -----
+
+local function ResetMenuItem(button)
+	button:SetHidden(true)
+	button:ClearAnchors()
+	button.menuIndex = nil
+	button.OnSelect = nil
+end
+
+local function ResetCheckBox(checkBox)
+	ResetMenuItem(checkBox)
+	ZO_CheckButton_SetToggleFunction(checkBox, nil)
+end
+
+local upInside = false
+
+local function MenuItemFactory(pool)
+	local control = CreateControlFromVirtual("ZO_CustomMenuItem", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
+	local function MouseEnter()
+		upInside = true
+		ZO_Menu_EnterItem(control)
+	end
+	local function MouseExit()
+		upInside = false
+		ZO_Menu_ExitItem(control)
+	end
+	local function MouseUp()
+		if upInside == true then
+			ZO_Menu_ClickItem(control, 1)
+		end
+	end
+
+	local label = wm:CreateControl("$(parent)Name", control, CT_LABEL)
+	label:SetAnchor(TOPLEFT)
+	control.nameLabel = label
+
+	control:SetHandler("OnMouseEnter", MouseEnter)
+	control:SetHandler("OnMouseExit", MouseExit)
+	control:SetHandler("OnMouseDown", IgnoreMouseDownEditFocusLoss)
+	control:SetHandler("OnMouseUp", MouseUp)
+
+	return control
+end
+
+local function CheckBoxFactory(pool)
+	local control = CreateControlFromVirtual("ZO_CustomMenuItemCheckButton", ZO_Menu, "ZO_CheckButton", pool:GetNextControlId())
+	control.nameLabel = control
+
+	local function MouseEnter()
+		ZO_Menu_EnterItem(control)
+	end
+	local function MouseExit()
+		ZO_Menu_ExitItem(control)
+	end
+	control:SetHandler("OnMouseEnter", MouseEnter)
+	control:SetHandler("OnMouseExit", MouseExit)
+	return control
+end
+
+local function DividerFactory(pool)
+	local control = CreateControlFromVirtual("ZO_CustomMenuDivider", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
+	SetupDivider(pool, control)
+	return control
+end
+
+----- Public API -----
+
+function AddCustomMenuItem(mytext, myfunction, itemType, myFont, normalColor, highlightColor, itemYPad, horizontalAlignment)
+	local orgItemPool = ZO_Menu.itemPool
+	local orgCheckboxItemPool = ZO_Menu.checkBoxPool
+
+	ZO_Menu.itemPool = mytext ~= lib.DIVIDER and lib.itemPool or lib.dividerPool
+	ZO_Menu.checkBoxPool = lib.checkBoxPool
+
+	local index = AddMenuItem(mytext, myfunction, itemType, myFont, normalColor, highlightColor, itemYPad, horizontalAlignment)
+
+	ZO_Menu.itemPool = orgItemPool
+	ZO_Menu.checkBoxPool = orgCheckboxItemPool
+
+	return index
+end
+
+function AddCustomSubMenuItem(mytext, entries, myfont, normalColor, highlightColor, itemYPad)
+	local function CreateSubMenu(control, state)
+		if (state == SUBMENU_ITEM_MOUSE_ENTER) then
+			lib.submenu:Clear()
+			local currentEntries = GetValueOrCallback(entries, ZO_Menu, control)
+			local entry
+			for i = 1, #currentEntries do
+				entry = currentEntries[i]
+				lib.submenu:AddItem(entry, myfont, normalColor, highlightColor, itemYPad)
+			end
+			lib.submenu:Show(control)
+		elseif (state == SUBMENU_ITEM_MOUSE_EXIT) then
+			lib.submenu:Clear()
+		end
+	end
+
+	local orgItemPool = ZO_Menu.itemPool
+	local orgCheckboxItemPool = ZO_Menu.checkBoxPool
+
+	ZO_Menu.itemPool = lib.submenuPool
+	ZO_Menu.checkBoxPool = lib.checkBoxPool
+
+	local index = AddMenuItem(mytext, CreateSubMenu, MENU_ADD_OPTION_LABEL, myfont, normalColor, highlightColor, itemYPad)
+
+	ZO_Menu.itemPool = orgItemPool
+	ZO_Menu.checkBoxPool = orgCheckboxItemPool
+
+	return index
+end
+
+local function HookClearMenu()
+	local orgClearMenu = ClearMenu
+	function ClearMenu()
+		ClearTimeout()
+		orgClearMenu()
+		lib.itemPool:ReleaseAllObjects()
+		lib.submenuPool:ReleaseAllObjects()
+		lib.checkBoxPool:ReleaseAllObjects()
+		lib.dividerPool:ReleaseAllObjects()
+		lib.submenu:Clear()
+	end
+end
+
+local function HookAddSlotAction()
+	function ZO_InventorySlotActions:AddCustomSlotAction(...)
+		local orgItemPool = ZO_Menu.itemPool
+		local orgCheckboxItemPool = ZO_Menu.checkBoxPool
+
+		ZO_Menu.itemPool = lib.itemPool
+		ZO_Menu.checkBoxPool = lib.checkBoxPool
+
+		self:AddSlotAction(...)
+
+		ZO_Menu.itemPool = orgItemPool
+		ZO_Menu.checkBoxPool = orgCheckboxItemPool
+	end
+end
+
+---- Init -----
+
+local function OnAddonLoaded(event, name)
+	if name:find("^ZO_") then return end
+	EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
+	lib.itemPool = ZO_ObjectPool:New(MenuItemFactory, ResetMenuItem)
+	lib.submenuPool = ZO_ObjectPool:New(SubMenuItemFactory, ResetMenuItem)
+	lib.checkBoxPool = ZO_ObjectPool:New(CheckBoxFactory, ResetCheckBox)
+	lib.dividerPool = ZO_ObjectPool:New(DividerFactory, ResetMenuItem)
+	lib.submenu = Submenu:New("LibCustomMenuSubmenu")
+	HookClearMenu()
+	HookAddSlotAction()
+end
+
+EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
+EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_ADD_ON_LOADED, OnAddonLoaded)
diff --git a/IIfA/libs/LibCustomMenu/Unlicense.rtf b/IIfA/libs/LibCustomMenu/Unlicense.rtf
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/IIfA/libs/LibCustomMenu/Unlicense.rtf
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/IIfA/libs/LibCustomTitles/LibCustomTitles.lua b/IIfA/libs/LibCustomTitles/LibCustomTitles.lua
new file mode 100644
index 0000000..bf76cf8
--- /dev/null
+++ b/IIfA/libs/LibCustomTitles/LibCustomTitles.lua
@@ -0,0 +1,295 @@
+--[[
+Author: Ayantir
+Filename: LibCustomTitles.lua
+Version: 11
+]]--
+
+--[[
+
+This software is under : CreativeCommons CC BY-NC-SA 4.0
+Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+You are free to:
+
+    Share — copy and redistribute the material in any medium or format
+    Adapt — remix, transform, and build upon the material
+    The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+
+Under the following terms:
+
+    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+    NonCommercial — You may not use the material for commercial purposes.
+    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+
+Please read full licence at :
+http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
+
+]]--
+
+local libLoaded
+local LIB_NAME, VERSION = "LibCustomTitles", 11
+local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
+if not LibCustomTitles then return end
+
+function LibCustomTitles:Init()
+
+	local CT_NO_TITLE = 0
+	local CT_TITLE_ACCOUNT = 1
+	local CT_TITLE_CHARACTER = 2
+
+	-- Default override
+	local overriden = {
+		en = "Volunteer",
+		fr = "Volontaire",
+		de = "Freiwillige",
+	}
+
+	local customTitles = {
+
+		["@Ayantir"] = { -- Dev / EU. v1
+			ov = true,
+			en = "The Enlightened",
+			fr = "Mangeuse de Gâteaux",
+			de = "Die Erleuchtete",
+		},
+
+		["@Baertram"] = { -- Dev / EU. v4
+			ov = true,
+			en = "Ursa Major",
+			fr = "Ursa Major",
+			de = "Ursa Major",
+		},
+
+		["@sirinsidiator"] = { -- Dev / EU. v5
+			["Illonia Ithildû"] = {
+				ov = true,
+				en = "Planeswalker",
+				fr = "Arpenteuse de Mondes",
+				de = "Weltenwanderer",
+			},
+			ov = true,
+			en = "Absolutely Not Suspicious",
+			fr = "Carrément pas suspect",
+			de = "Absolut Nicht Verdächtig",
+		},
+
+		["@Randactyl"] = { -- Dev / NA. v6
+			["Vedrasi Rilim"] = {
+				ov = true,
+				en = "Glorious Leader",
+			},
+			ov = true,
+			en = "No Lollygaggin'",
+		},
+
+		["@Wedgez"] = { -- NA. v8
+			ov = true,
+			en = "Golden Light Master",
+		},
+
+		["@Ign0tus"] = { -- NA. v8
+			["Smudgê"] = {
+				ov = true,
+				en = "Infiltrator",
+			},
+			["Nefandus Pravus"] = {
+				ov = true,
+				en = "Nightlord",
+			},
+			["Zero Divisor"] = {
+				ov = true,
+				en = "Executioner",
+			},
+			ov = true,
+			en = "Sweetroll Thief",
+		},
+
+		["@dOpiate"] = { -- Dev / EU. v8
+			["Harmful"] = {
+				ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
+				en = "The Butcher",
+				fr = "Le Boucher",
+				de = "Der Metzger",
+			},
+		},
+
+		["@LadyHermione"] = { -- NA v9
+			["Lady Hermione Sophia"] = {
+				ov = true,
+				en = "Know-It-All",
+			},
+		},
+
+		["@Tarsalterror"] = { -- NA v9
+			ov = {en = "Enemy of Coldharbour", fr = "Ennemi de Havreglace", de = "Feind Kalthafens"},
+			en = "Fancy Man of Cornwood",
+		},
+
+		["@manavortex"] = { -- EU v10
+			["Vivicah Telvanni"] = {
+				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
+				en = "Archmagister",
+				fr = "Archimage",
+				de = "Erzmagister",
+			},
+		},
+
+		["@Valorin"] = { -- EU v10
+			["Valorin Telvanni"] = {
+				ov = {en = "Savior of Nirn", fr = "Sauveur de Nirn", de = "Retter Nirns"},
+				en = "Aetherial Blade",
+				fr = "Lame Ethérée",
+				de = "Ätherklinge",
+			},
+		},
+
+		["@manorin"] = { -- EU v10
+			["Foryn Telvanni"] = {
+				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
+				en = "Hero",
+				fr = "Héros",
+				de = "Helt",
+			},
+		},
+
+		["@Chivana"] = { -- EU v11
+			["Chivana"] = {
+				ov = true,
+				en = "Amazon Queen",
+				fr = "Reine Amazone",
+				de = "Amazonaskönigin",
+			},
+		},
+
+		["@Mythk"] = { -- NA v11
+			ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
+			en = "The One and Only",
+			fr = "Le Seul et l'Unique",
+		},
+
+		["@susmitds"] = { -- NA. v11
+			["Shadow Kitter"] = {
+				ov = true,
+				en = "Emperor Slayer",
+			},
+			["Venom Kitter"] = {
+				ov = true,
+				en = "Poison Angel",
+			},
+			["Wind Kitter"] = {
+				ov = true,
+				en = "Cyclone Walker",
+			},
+			["Lumina Kitter"] = {
+				ov = true,
+				en = "Darklight Seeker",
+			},
+			["Thunder Xyler"] = {
+				ov = true,
+				en = "Unbound Infinium",
+			},
+			["Light Xyler"] = {
+				ov = true,
+				en = "Everglow Hunter",
+			},
+			["Fire Xyler"] = {
+				ov = true,
+				en = "Eternal Inferno",
+			},
+			["Void Xyler"] = {
+				ov = true,
+				en = "Existential Anomaly",
+			},
+		},
+
+		["@JasminTheSecond"] = { -- EU v11
+			["Durac"] = {
+				ov = true,
+				en = "The Lost",
+				fr = "L'égaré",
+				de = "Der Verschollene",
+			},
+		},
+
+	}
+
+	local lang = GetCVar("Language.2")
+
+	local function GetCustomTitleType(displayName, unitName)
+		if customTitles[displayName] then
+			if customTitles[displayName][unitName] then
+				return CT_TITLE_CHARACTER
+			end
+			return CT_TITLE_ACCOUNT
+		end
+		return CT_NO_TITLE
+	end
+
+	local function GetModifiedTitle(originalTitle, displayName, unitName, registerType)
+
+		local title = originalTitle
+		if registerType == CT_TITLE_CHARACTER then
+			if customTitles[displayName][unitName].ov then
+				if type(customTitles[displayName][unitName].ov) == "boolean" then
+					if originalTitle == overriden[lang] then
+						title = customTitles[displayName][unitName][lang] or originalTitle
+					end
+				elseif originalTitle == customTitles[displayName][unitName].ov[lang] then
+					title = customTitles[displayName][unitName][lang] or originalTitle
+				end
+			end
+		elseif registerType == CT_TITLE_ACCOUNT then
+			if customTitles[displayName].ov then
+				if type(customTitles[displayName].ov) == "boolean" then
+					if originalTitle == overriden[lang] then
+						title = customTitles[displayName][lang] or originalTitle
+					end
+				elseif originalTitle == customTitles[displayName].ov[lang] then
+					title = customTitles[displayName][lang] or originalTitle
+				end
+			end
+		end
+
+		return title
+
+	end
+
+	local GetUnitTitle_original = GetUnitTitle
+	GetUnitTitle = function(unitTag)
+		local unitTitleOriginal = GetUnitTitle_original(unitTag)
+		local unitDisplayName = GetUnitDisplayName(unitTag)
+		local unitCharacterName = GetUnitName(unitTag)
+		local registerType = GetCustomTitleType(unitDisplayName, unitCharacterName)
+		if registerType ~= CT_NO_TITLE then
+			return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName, registerType)
+		end
+		return unitTitleOriginal
+	end
+
+	local GetTitle_original = GetTitle
+	GetTitle = function(index)
+		local titleOriginal = GetTitle_original(index)
+		local displayName = GetDisplayName()
+		local characterName = GetUnitName("player")
+		local registerType = GetCustomTitleType(displayName, characterName)
+		if registerType ~= CT_NO_TITLE then
+			return GetModifiedTitle(titleOriginal, displayName, characterName, registerType)
+		end
+		return titleOriginal
+	end
+
+end
+
+local function OnAddonLoaded()
+	if not libLoaded then
+		libLoaded = true
+		local LCC = LibStub('LibCustomTitles')
+		LCC:Init()
+		EVENT_MANAGER:UnregisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED)
+	end
+end
+
+EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
\ No newline at end of file
diff --git a/IIfA/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua b/IIfA/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
new file mode 100644
index 0000000..aaa18d1
--- /dev/null
+++ b/IIfA/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
@@ -0,0 +1,163 @@
+--LibMediaProvider-1.0 is inspired by and borrows from LibSharedMedia-3.0 for World of Warcraft by Elkano
+--LibSharedMedia-3.0 and LibMediaProvider-1.0 are under the LGPL-2.1 license
+
+local MAJOR, MINOR = "LibMediaProvider-1.0", 7 -- remember to increase manually on changes
+local LMP = LibStub:NewLibrary(MAJOR, MINOR)
+if not LMP then return end
+
+local cm = CALLBACK_MANAGER
+local tinsert = table.insert
+local tsort = table.sort
+local pairs = pairs
+
+LMP.DefaultMedia = LMP.DefaultMedia or {}
+LMP.MediaList = LMP.MediaList or {}
+LMP.MediaTable = LMP.MediaTable or {}
+if not LMP.MediaType then
+	LMP.MediaType = {
+		BACKGROUND = "background",	-- background textures
+		BORDER = "border",			-- border textures
+		FONT = "font",				-- fonts
+		STATUSBAR = "statusbar",	-- statusbar textures
+		SOUND = "sound",			-- sound files
+	}
+end
+local defaultMedia = LMP.DefaultMedia
+local mediaList = LMP.MediaList
+local mediaTable = LMP.MediaTable
+
+--DEFAULT UI MEDIA--
+-- BACKGROUND
+LMP.MediaTable.background = LMP.MediaTable.background or {}
+--commented out because it still leaves a white texture behind - addons can use alpha to hide the background
+--LMP.MediaTable.background["None"]				= ""
+LMP.MediaTable.background["ESO Black"]			= "EsoUI/Art/Miscellaneous/borderedinset_center.dds"
+LMP.MediaTable.background["ESO Chat"]			= "EsoUI/Art/chatwindow/chat_bg_center.dds"
+LMP.MediaTable.background["ESO Gray"]			= "EsoUI/Art/itemtooltip/simpleprogbarbg_center.dds"
+LMP.MediaTable.background["Solid"]				= ""
+--LMP.DefaultMedia.background = "None"
+LMP.DefaultMedia.background = "Solid"
+
+-- BORDER
+LMP.MediaTable.border = LMP.MediaTable.border or {}
+--commented out because it still leaves a white texture behind - addons can use alpha to hide the border
+--LMP.MediaTable.border["None"]					= ""
+LMP.MediaTable.border["ESO Gold"]				= "EsoUI/Art/Miscellaneous/borderedinsettransparent_edgefile.dds"
+LMP.MediaTable.border["ESO Chat"]				= "EsoUI/Art/chatwindow/chat_bg_edge.dds"
+LMP.MediaTable.border["ESO Rounded"]			= "EsoUI/Art/miscellaneous/interactkeyframe_edge.dds"
+LMP.MediaTable.border["ESO Blue Highlight"]		= "EsoUI/Art/miscellaneous/textentry_highlight_edge.dds"
+LMP.MediaTable.border["ESO Blue Glow"]			= "EsoUI/Art/crafting/crafting_tooltip_glow_edge_blue64.dds"
+LMP.MediaTable.border["ESO Red Glow"]			= "EsoUI/Art/crafting/crafting_tooltip_glow_edge_red64.dds"
+LMP.MediaTable.border["ESO Red Overlay"]		= "EsoUI/Art/uicombatoverlay/uicombatoverlayedge.dds"
+--LMP.DefaultMedia.border = "None"
+LMP.DefaultMedia.border = "ESO Gold"
+
+-- FONT
+LMP.MediaTable.font = LMP.MediaTable.font or {}
+LMP.MediaTable.font["ProseAntique"]				= "EsoUI/Common/Fonts/ProseAntiquePSMT.otf"
+LMP.MediaTable.font["Consolas"]					= "EsoUI/Common/Fonts/consola.ttf"
+LMP.MediaTable.font["Futura Condensed Light"]	= "EsoUI/Common/Fonts/FuturaStd-CondensedLight.otf"
+LMP.MediaTable.font["Futura Condensed"]			= "EsoUI/Common/Fonts/FuturaStd-Condensed.otf"
+LMP.MediaTable.font["Skyrim Handwritten"]		= "EsoUI/Common/Fonts/Handwritten_Bold.otf"
+LMP.MediaTable.font["Trajan Pro"]				= "EsoUI/Common/Fonts/trajanpro-regular.otf"
+LMP.MediaTable.font["Univers 55"]				= "EsoUI/Common/Fonts/univers55.otf"
+LMP.MediaTable.font["Univers 57"]				= "EsoUI/Common/Fonts/univers57.otf"
+LMP.MediaTable.font["Univers 67"]				= "EsoUI/Common/Fonts/univers67.otf"
+LMP.DefaultMedia.font = "Univers 55"
+
+-- STATUSBAR
+LMP.MediaTable.statusbar = LMP.MediaTable.statusbar or {}
+--LMP.MediaTable.statusbar["ESO Basic"]			= "EsoUI/Art/miscellaneous/progressbar_genericfill_tall.dds"
+LMP.MediaTable.statusbar["ESO Basic"]			= ""
+LMP.DefaultMedia.statusbar = "ESO Basic"
+
+-- SOUND
+LMP.MediaTable.sound = LMP.MediaTable.sound or {}
+LMP.MediaTable.sound["None"]					= ""
+LMP.MediaTable.sound["AvA Gate Open"]			= SOUNDS.AVA_GATE_OPENED
+LMP.MediaTable.sound["AvA Gate Close"]			= SOUNDS.AVA_GATE_CLOSED
+LMP.MediaTable.sound["Emperor Coronated"]		= SOUNDS.EMPEROR_CORONATED_DAGGERFALL
+LMP.MediaTable.sound["Level Up"]				= SOUNDS.LEVEL_UP
+LMP.MediaTable.sound["Skill Gained"]			= SOUNDS.SKILL_GAINED
+LMP.MediaTable.sound["Ability Purchased"]		= SOUNDS.ABILITY_SKILL_PURCHASED
+LMP.MediaTable.sound["Book Acquired"]			= SOUNDS.BOOK_ACQUIRED
+LMP.MediaTable.sound["Unlock"]					= SOUNDS.LOCKPICKING_UNLOCKED
+LMP.MediaTable.sound["Enchanting Extract"]		= SOUNDS.ENCHANTING_EXTRACT_START_ANIM
+LMP.MediaTable.sound["Enchanting Create"]		= SOUNDS.ENCHANTING_CREATE_TOOLTIP_GLOW
+LMP.MediaTable.sound["Blacksmith Improve"]		= SOUNDS.BLACKSMITH_IMPROVE_TOOLTIP_GLOW_SUCCESS
+LMP.DefaultMedia.sound = "None"
+
+local function rebuildMediaList(mediatype)
+	local mtable = mediaTable[mediatype]
+	if not mtable then return end
+	if not mediaList[mediatype] then mediaList[mediatype] = {} end
+	local mlist = mediaList[mediatype]
+	-- list can only get larger, so simply overwrite it
+	local i = 0
+	for k in pairs(mtable) do
+		i = i + 1
+		mlist[i] = k
+	end
+	tsort(mlist)
+end
+
+function LMP:Register(mediatype, key, data)
+	if type(mediatype) ~= "string" then
+		error(MAJOR..":Register(mediatype, key, data) - mediatype must be string, got "..type(mediatype))
+	end
+	if type(key) ~= "string" then
+		error(MAJOR..":Register(mediatype, key, data) - key must be string, got "..type(key))
+	end
+	mediatype = mediatype:lower()
+	if not mediaTable[mediatype] then
+		mediaTable[mediatype] = {}
+	end
+
+	local mtable = mediaTable[mediatype]
+	if mtable[key] then
+		return false
+	end
+	mtable[key] = data
+	rebuildMediaList(mediatype)
+	cm:FireCallbacks("LibMediaProvider_Registered", mediatype, key)
+	return true
+end
+
+function LMP:Fetch(mediatype, key)
+	local mtt = mediaTable[mediatype]
+	local result = (mtt and mtt[key]) or (defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])
+	return result ~= "" and result or nil
+end
+
+function LMP:IsValid(mediatype, key)
+	return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
+end
+
+function LMP:HashTable(mediatype)
+	return mediaTable[mediatype]
+end
+
+function LMP:List(mediatype)
+	if not mediaTable[mediatype] then
+		return nil
+	end
+	if not mediaList[mediatype] then
+		rebuildMediaList(mediatype)
+	end
+	return mediaList[mediatype]
+end
+
+function LMP:GetDefault(mediatype)
+	return defaultMedia[mediatype]
+end
+
+function LMP:SetDefault(mediatype, key)
+	if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
+		defaultMedia[mediatype] = key
+		return true
+	else
+		return false
+	end
+end
+
+
diff --git a/IIfA/libs/LibScroll/LibScroll.lua b/IIfA/libs/LibScroll/LibScroll.lua
new file mode 100644
index 0000000..5e363c4
--- /dev/null
+++ b/IIfA/libs/LibScroll/LibScroll.lua
@@ -0,0 +1,145 @@
+
+
+local MAJOR, MINOR = "LibScroll", 1
+local libScroll, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not libScroll then return end	--the same or newer version of this lib is already loaded into memory
+
+local ROW_TYPE_ID 			= 1
+local DEFAULT_ROW_HEIGHT 	= 30
+local DEFAULT_SCROLL_WIDTH 	= 250
+local DEFAULT_SCROLL_HEIGHT = 400
+
+-- Adds scroll list categories:
+local function AddCategories(scrollList, categories)
+	if not categories then return end
+
+	for k,category in pairs(categories) do
+		local categoryId = tonumber(category)
+		if categoryId then
+			-- not handling parent categories
+			ZO_ScrollList_AddCategory(scrollList, categoryId, nil)
+		end
+	end
+end
+
+-- Used to get scroll list categories so they can be reloaded
+-- after an Update. This is also used in case users manually add/remove
+-- categories after the scrollList has been created & the original
+-- categories may no longer be valid
+local function GetListCategories(self)
+	local categories = {}
+
+	for categoryId in pairs(self.categories) do
+		table.insert(categories, categoryId)
+	end
+	return categories
+end
+
+--[[ Must use deepTableCopy or it WILL crash if the user passes in a dataTable that is stored in saved variables. This is because ZO_ScrollList_CreateDataEntry creates a recursive reference to the data. Although this is only necessary for data saved in saved vars, I'm doing it to protect users against themselves
+--]]
+local function UpdateScrollList(scrollList, dataTable)
+	local dataTableCopy = ZO_DeepTableCopy(dataTable)
+	local dataList 		= ZO_ScrollList_GetDataList(scrollList)
+	-- backup the current categories so we can reload them
+	local currentCategories = GetListCategories(scrollList)
+
+	ZO_ScrollList_Clear(scrollList)
+
+	AddCategories(scrollList, currentCategories)
+
+	-- Add data items to the list
+	for k, dataItem in ipairs(dataTableCopy) do
+		local entry = ZO_ScrollList_CreateDataEntry(ROW_TYPE_ID, dataItem, dataItem.categoryId)
+		table.insert(dataList, entry)
+	end
+
+	local sortFn = scrollList.SortFunction
+
+	if sortFn then
+		table.sort(dataList, sortFn)
+	end
+
+	ZO_ScrollList_Commit(scrollList)
+end
+
+--=======================================================--
+--== Available Functions (by scrollList.reference) ==--
+--=======================================================--
+-- These are fairly simple even for a beginner
+-- are they worth putting in here?
+--=======================================================--
+local function ShowAllCategories(self)
+	for k,catInfo in pairs(self.categories) do
+		ZO_ScrollList_ShowCategory(self, catInfo.id)
+	end
+end
+local function ShowOnlyCategory(self, categoryId)
+	ZO_ScrollList_HideAllCategories(self)
+	ZO_ScrollList_ShowCategory(self, categoryId)
+end
+local function ShowCategory(self, categoryId)
+	ZO_ScrollList_ShowCategory(self, categoryId)
+end
+local function HideAllCategories(self)
+	ZO_ScrollList_HideAllCategories(self)
+end
+local function HideCategory(self, categoryId)
+	ZO_ScrollList_HideCategory(self, categoryId)
+end
+local function ClearList(self)
+	ZO_ScrollList_Clear(self)
+	ZO_ScrollList_Commit(self)
+end
+
+local function CreateScrollList(scrollData)
+	local listName = scrollData.name
+	local parent = scrollData.parent
+
+	if not listName or type(listName) ~= "string" then return end
+	if not parent then return end
+
+	local listWidth = scrollData.width or DEFAULT_SCROLL_WIDTH
+	local listheight = scrollData.height or DEFAULT_SCROLL_HEIGHT
+	local rowHeight = scrollData.rowHeight or DEFAULT_ROW_HEIGHT
+	local template = scrollData.rowTemplate or "ZO_SelectableLabel"
+	local setupCallback = scrollData.setupCallback
+	local selectCallback = scrollData.selectCallback
+	-- Decided not to use a default or else it would force a highlight
+	-- which some users may not want
+	--local selectTemplate = scrollData.selectTemplate or "ZO_ThinListHighlight"
+	local selectTemplate = scrollData.selectTemplate
+
+	local scrollList = WINDOW_MANAGER:CreateControlFromVirtual(listName, parent, "ZO_ScrollList")
+
+	if not scrollList then return end
+
+	scrollList:SetDimensions(listWidth, listheight)
+
+	ZO_ScrollList_AddDataType(scrollList, ROW_TYPE_ID, template, rowHeight, setupCallback, scrollData.hideCallback, scrollData.dataTypeSelectSound, scrollData.resetControlCallback)
+
+	if selectTemplate or selectCallback then
+		ZO_ScrollList_EnableSelection(scrollList, selectTemplate, selectCallback)
+	end
+
+	AddCategories(scrollList, scrollData.categories)
+
+	-- Easy Access References:
+	scrollList.scrollData 		= scrollData
+	scrollList.SortFunction 	= scrollData.sortFunction
+
+	-- Easy Access Functions:
+	scrollList.Clear				= ClearList
+	scrollList.Update	 			= UpdateScrollList
+	scrollList.ShowAllCategories	= ShowAllCategories
+	scrollList.ShowOnlyCategory 	= ShowOnlyCategory
+	scrollList.ShowCategory 		= ShowCategory
+	scrollList.HideAllCategories 	= HideAllCategories
+	scrollList.HideCategory			= HideCategory
+
+	return scrollList
+end
+
+function libScroll:CreateScrollList(scrollData)
+	if not scrollData then return end
+	return CreateScrollList(scrollData)
+end
diff --git a/IIfA/libs/LibStub/LibStub.lua b/IIfA/libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/IIfA/libs/LibStub/LibStub.lua
@@ -0,0 +1,38 @@
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+-- LibStub developed for World of Warcraft by above members of the WowAce community.
+-- Ported to Elder Scrolls Online by Seerah
+
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
+local LibStub = _G[LIBSTUB_MAJOR]
+
+local strformat = string.format
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		if type(minor) ~= "number" then
+			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
+		end
+
+		local oldminor = self.minors[major]
+		if oldminor and oldminor >= minor then return nil end
+		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+		return self.libs[major], oldminor
+	end
+
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	function LibStub:IterateLibraries() return pairs(self.libs) end
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
+
+LibStub.SILENT = true
\ No newline at end of file
diff --git a/IIfABackpack.lua b/IIfABackpack.lua
deleted file mode 100644
index d6c0211..0000000
--- a/IIfABackpack.lua
+++ /dev/null
@@ -1,938 +0,0 @@
-local IIfA = IIfA
-
-local LMP = LibStub("LibMediaProvider-1.0")
-
-IIfA.ScrollSortUp = true
-IIfA.ActiveFilter = 0
-IIfA.ActiveSubFilter = 0
-IIfA.InventoryFilter = "All"
-
-IIfA.InventoryListFilter = "All"
-
--- Get pointer to current settings based on user pref (global or per char)
-function IIfA:GetSettings()
-	if IIfA.data.saveSettingsGlobally then return IIfA.data end
-	return IIfA.settings
-end
-
--- this is for the dropdown menu
-function IIfA:GetInventoryListFilter()
-	if not IIfA.InventoryListFilter then return "All" end
-	return IIfA.InventoryListFilter
-end
-
-
--- this is for the buttons
-local function enableFilterButton(num)
-	local buttonName = "Button"..num
-    local button = IIFA_GUI_Header_Filter:GetNamedChild(buttonName)
-    if button then
-        button:SetState(BSTATE_PRESSED)
-    end
-end
-local function disableFilterButton(num)
-    local button = IIFA_GUI_Header_Filter:GetNamedChild("Button"..num)
-    if button then
-        button:SetState(BSTATE_NORMAL)
-    end
-end
-
-function IIfA:GetActiveFilter()
-	if not IIfA.ActiveFilter then return 0 end
-	return tonumber(IIfA.ActiveFilter)
-end
-
-function IIfA:SetActiveFilter(value)
-	if value == nil then
-		value = 0
-	else
-		value = tonumber(value)
-	end
-	local currentFilter = IIfA:GetActiveFilter()
-
-	if tonumber(currentFilter) == value then
-		value = 0
-	end
-
-	IIfA.ActiveFilter = value
-	if currentFilter ~= value then
-		disableFilterButton(currentFilter)
-	end
-
-	enableFilterButton(value)
-
-	IIfA:UpdateScrollDataLinesData()
-
-end
-
-function IIfA:GetActiveSubFilter()
-	if not IIfA.activeSubFilter then return 0 end
-	return tonumber(IIfA.activeSubFilter)
-end
-
-function IIfA:SetActiveSubFilter(value)
-	value = tonumber(value)
-	if IIfA.GetActiveSubFilter() == value then
-		IIfA.activeSubFilter = 0
-	else
-		IIfA.activeSubFilter = value
-	end
-	IIfA:UpdateScrollDataLinesData()
-end
-
-
-function IIfA:SetInventoryListFilter(value)
-	if not value or value == "" then value = "All" end
-	IIfA.InventoryListFilter = value
-
-	IIfA.searchFilter = IIFA_GUI_SearchBox:GetText()
-
-	IIfA:UpdateScrollDataLinesData()
-	IIfA:UpdateInventoryScroll()
-end
-
-
---[[----------------------------------------------------------------------]]
---[[----------------------------------------------------------------------]]
---[[------ GUI functions  ------------------------------------------------]]
-
-function IIfA:GUIDoubleClick(control, button)
-	if button == MOUSE_BUTTON_INDEX_LEFT and control.itemLink then
-		if control.itemLink ~= "" then
-			ZO_ChatWindowTextEntryEditBox:SetText(ZO_ChatWindowTextEntryEditBox:GetText() .. zo_strformat(SI_TOOLTIP_ITEM_NAME, control.itemLink))
-		end
-	end
-end
-
-local function getItemLinkFromDB(itemLink, item)
-	local iLink = ""
-	if zo_strlen(itemLink) < 10 then
-		iLink = item.itemLink
-	else
-		iLink = itemLink
-	end
-	return iLink
-end
-
-
-local function DoesInventoryMatchList(locationName, location)
-	local bagId = location.bagID
-
---	if locationName == "attributes" then return false end
-	if( IIfA.InventoryListFilter == "All" ) then
-		return true
-
-	elseif(IIfA.InventoryListFilter == "All Banks") then
-		return nil ~= bagId and bagId ~= BAG_BACKPACK and IIfA.trackedBags[bagId]
-		-- (location.bagID == BAG_BANK or location.bagID == BAG_GUILDBANK or location.bagID == BAG_SUBSCRIBER_BANK)
-
-	elseif(IIfA.InventoryListFilter == "All Guild Banks") then
-		return (location.bagID == BAG_GUILDBANK)
-
-	elseif(IIfA.InventoryListFilter == "All Characters") then
-		return (location.bagID == BAG_BACKPACK or location.bagID == BAG_WORN)
-
-	elseif(IIfA.InventoryListFilter == "Bank and Characters") then
-		return (location.bagID == BAG_BANK or
-				location.bagID == BAG_SUBSCRIBER_BANK or
-				location.bagID == BAG_BACKPACK or
-				location.bagID == BAG_WORN)
-
-	elseif(IIfA.InventoryListFilter == "Bank and Current Character") then
-		return (location.bagID == BAG_BANK or
-				location.bagID == BAG_SUBSCRIBER_BANK or
-				((location.bagID == BAG_BACKPACK or
-				  location.bagID == BAG_WORN) and
-				 locationName == IIfA.currentCharacterId))
-
-	elseif(IIfA.InventoryListFilter == "Bank Only") then
-		return (location.bagID == BAG_BANK or
-				location.bagID == BAG_SUBSCRIBER_BANK)
-
-	elseif(IIfA.InventoryListFilter == "Craft Bag") then
-		return (location.bagID == BAG_VIRTUAL)
-
-	else --Not a preset, must be a specific guildbank or character
-		if location.bagID == BAG_BACKPACK or location.bagID == BAG_WORN then
-			-- it's a character name, convert to Id, check that against location Name in the dbv3 table
-			if locationName == IIfA.CharNameToId[IIfA.InventoryListFilter] then return true end
-		else
-			-- it's a bank to compare, do it direct
-			if locationName == IIfA.InventoryListFilter then return true end
-		end
-	end
-end
-
-local function matchCurrentInventory(locationName)
---	if locationName == "attributes" then return false end
-	local accountInventoryList = IIfA:GetAccountInventoryList()
-
-	for i, inventoryName in ipairs(accountInventoryList) do
-		if inventoryName == locationName then return true end
-	end
-
-	return (IIfA:GetInventoryListFilter() == "All")
-end
-
-local function matchFilter(itemName, itemLink)
-    local ret = true
-	local itemMatch = false
-	local hasSetInfo, setName
-
-	local searchFilter = IIfA.searchFilter
--- 17-7-30 AM - moved lowercasing to when it's created, it's an extra var overall, but will cut down filtering because it's one less call to lowercase for every item
---    if not searchFilter then searchFilter = "" end
---	searchFilter = string.lower(searchFilter)
-    local name = string.lower(itemName)
-    if not name then name = "" end
-
-	-- text filter takes precedence
-	-- 3-6-17 AM - you're either filtering on a set name, or not - much less confusing (hopefully)
-	if IIfA.bFilterOnSetName then
-		hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
-		if hasSetInfo then
-			ret = zo_plainstrfind(setName:lower(), searchFilter)
-		else
-			-- no point in going any further, this item doesn't have set info at all, so return a fail and keep truckin
-			return false
-		end
-	else
-		ret = zo_plainstrfind(name, searchFilter)
-		if IIfA:GetSettings().bFilterOnSetNameToo then
-			hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
-			if hasSetInfo then
-				ret = zo_plainstrfind(setName:lower(), searchFilter) or ret
-			end
-		end
-	end
-
-	local bWorn = false
-	local equipType = 0
-	local itemType = 0
-	local subType
-
-	if IIfA.filterGroup ~= "All" and ret then		-- it's not everything, and text search matches, filter by some more stuff
-		if IIfA.filterGroup == "Weapons" or
-			IIfA.filterGroup == "Consumable" or
-			IIfA.filterGroup == "Materials" or
-			IIfA.filterGroup == "Misc" or
-			IIfA.filterGroup == "Specialized" or
-			IIfA.filterGroup == "Body" then
-			if IIfA.filterGroup == "Weapons" then
-				itemType = GetItemLinkWeaponType(itemLink)
-			elseif IIfA.filterGroup == "Body" then
-				-- Body takes extra arg at beginning of array, if array is used at all
-				-- Item type (armor, non-armor)
-				-- remaining args are the specific type of equipment
-				itemType = 0
-				_, _, _, equipType = GetItemLinkInfo(itemLink)
-				-- pre-qual any body type item, if it's not wearable, it's not included
-
-				if equipType == EQUIP_TYPE_INVALID or
-					equipType == EQUIP_TYPE_POISON or
-					equipType == EQUIP_TYPE_MAIN_HAND or
-					equipType == EQUIP_TYPE_ONE_HAND or
-					equipType == EQUIP_TYPE_TWO_HAND then
-					itemType = 0
-				elseif IIfA.filterTypes == nil then		-- if we're not searching for something specific
-					-- quit searching, we're displaying anything worn
-					itemType = 1		-- number doesn't matter
-				else
-					-- it's a wearable piece of some type
-					bWorn = true
-					itemType = GetItemLinkArmorType(itemLink)
-				end
-			elseif	IIfA.filterGroup == "Consumable" or
-					IIfA.filterGroup == "Materials" or
-					IIfA.filterGroup == "Specialized" or
-					IIfA.filterGroup == "Misc" then
-				itemType, subType = GetItemLinkItemType(itemLink)
-				if IIfA.filterGroup ~= "Specialized" then
-					subType = nil
-				end
-			end
-
-			if itemType == 0 and not bWorn then		-- it's not worn or armor and no type assigned, ret false
-				ret = false
-			else
-				if IIfA.filterTypes ~= nil then
-					if bWorn then
-						if itemType == IIfA.filterTypes[1] then
-							for i=2, #IIfA.filterTypes do
-								if(equipType == IIfA.filterTypes[i]) then
-									itemMatch = true
-									break
-								end
-							end
-						end
-					elseif IIfA.filterGroup == "Specialized" then
-						if itemType == IIfA.filterTypes[1] then
-							for i=2, #IIfA.filterTypes do
-								if(subType == IIfA.filterTypes[i]) then
-									itemMatch = true
-									break
-								end
-							end
-						end
-					else
-						for i=1, #IIfA.filterTypes do
-							if (subType == nil and itemType == IIfA.filterTypes[i]) or
-							   (subType ~= nil and subType == IIfA.filterTypes[i]) then
-								itemMatch = true
-								break
-							end
-						end
-					end
-				else
-					itemMatch = true
-				end
-				ret = ret and itemMatch
-			end
-		elseif IIfA.filterGroup == "Stolen" then
-			ret = ret and IsItemLinkStolen(itemLink)
-		end
-	end
-    return ret
-end
-
-
---sort datalines
-local function IIfA_FilterCompareUp(a, b)
-	--local _, _, name1 = a.itemLink:match("|H(.-):(.-)|h(.-)|h")
-	--local _, _, name2 = b.itemLink:match("|H(.-):(.-)|h(.-)|h")
-	local name1 = a.name
-	local name2 = b.name
-	return (name1 or "") < (name2 or "")
-end
-local function IIfA_FilterCompareDown(a, b)
-	return IIfA_FilterCompareUp(b, a)
-end
-
-local function sort(dataLines)
-	if dataLines == nil then dataLines = IIFA_GUI_ListHolder.dataLines end
-
-	if (IIfA.ScrollSortUp) then
-		dataLines = table.sort(dataLines, IIfA_FilterCompareUp)
-	elseif (not IIfA.ScrollSortUp) then
-		dataLines = table.sort(dataLines, IIfA_FilterCompareDown)
-	end
-end
-
--- fill the shown item list with items that match current filter(s)
-function IIfA:UpdateScrollDataLinesData()
-	IIfA:DebugOut("UpdateScrollDataLinesData")
-
-	if (not IIfA.searchFilter) or IIfA.searchFilter == "Click to search..." then
-		IIfA.searchFilter = IIFA_GUI_SearchBox:GetText()
-	end
-
-	local index = 0
-	local dataLines = {}
-	local DBv3 = IIfA.data.DBv3
-	local iLink, itemLink, iconFile, itemQuality, tempDataLine = nil
-	local itemTypeFilter, itemCount = 0
-	local match = false
-	local bWorn = false
-
-	if(DBv3)then
-		for itemLink, item in pairs(DBv3) do
-			iLink = getItemLinkFromDB(itemLink, item)
-
-			if (itemLink ~= "") then
-
-				itemTypeFilter = 0
-				if (item.filterType) then
-					itemTypeFilter = item.filterType
-				end
-
-				itemCount = 0
-				bWorn = false
-
-				local locationName, locData
-				for locationName, locData in pairs(item.locations) do
-					itemCount = itemCount + (locData.itemCount or 0)
-					if DoesInventoryMatchList(locationName, locData) then
-						match = true
-					end
-					bWorn = bWorn or (locData.bagID == BAG_WORN)
-				end
-
-				tempDataLine = {
-					link = iLink, 		-- getItemLinkFromDB(itemLink, item),
-					qty = itemCount,
-					icon = item.iconFile,
-					name = item.itemName,
-					quality = item.itemQuality,
-					filter = itemTypeFilter,
-					worn = bWorn
-				}
-
-				if(itemCount > 0) and matchFilter(item.itemName, iLink) and match then
-					table.insert(dataLines, tempDataLine)
-				end
-				match = false
-			end
-		end
-	end
-
-	IIFA_GUI_ListHolder.dataLines = dataLines
-	sort(IIFA_GUI_ListHolder.dataLines)
-	IIFA_GUI_ListHolder.dataOffset = 0
-	IIfA:UpdateInventoryScroll()
-end
-
-
-local function fillLine(curLine, curItem)
-	if curItem == nil then
-		curLine.itemLink = ""
-		curLine.icon:SetTexture(nil)
-		curLine.icon:SetAlpha(0)
-		curLine.text:SetText("")
-		curLine.qty:SetText("")
-		curLine.worn:SetHidden(true)
-		curLine.stolen:SetHidden(true)
-	else
-		local r, g, b, a = 255, 255, 255, 1
-		if (curItem.quality) then
-			color = GetItemQualityColor(curItem.quality)
-			r, g, b, a = color:UnpackRGBA()
-		end
-		curLine.itemLink = curItem.link
-		curLine.icon:SetTexture(curItem.icon)
-		curLine.icon:SetAlpha(1)
-		local text = zo_strformat(SI_TOOLTIP_ITEM_NAME, curItem.name)
-		curLine.text:SetText(text)
-		curLine.text:SetColor(r, g, b, a)
-		curLine.qty:SetText(curItem.qty)
-		curLine.worn:SetHidden(not curItem.worn)
-		curLine.stolen:SetHidden(not IsItemLinkStolen(curItem.link))
-	end
-end
-
-function IIfA:InitializeInventoryLines()
-	IIfA:DebugOut("InitializeInventoryLines")
-
-	local curLine, curData
-	for i = 1, IIFA_GUI_ListHolder.maxLines do
-
-		curLine = IIFA_GUI_ListHolder.lines[i]
-		curData = IIFA_GUI_ListHolder.dataLines[IIFA_GUI_ListHolder.dataOffset + i]
-		IIFA_GUI_ListHolder.lines[i] = curLine
-
-		if( curData ~= nil) then
-			fillLine(curLine, curData)
-		else
-			fillLine(curLine, nil)
-		end
-	end
-end
-
-function IIfA:UpdateInventoryScroll()
-	local index = 0
-
-	IIfA:DebugOut("UpdateInventoryScroll")
-
-	------------------------------------------------------
-	if IIFA_GUI_ListHolder.dataOffset < 0 then IIFA_GUI_ListHolder.dataOffset = 0 end
-	if IIFA_GUI_ListHolder.maxLines == nil then
-		IIFA_GUI_ListHolder.maxLines = 35
-	end
-	IIfA:InitializeInventoryLines()
-
-	local total = #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines
-	IIFA_GUI_ListHolder_Slider:SetMinMax(0, total)
-end
-
-
-function IIfA:SetItemCountPosition()
-	for i=1, IIFA_GUI_ListHolder.maxLines do
-		line = IIFA_GUI_ListHolder.lines[i]
-		line.text:ClearAnchors()
-		line.qty:ClearAnchors()
-		if IIfA:GetSettings().showItemCountOnRight then
-			line.qty:SetAnchor(TOPRIGHT, line, TOPRIGHT, 0, 0)
-			line.text:SetAnchor(TOPLEFT, line:GetNamedChild("Button"), TOPRIGHT, 18, 0)
-			line.text:SetAnchor(TOPRIGHT, line.qty, TOPLEFT, -10, 0)
-		else
-			line.qty:SetAnchor(TOPLEFT, line:GetNamedChild("Button"), TOPRIGHT, 8, -3)
-			line.text:SetAnchor(TOPLEFT, line.qty, TOPRIGHT, 18, 0)
-			line.text:SetAnchor(TOPRIGHT, line, TOPLEFT, 0, 0)
-		end
-	end
-end
-
-
-function IIfA:CreateLine(i, predecessor, parent)
-	local line = WINDOW_MANAGER:CreateControlFromVirtual("IIFA_ListItem_".. i, parent, "IIFA_SlotTemplate")
-
-	line.icon = line:GetNamedChild("Button"):GetNamedChild("Icon")
-	line.text = line:GetNamedChild("Name")
-	line.qty = line:GetNamedChild("Qty")
-	line.worn = line:GetNamedChild("IconWorn")
-	line.stolen = line:GetNamedChild("IconStolen")
-
---	line.text:SetText(text)
---	line.itemLink = text
---	text=""
-
-	line:SetHidden(false)
-	line:SetMouseEnabled(true)
-	line:SetHeight(IIFA_GUI_ListHolder.rowHeight)
-
-	if i == 1 then
-		line:SetAnchor(TOPLEFT, IIFA_GUI_ListHolder, TOPLEFT, 0, 0)
-		line:SetAnchor(TOPRIGHT, IIFA_GUI_ListHolder, TOPRIGHT, 0, 0)
-	else
-		line:SetAnchor(TOPLEFT, predecessor, BOTTOMLEFT, 0, 0)
-		line:SetAnchor(TOPRIGHT, predecessor, BOTTOMRIGHT, 0, 0)
-	end
-
-	line:SetHandler("OnMouseEnter", function(self) IIfA:GuiLineOnMouseEnter(self) end )
-	line:SetHandler("OnMouseExit", function(self) IIfA:GuiLineOnMouseExit(self) end )
-	line:SetHandler("OnMouseDoubleClick", function(...) IIfA:GUIDoubleClick(...) end )
-
-	return line
-end
-
-
-function IIfA:CreateInventoryScroll()
-	IIfA:DebugOut("CreateInventoryScroll")
-
-	IIFA_GUI_ListHolder.dataOffset = 0
-
-	IIFA_GUI_ListHolder.dataLines = {}
-	IIFA_GUI_ListHolder.lines = {}
-	IIFA_GUI_Header_SortBar.Icon = IIFA_GUI_Header_SortBar:GetNamedChild("_Sort"):GetNamedChild("_Icon")
-
-	--local width = 250 -- IIFA_GUI_ListHolder:GetWidth()
-	local text = "       No Collected Data"
-
-
-	-- we set those to 35 because that's the amount of lines we can show
-	-- within the dimension constraints
-	IIFA_GUI_ListHolder.maxLines = 35
-	local predecessor = nil
-	for i=1, IIFA_GUI_ListHolder.maxLines do
-		IIFA_GUI_ListHolder.lines[i] = IIfA:CreateLine(i, predecessor, IIFA_GUI_ListHolder)
-		predecessor = IIFA_GUI_ListHolder.lines[i]
-	end
-
-	if IIfA:GetSettings().showItemCountOnRight then
-		IIfA:SetItemCountPosition()
-	end
-
-	IIfA:UpdateScrollDataLinesData()
-
-	-- setup slider
---	local tex = "/esoui/art/miscellaneous/scrollbox_elevator.dds"
---	IIFA_GUI_ListHolder_Slider:SetThumbTexture(tex, tex, tex, 16, 50, 0, 0, 1, 1)
-	IIFA_GUI_ListHolder_Slider:SetMinMax(0, #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines)
-
-	return IIFA_GUI_ListHolder.lines
-end
-
-function IIfA:GetCharacterList()
-	local charInventories = {}
-	for i=1, GetNumCharacters() do
-		local charName, _, _, _, _, _, _, _ = GetCharacterInfo(i)
-		charName = charName:sub(1, charName:find("%^") - 1)
-		if (nil == charInventories[charName]) then
-			table.insert(charInventories, charName)
-		end
-	end
-	return charInventories
-end
-
-function IIfA:GetAccountInventoryList()
-	local accountInventories = IIfA.dropdownBankNames
-
-
--- get character names, will present in same order as character selection screen
-	for idx, charName in ipairs(IIfA:GetCharacterList()) do
-		if (nil == accountInventories[charName]) then
-			table.insert(accountInventories, charName)
-		end
-	end
-
--- banks are same as toons, same order as player normally sees them
-	if IIfA.data.bCollectGuildBankData then
-		for i = 1, GetNumGuilds() do
-			id = GetGuildId(i)
-			guildName = GetGuildName(id)
-
-			-- on the off chance that this doesn't exist already, create it
-			if IIfA.data.guildBanks == nil then
-				IIfA.data.guildBanks = {}
-			end
-
-			if IIfA.data.guildBanks[guildName] ~= nil then
-				table.insert(accountInventories, guildName)
-			end
-		end
-	end
-	return accountInventories
-end
-
-function IIfA:QueryAccountInventory(itemLink)
-	if itemLink ~= nil then
-		itemLink = string.gsub(itemLink, '|H0', '|H1')
-	end
-
-	local queryItem = {
-		link = itemLink,
-		locations = {},
-	}
-
-	local queryItemsFound = 0
-	local AlreadySavedLoc = false
-	local newLocation = {}
-
-	itemType = GetItemLinkItemType(itemLink)
-	if itemType == ITEMTYPE_BLACKSMITHING_MATERIAL or
-		itemType == ITEMTYPE_ARMOR_TRAIT or
-		itemType == ITEMTYPE_BLACKSMITHING_BOOSTER or
-		itemType == ITEMTYPE_BLACKSMITHING_RAW_MATERIAL or
-		itemType == ITEMTYPE_CLOTHIER_BOOSTER or
-		itemType == ITEMTYPE_CLOTHIER_MATERIAL or
-		itemType == ITEMTYPE_CLOTHIER_RAW_MATERIAL or
-		itemType == ITEMTYPE_ENCHANTING_RUNE_ASPECT or
-		itemType == ITEMTYPE_ENCHANTING_RUNE_ESSENCE or
-		itemType == ITEMTYPE_ENCHANTING_RUNE_POTENCY or
-		itemType == ITEMTYPE_FLAVORING or
-		itemType == ITEMTYPE_INGREDIENT or
-		itemType == ITEMTYPE_LOCKPICK or
-		itemType == ITEMTYPE_LURE or
-		itemType == ITEMTYPE_POISON_BASE or
-		itemType == ITEMTYPE_POTION_BASE or
-		itemType == ITEMTYPE_RAW_MATERIAL or
-		itemType == ITEMTYPE_REAGENT or
-		itemType == ITEMTYPE_RECIPE or
-		itemType == ITEMTYPE_SPICE or
-		itemType == ITEMTYPE_STYLE_MATERIAL or
-		itemType == ITEMTYPE_WEAPON_TRAIT or
-		itemType == ITEMTYPE_WOODWORKING_BOOSTER or
-		itemType == ITEMTYPE_WOODWORKING_MATERIAL or
-		itemType == ITEMTYPE_WOODWORKING_RAW_MATERIAL or
-		itemType == ITEMTYPE_RACIAL_STYLE_MOTIF then
-		itemLink = IIfA:GetItemID(itemLink)
-	end
-
-	local item = IIfA.data.DBv3[itemLink]
-
-	if ((queryItem.link ~= nil) and (item ~= nil)) then
-		for locationName, location in pairs(item.locations) do
-			AlreadySavedLoc = false
-			if location.bagID == BAG_WORN or location.bagID == BAG_BACKPACK then
-				locationName = IIfA.CharIdToName[locationName]
-			end
-			if locationName ~= nil then
-				for x, QILocation in pairs(queryItem.locations) do
-					if (QILocation.name == locationName)then
-						QILocation.itemsFound = QILocation.itemsFound + location.itemCount
-						AlreadySavedLoc = true
-					end
-				end
-				if location.itemCount then
-					if (not AlreadySavedLoc) and (location.itemCount > 0) then
-						newLocation = {}
-						newLocation.name = locationName
-						newLocation.itemsFound = location.itemCount
-						if location.bagID == BAG_WORN then
-							newLocation.worn = true
-						end
-						table.insert(queryItem.locations, newLocation)
-					end
-				end
-			end
-		end
-	end
-	return queryItem
-end
-
-function IIfA:CreateInventoryDropdown()
-	local comboBox, i
-
-	if IIFA_GUI_Header_Dropdown.comboBox ~= nil then
-		comboBox = IIFA_GUI_Header_Dropdown.comboBox
-	else
-		comboBox = ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_Dropdown)
-		IIFA_GUI_Header_Dropdown.comboBox = comboBox
-	end
-
-	function OnItemSelect(_, choiceText, choice)
---		d("OnItemSelect", choiceText, choice)
-		IIfA:SetInventoryListFilter(choiceText)
-	  	PlaySound(SOUNDS.POSITIVE_CLICK)
-	end
-
-	comboBox:SetSortsItems(false)
-
-	local validChoices =  IIfA:GetAccountInventoryList()
-
-	for i = 1, #validChoices do
-       	entry = comboBox:CreateItemEntry(validChoices[i], OnItemSelect)
-		comboBox:AddItem(entry)
-		if validChoices[i] == IIfA:GetInventoryListFilter() then
-			comboBox:SetSelectedItem(validChoices[i])
-		end
-	end
-
-	return IIFA_GUI_Header_Dropdown
-end
-
-function IIfA:SetSceneVisible(name, value)
-	IIfA:GetSettings().frameSettings[name].hidden = not value
-end
-
-function IIfA:GetSceneVisible(name)
-	if IIfA:GetSettings().frameSettings then
-		return (not IIfA:GetSettings().frameSettings[name].hidden)
-	else
-		return true
-	end
-end
-
-function IIfA:SetupBackpack()
-	IIfA.InventoryListFilter = IIfA.data.in2DefaultInventoryFrameView
-	IIfA:CreateInventoryScroll()
-	IIfA:CreateInventoryDropdown()
-	IIfA:GuiOnSort(true)
-end
-
-function IIfA:ProcessRightClick(control)
-	if control == nil then
-		return
-	end
-
-	control = control:GetParent()
-	if control:GetName():match("IIFA_ListItem") == nil or
-		control.itemLink == nil then
-		return
-	end
-
-	-- it's an IIFA list item, lets see if it has data, and allow menu if it does
-
-	if control.itemLink ~= "" then
-		zo_callLater(function()
-			AddCustomMenuItem(GetString(SI_ITEM_ACTION_LINK_TO_CHAT), function() IIfA:GUIDoubleClick(control, MOUSE_BUTTON_INDEX_LEFT) end, MENU_ADD_OPTION_LABEL)
-			AddCustomMenuItem("Missing Motifs to text", function() IIfA:FMC(control, "Private") end, MENU_ADD_OPTION_LABEL)
-			AddCustomMenuItem("Missing Motifs to Chat", function() IIfA:FMC(control, "Public") end, MENU_ADD_OPTION_LABEL)
-			AddCustomMenuItem("Filter by Item Name", function() IIfA:FilterByItemName(control) end, MENU_ADD_OPTION_LABEL)
-			AddCustomMenuItem("Filter by Item Set Name", function() IIfA:FilterByItemSet(control) end, MENU_ADD_OPTION_LABEL)
-			ShowMenu(control)
-			end, 50
-			)
-	end
-end
-
-
--- paste missing motif chapters to chat based on currently displayed list of items
-function IIfA:FMC(control, WhoSeesIt)
---[[
--- next block taken from AI Research Grid
--- not helpful in that it gives back singular versions of everything, and breastplate instead of chest
--- Display Order in tooltip
-	local styleChaptersLookup =
-		{
-		[1] = ITEM_STYLE_CHAPTER_AXES,
-		[2] = ITEM_STYLE_CHAPTER_BELTS,
-		[3] = ITEM_STYLE_CHAPTER_BOOTS,
-		[4] = ITEM_STYLE_CHAPTER_BOWS,
-		[5] = ITEM_STYLE_CHAPTER_CHESTS,
-		[6] = ITEM_STYLE_CHAPTER_DAGGERS,
-		[7] = ITEM_STYLE_CHAPTER_GLOVES,
-		[8] = ITEM_STYLE_CHAPTER_HELMETS,
-		[9] = ITEM_STYLE_CHAPTER_LEGS,
-		[10] = ITEM_STYLE_CHAPTER_MACES,
-		[11] = ITEM_STYLE_CHAPTER_SHIELDS,
-		[12] = ITEM_STYLE_CHAPTER_SHOULDERS,
-		[13] = ITEM_STYLE_CHAPTER_STAVES,
-		[14] = ITEM_STYLE_CHAPTER_SWORDS,
-		}
---]]
-
--- following lookup turns a motif number "Crafting Motif 33: Thieves Guild Axes" into an achieve lookup
--- |H1:achievement:1318:16383:1431113493|h|h
-	local motifAchieves =
-		{
-		[15] = 1144,	-- Dwemer
-		[16] = 1319, 	-- Glass
-		[17] = 1181,	-- Xivkyn
-		[18] = 1318,	-- Akaviri
-		[19] = 1348,	-- Mercenary
-		[20] = 1713,	-- Yokudan
-		[21] = 1341,	-- Ancient Orc
-		[22] = 1411,	-- Trinimac
-		[23] = 1412,	-- Malacath
-		[24] = 1417,	-- Outlaw
-		[25] = 1415,	-- Aldmeri Dominion
-		[26] = 1416,	-- Daggerfall Covenant
-		[27] = 1414,	-- Ebonheart Pact
-		[28] = 1797,	-- Ra Gada
---		[29] = 0,		-- Soul-Shriven
-		[30] = 1933,	-- Morag Tong
-		[31] = 1676, 	-- Skinchanger
-		[32] = 1422, 	-- Abah's Watch
-		[33] = 1423,	-- Thieves Guild
-		[34] = 1424,	-- Assasins League
-		[35] = 1659,	-- Dro-m'Athra
-		[36] = 1661,	-- Dark Brotherhood
-		[37] = 1798,	-- Ebony
-		[38] = 1715,	-- Draugr
-		[39] = 1662,	-- Minotaur
-		[40] = 1660,	-- Order Hour
-		[41] = 1714,	-- Celestial
-		[42] = 1545,	-- Hollowjack
---		[43] = 0,		-- Harlequin
-		[44] = 1796,	-- Silken Ring
-		[45] = 1795,	-- Mazzatun
---		[46] = 0,		-- Stahlrim
-		[47] = 1934,	-- Bouyant Armiger
-		[48] = 1932,	-- Ashlander
-		[49] = 1935,	-- Militant Ordinator
-		[50] = 2023,	-- Telvani
-		[51] = 2021,	-- Hlaalu
-		[52] = 2022,	-- Redoran
-		[54] = 2098,	-- Bloodforge
-		[55] = 2097,	-- Dreadhorn
-		[56] = 2044,	-- Apostle
-		[57] = 2045,	-- Ebonshadow
-		}
-
---		local i, a
---		for i,a in pairs(motifAchieves) do
---			d(i .. " = |H1:achievement:" .. a .. ":16383:1431113493|h|h")
---		end
-
-	local langChapNames = {}
-	langChapNames["EN"] = {"Axes", "Belts", "Boots", "Bows", "Chests", "Daggers", "Gloves", "Helmets", "Legs", "Maces", "Shields", "Shoulders", "Staves", "Swords" }
-	langChapNames["DE"] = {"xte", "Grtel", "Stiefel", "Bogen", "Torsi", "Dolche", "Handschuhe", "Helme", "Beine", "Keulen", "Schilde", "Schultern", "Stbe", "Schwerter" }
-	local chapnames = langChapNames[GetCVar("language.2")]
-	if chapnames == nil then
-		chapnames = langChapNames["EN"]
-	end
-
-	if control.itemLink == nil or control.itemLink == "" then
-		d("Invalid item. Right-Click ignored.")
-		return
-	end
-
-	local motifNum
-	motifNum = GetItemLinkName(control.itemLink):match("%d+")
-	motifNum = tonumber(motifNum)
-	if motifAchieves[motifNum] == nil then
-		d(control.itemLink .. " is not a valid motif chapter")
-		return
-	end
-
---	local chapnames = {}, idx, chapType
---	for idx, chapType in pairs(styleChaptersLookup) do
---		chapnames[idx - 1] = GetString("SI_ITEMSTYLECHAPTER", chapType)
---	end
-
-	local idx, data, i, val
-	local chapVal
-	chapVal = 0
-	for idx, data in pairs(IIFA_GUI_ListHolder.dataLines) do
-		for i, val in pairs(chapnames) do
-			if chapnames[i] ~= nil then
-				if zo_plainstrfind(data.name, val) and zo_plainstrfind(data.name, tostring(motifNum)) then
-					chapnames[i] = nil
-					chapVal = chapVal + (2 ^ (i - 1))
-				end
-			end
-		end
-	end
-
-	local s = ""
-	for i, val in pairs(chapnames) do
-		if val ~= nil then
-			if s == "" then
-				s = val
-			else
-				s = s .. ", " .. val
-			end
-		end
-	end
-
-	if s == "" then
-		d("No motif chapters missing")
-	else
-		-- incomplete motif achieve
-		-- |H1:achievement:1416:0:0|h|h
-		local motifStr = "|H1:achievement:" .. motifAchieves[motifNum] .. ":" .. chapVal .. ":0|h|h"
-
-		if WhoSeesIt == "Private" then
-			d("Missing " .. motifStr .. " chapters: " .. s)
-		end
-
-		if WhoSeesIt == "Public" then
-			d("Missing motif chapters are in the chat text edit area")
-			ZO_ChatWindowTextEntryEditBox:SetText("Looking for " .. motifStr .. " missing chapters: " .. s)
-		end
-
-	end
-	--d(chapnames)
-
-end
-
-function IIfA:FilterByItemName(control)
-
-	local itemName
-	itemName = GetItemLinkName(control.itemLink)
-
-	IIfA.searchFilter = itemName
-	IIFA_GUI_SetNameOnly_Checked:SetHidden(true)
-	IIFA_GUI_SearchBox:SetText(itemName)
-	IIFA_GUI_SearchBoxText:SetHidden(true)
-	IIfA.bFilterOnSetName = false
-    IIfA:UpdateScrollDataLinesData()
-    IIfA:UpdateInventoryScroll()
-
-end
-
-function IIfA:FilterByItemSet(control)
-
-	local itemLink
-	itemLink = control.itemLink
-	if itemLink == nil then
-		return
-	end
-	local hasSetInfo, setName
-	hasSetInfo, setName = GetItemLinkSetInfo(itemLink, false)
-	if hasSetInfo then
-		IIfA.searchFilter = setName
-		-- fill in the GUI portion here
-	else
-		d("Item is not part of a set. Filter not changed.")
-		return
-	end
-
-	IIfA.searchFilter = setName
-	IIFA_GUI_SetNameOnly_Checked:SetHidden(false)
-	IIFA_GUI_SearchBox:SetText(setName)
-	IIFA_GUI_SearchBoxText:SetHidden(true)
-	IIfA.bFilterOnSetName = true
-    IIfA:UpdateScrollDataLinesData()
-    IIfA:UpdateInventoryScroll()
-
-end
-
-
-
---[[
-misc musings
-
---|H1:item:45350:365:50:0:0:0:0:0:0:0:0:0:0:0:0:7:0:0:0:10000:0|h|h
-
-ww writ
-ruby ash healing staff, epic, nirnhoned, magnus gift set, glass, 48 writ voucher reward
-/script local i for i=1,100 do d(i .. " = " .. GenerateMasterWritBaseText("|H1:item:119681:6:1:0:0:0:" .. i .. ":192:4:48:26:28:0:0:0:0:0:0:0:0:480000|h|h")) end
-
-maple resto staff
-|H1:item:43560:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:0:0|h|h
-
-nobles conquest robe
-|H1:item:59965:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:10000:0|h|h
-|H1:item:60000:30:1:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0:10000:0|h|h
-]]
diff --git a/IIfADataCollection.lua b/IIfADataCollection.lua
deleted file mode 100644
index f90535b..0000000
--- a/IIfADataCollection.lua
+++ /dev/null
@@ -1,551 +0,0 @@
-local IIfA = IIfA
-local EMPTY_STRING = ""
-
-function IIfA:DeleteCharacterData(name)
-	if (name) then
-		--delete selected character
-		for characterName, character in pairs(IIfA.data.accountCharacters) do
-			if(characterName == name) then
-				IIfA.data.accountCharacters[name] = nil
-			end
-		end
-	end
-end
-
-function IIfA:DeleteGuildData(name)
-	if (name) then
-		--delete selected guild
-		for guildName, guild in pairs(IIfA.data.guildBanks) do
-			if guildName == name then
-				IIfA.data.guildBanks[name] = nil
-			end
-        end
-		IIfA:ClearUnowned()
-	end
-end
-
-function IIfA:CollectGuildBank()
-
-
-	-- add roomba support
-	if Roomba and Roomba.WorkInProgress and Roomba.WorkInProgress() then return  end
-
-	local curGB = GetSelectedGuildBankId()
-
-	if not IIfA.data.bCollectGuildBankData or curGB == nil then
-		return
-	end
-
-	if not IIfA.data.guildBanks then IIfA.data.guildBanks = {} end
-	local curGuild = GetGuildName(curGB)
-
-	IIfA:DebugOut("Collecting Guild Bank Data for " .. curGuild)
-
-	if IIfA.data.guildBanks[curGuild] ~= nil then
-		if not IIfA.data.guildBanks[curGuild].bCollectData then
-			return
-		end
-	end
-
-	SelectGuildBank(CurGB)
-	local count = 0
-
-	if(IIfA.data.guildBanks[curGuild] == nil) then
-		IIfA.data.guildBanks[curGuild] = {}
-		IIfA.data.guildBanks[curGuild].bCollectData = true		-- default to true just so it's here and ok
-	end
-	local guildData = IIfA.data.guildBanks[curGuild]
-	guildData.items = #ZO_GuildBankBackpack.data
-	guildData.lastCollected = GetDate() .. "@" .. GetFormattedTime();
-	IIfA:ClearLocationData(curGuild)
-	IIfA:DebugOut(" - " .. #ZO_GuildBankBackpack.data .. " items")
-	for i=1, #ZO_GuildBankBackpack.data do
-		local slotIndex = ZO_GuildBankBackpack.data[i].data.slotIndex
-		IIfA:EvalBagItem(BAG_GUILDBANK, slotIndex)
-	end
---	d("IIfA - Guild Bank Collected - " .. curGuild)
-end
-
-
-local function grabBagContent(bagId)
-	local bagItems = GetBagSize(BAG_BAGPACK)
-	for slotNum=0, bagItems, 1 do
-		dbItem, itemKey = IIfA:EvalBagItem(bagId, slotNum)
-	end
-end
-
-local function scanBags()
-	local playerName = GetUnitName('player')
-
-	IIfA.data.accountCharacters 			= IIfA.data.accountCharacters or {}
-	IIfA.data.accountCharacters[playerName] = IIfA.data.accountCharacters[playerName] or {}
-
-
-
-	IIfA:ClearLocationData(IIfA.currentCharacterId)
-
-	if not IIfA:IsCharacterEquipIgnored(playerName) then
-		grabBagContent(BAG_WORN)
-	end
-	if not IIfA:IsCharacterInventoryIgnored(playerName) then
-		grabBagContent(BAG_BACKPACK)
-	end
-end
-IIfA.ScanCurrentCharacter = scanBags
-
-function IIfA:ScanBank()
-	IIfA:ClearLocationData(GetString(IIFA_BAG_BANK))
-	grabBagContent(BAG_BANK)
-
-	local slotNum = nil
-	if HasCraftBagAccess() then
-		grabBagContent(BAG_SUBSCRIBER_BANK)
-		IIfA:ClearLocationData(GetString(IIFA_BAG_CRAFTBAG))
-		slotNum = GetNextVirtualBagSlotId(slotNum)
-		while slotNum ~= nil do
-			IIfA:EvalBagItem(BAG_VIRTUAL, slotNum)
-			slotNum = GetNextVirtualBagSlotId(slotNum)
-		end
-	end
-end
-
--- only grabs the content of bagpack and worn on the first login - hence we set the function to insta-return below.
-function IIfA:OnFirstInventoryOpen()
-	scanBags()
-	IIfA:ScanBank()
-	IIfA.OnFirstInventoryOpen = function() return end
-end
-
-
-function IIfA:CheckForAgedGuildBankData( days )
-	local results = false
-	local days = days or 5
-	if IIfA.data.bCollectGuildBankData then
-		IIfA:CleanEmptyGuildBug()
-		for guildName, guildData in pairs(IIfA.data.guildBanks)do
-			local today = GetDate()
-			local lastCollected = guildData.lastCollected:match('(........)')
-			if(lastCollected and lastCollected ~= EMPTY_STRING)then
-				if(today - lastCollected >= days)then
-					d("[IIfA]:Warning - " .. guildName .. " Guild Bank data not collected in " .. days .. " or more days!")
-					results = true
-				end
-			else
-				d("[IIfA]:Warning - " .. guildName .. " Guild Bank data has not been collected!")
-				results = true
-			end
-		end
-		return results
-	end
-	return true
-end
-
-function IIfA:UpdateGuildBankData()
-	if IIfA.data.bCollectGuildBankData then
-		local tempGuildBankBag = {
-			items = 0;
-			lastCollected = EMPTY_STRING;
-		}
-		for index=1, GetNumGuilds() do
-			local guildName = GetGuildName(index)
-			local guildBank = IIfA.data.guildBanks[guildName]
-			if(not guildBank) then
-				IIfA.data.guildBanks[guildName] = tempGuildBankBag
-			end
-		end
-	end
-end
-
-function IIfA:CleanEmptyGuildBug()
-	local emptyGuild = IIfA.data.guildBanks[EMPTY_STRING]
-	if(emptyGuild)then
-		IIfA.data.guildBanks[EMPTY_STRING] = nil
-	end
-end
-
-function IIfA:GuildBankReady()
-	IIfA:DebugOut("GuildBankReady...")
-	IIfA.isGuildBankReady = false
-	IIfA:UpdateGuildBankData()
-	IIfA:CleanEmptyGuildBug()
-	IIfA:CollectGuildBank()
-end
-
-function IIfA:GuildBankDelayReady()
-	IIfA:DebugOut("GuildBankDelayReady...")
-	if not IIfA.isGuildBankReady then
-		IIfA.isGuildBankReady = true
-		zo_callLater(function() IIfA:GuildBankReady() end, 1750)
-	end
-end
-
-function IIfA:GuildBankAddRemove(eventID, slotNum)
-	IIfA:DebugOut("Guild Bank Add or Remove...")
-	IIfA:UpdateGuildBankData()
-	IIfA:CleanEmptyGuildBug()
-	--IIfA:CollectGuildBank()
-	local dbItem, itemKey
-	if eventID == EVENT_GUILD_BANK_ITEM_ADDED then
---		d("GB Add")
-		dbItem, itemKey = IIfA:EvalBagItem(BAG_GUILDBANK, slotNum, true, 0)
-		IIfA:ValidateItemCounts(BAG_GUILDBANK, slotNum, dbItem, itemKey)
-	else
---		d("GB Remove")
---		d(GetItemLink(BAG_GUILDBANK, slotNum))
---		dbItem, itemKey = IIfA:EvalBagItem(BAG_BACKPACK, slotNum)
---		IIfA:ValidateItemCounts(BAG_GUILDBANK, slotNum, dbItem, itemKey)
-	end
-end
-
-function IIfA:ActionLayerInventoryUpdate()
-	-- IIfA:CollectAll()
-end
-
-
---[[
-Data collection notes:
-	Currently crafting items are coming back from getitemlink with level info in them.
-	If it's a crafting item, strip the level info and store only the item number as the itemKey
-	Use function GetItemCraftingInfo, if usedInCraftingType indicates it's NOT a material, check for other item types
-
-	When showing items in tooltips, check for both stolen & owned, show both
---]]
-
-
--- used by an event function - see iifaevents.lua for call
-function IIfA:InventorySlotUpdate(eventCode, bagId, slotNum, isNewItem, itemSoundCategory, inventoryUpdateReason, qty)
-	if isNewItem then
-		isNewItem = "True"
-	else
-		isNewItem = "False"
-	end
-
-	IIfA:DebugOut(zo_strformat("Inv Slot Upd - <<1>>, <<2>>, <<3>>, <<4>>, <<5>>, <<6>>, <<7>>", GetItemLink(bagId, slotNum, LINK_STYLE_NORMAL), eventCode, bagId, slotNum, inventoryUpdateReason, qty, isNewItem))
-	local dbItem, itemKey
-	dbItem, itemKey = self:EvalBagItem(bagId, slotNum, true, qty)
---	if dbItem ~= nil and (bagId == BAG_BANK or bagId == BAG_SUBSCRIBER_BANK or bagId == BAG_BACKPACK) then
---		IIfA:ValidateItemCounts(bagId, slotNum, dbItem, itemKey)
---	end
-end
-
-local function assertValue(value, itemLink, getFunc)
-	if value then return value end
-	if getFunc == EMPTY_STRING then return EMPTY_STRING end
-	return getFunc(itemLink)
-end
-
-local function IIfA_assertItemLink(itemLink, bagId, slotIndex)
-	if itemLink ~= nil then
-		return itemLink
-	else
-		if (bagId ~= nil and slotIndex ~= nil) then
-			return GetItemLink(tonumber(bagId), tonumber(slotIndex))
-		end
-	end
-
-	return nil
-end
-
-local function setItemFileEntry(array, key, value)
-	if not value then return end
-	if not array then return end
-	if not array[key] then
-		array[key] = {}
-	end
-
-	array[key] = value
-end
-
-
-function IIfA:EvalBagItem(bagId, slotNum, fromXfer, qty)
-	if not IIfA.trackedBags[bagId] then return end
-	local DBv3 = IIfA.data.DBv3
-	if fromXfer == nil then
-		fromXfer = false
-	end
-
-	if(not DBv3)then
-		IIfA.data.DBv3 = {}
-		DBv3 = IIfA.data.DBv3
-	end
-	itemName = GetItemName(bagId, slotNum) or EMPTY_STRING
-
-	IIfA:DebugOut(zo_strformat("EvalBagItem - <<1>>/<<2>> <<3>>", bagId, slotNum, itemName))
-
-	if itemName > EMPTY_STRING then
-		itemLink = GetItemLink(bagId, slotNum, LINK_STYLE_BRACKETS)
-		itemKey = itemLink
-		local usedInCraftingType, itemType, extraInfo1, extraInfo2, extraInfo3 = GetItemCraftingInfo(bagId, slotNum)
-
-		if usedInCraftingType ~= CRAFTING_TYPE_INVALID and
-		   itemType ~= ITEMTYPE_GLYPH_ARMOR and
-		   itemType ~= ITEMTYPE_GLYPH_JEWELRY and
-		   itemType ~= ITEMTYPE_GLYPH_WEAPON then
-		   itemKey = IIfA:GetItemID(itemLink)
-		else
-			itemType = GetItemLinkItemType(itemLink)
-			if  itemType == ITEMTYPE_STYLE_MATERIAL or
-				itemType == ITEMTYPE_ARMOR_TRAIT or
-				itemType == ITEMTYPE_WEAPON_TRAIT or
-				itemType == ITEMTYPE_LOCKPICK or
-				itemType == ITEMTYPE_RAW_MATERIAL or
-				itemType == ITEMTYPE_RACIAL_STYLE_MOTIF or		-- 9-12-16 AM - added because motifs now appear to have level info in them
-				itemType == ITEMTYPE_RECIPE then
-				itemKey = IIfA:GetItemID(itemLink)
-			end
-		end
-
-		local itemIconFile, itemCount, _, _, _, equipType, _, itemQuality = GetItemInfo(bagId, slotNum)
-		itemCount = itemCount or qty
-		itemFilterType = GetItemFilterTypeInfo(bagId, slotNum) or 0
-		DBitem = DBv3[itemKey]
-		location = EMPTY_STRING
-		if(equipType == 0 or bagId ~= BAG_WORN) then equipType = false end
-		if(bagId == BAG_BACKPACK or bagId == BAG_WORN) then
-			location = IIfA.currentCharacterId
-
-		elseif(bagId == BAG_BANK or bagId == BAG_SUBSCRIBER_BANK) then
-			location = GetString(IIFA_BAG_BANK)
-		elseif(bagId == BAG_VIRTUAL) then
-			location =GetString(IIFA_BAG_CRAFTBAG)
-		elseif(bagId == BAG_GUILDBANK) then
-			location = GetGuildName(GetSelectedGuildBankId())
-		else
-			local collectibleId = GetCollectibleForHouseBankBag(GetBankingBag())
-			location = GetCollectibleNickname(collectibleId)
-			if location == EMPTY_STRING then location = GetCollectibleName(collectibleId) end
-		end
-		if(DBitem) then
-			DBitemlocation = DBitem.locations[location]
-			if DBitemlocation then
-				DBitemlocation.itemCount = DBitemlocation.itemCount + itemCount
-				DBitemlocation.bagSlot = DBitemlocation.bagSlot or slotNum
-			else
-				DBitem.locations[location] = {}
-				DBitem.locations[location].bagID = bagId
-				DBitem.locations[location].bagSlot = slotNum
-				DBitem.locations[location].itemCount = itemCount
-			end
-		else
-			DBv3[itemKey] = {}
-			DBv3[itemKey].iconFile = itemIconFile
-			DBv3[itemKey].filterType = itemFilterType
-			DBv3[itemKey].itemQuality = itemQuality
-			DBv3[itemKey].itemName = itemName
-			DBv3[itemKey].locations = {}
-			DBv3[itemKey].locations[location] = {}
-			DBv3[itemKey].locations[location].bagID = bagId
-			DBv3[itemKey].locations[location].bagSlot = slotNum
-			DBv3[itemKey].locations[location].itemCount = itemCount
-		end
-		if zo_strlen(itemKey) < 10 then
-			DBv3[itemKey].itemLink = itemLink
-		end
-		if (IIfA.trackedBags[bagId]) and fromXfer then
-			IIfA:ValidateItemCounts(bagId, slotNum, DBv3[itemKey], itemKey)
-		end
-
-	  	return DBv3[itemKey], itemKey
-	else
-		return nil
-	end
-end
-
-function IIfA:ValidateItemCounts(bagID, slotNum, dbItem, itemKey)
-	local itemLink, itemLinkCheck
-	if zo_strlen(itemKey) < 10 then
-		itemLink = dbItem.itemLink
-	else
-		itemLink = itemKey
-	end
-	IIfA:DebugOut("ValidateItemCounts: <<1>>x<<3>> in <<2>>", itemLink, bagID, slotNum)
-
-	for locName, data in pairs(dbItem.locations) do
---		if data.bagID ~= nil then	-- it's an item, not attribute
-			if (data.bagID == BAG_GUILDBANK and locName == GetGuildName(GetSelectedGuildBankId())) or
-			-- we're looking at the right guild bank
-			    data.bagID == BAG_VIRTUAL or
-				data.bagID == BAG_BANK or
-				data.bagID == BAG_SUBSCRIBER_BANK or
-				nil ~= GetCollectibleForHouseBankBag and nil ~= GetCollectibleForHouseBankBag(data.bagID) or -- is housing bank, manaeeee
-			   ((data.bagID == BAG_BACKPACK or data.bagID == BAG_WORN) and locName == GetCurrentCharacterId()) then
---		d(locName)
---		d(data)
---		d(GetItemLink(data.bagID, data.bagSlot, LINK_STYLE_BRACKETS))
-				itemLinkCheck = GetItemLink(data.bagID, data.bagSlot, LINK_STYLE_BRACKETS)
-				if itemLinkCheck == nil then
-					itemLinkCheck = EMPTY_STRING
-				end
---				d("ItemlinkCheck = " .. itemLinkCheck)
-				if itemLinkCheck ~= itemLink then
-					if bagID ~= data.bagID and slotNum ~= data.bagSlot then
---						d("should remove " .. itemLink .. " from " .. locName)
-					-- it's no longer the same item, or it's not there at all
-						self.data.DBv3[itemKey].locations[locName] = nil
-					end
-				end
-			end
---		end
-	end
-end
-
-function IIfA:CollectAll()
-	local bagItems = nil
-	local itemLink, dbItem = nil
-	local itemKey
-	local location = EMPTY_STRING
-	local BagList = IIfA.trackedBags -- 20.1. mana: Iterating over a list now
-
-	for bagId, tracked in ipairs(BagList) do
-
-		bagItems = GetBagSize(bagId)
-		if(bagId == BAG_WORN)then	--location for BAG_BACKPACK and BAG_WORN is the same so only reset once
-			IIfA:ClearLocationData(IIfA.currentCharacterId)
-		elseif(bagId == BAG_BANK) then	-- do NOT add BAG_SUBSCRIBER_BANK here, it'll wipe whatever already got put into the bank on first hit
-			IIfA:ClearLocationData(GetString(IIFA_BAG_BANK))
-		elseif(bagId == BAG_VIRTUAL)then
-			IIfA:ClearLocationData(GetString(IIFA_BAG_CRAFTBAG))
-		elseif GetAPIVersion() >= 100022 then -- 20.1. mana: bag bag bag
-			local collectibleId = GetCollectibleForHouseBankBag(bagId)
-			if IsCollectibleUnlocked(collectibleId) then
-				local name = GetCollectibleNickname(collectibleId) or GetCollectibleName(collectibleId)
-				IIfA:ClearLocationData(name)
-			end
-		end
---		d("  BagItemCount=" .. bagItems)
-		if bagId ~= BAG_VIRTUAL and tracked then
-			for slotNum=0, bagItems, 1 do
-				dbItem, itemKey = IIfA:EvalBagItem(bagId, slotNum)
-			end
-		else
-			if HasCraftBagAccess() then
-				slotNum = GetNextVirtualBagSlotId(nil)
-				while slotNum ~= nil do
-					IIfA:EvalBagItem(bagId, slotNum)
-					slotNum = GetNextVirtualBagSlotId(slotNum)
-				end
-			end
-		end
-	end
-
-	-- 6-3-17 AM - need to clear unowned items when deleting char/guildbank too
-	IIfA:ClearUnowned()
-end
-
-function IIfA:TrySaveBagInfo()
-
-end
-
-function IIfA:ClearUnowned()
--- 2015-3-7 Assembler Maniac - new code added to go through full inventory list, remove any un-owned items
-	local DBv3 = IIfA.data.DBv3
-	local n, ItemLink, DBItem
-	local ItemOwner, ItemData
-	for ItemLink, DBItem in pairs(DBv3) do
-		n = 0
-		for ItemOwner, ItemData in pairs(DBItem.locations) do
-			n = n + 1
-			if ItemOwner ~= "Bank" and ItemOwner ~= "CraftBag" then
-				if ItemData.bagID == BAG_BACKPACK or ItemData.bagID == BAG_WORN then
-					if IIfA.CharIdToName[ItemOwner] == nil then
-						DBItem[ItemOwner] = nil
-	  				end
-				elseif ItemData.bagID == BAG_GUILDBANK then
-					if IIfA.data.guildBanks[ItemOwner] == nil then
-						DBItem[ItemOwner] = nil
-					end
-				end
-			end
-		end
-		if (n == 0) then
-			DBv3[ItemLink] = nil
-		end
-	end
--- 2015-3-7 end of addition
-end
-
-
-function IIfA:ClearLocationData(location)
-	local DBv3 = IIfA.data.DBv3
-	local itemLocation = nil
-	local LocationCount = 0
-	local itemName, itemData
-
-	if(DBv3)then
-		for itemName, itemData in pairs(IIfA.data.DBv3) do
-			itemLocation = itemData.locations[location]
-			if (itemLocation) then
-				itemData.locations[location] = nil
-			end
-			LocationCount = 0
-			for locName, location in pairs(itemData.locations) do
-				LocationCount = LocationCount + 1
-				break
-			end
-			if(LocationCount == 0)then
-				DBv3[itemName] = nil
-			end
-		end
-	end
-end
-
--- rewrite item links with proper level value in them, instead of random value based on who knows what
--- written by SirInsidiator
-local function RewriteItemLink(itemLink)
-    local requiredLevel = select(6, ZO_LinkHandler_ParseLink(itemLink))
-    requiredLevel = tonumber(requiredLevel)
-    local trueRequiredLevel = GetItemLinkRequiredLevel(itemLink)
-
-    itemLink = string.gsub(itemLink, "|H(%d):item:(.*)" , "|H0:item:%2")
-
-    if requiredLevel ~= trueRequiredLevel then
-        itemLink = string.gsub(itemLink, "|H0:item:(%d+):(%d+):(%d+)(.*)" , "|H0:item:%1:%2:".. trueRequiredLevel .."%4")
-    end
-
-    return itemLink
-end
-
-local function GetItemIdentifier(itemLink)
-    local itemType = GetItemLinkItemType(itemLink)
-    local data = {zo_strsplit(":", itemLink:match("|H(.-)|h.-|h"))}
-    local itemId = data[3]
-    local level = GetItemLinkRequiredLevel(itemLink)
-    local cp = GetItemLinkRequiredChampionPoints(itemLink)
---	local results
---	results.itemId = itemId
---	results.itemType = itemType
---	results.level = level
---	results.cp = cp
-    if(itemType == ITEMTYPE_WEAPON or itemType == ITEMTYPE_ARMOR) then
-        local trait = GetItemLinkTraitInfo(itemLink)
-        return string.format("%s,%s,%d,%d,%d", itemId, data[4], trait, level, cp)
-    elseif(itemType == ITEMTYPE_POISON or itemType == ITEMTYPE_POTION) then
-        return string.format("%s,%d,%d,%s", itemId, level, cp, data[23])
-    elseif(hasDifferentQualities[itemType]) then
-        return string.format("%s,%s", itemId, data[4])
-    else
-        return itemId
-    end
-end
-
-function IIfA:RenameItems()
-	local DBv3 = IIfA.data.DBv3
-	local item = nil
-	local itemName
-
-	if(DBv3)then
-		for item, itemData in pairs(DBv3) do
-			itemName = nil
-			if item:match("|H") then
-				itemName = GetItemLinkName(item)
-			else
-				itemName = GetItemLinkName(itemData.itemLink)
-			end
-			if itemName ~= nil then
-				itemData.itemName = itemName
-			end
-		end
-	end
-end
-
-
diff --git a/IIfAEvents.lua b/IIfAEvents.lua
deleted file mode 100644
index cbbd6b8..0000000
--- a/IIfAEvents.lua
+++ /dev/null
@@ -1,195 +0,0 @@
-local IIfA = IIfA
-
--- 2016-7-26 AM - added global funcs for events
--- the following functions are all globals, not tied to the IIfA class, but call the IIfA class member functions for event processing
-
--- 2015-3-7 AssemblerManiac - added code to collect inventory data at char disconnect
-local function IIfA_EventOnPlayerUnloaded()
-	-- update the stored inventory every time character logs out, will assure it's always right when viewing from other chars
-	IIfA:CollectAll()
-
-	IIfA.CharCurrencyFrame:UpdateAssets()
-	IIfA.CharBagFrame:UpdateAssets()
-end
-
-local function IIfA_GuildBankDelayReady()
-	IIfA:GuildBankDelayReady()
-end
-
-local function IIfA_GuildBankAddRemove(...)
-	IIfA:GuildBankAddRemove(...)
-end
-
-local function IIfA_ActionLayerInventoryUpdate()
-	IIfA:ActionLayerInventoryUpdate()
-end
-
-local function IIfA_InventorySlotUpdate(...)
-	IIfA:InventorySlotUpdate(...)
-end
-
-local function IIfA_OnRightClickUp(rowControl)
-	IIfA:ProcessRightClick(rowControl)
-end
-
-
-local function IIfA_EventProc(...)
-	--d(...)
-	local l = {...}
-	local s = ""
-	for name, data in pairs(l) do
-		if type(data) ~= "table" then
-			s = s .. name .. " = " .. tostring(data) .. "\r\n"
-		else
-			s = s .. name .. " = {" .. "\r\n"
-			for name1, data1 in pairs(data) do
-				if type(data1) ~= "table" then
-					s = s .. "\t" .. name1 .. " = " .. tostring(data1) .. "\r\n"
-				else
-					s = s .. "\t" .. name1 .. " = {}" .. "\r\n"
-				end
-			end
-			s = s .. "}\r\n"
-		end
-	end
-	d(s)
-end
-
-local function finv1(...)
-	d("inventory open error")
-	IIfA_EventDump(...)
-end
-
-
-local function fgb1(...)
-	d("gb open error")
-	IIfA_EventDump(...)
-end
-local function fgb2(...)
-	d("gb updated qty")
-	IIfA_EventDump(...)
-end
-local function fgb3(...)
-	d("gb selected")
-	IIfA_EventDump(...)
-end
-local function fgb4(...)
-	d("gb deselected")
-	IIfA_EventDump(...)
-end
-local function fgb5(...)
-	d("gb items ready")
-	IIfA_EventDump(...)
-end
-
-function IIfA:RegisterForEvents()
-	-- 2016-6-24 AM - commented this out, doing nothing at the moment, revisit later
-	-- EVENT_MANAGER:RegisterForEvent("IIFA_PLAYER_LOADED_EVENTS", EVENT_PLAYER_ACTIVATED, IIfA_EventOnPlayerloaded)
-
-	-- 2015-3-7 AssemblerManiac - added EVENT_PLAYER_DEACTIVATED event
-	EVENT_MANAGER:RegisterForEvent("IIFA_PLAYER_UNLOADED_EVENTS", EVENT_PLAYER_DEACTIVATED, IIfA_EventOnPlayerUnloaded)
-
-	-- when item comes into inventory
-	EVENT_MANAGER:RegisterForEvent("IIFA_InventorySlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE, IIfA_InventorySlotUpdate)
-	EVENT_MANAGER:AddFilterForEvent("IIFA_InventorySlotUpdate", EVENT_INVENTORY_SINGLE_SLOT_UPDATE, REGISTER_FILTER_INVENTORY_UPDATE_REASON, INVENTORY_UPDATE_REASON_DEFAULT)
-
---	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_ITEM_SLOT_CHANGED, IIfA_EventDump)
---	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_INVENTORY_ITEM_USED, IIfA_EventDump)	-- arg 1 = event id, arg 2 = 27 (no clue)
---	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_INVENTORY_ITEM_DESTROYED, IIfA_EventDump)
---	EVENT_MANAGER:RegisterForEvent("IIFA_unknown", EVENT_JUSTICE_FENCE_UPDATE, IIfA_EventDump) -- # sold, # laundered is sent to event handler
-
--- not helpful, no link at all on this callback
---	SHARED_INVENTORY:RegisterCallback("SlotRemoved", IIfA_EventDump)
---	SHARED_INVENTORY:RegisterCallback("SingleSlotInventoryUpdate", IIfA_EventDump)
-
-	-- Events for data collection
-	EVENT_MANAGER:RegisterForEvent("IIFA_ALPUSH", EVENT_ACTION_LAYER_PUSHED, IIfA_ActionLayerInventoryUpdate)
-
-	-- on opening guild bank:
-	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_LOADED", EVENT_GUILD_BANK_ITEMS_READY, IIfA_GuildBankDelayReady)
-
---	EVENT_MANAGER:RegisterForEvent("IIFA_gb1", EVENT_GUILD_BANK_OPEN_ERROR, fgb1)
-	EVENT_MANAGER:RegisterForEvent("IIFA_gb2", EVENT_GUILD_BANK_UPDATED_QUANTITY, fgb2)
---	EVENT_MANAGER:RegisterForEvent("IIFA_gb3", EVENT_GUILD_BANK_SELECTED, fgb3)
---	EVENT_MANAGER:RegisterForEvent("IIFA_gb4", EVENT_GUILD_BANK_DESELECTED, fgb4)
---	EVENT_MANAGER:RegisterForEvent("IIFA_gb5", EVENT_GUILD_BANK_ITEMS_READY, fgb5)
-
-
-	-- on adding or removing an item from the guild bank:
-	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_ITEM_ADDED", EVENT_GUILD_BANK_ITEM_ADDED, IIfA_GuildBankAddRemove)
-	EVENT_MANAGER:RegisterForEvent("IIFA_GUILDBANK_ITEM_REMOVED", EVENT_GUILD_BANK_ITEM_REMOVED, IIfA_GuildBankAddRemove)
-
-	local function RebuildOptionsMenu()
-		self:CreateOptionsMenu()
-	end
-	EVENT_MANAGER:RegisterForEvent("IIFA_GuildJoin", EVENT_GUILD_SELF_JOINED_GUILD, RebuildOptionsMenu)
-	EVENT_MANAGER:RegisterForEvent("IIFA_GuildLeave", EVENT_GUILD_SELF_LEFT_GUILD, RebuildOptionsMenu)
-
---    ZO_QuickSlot:RegisterForEvent(EVENT_ABILITY_COOLDOWN_UPDATED, IIfA_EventDump)
-
-	ZO_PreHook('ZO_InventorySlot_ShowContextMenu', function(rowControl) IIfA_OnRightClickUp(rowControl) end)
-end
-
---[[ maybe revisit this in the future
-function IIfA_EventOnPlayerloaded()
-	--Do these things only on the first load
-	if(not IIfA.PlayerLoadedFired)then
-		--if(IIfA.data.in2AgedGuildBankDataWarning) then IIfA:CheckForAgedGuildBankData() end
-		--Set PlayerLoadedFired = true to prevent future execution during this session
-		IIfA.PlayerLoadedFired = true
-	end
-	--Do these things on any load
-	--Do a little dance...
-	--Make a little love...
-	--Get down tonight...
-end
- --]]
-
-
-
---[[ registerfilter & events
-define HOW to listen for events (minimize # of calls to event handler, less overhead of eso internals)
-EVENT_MANAGER:RegisterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE, OnInventorySlotUpdate)
-EVENT_MANAGER:AddFilterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE,  REGISTER_FILTER_BAG_ID, BAG_BACKPACK)
-EVENT_MANAGER:AddFilterForEvent(ADDON_NAME, EVENT_INVENTORY_SINGLE_SLOT_UPDATE,  REGISTER_FILTER_INVENTORY_UPDATE_REASON, INVENTORY_UPDATE_REASON_DEFAULT)
---]]
-
-
---[[ event for SHARED_INVENTORY:RegisterCallback sends as follows, and has no itemlink :(
-arg 1 = 5		-- bag id
-arg 2 = 71198		-- slot number
-arg 3 = {
-  inventory = {}
-  condition = 100
-  age = 6702.2509765625
-  isPlaceableFurniture = false
-  searchData = {}
-  requiredLevel = 1
-  stackCount = 1426
-  stolen = false
-  isPlayerLocked = false
-  brandNew = true
-  sellPrice = 2
-  itemInstanceId = 3340100312
-  statValue = 0
-  rawName = rubedite ore
-  locked = false
-  isJunk = false
-  stackSellPrice = 2852
-  slotIndex = 71198
-  specializedItemType = 0
-  isBoPTradeable = false
-  meetsUsageRequirement = true
-  quality = 1
-  filterData = {}
-  equipType = 0
-  name = Rubedite Ore
-  itemType = 35
-  bagId = 5
-  stackLaunderPrice = 0
-  uniqueId = 3.5176485852605e-319
-  iconFile = /esoui/art/icons/crafting_jewelry_base_ruby_r1.dds
-  launderPrice = 0
-  }
-
---]]
diff --git a/IIfAMenu.lua b/IIfAMenu.lua
deleted file mode 100644
index 0943b90..0000000
--- a/IIfAMenu.lua
+++ /dev/null
@@ -1,541 +0,0 @@
---this creates a menu for the addon.
-IIfA = IIfA
-
-local LAM = LibStub("LibAddonMenu-2.0")
-local LMP = LibStub("LibMediaProvider-1.0")
-
-local function getCharacterInventories()
-
-	local accountInventories = {}
-
-	if nil ~= IIfA:GetCharacterList() then
-		for characterName, character in pairs(IIfA:GetCharacterList()) do
-			d("inserting " .. characterName)
-			table.insert(accountInventories, characterName)
-		end
-	end
-
-	return accountInventories
-end
-
-local function getGuildBanks()
-	local guildBanks = {}
-	if(IIfA.data.guildBanks) then
-		for guildName, guildData in pairs(IIfA.data.guildBanks) do
-			if guildData.bCollectData == nil then
-				guildData.bCollectData = true
-			end
-			table.insert(guildBanks, guildName)
-		end
-	end
-	return guildBanks
-end
-
---[[checkboxData = {
-	type = "checkbox",
-	name = "My Checkbox", -- or string id or function returning a string
-	getFunc = function() return db.var end,
-	setFunc = function(value) db.var = value doStuff() end,
-	tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
-	width = "full", -- or "half" (optional)
-	disabled = function() return db.someBooleanSetting end,	--or boolean (optional)
-	warning = "Will need to reload the UI.", -- or string id or function returning a string (optional)
-	default = defaults.var,	-- a boolean or function that returns a boolean (optional)
-	reference = "MyAddonCheckbox", -- unique global reference to control (optional)
-}	]]
-
-local function getGuildBankName(guildNum)
-	if guildNum > GetNumGuilds() then return end
-	id = GetGuildId(guildNum)
-	return GetGuildName(id)
-end
-
-local function getGuildBankKeepDataSetting(guildNum)
-	guildName = getGuildBankName(guildNum)
-
-	if IIfA.data.guildBanks[guildName] == nil then return false end
-
-	if IIfA.data.guildBanks[guildName].bCollectData == nil then
-		IIfA.data.guildBanks[guildName].bCollectData = true
-	end
-
-	return IIfA.data.guildBanks[guildName].bCollectData
-end
-
-local function setGuildBankKeepDataSetting(guildNum, newSetting)
-	guildName = getGuildBankName(guildNum)
-	if guildName ~= nil then
-		IIfA.data.guildBanks[guildName].bCollectData = newSetting
-	end
-end
-
-function IIfA:CreateOptionsMenu()
-	local deleteChar, deleteGBank, undeleteChar
-
-	local optionsData = {
-		{	type = "header",
-			name = "Global Settings",
-		},
-		{
-			type = "checkbox",
-			tooltip = "Should you really wish to move your window around a hundred times, uncheck this box",
-			name = "Use same settings for all characters?",
-			getFunc = function() return IIfA.data.saveSettingsGlobally end,
-			setFunc = function(value)
-				IIfA.data.saveSettingsGlobally = value
-			end
-		},
-		{
-			type = "checkbox",
-			tooltip = "Prints verbose debugging to the ChatFrame. '/ii debug' for quick toggle",
-			name = "Debugging",
-			getFunc = function() return IIfA.data.bDebug end,
-			setFunc = function(value) IIfA.data.bDebug = value end
-		},
-
-		{
-			type = "submenu",
-			name = "Manage Collected Data",
-			tooltip = "Manage collected Characters and Guild Banks. Delete data you no longer need (old guilds or deleted characters)",	--(optional)
-			controls = {
-				{	type 	= "description",
-					title 	= "Ignore or delete characters",
-					text 	= "removes or un-tracks a character. \nWarning: This change will be applied immediately.",
-				},
-				{
-					type 	= "dropdown",
-					name 	= "characters to delete or un-track",
-					choices = IIfA:GetCharacterList(),
-					getFunc = function() return end,
-					setFunc = function(choice) deleteChar = nil; deleteChar = choice end
-				}, --dropdown end
-
-				{  -- button begin
-					type = "button",
-					width = "half",
-					name = "Delete Character",
-					tooltip = "Delete Inventory Insight data for the character selected above",
-					func = function() IIfA:DeleteCharacterData(deleteChar) end,
-
-				}, -- button end
-				{  -- button begin
-					type = "button",
-					width = "half",
-					name = "Ignore Equipment",
-					tooltip = "All items equipped by the current character will be ignored",
-					func = function() IIfA:IgnoreCharacterEquip(deleteChar, true) end,
-
-				}, -- button end
-				{  -- button begin
-					type = "button",
-					width = "half",
-					name = "Ignore Inventory",
-					tooltip = "This character's carried inventory will be ignored",
-					func = function() IIfA:IgnoreCharacterInventory(deleteChar, true) end,
-				}, -- button end
-
-				{	type 	= "description",
-					title 	= "Unignore characters",
-					text 	= "Adds an ignored character back to the tracking lists",
-				},
-				{
-					type = "dropdown",
-					name = "Character to unignore",
-					choices = IIfA:GetIgnoredCharacterList(),
-					getFunc = function() return end,
-					setFunc = function(choice) undeleteChar = nil; undeleteChar = choice end
-				}, --dropdown end
-
-				{  -- button begin
-					type = "button",
-					width = "half",
-					name = "Unignore",
-					tooltip = "All items equipped by the current character will be tracked again",
-					func = function()
-						IIfA:IgnoreCharacterEquip(undeleteChar, false)
-						IIfA:IgnoreCharacterInventory(undeleteChar, false)
-					end,
-				}, -- button end
-
-				{	type 	= "description",
-					title 	= "Guild Bank To Delete",
-					text 	= "Delete Inventory Insight data for guild. \nWarning: This change will be applied immediately.",
-				},
-				{ -- dropdown begin
-					 type = "dropdown",
-					 name = 'Guild Bank To Delete',
-					 choices = getGuildBanks(),
-					 getFunc = function() return end,
-					 setFunc = function(choice) deleteGBank = nil; deleteGBank = choice end
-
-				}, -- dropdown end
-
-				{	-- button begin
-					type = "button",
-					name = "Delete Guild Bank",
-					tooltip = "Delete Inventory Insight data for the guild selected above",
-					func = function() IIfA:DeleteGuildData(deleteGBank) end,
-				}, -- button end
-
-
-			}, -- Collected Guild Bank Data controls end
-
-		}, -- Collected Guild Bank Data submenu end
-
-		{
-			type = "submenu",
-			name = "Guild Bank Options",
-			tooltip = "Manage data collection options for Guild Banks",
-			controls = {}
-		},
-
-		{
-			type = "submenu",
-			name = "Pack Use/Size highlites",
-			tooltip = "Set the counts/colors for 2 the levels of count warnings",	--(optional)
-			controls = {
-				{
-				type = "slider",
-				name = "Used Space Warning Threshold",
-				getFunc = function() return IIfA.data.BagSpaceWarn.threshold end,
-				setFunc = function(choice) IIfA.data.BagSpaceWarn.threshold = choice end,
-				min = 1,
-				max = 100,
-				step = 1, --(optional)
-				clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
-				decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
-				tooltip = "Percent Value: if bag space used is above threshold, it will be shown in the below color",
-				default = 85, -- default value or function that returns the default value (optional)
-				}, -- slider end
-
-				{
-				type = "colorpicker",
-				name = "Used Space Warning Color",
-				getFunc = function() return IIfA.data.BagSpaceWarn.r, IIfA.data.BagSpaceWarn.g, IIfA.data.BagSpaceWarn.b end,
-				setFunc = function(r,g,b,a) IIfA.data.BagSpaceWarn.r = r
-						IIfA.data.BagSpaceWarn.g = g
-						IIfA.data.BagSpaceWarn.b = b
-						IIfA.CharBagFrame.ColorWarn = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceWarn)
-						IIfA.CharBagFrame:RepaintSpaceUsed()
-				end, --(alpha is optional)
-				tooltip = "Color used to show bag space when greater than the designated threshold",
-				default = {r = 230 / 255, g = 130 / 255, b = 0},
-				}, -- colorpicker end
-
-				{
-				type = "slider",
-				name = "Used Space Alert Threshold",
-				getFunc = function() return IIfA.data.BagSpaceAlert.threshold end,
-				setFunc = function(choice) IIfA.data.BagSpaceAlert.threshold = choice end,
-				min = 1,
-				max = 100,
-				step = 1, --(optional)
-				clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
-				decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
-				tooltip = "Percent Value: if bag space used is above threshold, it will be shown in the below color",
-				default = 95, -- default value or function that returns the default value (optional)
-				}, -- slider end
-
-				{
-				type = "colorpicker",
-				name = "Used Space Alert Color",
-				getFunc = function() return IIfA.data.BagSpaceAlert.r, IIfA.data.BagSpaceAlert.g, IIfA.data.BagSpaceAlert.b end,
-				setFunc = function(r,g,b,a) IIfA.data.BagSpaceAlert.r = r
-						IIfA.data.BagSpaceAlert.g = g
-						IIfA.data.BagSpaceAlert.b = b
-						IIfA.CharBagFrame.ColorAlert = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceAlert)
-						IIfA.CharBagFrame:RepaintSpaceUsed()
-				end, --(alpha is optional)
-				tooltip = "Color used to show bag space when greater than the designated threshold",
-				default = {r = 1, g = 1, b = 0},
-				}, -- colorpicker end
-
-				{
-				type = "colorpicker",
-				name = "Used Space Full Color",
-				getFunc = function() return IIfA.data.BagSpaceFull.r, IIfA.data.BagSpaceFull.g, IIfA.data.BagSpaceFull.b end,
-				setFunc = function(r,g,b,a) IIfA.data.BagSpaceFull.r = r
-						IIfA.data.BagSpaceFull.g = g
-						IIfA.data.BagSpaceFull.b = b
-						IIfA.CharBagFrame.ColorFull = IIfA.CharBagFrame:rgb2hex(IIfA.data.BagSpaceFull)
-						IIfA.CharBagFrame:RepaintSpaceUsed()
-				end, --(alpha is optional)
-				tooltip = "Color used to show bag space when it's full",
---				width = "full", --or "half" (optional)
-				default = {r = 255, g = 0, b = 0},
-				}, -- colorpicker end
-
-			},
-		},
-
-		{
-			type = "header",
-			name = "Global/Per Char settings",
-		},
-
-		{
-			type = "submenu",
-			name = "Tooltips",
-			tooltip = "Manage tooltip options for both default and custom IIfA tooltips",
-			controls = {
-				{
-					type = "dropdown",
-					name = "Show IIfA Tooltips",
-					choices = {"Always", "IIfA", "Never" },
-					tooltip = "Choose when to display IIfA info on Tooltips",
-					getFunc = function() return IIfA:GetSettings().showToolTipWhen end,
-					setFunc = function(value) 	IIfA:GetSettings().showToolTipWhen = value end,
-				}, -- checkbox end
-
-				{
-					type = "checkbox",
-					name = "Show Info in Separate Frame",
-					tooltip = "Enables/Disables display of Style Info and Location info in a separate frame, or within the tooltip",
-					getFunc = function() return 	IIfA:GetSettings().bInSeparateFrame end,
-					setFunc = function(value)		IIfA:GetSettings().bInSeparateFrame = value end,
-				}, -- checkbox end
-
-				{
-					type = "checkbox",
-					name = "Show Style Info",
-					tooltip = "Enables/Disables display of Style Info on the tooltips",
-					getFunc = function() return IIfA:GetSettings().showStyleInfo end,
-					setFunc = function(value) 	IIfA:GetSettings().showStyleInfo = value end,
-				}, -- checkbox end
-
-				 {
-					type = "colorpicker",
-					name = 'Tooltip Inventory Information Text Color',
-					tooltip = 'Sets the color of the text for the inventory information that gets added to Tooltips.',
-					getFunc = function() return IIfA.colorHandler:UnpackRGBA() end,
-					setFunc = function(...)
-						IIfA.colorHandler:SetRGBA(...)
-						IIfA:GetSettings().in2TextColors = IIfA.colorHandler:ToHex()
-					end
-				},
-
-				{
-					type = "dropdown",
-					name = "Tooltips Font",
-					tooltip = "The font used for location information added to both default and custom IN2 tooltips",
-					choices = LMP:List('font'),
-					getFunc = function() return (IIfA:GetSettings().in2TooltipsFont or "ZoFontGame") end,
-					setFunc = function( choice )
-						IIfA:StatusAlert("[IIfA]:TooltipsFontChanged["..choice.."]")
-						IIfA:SetTooltipFont(choice)
-					end
-				},
-
-				{
-					type = "slider",
-					name = "Tooltip Font Size",
-					tooltip = "The font size used for location information added to both default and custom IIfA tooltips",
-					min = 5,
-					max = 40,
-					step = 1,
-					getFunc = function() return IIfA:GetSettings().in2TooltipsFontSize end,
-					setFunc = function(value)
-						IIfA:GetSettings().in2TooltipsFontSize = value
-					end,
-				},
-
-			}, -- controls end
-
-
-		}, -- tooltipOptionsSubWindow end
-
-		{
-			type = "checkbox",
-			tooltip = "Show Item Count on Right side of list",
-			name = "Item Count on Right",
-			getFunc = function() return IIfA:GetSettings().showItemCountOnRight end,
-			setFunc = function(value)
-					IIfA:StatusAlert("[IIfA]:ItemCountOnRight[" .. tostring(value) .. "]")
-					IIfA:GetSettings().showItemCountOnRight = value
-					IIfA:SetItemCountPosition()
-			end,
-		},
-
-		{
-			type = "dropdown",
-			name =  "Default Inventory Frame View",
-			tooltip =  "The default view (in the dropdown) set when the inventory frame loads",
-			choices = IIfA.dropdownBankNames,
-			default = IIfA:GetSettings().in2DefaultInventoryFrameView,
-			getFunc = function() return IIfA:GetSettings().in2DefaultInventoryFrameView end,
-			setFunc = function( value )
-				IIfA:StatusAlert("[IIfA]:DefaultInventoryFrameView["..value.."]")
-				IIfA:GetSettings().in2DefaultInventoryFrameView = value
-				-- 2015-3-9 Assembler Maniac - next line changed to stop crash
-				ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_Dropdown):SetSelectedItem(value)
-				IIfA:SetInventoryListFilter(value)
-				return
-			end
-			-- warning = "Will need to reload the UI",	--(optional)
-		},
-
-		{
-			type = "checkbox",
-			name = "Search Set Names when using Text Filter",
-			tooltip = "Enables/Disables set name inclusion in searches",
-			getFunc = function() return IIfA:GetSettings().bFilterOnSetNameToo end,
-			setFunc = function(value)
-				IIfA:GetSettings().bFilterOnSetNameToo = value
-			end,
-		}, -- checkbox end
-
-		{
-			type = "checkbox",
-			name = "Default to search only Set Names when using Text Filter",
-			tooltip = "Enables/Disables set name inclusion in searches",
-			getFunc = function() return IIfA:GetSettings().bFilterOnSetName end,
-			setFunc = function(value)
-				IIfA:GetSettings().bFilterOnSetName = value
-				IIfA.bFilterOnSetName = value
-				IIFA_GUI_SetNameOnly_Checked:SetHidden(not value)
-			end,
-		}, -- checkbox end
-
-		{
-			type = "header",
-			name = "Major Scene Toggles",
-		},
-
-		{
-			type = "checkbox",
-			name = "Inventory scene",
-			tooltip = "Makes the Inventory Frame visible while viewing your inventory",
-			getFunc = function() return IIfA:GetSceneVisible("inventory") end,
-			setFunc = function(value) IIfA:SetSceneVisible("inventory", value) end,
-
-			},
-
-		{
-			type = "checkbox",
-			tooltip = "Makes the Inventory Frame visible while viewing your bank",
-			name = "Bank scene",
-			getFunc = function() return IIfA:GetSceneVisible("bank") end,
-			setFunc = function(value) IIfA:SetSceneVisible("bank", value) end,
-		},
-
-		{
-			type = "checkbox",
-			name = "Guild Bank scene",
-			tooltip = "Makes the Inventory Frame visible while viewing your guild vault",
-			getFunc = function() return IIfA:GetSceneVisible("guildBank") end,
-			setFunc = function(value) IIfA:SetSceneVisible("guildBank", value) end,
-		},
-
-		{
-			type = "checkbox",
-			name = "Guild Store scene",
-			tooltip = "Makes the Inventory Frame visible while accessing the guild store",
-			getFunc = function() return IIfA:GetSceneVisible("tradinghouse") end,
-			setFunc = function(value) IIfA:SetSceneVisible("tradinghouse", value) end,
-		},
-
-		 {
-			type = "checkbox",
-			name = "Crafting scene",
-			tooltip = "Makes the Inventory Frame visible while Crafting",
-			getFunc = function() return IIfA:GetSceneVisible("smithing") end,
-			setFunc = function(value) IIfA:SetSceneVisible("smithing", value) end,
-		},
-
-		 {
-			type = "checkbox",
-			name = "Vendor scene",
-			tooltip = "Makes the Inventory Frame visible while buying/selling",
-			getFunc = function() return IIfA:GetSceneVisible("store") end,
-			setFunc = function(value)	IIfA:SetSceneVisible("store", value) end,
-		},
-
-		 {
-			type = "checkbox",
-			name = "Stables scene",
-			tooltip = "Makes the Inventory Frame visible while talking with the Stablemaster",
-			getFunc = function() return IIfA:GetSceneVisible("stables") end,
-			setFunc = function(value) IIfA:SetSceneVisible("stables", value) end,
-		},
-
-
-		 {
-			type = "checkbox",
-			name = "Trading scene",
-			tooltip = "Makes the Inventory Frame visible while trading",
-			getFunc = function() return IIfA:GetSceneVisible("trade") end,
-			setFunc = function(value) IIfA:SetSceneVisible("trade", value) end,
-		},
-
-	-- options data end
-	}
-
-	-- run through list of options, find one with empty controls, add in the submenu for guild banks options
-	local i, data
-	for i, data in ipairs(optionsData) do
-		if data.controls ~= nil then
-			if #data.controls == 0 then
-				data.controls[1] =
-					{
-						type = "checkbox",
-						name = "Guild Bank Data Collection",
-						tooltip = "Enables/Disables data collection for all guild banks on this account",
-						warning = "Guild bank information will not be updated if this option is turned off!",
-						getFunc = function() return IIfA.data.bCollectGuildBankData end,
-						setFunc = function(value)
-							IIfA.data.bCollectGuildBankData = value
-							IIfA.trackedBags[BAG_GUILDBANK] = value
-						end,
-					}
-				for i = 1, GetNumGuilds() do
-					local id = GetGuildId(i)
-					local guildName = GetGuildName(id)
-					data.controls[i + 1] =
-					{
-						type = "checkbox",
-						name = "Collect data for " .. guildName .. "?",
-						tooltip = "Enables/Disables data collection for this guild bank",
-						warning = "Guild bank information for this guild bank will not be updated if this option is turned off!",
-						getFunc = function() return getGuildBankKeepDataSetting(i) end,
-						setFunc = function(value) setGuildBankKeepDataSetting(i, value) end,
-						disabled = function() return (not IIfA.data.bCollectGuildBankData) end,
-					}
-	--[[
-					{
-						type = "checkbox",
-						name = "Old Guild Bank Data Alert",
-						tooltip = "Enables/Disables an alert that will notify you once, when you first log in, if one or more guild banks contain data that is 5 days or older",
-						-- 3-29-15 - AssemblerManiac - changed .data. to :GetSettings(). next 2 occurances
-						getFunc = function() return IIfA:GetSettings().in2AgedGuildBankDataWarning end,
-						setFunc = function(value)
-							IIfA:GetSettings().in2AgedGuildBankDataWarning = value
-							end,
-					}, -- checkbox end
-	]]--
-				end
-			end
-		end
-	end
-
-	LAM:RegisterOptionControls("IIfA_OptionsPanel", optionsData)
-
-end
-
-function IIfA:CreateSettingsWindow(savedVars, defaults)
-
-	local panelData = {
-		type = "panel",
-		name = IIfA.name,
-		displayName = name,
-		author = IIfA.author,
-		version = IIfA.version,
-		slashCommand = "/iifa",	--(optional) will register a keybind to open to this panel
-		registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
-		registerForDefaults = true	--boolean (optional) (will set all options controls back to default values)
-	}
-
-	LAM:RegisterAddonPanel("IIfA_OptionsPanel", panelData)
-
-	self:CreateOptionsMenu()
-
-   end
diff --git a/IIfASceneFuncs.lua b/IIfASceneFuncs.lua
deleted file mode 100644
index 36d55cb..0000000
--- a/IIfASceneFuncs.lua
+++ /dev/null
@@ -1,124 +0,0 @@
--- scene related functions (show/hide/determine/register)
-
-
-function IIfA:GetCurrentSceneName()
-	local ret = ""
-
-	-- [16:20] scene name: 65553, hidden: false
-	if not SCENE_MANAGER or not SCENE_MANAGER:GetCurrentScene() then
-		ret = "hud"
-	elseif SCENE_MANAGER:GetCurrentScene().name == "hudui" then
-		ret = "hud"
-	else
-		ret = SCENE_MANAGER:GetCurrentScene().name
-	end
-
-	if tostring(ret) == "65553" then ret = "hud" end
-
-	return ret
-end
-
-function IIfA:RegisterForSceneChanges()
-	local scenes = IIfA:GetSettings().frameSettings
-	for sceneName, settings in pairs(scenes) do
-		if (sceneName ~= "hudui") then
-			local scene = SCENE_MANAGER:GetScene(sceneName)
-			if scene then
-				scene:RegisterCallback("StateChange", function(...)
-					IIfA:ProcessSceneChange(sceneName, ...)
-				end)
-			end
--- for reasons unknown, hudui doesn't always appear to be "found" for items in the list (get cur scene from scene_manager sometimes says hud, when it's hudui), force it to work same as HUD here
-			if (sceneName == "hud") then
-				local scene = SCENE_MANAGER:GetScene("hudui")
-				scene:RegisterCallback("StateChange", function(...)
-					IIfA:ProcessSceneChange(sceneName, ...)
-				end)
-			end
-		end
-	end
-end
-
-function IIfA:GetSceneSettings(sceneName)
-
-	sceneName = sceneName or IIfA:GetCurrentSceneName()
-
-
-	local settings = IIfA:GetSettings().frameSettings
-
-	if not settings[sceneName] then
-		-- if we have to create a new set of scene info, register it in the scene change too, it'll be set again during next opening
-
-		local scene = SCENE_MANAGER:GetScene(sceneName)
-		scene:RegisterCallback("StateChange", function(...)
-				IIfA:ProcessSceneChange(sceneName, ...)
-			end)
-		-- save the settings in the settings table, base it on HUD
-		settings[sceneName] = ZO_DeepTableCopy(settings["hud"])
-		settings[sceneName].hidden = true
-		settings[sceneName].docked = false
-	end
-
-	return settings[sceneName]
-
-end
-
-
-function IIfA:ProcessSceneChange(sceneName, oldState, newState)
-
-
-	-- IIfA:DebugOut(zo_strformat("ProcessSceneChange <<1>>: <<2>> -> <<3>>", sceneName, oldState, newState))
-	if (tostring(newState) == "shown") then
-		sceneName = IIfA:GetCurrentSceneName()
-		local settings = IIfA:GetSceneSettings(sceneName)
-		self:RePositionFrame(settings)
-
-	elseif (tostring(newState) == "hidden") then
-		IIFA_GUI:SetHidden(true)
-	end
-end
-
-
-function IIfA:SaveFrameInfo(calledFrom)
-	if (calledFrom == "onHide") then return end
-
-	local sceneName = IIfA:GetCurrentSceneName()
-	local settings = IIfA:GetSceneSettings(sceneName)
-
-    settings.hidden    	=  IIFA_GUI:IsControlHidden()
---    settings.locked    	=  IIFA_GUI.locked
---    settings.minimized 	=  IIFA_GUI.minimized
---	settings.docked		=  IIFA_GUI.docked
-
---	if sceneName ~= "hud" then
---		settings.docked = IIFA_GUI.docked
---	else
---		settings.docked = false
---	end
-
-	if (not settings.docked and (calledFrom == "onMoveStop" or calledFrom == "onResizeStop")) then
-    	settings.lastX	= IIFA_GUI:GetLeft()
-    	settings.lastY	= IIFA_GUI:GetTop()
-		if not settings.minimized then
-			settings.width	= IIFA_GUI:GetWidth()
-    		settings.height	= IIFA_GUI:GetHeight()
-		end
-	end
-end
-
--- called only from bindings.xml on keypress
-function IIfA:ToggleInventoryFrame()
-	IIFA_GUI:SetHidden(not IIFA_GUI:IsControlHidden())
-	if not IIFA_GUI:IsControlHidden() then
-		IIfA:OnFirstInventoryOpen()
-		-- get current camera mode so when we toggle off, we put it back to where it was (maybe, can think of some weird circumstances where it might screw it up)
-		SetGameCameraUIMode(true)
-		IIfA:GuiResizeScroll()
-    	IIfA:UpdateScrollDataLinesData()
-    	IIfA:UpdateInventoryScroll()
-	end
-
-	IIfA:SaveFrameInfo("ToggleInventoryFrame")
-end
-
-
diff --git a/IIfASettingsAdapter.lua b/IIfASettingsAdapter.lua
deleted file mode 100644
index 2ea520b..0000000
--- a/IIfASettingsAdapter.lua
+++ /dev/null
@@ -1,37 +0,0 @@
- local IIfA = IIfA
-
-
-function IIfA:IsCharacterInventoryIgnored(ignoreChar)
-	return IIfA.data.ignoredCharEquipment[ignoreChar]
-end
-
-function IIfA:IsCharacterEquipIgnored(ignoreChar)
-	return IIfA.data.ignoredCharInventories[ignoreChar]
-end
-
-function IIfA:IgnoreCharacterEquip(ignoreChar, value)
-	IIfA.data.ignoredCharEquipment[ignoreChar] = value
-	IIfA:ScanCurrentCharacter()
-end
-function IIfA:IgnoreCharacterInventory(ignoreChar, value)
-	IIfA.data.ignoredCharInventories[ignoreChar] = value
-	IIfA:ScanCurrentCharacter()
-end
-function IIfA:GetCharacterList()
-	return IIfA.data.accountCharacters
-end
-
-function IIfA:GetIgnoredCharacterList()
-	local ret = {}
-	local wasAdded = {}
-	for characterName, characterData in pairs(IIfA.data.ignoredCharEquipment) do
-		table.insert(ret, characterName)
-		wasAdded[characterName] = true
-	end
-	for characterName, characterData in pairs(IIfA.data.ignoredCharInventories) do
-		if not wasAdded[characterName] then
-			table.insert(ret, characterName)
-		end
-	end
-	return ret
-end
\ No newline at end of file
diff --git a/IIfATooltip.lua b/IIfATooltip.lua
deleted file mode 100644
index 3949c7d..0000000
--- a/IIfATooltip.lua
+++ /dev/null
@@ -1,553 +0,0 @@
-local IIfA = IIfA
-IIfA.LastActiveRowControl = nil
-
-function IIfA:addStatsPopupTooltip(...)
-	d("IIFA - Popup tooltip OnUpdate hit")
-	d(...)
-end
-
-
-function IIfA:CreateTooltips()
-	WINDOW_MANAGER:CreateControlFromVirtual("IIFA_ITEM_TOOLTIP", ItemTooltipTopLevel, "IIFA_ITEM_TOOLTIP")
-	WINDOW_MANAGER:CreateControlFromVirtual("IIFA_POPUP_TOOLTIP", ItemTooltipTopLevel, "IIFA_POPUP_TOOLTIP")
-
---	zo_callLater(function() ZO_PreHookHandler(PopupTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch) end , 7000)
---	ZO_PreHookHandler(PopupTooltip, 'OnUpdate', function() self:addStatsPopupTooltip() end)
-	ZO_PreHookHandler(PopupTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch)
-	ZO_PreHookHandler(PopupTooltip, 'OnHide', IIfA_HideTooltip)
-
-	ZO_PreHookHandler(ItemTooltip, 'OnAddGameData', IIfA_TooltipOnTwitch)
-	ZO_PreHookHandler(ItemTooltip, 'OnHide', IIfA_HideTooltip)
-
-	ZO_PreHook("ZO_PopupTooltip_SetLink", function(itemLink) IIfA.TooltipLink = itemLink end)
-
-	IIfA:SetTooltipFont(IIfA:GetSettings().in2TooltipsFont)
-end
-
-function IIfA:SetTooltipFont(font)
-	if not font or font == "" then font = "ZoFontGameMedium" end
---	d("SetTooltipFont called with " .. tostring(font))
-	IIfA:GetSettings().in2TooltipsFont = font
---	IIFA_ITEM_TOOLTIP:GetNamedChild("_Label"):SetFont(font)
---	IIFA_POPUP_TOOLTIP:GetNamedChild("_Label"):SetFont(font)
-end
-
-local function getTex(name)
-	return ("IIfA/assets/icons/" .. name .. ".dds")
-end
-
-IIfA.racialTextures = {
-	[0]		= { styleName = "", styleTexture = ""},
-	[1]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(1)), styleTexture = getTex("breton")}, 				-- Breton
-	[2]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(2)), styleTexture = getTex("redguard")}, 			-- Redguard
-	[3]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(3)), styleTexture = getTex("orsimer")}, 				-- Orc
-	[4]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(4)), styleTexture = getTex("dunmer")}, 				-- Dark Elf
-	[5]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(5)), styleTexture = getTex("nord")}, 				-- Nord
-	[6]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(6)), styleTexture = getTex("argonian")}, 			-- Argonian
-	[7]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(7)), styleTexture = getTex("altmer")}, 				-- High Elf
-	[8]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(8)), styleTexture = getTex("bosmer")}, 				-- Wood Elf
-	[9]		= { styleName = zo_strformat("<<1>>", GetItemStyleName(9)), styleTexture = getTex("khajit")}, 				-- Khajiit
-	[10]  	= { styleName = zo_strformat("<<1>>", GetItemStyleName(10)), styleTexture = getTex("telvanni")}, 			-- Unique
-	[11] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(11)), styleTexture = getTex("thief")}, 				-- Thieves Guild
-	[12] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(12)), styleTexture = getTex("darkbrotherhood")}, 	-- Dark Brotherhood
-	[13] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(13)), styleTexture = getTex("malacath")}, 			-- Malacath
-	[14] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(14)), styleTexture = getTex("dwemer")}, 				-- Dwemer
-	[15] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(15)), styleTexture = getTex("ancient")}, 			-- Ancient Elf
-	[16] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(16)), styleTexture = getTex("akatosh")}, 			-- Akatosh
-	[17] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(17)), styleTexture = getTex("reach")}, 				-- Reach
-	[18] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(18)), styleTexture = getTex("bandit")}, 				-- Bandit
-	[19] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(19)), styleTexture = getTex("primitive")}, 			-- Primitive
-	[20] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(20)), styleTexture = getTex("daedric")}, 			-- Daedric
-	[21] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(21)), styleTexture = getTex("trinimac")}, 			-- Trinimac
-	[22] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(22)), styleTexture = getTex("orsimer")}, 			-- Ancient Orc
-	[23] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(23)), styleTexture = getTex("daggerfall")}, 			-- Daggerfall Covenant - "Ding-a-ling Smurf"
-	[24] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(24)), styleTexture = getTex("ebonheart")}, 			-- Ebonheart Pact - "Funny Tomato"
-	[25] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(25)), styleTexture = getTex("ancient")}, 			-- Aldmeri Dominion - "chiquita banana"
-	[26] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(26)), styleTexture = getTex("laurel")}, 				-- Undaunted
-	[27] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(27)), styleTexture = getTex("dragonknight")}, 		-- Craglorn
-	[28] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(28)), styleTexture = getTex("templar")}, 			-- Glass
-	[29] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(29)), styleTexture = getTex("nightblade")}, 			-- Xivkyn
-	[30] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(30)), styleTexture = getTex("soulshriven")}, 		-- Soul Shriven
-	[31] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(31)), styleTexture = getTex("skull")},  				-- Draugr
-	[32] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(32)), styleTexture = getTex("maormer")},  			-- Maormer
-	[33] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(33)), styleTexture = getTex("akaviri")},  			-- Akaviri
-	[34] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(34)), styleTexture = getTex("imperial")}, 			-- Imperial
-	[35] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(35)), styleTexture = getTex("akaviri")}, 			-- Yokudan
-	[36] 	= { styleName = "Universal", styleTexture = getTex("imperial")}, 											-- "Universal" what the hell
-	[37] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(37)), styleTexture = getTex("reach")}, 				-- Reach Winter
-	[38] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(38)), styleTexture = getTex("tsaesci")}, 			-- Tsaesci
-	[39] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(39)), styleTexture = getTex("minotaur")}, 			-- Minotaur
-	[40] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(40)), styleTexture = getTex("ebony")}, 				-- Ebony
-	[41] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(41)), styleTexture = getTex("abahswatch")}, 			-- Abah's Watch
-	[42] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(42)), styleTexture = getTex("skinchanger")}, 		-- Skinchanger
-	[43] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(43)), styleTexture = getTex("moragtong")}, 			-- Morag Tong
-	[44] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(44)), styleTexture = getTex("ragada")}, 				-- Ra Gada
-	[45] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(45)), styleTexture = getTex("dromathra")}, 			-- Dro-m'Athra
-	[46] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(46)), styleTexture = getTex("assassin")}, 			-- Assassins League
-	[47] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(47)), styleTexture = getTex("outlaw")}, 				-- Outlaw
-	[48] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(48)), styleTexture = getTex("redoran")}, 			-- Redoran
-	[49] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(49)), styleTexture = getTex("hlaalu")}, 				-- Hlaalu
-	[50] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(50)), styleTexture = getTex("ordinator")}, 			-- Ordinator **
-	[51] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(51)), styleTexture = getTex("telvanni")}, 			-- Telvanni
-	[52] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(52)), styleTexture = getTex("buoyantarmiger")}, 		-- Buoyant Armiger
-	[53] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(53)), styleTexture = getTex("frostcaster")}, 		-- Frostcaster
-	[54] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(54)), styleTexture = getTex("cliffracer")}, 			-- Ashlander
-	[55] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(55)), styleTexture = getTex("skull_nice")}, 			-- Worm Cult
-	[56] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(56)), styleTexture = getTex("kothringi")}, 			-- Silken Ring
-	[57] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(57)), styleTexture = getTex("lizard")}, 				-- Mazzatun
-	[58] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(58)), styleTexture = getTex("harlequin")}, 			-- Grim Harlequin
-	[59] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(59)), styleTexture = getTex("hollowjack")}, 			-- Hollowjack
-	[60] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(60)), styleTexture = getTex("clockwork")}, 			-- Clockwork
-	[61] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(61)), styleTexture = getTex("bloodforge")}, 			-- Bloodforge
-	[62] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(62)), styleTexture = getTex("dreadhorn")}, 			-- Dreadhorn / Falkreath
-	[63] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(63)), styleTexture = getTex("")}, 					-- Unused
-	[64] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(64)), styleTexture = getTex("")},					-- Unused
-	[65] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(65)), styleTexture = getTex("apostle")},				-- Apostle
-	[66] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(66)), styleTexture = getTex("ebonshadow")},			-- Ebonshadow
-	[67] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(67)), styleTexture = getTex("")}, 					-- Unused
-	[68] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(68)), styleTexture = getTex("")}, 					-- Unused
-	[69] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(69)), styleTexture = getTex("")}, 					-- Unused
-	[70] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(70)), styleTexture = getTex("")}, 					-- Unused
-	[71] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(71)), styleTexture = getTex("")}, 					-- Unused
-	[72] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(72)), styleTexture = getTex("")}, 					-- Unused
-	[73] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(73)), styleTexture = getTex("")}, 					-- Unused
-	[74] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(74)), styleTexture = getTex("")}, 					-- Unused
-	[75] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(75)), styleTexture = getTex("")}, 					-- Unused
-	[76] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(76)), styleTexture = getTex("")}, 					-- Unused
-	[77] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(77)), styleTexture = getTex("")}, 					-- Unused
-	[78] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(78)), styleTexture = getTex("")}, 					-- Unused
-	[79] 	= { styleName = zo_strformat("<<1>>", GetItemStyleName(79)), styleTexture = getTex("")}, 					-- Unused
-}
-
--- check on icons Hlaalu, Redoran and Morag Tong not loading properly
-
---[[ -- these aren't used right now. Not sure whether or not we actually want to.
-IIfA.itemEquipTypeTextures = {
-	[EQUIP_TYPE_CHEST]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_COSTUME]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_FEET]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_HAND]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_HEAD]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_INVALID]  =   "",
-	[EQUIP_TYPE_LEGS]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_MAIN_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
-	[EQUIP_TYPE_NECK]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_OFF_HAND]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_ONE_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
-	[EQUIP_TYPE_RING]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_SHOULDERS]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds",
-	[EQUIP_TYPE_TWO_HAND]  =   "/esoui/art/inventory/inventory_tabicon_weapons_up.dds",
-	[EQUIP_TYPE_WAIST]  =   "/esoui/art/inventory/inventory_tabicon_armor_up.dds"
-}
-
-IIfA.gearslotTextures = {
-	[EQUIP_TYPE_CHEST] = "/esoui/art/characterwindow/gearslot_chest.dds",
-	[EQUIP_TYPE_COSTUME] = "/esoui/art/characterwindow/gearslot_costume.dds",
-	[EQUIP_TYPE_FEET] = "/esoui/art/characterwindow/gearslot_feet.dds",
-	[EQUIP_TYPE_HAND] = "/esoui/art/characterwindow/gearslot_hands.dds",
-	[EQUIP_TYPE_HEAD] = "/esoui/art/characterwindow/gearslot_head.dds",
-	[EQUIP_TYPE_LEGS] = "/esoui/art/characterwindow/gearslot_legs.dds",
-	[EQUIP_TYPE_MAIN_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
-	[EQUIP_TYPE_NECK] = "/esoui/art/characterwindow/gearslot_neck.dds",
-	[EQUIP_TYPE_OFF_HAND] = "/esoui/art/characterwindow/gearslot_offhand.dds",
-	[EQUIP_TYPE_ONE_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
-	[EQUIP_TYPE_RING] = "/esoui/art/characterwindow/gearslot_ring.dds",
-	[EQUIP_TYPE_SHOULDERS] = "/esoui/art/characterwindow/gearslot_shoulders.dds",
-	[EQUIP_TYPE_TWO_HAND] = "/esoui/art/characterwindow/gearslot_mainhand.dds",
-	[EQUIP_TYPE_WAIST] = "/esoui/art/characterwindow/gearslot_belt.dds",
-	[15] = "/esoui/art/characterwindow/gearslot_tabard.dds"
-}
---]]
-
-local controlTooltips = {
-	["LineShare"] 	= "Doubleclick an item to add link to chat.",
-	["close"] 		= "close",
-	["toggle"] 		= "toggle",
-	["Search"] 		= "Search item name..."
-}
-
-local function getStyleIntel(itemLink)
-	if not itemLink then
-		return nil
-	end
-	if IIfA:GetSettings().showStyleInfo == false then
-		return nil
-	end
-
-	local data = itemLink:match("|H.:item:(.-)|h.-|h")
-	-- d(data)
-	-- d(zo_strsplit(':', data))
-	local itemID,
-		_,
-		itemLevel,
-		itemEnchantmentType,
-		itemEnchantmentStrength1,
-		itemEnchantmentStrength2,
-		_, _, _, _, _, _, _, _, _,
-		itemStyle,
-		_,
-		itemIsBound,
-		itemChargeStatus = zo_strsplit(':', data)
-
-	itemStyle = tonumber(itemStyle)
-
-	if itemStyle == ITEMSTYLE_UNIVERSAL then
-		return nil
-	else
-		return IIfA.racialTextures[itemStyle]
-	end
-end
-
-function IIfA:AnchorFrame(frame, parentTooltip)
-	if frame:GetTop() < parentTooltip:GetBottom() then
-		frame:ClearAnchors()
-		frame:SetAnchor(BOTTOM, parentTooltip, TOP, 0, 0)
-	elseif frame:GetBottom() > parentTooltip:GetTop() then
-		frame:ClearAnchors()
-		frame:SetAnchor(TOP, parentTooltip, BOTTOM, 0, 0)
-	end
-end
-
--- do NOT local this function
-function IIfA_HideTooltip(control, ...)
-	if IIfA:GetSettings().bInSeparateFrame then
-		if control == ItemTooltip then
-			IIFA_ITEM_TOOLTIP:SetHidden(true)
-		elseif control == PopupTooltip then
-			IIFA_POPUP_TOOLTIP:SetHidden(true)
-		end
-	else
-		if control.IIfA_TT_Ext then
-			control.IIfAPool:ReleaseAllObjects()
-			control.IIfA_TT_Ext = nil
-		end
-	end
-end
-
--- do NOT local this function
-function IIfA_TooltipOnTwitch(control, eventNum)
-	if IIfA:GetSettings().bInSeparateFrame then
-		if eventNum == 7 then
-			if control == ItemTooltip then
-				-- item tooltips appear where mouse is
-				return IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP)
-			elseif control == PopupTooltip then
-				-- popup tooltips have the X in the corner and usually pop up in center screen
-				IIfA.TooltipLink = PopupTooltip.lastLink
-				return IIfA:UpdateTooltip(IIFA_POPUP_TOOLTIP)
-			end
-		end
-	else
-		if control == PopupTooltip and control.IIfA_TT_Ext then
-			return
-		end
-		-- this is called whenever there's any data added to the ingame tooltip
-		if eventNum == TOOLTIP_GAME_DATA_MAX_VALUE then		-- hopefully always called on last data add
---			IIfA:DebugOut("Tooltip On Twitch - " .. control:GetName() .. ", " .. eventNum)
-			IIfA:UpdateTooltip(control)
-		end
-	end
-end
-
-
-function IIfA:GetEquippedItemLink(mouseOverControl)
-	local fullSlotName = mouseOverControl:GetName()
-	local slotName = string.gsub(fullSlotName, "ZO_CharacterEquipmentSlots", "")
-	local index = 0
-
-	if 		(slotName == "Head")		then index = 0
-	elseif	(slotName == "Neck") 		then index = 1
-	elseif	(slotName == "Chest") 		then index = 2
-	elseif	(slotName == "Shoulder") 	then index = 3
-	elseif	(slotName == "MainHand") 	then index = 4
-	elseif	(slotName == "OffHand") 	then index = 5
-	elseif	(slotName == "Belt") 		then index = 6
-	elseif	(slotName == "Costume") 	then index = 7
-	elseif	(slotName == "Leg") 		then index = 8
-	elseif	(slotName == "Foot") 		then index = 9
-	elseif	(slotName == "Ring1") 		then index = 11
-	elseif	(slotName == "Ring2") 		then index = 12
-	elseif	(slotName == "Glove") 		then index = 16
-	elseif	(slotName == "BackupMain") 	then index = 20
-	elseif	(slotName == "BackupOff") 	then index = 20
-	end
-
-	local itemLink = GetItemLink(0, index, LINK_STYLE_BRACKETS)
-	return itemLink
-end
-
-
-function IIfA:getMouseoverLink()
-	local data
-	local mouseOverControl = moc()
-	if not mouseOverControl then return end
-
-	local name = nil
-	if mouseOverControl:GetParent() then
-		name = mouseOverControl:GetParent():GetName()
-	else
-		name = mouseOverControl:GetName()
-	end
-
-	-- do we show IIfA info?
-	if IIfA:GetSettings().showToolTipWhen == "Never" or
-		(IIfA:GetSettings().showToolTipWhen == "IIfA" and name ~= "IIFA_GUI_ListHolder") then
-		return nil
-	end
-
-	if	name == 'ZO_CraftBagListContents' or
-		name == 'ZO_EnchantingTopLevelInventoryBackpackContents' or
-		name == 'ZO_GuildBankBackpackContents' or
-		name == 'ZO_PlayerBankBackpackContents' or
-		name == 'ZO_PlayerInventoryListContents' or
-		name == 'ZO_QuickSlotListContents' or
-		name == 'ZO_SmithingTopLevelDeconstructionPanelInventoryBackpackContents' or
-		name == 'ZO_SmithingTopLevelImprovementPanelInventoryBackpackContents' or
-		name == 'ZO_SmithingTopLevelRefinementPanelInventoryBackpackContents' or
-		name == 'ZO_HouseBankBackpackContents' or
-		name == 'ZO_PlayerInventoryBackpackContents' then
-		if not mouseOverControl.dataEntry then return end
-		data = mouseOverControl.dataEntry.data
-		return GetItemLink(data.bagId, data.slotIndex, LINK_STYLE_BRACKETS)
-
-	elseif name == "ZO_LootAlphaContainerListContents" then						-- is loot item
-		if not mouseOverControl.dataEntry then return end
-		data = mouseOverControl.dataEntry.data
-		return GetLootItemLink(data.lootId, LINK_STYLE_BRACKETS)
-
-	elseif name == "ZO_InteractWindowRewardArea" then							-- is reward item
-		return GetQuestRewardItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
-
-	elseif name == "ZO_Character" then											-- is worn item
-		return IIfA:GetEquippedItemLink(mouseOverControl)
-
-	elseif name == "ZO_StoreWindowListContents" then							-- is store item
-		return GetStoreItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
-
-	elseif name == "ZO_BuyBackListContents" then								-- is buyback item
-		return GetBuybackItemLink(mouseOverControl.index, LINK_STYLE_BRACKETS)
-
-	-- following 4 if's derived directly from MasterMerchant
-	elseif string.sub(name, 1, 14) == "MasterMerchant" then
-		local mocGPGP = mouseOverControl:GetParent():GetParent()
-		if mocGPGP then
-			name = mocGPGP:GetName()
-			if	name == 'MasterMerchantWindowListContents' or
-				name == 'MasterMerchantWindowList' or
-				name == 'MasterMerchantGuildWindowListContents' then
-				if mouseOverControl.GetText then
-					return mouseOverControl:GetText()
-				end
-			end
-		end
-	elseif name == 'ZO_LootAlphaContainerListContents' then
-		return GetLootItemLink(mouseOverControl.dataEntry.data.lootId)
-	elseif name == 'ZO_MailInboxMessageAttachments' then
-		return GetAttachedItemLink(MAIL_INBOX:GetOpenMailId(), mouseOverControl.id, LINK_STYLE_DEFAULT)
-	elseif name == 'ZO_MailSendAttachments' then
-		return GetMailQueuedAttachmentLink(mouseOverControl.id, LINK_STYLE_DEFAULT)
-
-	elseif name == "ZO_MailInboxMessageAttachments" then
-		return nil
-
-	elseif name == "IIFA_GUI_ListHolder" then
-		-- falls out, returns default current link
-
-	elseif name:sub(1, 13) == "IIFA_ListItem" then
-		return mouseOverControl.itemLink
-
-	elseif name:sub(1, 44) == "ZO_TradingHouseItemPaneSearchResultsContents" then
-		data = mouseOverControl.dataEntry
-		if data then data = data.data end
-	    -- The only thing with 0 time remaining should be guild tabards, no
-    	-- stats on those!
-    	if not data or data.timeRemaining == 0 then return nil end
-		return GetTradingHouseSearchResultItemLink(data.slotIndex)
-
-	elseif name == "ZO_TradingHousePostedItemsListContents" then
-		return GetTradingHouseListingItemLink(mouseOverControl.dataEntry.data.slotIndex)
-
-  	elseif name == 'ZO_TradingHouseLeftPanePostItemFormInfo' then
-    	if mouseOverControl.slotIndex and mouseOverControl.bagId then
-			return GetItemLink(mouseOverControl.bagId, mouseOverControl.slotIndex)
-		end
-
-	else
---		d(mouseOverControl:GetName(), mouseOverControl)
-		IIfA:DebugOut("Tooltip not processed - '" .. name .. "'")
-
-		if IIfA.TooltipLink then
-			IIfA:DebugOut("Current Link - " .. IIfA.TooltipLink)
-		end
-
-		return nil
-	end
-
-	return IIfA.TooltipLink
-end
-
-function IIfA:getLastLink(tooltip)
-	local ret = nil
-	if IIfA:GetSettings().bInSeparateFrame then
-		if tooltip == IIFA_POPUP_TOOLTIP then
-			ret = IIfA.TooltipLink
-		elseif tooltip == IIFA_ITEM_TOOLTIP then
-			ret = self:getMouseoverLink()
-		end
-	else
-		if tooltip == PopupTooltip then
-			ret = IIfA.TooltipLink		-- this gets set on the prehook of PopupTooltip:SetLink
-		elseif tooltip == ItemTooltip then
-			ret = self:getMouseoverLink()
-			IIfA.TooltipLink = ret		-- make sure it's set right always
-		end
-	end
-
-	if (not ret) then
-		if not IIfA.LastActiveRowControl then return ret end
-		ret = IIfA.LastActiveRowControl:GetText()
-	end
-
-	return ret
-end
-
-function IIfA:UpdateTooltip(tooltip)
-	local itemLink
-	itemLink = self:getLastLink(tooltip)
-
-	local queryResults = IIfA:QueryAccountInventory(itemLink)
-	local itemStyleTexArray = getStyleIntel(itemLink)
-
-	if not itemStyleTexArray then itemStyleTexArray = {["styleTexture"] = "", ["styleName"] = ""} end
-	if itemStyleTexArray.styleName == nil then itemStyleTexArray = {["styleTexture"] = "", ["styleName"] = ""} end
-
-	if IIfA:GetSettings().bInSeparateFrame then
-		local parentTooltip = nil
-		if tooltip == IIFA_POPUP_TOOLTIP then parentTooltip = PopupTooltip end
-		if tooltip == IIFA_ITEM_TOOLTIP then parentTooltip = ItemTooltip end
-
-		if (not itemLink) or ((#queryResults.locations == 0) and (itemStyleTexArray.styleName == "")) then
-			tooltip:SetHidden(true)
-			return
-		end
-
-		tooltip:ClearLines()
-		tooltip:SetHidden(false)
-		tooltip:SetHeight(0)
-
-		tooltip:SetWidth(parentTooltip:GetWidth())
-
-		if itemStyleTexArray.styleName ~= "" then
-			tooltip:AddLine(" ");
-		end
-
-		if(queryResults) then
-			if #queryResults.locations > 0 then
-				if itemStyleTexArray.styleName ~= "" then
-					ZO_Tooltip_AddDivider(tooltip)
-				end
-				for x, location in pairs(queryResults.locations) do
-					local textOut
-					if location.name == nil or location.itemsFound == nil then
-						d(location)
-						textOut = 'Error occurred'
-					else
-						textOut = location.name .. " x" .. location.itemsFound
-					end
-					IIfA:DebugOut(textOut)
-					if location.worn then
-						textOut = textOut .. " *"
-					end
-					textOut = IIfA.colorHandler:Colorize(textOut)
-					tooltip:AddLine(textOut)
-				end
-			end
-		end
-
-		local styleIcon = tooltip:GetNamedChild("_StyleIcon")
-		local styleLabel = tooltip:GetNamedChild("_StyleLabel")
-
-		-- update the style icon
-		styleIcon:SetTexture(itemStyleTexArray.styleTexture)
-		styleLabel:SetText(itemStyleTexArray.styleName)
-
-		styleLabel:SetHidden(itemStyleTexArray.styleName == "")
-		styleIcon:SetHidden(itemStyleTexArray.styleName == "")
-		IIfA:AnchorFrame(tooltip, parentTooltip)
-	else
-		if (not itemLink) or ((#queryResults.locations == 0) and (itemStyleTexArray.styleName == "")) then
-			IIfA_HideTooltip(tooltip)
-			return
-		end
-
-		local bHasStyle
-		bHasStyle = not (itemStyleTexArray.styleName == nil or itemStyleTexArray.styleName == "")
-
-		-- only add/show the style info if it's got style
-		if bHasStyle then
-			if tooltip.IIfAPool == nil then
-				tooltip.IIfAPool = ZO_ControlPool:New("IIFA_TT_Template", tooltip, "IIFA_TT_Ext")
-			end
-
-			if tooltip.IIfAPool then
-				tooltip.IIfA_TT_Ext = tooltip.IIfAPool:AcquireObject()
-				tooltip.IIfA_TT_Ext:SetWidth(tooltip:GetWidth())
-			end
-
-			if tooltip.IIfA_TT_Ext then
-				ZO_Tooltip_AddDivider(tooltip)
-				tooltip:AddControl(tooltip.IIfA_TT_Ext)
-				tooltip.IIfA_TT_Ext:SetAnchor(TOP)
-
-				local styleIcon = tooltip.IIfA_TT_Ext:GetNamedChild("_StyleIcon")
-				local styleLabel = tooltip.IIfA_TT_Ext:GetNamedChild("_StyleLabel")
-				-- update the style icon
-				styleIcon:SetTexture(itemStyleTexArray.styleTexture)
-				styleLabel:SetText(itemStyleTexArray.styleName)
-			end
-		end
-
-		if(queryResults) then
-			if #queryResults.locations > 0 then
-				ZO_Tooltip_AddDivider(tooltip)
-				for x, location in pairs(queryResults.locations) do
-					local textOut
-					if location.name == nil or location.itemsFound == nil then
-						d(location)
-						textOut = 'Error occurred'
-					else
-						textOut = location.name .. " x" .. location.itemsFound
-					end
-					if location.worn then
-						textOut = textOut .. " *"
-					end
-					textOut = IIfA.colorHandler:Colorize(textOut)
-					tooltip:AddLine(textOut)
-				end
-			end
-		end
-	end
-end
-
-
---[[
-on pts
-/script d("|H1:item:122828:362:50:00000:0:0:0:0:0:0:0:0:0:0:0:38:0:0:0:10000:0|h|h |H1:item:048760:029:04:26848:2:1:0:0:0:0:0:0:0:0:1:06:1:1:0:00053:0|h|h")
-
-
-/script d("Redoran: |H1:item:122627:359:50:0:0:0:0:0:0:0:0:0:0:0:0:48:0:0:0:10000:0|h|h")
-/script d("Buoyant Armiger: |H1:item:126064:358:50:0:0:0:0:0:0:0:0:0:0:0:0:52:0:0:0:10000:0|h|h")
-/script d("MoragTong: |H1:item:45349:308:50:0:0:0:0:0:0:0:0:0:0:0:1:43:0:1:0:10000:0|h|h")
-
-red mountain - no icon, no style text - use get style func to find out what # it really is
-"of the worm" - same issue
-"ebon armory"
-hircine
-withered hand - same problem (of the necromancer)
-
-/script PopupTooltipIIFA_TT_Ext1_StyleIcon.idx=48 PopupTooltipIIFA_TT_Ext1_StyleIcon:SetTexture(IIfA.racialTextures[PopupTooltipIIFA_TT_Ext1_StyleIcon.idx].styleTexture) d(IIfA.racialTextures[PopupTooltipIIFA_TT_Ext1_StyleIcon.idx].styleName ..", "..PopupTooltipIIFA_TT_Ext1_StyleIcon.idx)
-
-/script PopupTooltipIIFA_TT_Ext1_StyleIcon:SetTexture("IIfA/assets/icons/ordinator.dds") PopupTooltipIIFA_TT_Ext1_StyleLabel:SetText("Ordinator")
-
-]]--
-
diff --git a/IIfA_xml_adapter.lua b/IIfA_xml_adapter.lua
deleted file mode 100644
index 8b2ee48..0000000
--- a/IIfA_xml_adapter.lua
+++ /dev/null
@@ -1,568 +0,0 @@
-local IIfA = IIfA
-
-function IIfA:GUILock(bLock)
-	-- if we're docked, we can't very well lock it in place too
-	-- this IF might go away providing the lock button turns on/off as it's supposed to (then it'll never be able to get here)
-	if self:GetSceneSettings().docked then return end
-
-	IIFA_GUI_Header_Locked:SetHidden(not bLock)
-	IIFA_GUI_Header_Unlocked:SetHidden(bLock)
-
-	self:GetSceneSettings().locked = bLock
-
-	IIFA_GUI:SetMovable(not bLock)
-	if bLock then
-		IIFA_GUI:SetResizeHandleSize(0)
-	else
-		IIFA_GUI:SetResizeHandleSize(12)
-	end
-end
-
---[[
-function IIfA:DisplayDockButton(settings, sceneName)
-
-	if not sceneName then
-		sceneName = IIfA:GetCurrentSceneName()
-	end
-
-	if not settings then
-		settings = IIfA:GetSceneSettings(sceneName)
-	end
-
-	if sceneName == "hud" then
-		IIFA_GUI_Header_Docked:SetHidden(true)
-		IIFA_GUI_Header_Undocked:SetHidden(true)
-	else
-		IIFA_GUI_Header_Docked:SetHidden(not settings.docked)
-		IIFA_GUI_Header_Undocked:SetHidden(settings.docked)
-	end
-end
- --]]
-
-function IIfA:GuiDock(bDock)
-	sceneName = IIfA:GetCurrentSceneName()
-	-- docking not allowed when hud is active (it has no clue what it's docking to)
-	if bDock and sceneName == "hud" then
-		return
-	end
-
-	local settings = IIfA:GetSceneSettings()
-
-	settings.docked = bDock
-
-	IIfA:RePositionFrame(settings)
-
---[[
-
-	IIfA:DisplayDockButton(settings, nil)
-
-	IIFA_GUI:ClearAnchors()
-	IIFA_GUI:SetMovable(not bDock)
-	--IIFA_GUI_Header_Lockedndson:SetHidden(bDock)
-	--IIFA_GUI_Header_Unlocked:SetHidden(bDock)
-	if bDock then
-		-- two diff backgrouns on the right, figure out which is to be used
-		local RightBackground = ZO_SharedRightPanelBackground
-		if not ZO_SharedRightBackground:IsControlHidden() then
-			RightBackground = ZO_SharedRightBackground
-		end
-		local parentHeight = RightBackground:GetHeight()
-		IIFA_GUI:SetDimensionConstraints(410, parentHeight, -1, parentHeight)
-		local windowOffset = -20
-		if sceneName == "mailInbox" or sceneName == "mailSend" then
-			windowOffset = -40
-		end
-		IIFA_GUI:SetAnchor(TOPRIGHT, RightBackground, TOPLEFT, windowOffset, 16)
-		IIFA_GUI:SetAnchor(BOTTOMRIGHT, RightBackground, BOTTOMLEFT, windowOffset, 16)
-		IIFA_GUI:SetResizeHandleSize(0)
-		IIFA_GUI:SetWidth(settings.width)
-		IIFA_GUI_Header_Unlocked:SetHidden(true)
-		IIFA_GUI_Header_Locked:SetHidden(true)
-	else
-		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 1400)
-		IIFA_GUI:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, settings.lastX, settings.lastY)
-		if not settings.minimized then
-			IIFA_GUI:SetHeight(settings.height)
-			IIFA_GUI:SetWidth(settings.width)
-			IIFA_GUI:SetResizeHandleSize(12)
-		else
-			IIFA_GUI:SetHeight(33)
-			IIFA_GUI:SetWidth(settings.width)
-			IIFA_GUI:SetResizeHandleSize(0)
-		end
-		self:GUILock(settings.locked)
-	end
-
-	IIfA:GuiResizeScroll()
-	--]]
-end
-
-function IIfA:GUIMinimize(bMinimize)
-	local settings = IIfA:GetSceneSettings()
-
-	settings.minimized = bMinimize
-
-	IIfA:RePositionFrame(settings)
---[[
-
-
-	ZO_Tooltips_HideTextTooltip()
-	IIFA_GUI_Header_Minimize:SetHidden(bMinimize)
-	IIFA_GUI_Header_Maximize:SetHidden(not bMinimize)
-
-	IIFA_GUI.minimized = bMinimize
-
-	local settings = IIfA:GetSceneSettings()
-	local lastX = IIFA_GUI:GetLeft()
-	local lastY = IIFA_GUI:GetTop()
-
-	settings.minimized = bMinimize
-
-	if bMinimize then
-		IIFA_GUI:SetResizeHandleSize(0)
-		settings.width	= IIFA_GUI:GetWidth()
-		settings.height = IIFA_GUI:GetHeight()
-		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 33)
-		IIFA_GUI:SetHeight(33)
-		PlaySound(SOUNDS.BACKPACK_WINDOW_CLOSE)
-	else
-		IIFA_GUI:SetResizeHandleSize(12)
-		IIFA_GUI:SetDimensionConstraints(410, 300, -1, 1400)
-		IIFA_GUI:SetHeight(settings.height)
-		PlaySound(SOUNDS.BACKPACK_WINDOW_OPEN)
-	end
-
-	IIFA_GUI_ListHolder:SetHidden(bMinimize)
-	IIFA_GUI_Header_Filter:SetHidden(bMinimize)
-	IIFA_GUI_Header_Dropdown:SetHidden(bMinimize)
-	IIFA_GUI_Search:SetHidden(bMinimize)
-	IIFA_GUI_Header_GoldButton:SetHidden(bMinimize)
-	IIFA_GUI_Header_SortBar:SetHidden(bMinimize)
-
-	IIFA_GUI:ClearAnchors()
-	IIFA_GUI:SetAnchor(TOPLEFT, nil, TOPLEFT, lastX, lastY)
-	--]]
-end
-
-function IIfA:GUIButtonHideOnMouseUp()
-	IIFA_GUI:SetHidden(true)
-	local settings = IIfA:GetSceneSettings()
-	settings.hidden = true
-end
-
--- dropdown
-function IIfA:GuiSetupDropdown(dropdown)
-	local selectedItem = IIfA:GetInventoryListFilter()
-	dropdown.comboBox:SetSelectedItem(selectedItem)
-end
-
--- click functions
-function IIfA:GuiOnFilterButton(control, filterGroup, filterTypes, filterTypeNames)
-	-- identify if this is main or sub filter clicked
-	local b_isMain = control:GetName():find("Sub") == nil
-
-	if b_isMain then
-		if IIfA.LastFilterControl ~= nil then
-			IIfA.LastFilterControl:SetState(BSTATE_NORMAL)
-		end
-		IIfA.LastFilterControl = control
-
-		if IIfA.LastSubFilterControl ~= nil then
-		   IIfA.LastSubFilterControl:SetState(BSTATE_NORMAL)
-		   IIfA.LastSubFilterControl:GetParent():SetHidden(true)
-		end
-		if filterGroup ~= "All" then
-			IIfA.LastSubFilterControl = IIFA_GUI_Header:GetNamedChild(control:GetName():gsub("IIFA_GUI_Header", ""):gsub("Filter_Button", "Subfilter_") .. "_Button0")
-			IIfA.LastSubFilterControl:SetState(BSTATE_PRESSED)
-		else
-			IIfA.LastSubFilterControl = nil
-		end
-	else
-		if IIfA.LastSubFilterControl ~= nil then
-			IIfA.LastSubFilterControl:SetState(BSTATE_NORMAL)
-			if IIfA.LastSubFilterControl:GetParent() ~= control:GetParent() then
-				IIfA.LastSubFilterControl:GetParent():SetHidden(true)
-			end
-		end
-		IIfA.LastSubFilterControl = control
-	end
-
-	control:SetState(BSTATE_PRESSED)
-
-	if IIfA.LastSubFilterControl == nil then
-		IIFA_GUI_Header_Subfilter:SetHidden(true)
-		IIFA_GUI_Header_Subfilter:SetHeight(0)
-	else
-		IIFA_GUI_Header_Subfilter:SetHidden(false)
-		IIFA_GUI_Header_Subfilter:SetHeight(38)
-		local SubFilt = IIfA.LastSubFilterControl:GetParent()
-		SubFilt:SetHidden(false)
-		SubFilt:SetHeight(38)
-	end
-	IIfA.filterGroup = filterGroup
-	IIfA.filterTypes = filterTypes
-
-	function SetSubSubFilters(_, subFiltName, choice)
-		IIfA.filterTypes = choice.subFiltTypes
-		IIfA:UpdateScrollDataLinesData()
-	end
-
-	if filterTypeNames ~= nil then
-		local comboBox
-		if IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox ~= nil then
-			comboBox = IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox
-		else
-			comboBox = ZO_ComboBox_ObjectFromContainer(IIFA_GUI_Header_SortBar_Subfilter_Dropdown)
-			IIFA_GUI_Header_SortBar_Subfilter_Dropdown.comboBox = comboBox
-		end
-		comboBox:ClearItems()
-		comboBox:SetSortsItems(false)
-		entry = comboBox:CreateItemEntry("All", SetSubSubFilters)
-		entry.subFiltTypes = IIfA.filterTypes
-		comboBox:AddItem(entry)
-		if IIfA.filterGroup == "Body" or		--:find("Body") ~= nil or
-		   IIfA.filterGroup == "Specialized" then
-			for i = 2, #filterTypes do
-				entry = comboBox:CreateItemEntry(filterTypeNames[i], SetSubSubFilters)
-				entry.subFiltTypes = { filterTypes[1], filterTypes[i] }
-				comboBox:AddItem(entry)
-			end
-		else
-			for i = 1, #filterTypes do
-				entry = comboBox:CreateItemEntry(filterTypeNames[i], SetSubSubFilters)
-				entry.subFiltTypes = { filterTypes[i] }
-				comboBox:AddItem(entry)
-			end
-		end
-		comboBox:SetSelectedItem("All")
-		IIFA_GUI_Header_SortBar_Subfilter_Dropdown:SetHidden(false)
-	else
-		IIFA_GUI_Header_SortBar_Subfilter_Dropdown:SetHidden(true)
-	end
-
-
-	local X_OFFSET_INDEX = 4
-	local Y_OFFSET_INDEX = 5
-	IIFA_GUI_ListHolder:ClearAnchors()
-
-	local newAnchor = ZO_Anchor:New(unpack(IIFA_GUI_ListHolder.savedAnchor1))
-	newAnchor:SetOffsets(IIFA_GUI_ListHolder.savedAnchor1[X_OFFSET_INDEX], IIFA_GUI_ListHolder.savedAnchor1[Y_OFFSET_INDEX] + IIFA_GUI_Header_Subfilter:GetHeight())
-	newAnchor:AddToControl(IIFA_GUI_ListHolder)
-
-	newAnchor = ZO_Anchor:New(unpack(IIFA_GUI_ListHolder.savedAnchor2))
-	newAnchor:SetOffsets(IIFA_GUI_ListHolder.savedAnchor2[X_OFFSET_INDEX], IIFA_GUI_ListHolder.savedAnchor2[Y_OFFSET_INDEX])
-	newAnchor:AddToControl(IIFA_GUI_ListHolder)
-
-	IIfA:GuiResizeScroll()
-
-	IIfA:UpdateScrollDataLinesData()
-end
-
--- IIFA_GUI_SearchBox is the input field
--- IIFA_GUI_SearchBoxText is the "Filter by text search" text msg
-function IIfA:GuiOnSearchboxText(control)
-	local text = control:GetText()
-	IIFA_GUI_SearchBoxText:SetHidden(text ~= nil and text > "")
-	IIfA.searchFilter = zo_strlower(text)
-    IIfA:UpdateScrollDataLinesData()
-    IIfA:UpdateInventoryScroll()
-end
-
-function IIfA:GuiOnSearchBoxClear(control)
-	IIFA_GUI_SearchBox:SetText("")
-	IIFA_GUI_SearchBoxText:SetHidden(false)
-	IIfA.searchFilter = ""
-    IIfA:UpdateScrollDataLinesData()
-    IIfA:UpdateInventoryScroll()
-end
-
-
--- IIFA_GUI_ListHolder sort
-function IIfA:GuiOnSort(initialised)
-	if (initialised ~= true) then
-		IIfA.ScrollSortUp = not IIfA.ScrollSortUp
-	end
-
-	local icon = IIFA_GUI_Header_SortBar.Icon
-
-	if(IIfA.ScrollSortUp)then
-		icon:SetTexture("/esoui/art/miscellaneous/list_sortheader_icon_sortup.dds")
-		icon:SetAlpha(1)
-	else
-		icon:SetTexture("/esoui/art/miscellaneous/list_sortheader_icon_sortdown.dds")
-		icon:SetAlpha(1)
-	end
-	IIfA:UpdateScrollDataLinesData()
-end
-
-function IIfA:GuiOnScroll(control, delta)
---	IIfA:DebugOut("guionscroll called")
-
-	if not delta then return end
-	if delta == 0 then return end
-
-	local slider = IIFA_GUI_ListHolder_Slider
---	slider.locked = true
-	-- negative delta means scrolling down
-
-	local value = (IIFA_GUI_ListHolder.dataOffset - delta)
-	local total = #IIFA_GUI_ListHolder.dataLines - IIFA_GUI_ListHolder.maxLines
-
-	if value < 0 then value = 0 end
-	if value > total then value = total end
-	IIFA_GUI_ListHolder.dataOffset  = value
-
-	IIfA:UpdateInventoryScroll()
-
-	slider:SetValue(IIFA_GUI_ListHolder.dataOffset)
-
-	IIfA:GuiLineOnMouseEnter(moc())
-	--IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP, true)
-
-
---	slider.locked = false
-end
-
--- IIFA_GUI_ListHolder.lines
-function IIfA:GuiLineOnMouseEnter(lineControl)
-	if not lineControl then return end
-
-	if( lineControl.itemLink ~= nil and lineControl.itemLink ~= "") then
-		IIfA.TooltipLink = lineControl.itemLink
-		InitializeTooltip(ItemTooltip, lineControl, LEFT, 0, 0, 0)
-		ItemTooltip:SetLink(lineControl.itemLink)
---		IIfA:UpdateTooltip(IIFA_ITEM_TOOLTIP)
-	end
-end
-
-function IIfA:GuiLineOnMouseExit(control)
-	ClearTooltip(ItemTooltip)
-end
-
-
-function IIfA:GuiOnSliderUpdate(slider, value)
-	if not value or slider.locked then return end
-	local relativeValue = math.floor(IIFA_GUI_ListHolder.dataOffset - value)
-	IIfA:GuiOnScroll(slider, relativeValue)
-end
-
-function IIfA:GuiResizeScroll()		-- returns true if it had to be resized, otherwise false
-	if IIFA_GUI.minimized then return end		-- no point trying to resize if there's no scroll bar displayed
-
-	local regionHeight = IIFA_GUI_ListHolder:GetHeight()
-	local newLines = math.floor(regionHeight / IIFA_GUI_ListHolder.rowHeight)
-
-	if IIFA_GUI_ListHolder.maxLines == nil or IIFA_GUI_ListHolder.maxLines ~= newLines then
-		IIFA_GUI_ListHolder.maxLines = newLines
-		IIfA:GuiResizeLines()
-	end
-end
-
-function IIfA:GuiShowTooltip(control, tooltiptext)
-	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
-	InformationTooltip:SetHidden(false)
-	InformationTooltip:ClearLines()
-	InformationTooltip:AddLine(tooltiptext)
-end
-
-function IIfA:GuiShowFilterTooltip(control, tooltiptext)
-	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
-	InformationTooltip:SetHidden(false)
-	InformationTooltip:ClearLines()
-	InformationTooltip:AddLine(tooltiptext)
-end
-
-function IIfA:GuiHideTooltip(control)
-	InformationTooltip:SetHidden(true)
-	InformationTooltip:ClearLines()
-end
-
--- resize to saved settings
-function IIfA:GuiReloadDimensions(settings, sceneName)
-
-	if not settings then
-		settings = IIfA:GetSceneSettings(sceneName)
-	end
-
-	IIfA:DisplayDockButton(settings, sceneName)
-
-	if not settings.docked then
-		if settings.minimized then
-			IIFA_GUI:SetHeight(33)
-		else
-			IIFA_GUI:SetHeight(settings.height)
-		end
-	end
-	IIfA:GuiResizeScroll()
-	IIFA_GUI:SetWidth(settings.width)
-end
-
-function IIfA:GuiResizeLines()
-	if not IIFA_GUI_ListHolder.lines then
-		lines = IIfA:CreateInventoryScroll()
-	end
-	if IIFA_GUI_ListHolder.lines ~= {} then
-		lines = IIFA_GUI_ListHolder.lines
-	end
-
---	local linewidth =  (IIFA_GUI_ListHolder:GetWidth()-20)
---	local qtywidth = lines[1].qty:GetWidth()
---	local iconwidth = lines[1].icon:GetWidth()
---	local textwidth = linewidth - qtywidth - iconwidth
-
-	for index, line in ipairs(lines) do
---		line.text:SetWidth(textwidth)
---		line:SetWidth(linewidth)
-		line:SetHidden(index > IIFA_GUI_ListHolder.maxLines)
-	end
-end
-
-function IIfA:onResizeStop()
-	-- if you resize the box, you need to resize the list to go with it
-	-- local sceneName = IIfA:GetCurrentSceneName()
-	local settings = IIfA:GetSceneSettings()
-
-	IIfA:SaveFrameInfo("onResizeStop")
-
-	IIfA:GuiResizeScroll()
-	if not settings.docked then
-		IIfA:UpdateInventoryScroll()
-	end
-end
-
-
-
--- put separate dock/minimize/restore sizing code into unified function so all resizing gets done in one place, one time
-function IIfA:RePositionFrame(settings)
-	--[[
-	re-position frame based on current settings
-	- docked - no sizing handles, no moving, anchor to left edge of conrols on right side of screen, width at minimum, height determined by right hand control
-	- locked - no sizing handles, no moving, anchor to GUIRoot, pos/size based on last known info
-	- minimized - no sizing handles, anchor to GUIRoot, height 33, width at minimum, pos based on last known info
-	- hidden - just hide the whole works as is
-	- none of the above, sizing handles 12, anchor to GUIRoot, pos/size based on last known info
-	--]]
-
-
-	ZO_Tooltips_HideTextTooltip()
-	local sceneName = IIfA:GetCurrentSceneName()
-	if settings == nil then
-		settings = IIfA:GetSceneSettings()
-	end
-
--- revisit - also look at toggleinventoryframe (it *should* be doing more than just show when it's not vis, like re-applying everything)
---	if settings.hidden == true and IIFA_GUI:IsHidden() then
---		return
---	end
-
-	local bIsHud = (sceneName == "hud")
-
-	local bMinimize = settings.minimized
-
-	-- all of these go away if we're minimizing, otherwise they're shown
-	IIFA_GUI_ListHolder:SetHidden(bMinimize)
-	IIFA_GUI_Header_Filter:SetHidden(bMinimize)
-	if IIfA.LastSubFilterControl == nil or bMinimize then
-		IIFA_GUI_Header_Subfilter:SetHidden(true)
-		IIFA_GUI_Header_Subfilter:SetHeight(0)
-	else
-		IIFA_GUI_Header_Subfilter:SetHidden(false)
-		IIFA_GUI_Header_Subfilter:SetHeight(38)
-	end
-	IIFA_GUI_Header_Dropdown:SetHidden(bMinimize)
-	IIFA_GUI_Search:SetHidden(bMinimize)
-	IIFA_GUI_Header_GoldButton:SetHidden(bMinimize)
-	IIFA_GUI_Header_BagButton:SetHidden(bMinimize)
-	IIFA_GUI_Header_SortBar:SetHidden(bMinimize)
-	IIFA_GUI_SetNameOnly:SetHidden(bMinimize)
-
-	IIFA_GUI:ClearAnchors()
-	if bMinimize then
-		IIFA_GUI:SetResizeHandleSize(0)
-		-- have to change the constraints, it even constrains resizing by code, not just resize by sizing handles
-   		IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 33, -1, 1400)
-
-		IIFA_GUI:SetHeight(33)
-		IIFA_GUI:SetWidth(settings.width)
-		IIFA_GUI:SetAnchor(TOPLEFT, GUIRoot, TOPLEFT, settings.lastX, settings.lastY)
-
-		-- no docking while minimized
-		IIFA_GUI_Header_Docked:SetHidden(true)
-		IIFA_GUI_Header_Undocked:SetHidden(true)
-
-		-- flip the min/max buttons
-		IIFA_GUI_Header_Minimize:SetHidden(true)
-		IIFA_GUI_Header_Maximize:SetHidden(false)
-	else
-   		IIFA_GUI:SetDimensionConstraints(IIfA.minWidth, 300, -1, 1400)
-		if settings.docked then
-			-- no resizing handles
-			IIFA_GUI:SetResizeHandleSize(0)
-
-			-- no min/max buttons
-			IIFA_GUI_Header_Minimize:SetHidden(true)
-			IIFA_GUI_Header_Maximize:SetHidden(true)
-
-			-- no lock/unlock buttons
-			IIFA_GUI_Header_Locked:SetHidden(true)
-			IIFA_GUI_Header_Unlocked:SetHidden(true)
-			IIFA_GUI:SetMovable(false)
-
-			-- set docked buttons properly
-			IIFA_GUI_Header_Docked:SetHidden(false)
-			IIFA_GUI_Header_Undocked:SetHidden(true)
-
-			local RightBackground = ZO_SharedRightPanelBackground
-			if not ZO_SharedRightBackground:IsControlHidden() then
-				RightBackground = ZO_SharedRightBackground
-			end
-			local parentHeight = RightBackground:GetHeight()
-			local windowOffset = -20
-			if sceneName == "mailInbox" or sceneName == "mailSend" then
-				windowOffset = -40
-			end
-			IIFA_GUI:SetHeight(parentheight)
-			IIFA_GUI:SetWidth(self.minWidth)
-			IIFA_GUI:SetAnchor(TOPRIGHT, RightBackground, TOPLEFT, windowOffset, 16)
-			IIFA_GUI:SetAnchor(BOTTOMRIGHT, RightBackground, BOTTOMLEFT, windowOffset, 16)
-		else
-			IIFA_GUI:SetHeight(settings.height)
-			IIFA_GUI:SetWidth(settings.width)
-			if not settings.locked then
-				IIFA_GUI:SetResizeHandleSize(12)
-			else
-				IIFA_GUI:SetResizeHandleSize(0)
-			end
-
-			-- set the min/max buttons
-			IIFA_GUI_Header_Minimize:SetHidden(false)
-			IIFA_GUI_Header_Maximize:SetHidden(true)
-
-			-- display lock/unlock buttons
-			IIFA_GUI_Header_Locked:SetHidden(not settings.locked)
-			IIFA_GUI_Header_Unlocked:SetHidden(settings.locked)
-			IIFA_GUI:SetMovable(not settings.locked)
-
-			-- set docked buttons properly
-			IIFA_GUI_Header_Docked:SetHidden(true)
-			IIFA_GUI_Header_Undocked:SetHidden(bIsHud)
-
-			-- different anchor point
-			IIFA_GUI:SetAnchor(TOPLEFT, GUIRoot, TOPLEFT, settings.lastX, settings.lastY)
-		end
-	end
-
-	if not settings.hidden then
-		IIfA:GuiResizeScroll()
-    	IIfA:UpdateScrollDataLinesData()
-    	IIfA:UpdateInventoryScroll()
-	end
-	IIFA_GUI:SetHidden(settings.hidden)
-end
-
-function IIfA:SetNameFilterToggle()
-	IIFA_GUI_SetNameOnly_Checked:SetHidden(IIfA.bFilterOnSetName)
-	IIfA.bFilterOnSetName = not IIfA.bFilterOnSetName
-    IIfA:UpdateScrollDataLinesData()
-    IIfA:UpdateInventoryScroll()
-end
diff --git a/README.md b/README.md
deleted file mode 100644
index 30602cc..0000000
--- a/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# InventoryInsight
-
-This is the git repository for the eso addon [InventoryInsight](http://www.esoui.com/downloads/info731-InventoryInsight.html "IIfA on esoui.com")
diff --git a/StringRegistration.lua b/StringRegistration.lua
deleted file mode 100644
index ed9ad57..0000000
--- a/StringRegistration.lua
+++ /dev/null
@@ -1,14 +0,0 @@
- --this creates a menu for the addon.
-local IIfA = IIfA
-
-local strings = {
-	IIFA_BAG_BAGPACK 	= "Inventar",
-	IIFA_BAG_BANK 		= "Bank",
-	IIFA_BAG_CRAFTBAG 	= "CraftBag",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 1)
-end
\ No newline at end of file
diff --git a/assets/apparel/clothing_down.dds b/assets/apparel/clothing_down.dds
deleted file mode 100644
index ef6375a..0000000
Binary files a/assets/apparel/clothing_down.dds and /dev/null differ
diff --git a/assets/apparel/clothing_over.dds b/assets/apparel/clothing_over.dds
deleted file mode 100644
index 6a22d0d..0000000
Binary files a/assets/apparel/clothing_over.dds and /dev/null differ
diff --git a/assets/apparel/clothing_up.dds b/assets/apparel/clothing_up.dds
deleted file mode 100644
index fd583d4..0000000
Binary files a/assets/apparel/clothing_up.dds and /dev/null differ
diff --git a/assets/apparel/jewelry_down.dds b/assets/apparel/jewelry_down.dds
deleted file mode 100644
index 9e80bc1..0000000
Binary files a/assets/apparel/jewelry_down.dds and /dev/null differ
diff --git a/assets/apparel/jewelry_over.dds b/assets/apparel/jewelry_over.dds
deleted file mode 100644
index 7146414..0000000
Binary files a/assets/apparel/jewelry_over.dds and /dev/null differ
diff --git a/assets/apparel/jewelry_up.dds b/assets/apparel/jewelry_up.dds
deleted file mode 100644
index ca66730..0000000
Binary files a/assets/apparel/jewelry_up.dds and /dev/null differ
diff --git a/assets/apparel/shield_down.dds b/assets/apparel/shield_down.dds
deleted file mode 100644
index cb98b00..0000000
Binary files a/assets/apparel/shield_down.dds and /dev/null differ
diff --git a/assets/apparel/shield_over.dds b/assets/apparel/shield_over.dds
deleted file mode 100644
index 61c5c6b..0000000
Binary files a/assets/apparel/shield_over.dds and /dev/null differ
diff --git a/assets/apparel/shield_up.dds b/assets/apparel/shield_up.dds
deleted file mode 100644
index de0dc58..0000000
Binary files a/assets/apparel/shield_up.dds and /dev/null differ
diff --git a/assets/consumables/containers/container_down.dds b/assets/consumables/containers/container_down.dds
deleted file mode 100644
index b55c106..0000000
Binary files a/assets/consumables/containers/container_down.dds and /dev/null differ
diff --git a/assets/consumables/containers/container_over.dds b/assets/consumables/containers/container_over.dds
deleted file mode 100644
index 58ef270..0000000
Binary files a/assets/consumables/containers/container_over.dds and /dev/null differ
diff --git a/assets/consumables/containers/container_up.dds b/assets/consumables/containers/container_up.dds
deleted file mode 100644
index 804e124..0000000
Binary files a/assets/consumables/containers/container_up.dds and /dev/null differ
diff --git a/assets/consumables/drinks/drink_down.dds b/assets/consumables/drinks/drink_down.dds
deleted file mode 100644
index c246c01..0000000
Binary files a/assets/consumables/drinks/drink_down.dds and /dev/null differ
diff --git a/assets/consumables/drinks/drink_over.dds b/assets/consumables/drinks/drink_over.dds
deleted file mode 100644
index 989ec36..0000000
Binary files a/assets/consumables/drinks/drink_over.dds and /dev/null differ
diff --git a/assets/consumables/drinks/drink_up.dds b/assets/consumables/drinks/drink_up.dds
deleted file mode 100644
index 730d728..0000000
Binary files a/assets/consumables/drinks/drink_up.dds and /dev/null differ
diff --git a/assets/consumables/food/food_down.dds b/assets/consumables/food/food_down.dds
deleted file mode 100644
index ede82d3..0000000
Binary files a/assets/consumables/food/food_down.dds and /dev/null differ
diff --git a/assets/consumables/food/food_over.dds b/assets/consumables/food/food_over.dds
deleted file mode 100644
index 7302ac0..0000000
Binary files a/assets/consumables/food/food_over.dds and /dev/null differ
diff --git a/assets/consumables/food/food_up.dds b/assets/consumables/food/food_up.dds
deleted file mode 100644
index 74fe517..0000000
Binary files a/assets/consumables/food/food_up.dds and /dev/null differ
diff --git a/assets/consumables/motifs/motif_down.dds b/assets/consumables/motifs/motif_down.dds
deleted file mode 100644
index ae95c4a..0000000
Binary files a/assets/consumables/motifs/motif_down.dds and /dev/null differ
diff --git a/assets/consumables/motifs/motif_over.dds b/assets/consumables/motifs/motif_over.dds
deleted file mode 100644
index 0c3bf7c..0000000
Binary files a/assets/consumables/motifs/motif_over.dds and /dev/null differ
diff --git a/assets/consumables/motifs/motif_up.dds b/assets/consumables/motifs/motif_up.dds
deleted file mode 100644
index 17b9c83..0000000
Binary files a/assets/consumables/motifs/motif_up.dds and /dev/null differ
diff --git a/assets/consumables/poison/poison_down.dds b/assets/consumables/poison/poison_down.dds
deleted file mode 100644
index 12e9dac..0000000
Binary files a/assets/consumables/poison/poison_down.dds and /dev/null differ
diff --git a/assets/consumables/poison/poison_over.dds b/assets/consumables/poison/poison_over.dds
deleted file mode 100644
index 7ff30e4..0000000
Binary files a/assets/consumables/poison/poison_over.dds and /dev/null differ
diff --git a/assets/consumables/poison/poison_up.dds b/assets/consumables/poison/poison_up.dds
deleted file mode 100644
index cf0d602..0000000
Binary files a/assets/consumables/poison/poison_up.dds and /dev/null differ
diff --git a/assets/consumables/potion/potion_down.dds b/assets/consumables/potion/potion_down.dds
deleted file mode 100644
index 70941de..0000000
Binary files a/assets/consumables/potion/potion_down.dds and /dev/null differ
diff --git a/assets/consumables/potion/potion_over.dds b/assets/consumables/potion/potion_over.dds
deleted file mode 100644
index e49c955..0000000
Binary files a/assets/consumables/potion/potion_over.dds and /dev/null differ
diff --git a/assets/consumables/potion/potion_up.dds b/assets/consumables/potion/potion_up.dds
deleted file mode 100644
index e11b347..0000000
Binary files a/assets/consumables/potion/potion_up.dds and /dev/null differ
diff --git a/assets/consumables/recipes/recipe_down.dds b/assets/consumables/recipes/recipe_down.dds
deleted file mode 100644
index 0f2dbc7..0000000
Binary files a/assets/consumables/recipes/recipe_down.dds and /dev/null differ
diff --git a/assets/consumables/recipes/recipe_over.dds b/assets/consumables/recipes/recipe_over.dds
deleted file mode 100644
index ccff653..0000000
Binary files a/assets/consumables/recipes/recipe_over.dds and /dev/null differ
diff --git a/assets/consumables/recipes/recipe_up.dds b/assets/consumables/recipes/recipe_up.dds
deleted file mode 100644
index 44e2451..0000000
Binary files a/assets/consumables/recipes/recipe_up.dds and /dev/null differ
diff --git a/assets/consumables/repair/repair_down.dds b/assets/consumables/repair/repair_down.dds
deleted file mode 100644
index 5c5f5e3..0000000
Binary files a/assets/consumables/repair/repair_down.dds and /dev/null differ
diff --git a/assets/consumables/repair/repair_over.dds b/assets/consumables/repair/repair_over.dds
deleted file mode 100644
index c599fc4..0000000
Binary files a/assets/consumables/repair/repair_over.dds and /dev/null differ
diff --git a/assets/consumables/repair/repair_up.dds b/assets/consumables/repair/repair_up.dds
deleted file mode 100644
index d38166a..0000000
Binary files a/assets/consumables/repair/repair_up.dds and /dev/null differ
diff --git a/assets/icons/Akaviri.dds b/assets/icons/Akaviri.dds
deleted file mode 100644
index 30409c5..0000000
Binary files a/assets/icons/Akaviri.dds and /dev/null differ
diff --git a/assets/icons/Bandit.dds b/assets/icons/Bandit.dds
deleted file mode 100644
index cf0a3a3..0000000
Binary files a/assets/icons/Bandit.dds and /dev/null differ
diff --git a/assets/icons/BuoyantArmiger.dds b/assets/icons/BuoyantArmiger.dds
deleted file mode 100644
index 9333584..0000000
Binary files a/assets/icons/BuoyantArmiger.dds and /dev/null differ
diff --git a/assets/icons/Maormer.dds b/assets/icons/Maormer.dds
deleted file mode 100644
index 9aac4fc..0000000
Binary files a/assets/icons/Maormer.dds and /dev/null differ
diff --git a/assets/icons/Primitive.dds b/assets/icons/Primitive.dds
deleted file mode 100644
index f7fed38..0000000
Binary files a/assets/icons/Primitive.dds and /dev/null differ
diff --git a/assets/icons/Reach.dds b/assets/icons/Reach.dds
deleted file mode 100644
index 47f7b16..0000000
Binary files a/assets/icons/Reach.dds and /dev/null differ
diff --git a/assets/icons/Soulshriven.dds b/assets/icons/Soulshriven.dds
deleted file mode 100644
index 5e0e45f..0000000
Binary files a/assets/icons/Soulshriven.dds and /dev/null differ
diff --git a/assets/icons/abahswatch.dds b/assets/icons/abahswatch.dds
deleted file mode 100644
index 42c13f7..0000000
Binary files a/assets/icons/abahswatch.dds and /dev/null differ
diff --git a/assets/icons/akatosh.dds b/assets/icons/akatosh.dds
deleted file mode 100644
index df2d207..0000000
Binary files a/assets/icons/akatosh.dds and /dev/null differ
diff --git a/assets/icons/altmer.dds b/assets/icons/altmer.dds
deleted file mode 100644
index 036c746..0000000
Binary files a/assets/icons/altmer.dds and /dev/null differ
diff --git a/assets/icons/ancient.dds b/assets/icons/ancient.dds
deleted file mode 100644
index 9240a9d..0000000
Binary files a/assets/icons/ancient.dds and /dev/null differ
diff --git a/assets/icons/apostle.dds b/assets/icons/apostle.dds
deleted file mode 100644
index 0d7e260..0000000
Binary files a/assets/icons/apostle.dds and /dev/null differ
diff --git a/assets/icons/argonian.dds b/assets/icons/argonian.dds
deleted file mode 100644
index 1319590..0000000
Binary files a/assets/icons/argonian.dds and /dev/null differ
diff --git a/assets/icons/assassin.dds b/assets/icons/assassin.dds
deleted file mode 100644
index f480732..0000000
Binary files a/assets/icons/assassin.dds and /dev/null differ
diff --git a/assets/icons/bloodforge.dds b/assets/icons/bloodforge.dds
deleted file mode 100644
index 007fda5..0000000
Binary files a/assets/icons/bloodforge.dds and /dev/null differ
diff --git a/assets/icons/bosmer.dds b/assets/icons/bosmer.dds
deleted file mode 100644
index c92d595..0000000
Binary files a/assets/icons/bosmer.dds and /dev/null differ
diff --git a/assets/icons/breton.dds b/assets/icons/breton.dds
deleted file mode 100644
index d32e08b..0000000
Binary files a/assets/icons/breton.dds and /dev/null differ
diff --git a/assets/icons/broken.dds b/assets/icons/broken.dds
deleted file mode 100644
index 9770828..0000000
Binary files a/assets/icons/broken.dds and /dev/null differ
diff --git a/assets/icons/cliffracer.dds b/assets/icons/cliffracer.dds
deleted file mode 100644
index 1cd03eb..0000000
Binary files a/assets/icons/cliffracer.dds and /dev/null differ
diff --git a/assets/icons/clockwork.dds b/assets/icons/clockwork.dds
deleted file mode 100644
index 2f4dfbc..0000000
Binary files a/assets/icons/clockwork.dds and /dev/null differ
diff --git a/assets/icons/daedric.dds b/assets/icons/daedric.dds
deleted file mode 100644
index 18b6ad0..0000000
Binary files a/assets/icons/daedric.dds and /dev/null differ
diff --git a/assets/icons/daggerfall.dds b/assets/icons/daggerfall.dds
deleted file mode 100644
index 6af5bed..0000000
Binary files a/assets/icons/daggerfall.dds and /dev/null differ
diff --git a/assets/icons/darkbrotherhood.dds b/assets/icons/darkbrotherhood.dds
deleted file mode 100644
index db38123..0000000
Binary files a/assets/icons/darkbrotherhood.dds and /dev/null differ
diff --git a/assets/icons/docked_down.dds b/assets/icons/docked_down.dds
deleted file mode 100644
index 5dcce13..0000000
Binary files a/assets/icons/docked_down.dds and /dev/null differ
diff --git a/assets/icons/docked_over.dds b/assets/icons/docked_over.dds
deleted file mode 100644
index 8014ba3..0000000
Binary files a/assets/icons/docked_over.dds and /dev/null differ
diff --git a/assets/icons/docked_up.dds b/assets/icons/docked_up.dds
deleted file mode 100644
index e690d21..0000000
Binary files a/assets/icons/docked_up.dds and /dev/null differ
diff --git a/assets/icons/dragonknight.dds b/assets/icons/dragonknight.dds
deleted file mode 100644
index 9eca10c..0000000
Binary files a/assets/icons/dragonknight.dds and /dev/null differ
diff --git a/assets/icons/dreadhorn.dds b/assets/icons/dreadhorn.dds
deleted file mode 100644
index 3f1af48..0000000
Binary files a/assets/icons/dreadhorn.dds and /dev/null differ
diff --git a/assets/icons/dromathra.dds b/assets/icons/dromathra.dds
deleted file mode 100644
index d9b3530..0000000
Binary files a/assets/icons/dromathra.dds and /dev/null differ
diff --git a/assets/icons/dunmer.dds b/assets/icons/dunmer.dds
deleted file mode 100644
index a88f98a..0000000
Binary files a/assets/icons/dunmer.dds and /dev/null differ
diff --git a/assets/icons/dwemer.dds b/assets/icons/dwemer.dds
deleted file mode 100644
index 7c56666..0000000
Binary files a/assets/icons/dwemer.dds and /dev/null differ
diff --git a/assets/icons/ebonheart.dds b/assets/icons/ebonheart.dds
deleted file mode 100644
index 9a83476..0000000
Binary files a/assets/icons/ebonheart.dds and /dev/null differ
diff --git a/assets/icons/ebonshadow.dds b/assets/icons/ebonshadow.dds
deleted file mode 100644
index 0cf3ef3..0000000
Binary files a/assets/icons/ebonshadow.dds and /dev/null differ
diff --git a/assets/icons/ebony.dds b/assets/icons/ebony.dds
deleted file mode 100644
index 511639d..0000000
Binary files a/assets/icons/ebony.dds and /dev/null differ
diff --git a/assets/icons/frostcaster.dds b/assets/icons/frostcaster.dds
deleted file mode 100644
index 60286ce..0000000
Binary files a/assets/icons/frostcaster.dds and /dev/null differ
diff --git a/assets/icons/harlequin.dds b/assets/icons/harlequin.dds
deleted file mode 100644
index 2d89b8c..0000000
Binary files a/assets/icons/harlequin.dds and /dev/null differ
diff --git a/assets/icons/hlaalu.dds b/assets/icons/hlaalu.dds
deleted file mode 100644
index 5697297..0000000
Binary files a/assets/icons/hlaalu.dds and /dev/null differ
diff --git a/assets/icons/hollowjack.dds b/assets/icons/hollowjack.dds
deleted file mode 100644
index 0c21e51..0000000
Binary files a/assets/icons/hollowjack.dds and /dev/null differ
diff --git a/assets/icons/imperial.dds b/assets/icons/imperial.dds
deleted file mode 100644
index ad2c9d8..0000000
Binary files a/assets/icons/imperial.dds and /dev/null differ
diff --git a/assets/icons/inventoryinsight_icon.dds b/assets/icons/inventoryinsight_icon.dds
deleted file mode 100644
index f5b6800..0000000
Binary files a/assets/icons/inventoryinsight_icon.dds and /dev/null differ
diff --git a/assets/icons/khajit.dds b/assets/icons/khajit.dds
deleted file mode 100644
index 3608358..0000000
Binary files a/assets/icons/khajit.dds and /dev/null differ
diff --git a/assets/icons/kothringi.dds b/assets/icons/kothringi.dds
deleted file mode 100644
index 5437cd0..0000000
Binary files a/assets/icons/kothringi.dds and /dev/null differ
diff --git a/assets/icons/laurel.dds b/assets/icons/laurel.dds
deleted file mode 100644
index 5220df4..0000000
Binary files a/assets/icons/laurel.dds and /dev/null differ
diff --git a/assets/icons/lizard.dds b/assets/icons/lizard.dds
deleted file mode 100644
index d5f1f2b..0000000
Binary files a/assets/icons/lizard.dds and /dev/null differ
diff --git a/assets/icons/malacath.dds b/assets/icons/malacath.dds
deleted file mode 100644
index 4bab1ed..0000000
Binary files a/assets/icons/malacath.dds and /dev/null differ
diff --git a/assets/icons/minotaur.dds b/assets/icons/minotaur.dds
deleted file mode 100644
index f070aac..0000000
Binary files a/assets/icons/minotaur.dds and /dev/null differ
diff --git a/assets/icons/moragtong.dds b/assets/icons/moragtong.dds
deleted file mode 100644
index 54e28df..0000000
Binary files a/assets/icons/moragtong.dds and /dev/null differ
diff --git a/assets/icons/necromancer.dds b/assets/icons/necromancer.dds
deleted file mode 100644
index 7fdc860..0000000
Binary files a/assets/icons/necromancer.dds and /dev/null differ
diff --git a/assets/icons/nightblade.dds b/assets/icons/nightblade.dds
deleted file mode 100644
index 066b58e..0000000
Binary files a/assets/icons/nightblade.dds and /dev/null differ
diff --git a/assets/icons/nord.dds b/assets/icons/nord.dds
deleted file mode 100644
index c8ab9de..0000000
Binary files a/assets/icons/nord.dds and /dev/null differ
diff --git a/assets/icons/ordinator.dds b/assets/icons/ordinator.dds
deleted file mode 100644
index 589ae0a..0000000
Binary files a/assets/icons/ordinator.dds and /dev/null differ
diff --git a/assets/icons/orsimer.dds b/assets/icons/orsimer.dds
deleted file mode 100644
index 80b59d2..0000000
Binary files a/assets/icons/orsimer.dds and /dev/null differ
diff --git a/assets/icons/outlaw.dds b/assets/icons/outlaw.dds
deleted file mode 100644
index b1f2c93..0000000
Binary files a/assets/icons/outlaw.dds and /dev/null differ
diff --git a/assets/icons/ragada.dds b/assets/icons/ragada.dds
deleted file mode 100644
index 65d7d19..0000000
Binary files a/assets/icons/ragada.dds and /dev/null differ
diff --git a/assets/icons/redguard.dds b/assets/icons/redguard.dds
deleted file mode 100644
index 6bfec2c..0000000
Binary files a/assets/icons/redguard.dds and /dev/null differ
diff --git a/assets/icons/redoran.dds b/assets/icons/redoran.dds
deleted file mode 100644
index be4c4f3..0000000
Binary files a/assets/icons/redoran.dds and /dev/null differ
diff --git a/assets/icons/skinchanger.dds b/assets/icons/skinchanger.dds
deleted file mode 100644
index 38027e0..0000000
Binary files a/assets/icons/skinchanger.dds and /dev/null differ
diff --git a/assets/icons/skull.dds b/assets/icons/skull.dds
deleted file mode 100644
index 7fdc860..0000000
Binary files a/assets/icons/skull.dds and /dev/null differ
diff --git a/assets/icons/skull_nice.dds b/assets/icons/skull_nice.dds
deleted file mode 100644
index 105b589..0000000
Binary files a/assets/icons/skull_nice.dds and /dev/null differ
diff --git a/assets/icons/sorcerer.dds b/assets/icons/sorcerer.dds
deleted file mode 100644
index 1509f09..0000000
Binary files a/assets/icons/sorcerer.dds and /dev/null differ
diff --git a/assets/icons/telvanni.dds b/assets/icons/telvanni.dds
deleted file mode 100644
index 97631be..0000000
Binary files a/assets/icons/telvanni.dds and /dev/null differ
diff --git a/assets/icons/templar.dds b/assets/icons/templar.dds
deleted file mode 100644
index 989c0c9..0000000
Binary files a/assets/icons/templar.dds and /dev/null differ
diff --git a/assets/icons/thief.dds b/assets/icons/thief.dds
deleted file mode 100644
index da1c61f..0000000
Binary files a/assets/icons/thief.dds and /dev/null differ
diff --git a/assets/icons/triangle.dds b/assets/icons/triangle.dds
deleted file mode 100644
index 1fea9b7..0000000
Binary files a/assets/icons/triangle.dds and /dev/null differ
diff --git a/assets/icons/trinimac.dds b/assets/icons/trinimac.dds
deleted file mode 100644
index eb1c987..0000000
Binary files a/assets/icons/trinimac.dds and /dev/null differ
diff --git a/assets/icons/tsaesci.dds b/assets/icons/tsaesci.dds
deleted file mode 100644
index ac3909e..0000000
Binary files a/assets/icons/tsaesci.dds and /dev/null differ
diff --git a/assets/icons/undocked_down.dds b/assets/icons/undocked_down.dds
deleted file mode 100644
index df1fd8e..0000000
Binary files a/assets/icons/undocked_down.dds and /dev/null differ
diff --git a/assets/icons/undocked_over.dds b/assets/icons/undocked_over.dds
deleted file mode 100644
index 9319337..0000000
Binary files a/assets/icons/undocked_over.dds and /dev/null differ
diff --git a/assets/icons/undocked_up.dds b/assets/icons/undocked_up.dds
deleted file mode 100644
index 0a38f4b..0000000
Binary files a/assets/icons/undocked_up.dds and /dev/null differ
diff --git a/assets/icons/wheel.dds b/assets/icons/wheel.dds
deleted file mode 100644
index 2a61dc5..0000000
Binary files a/assets/icons/wheel.dds and /dev/null differ
diff --git a/assets/materials/atrait/atrait_down.dds b/assets/materials/atrait/atrait_down.dds
deleted file mode 100644
index 298c340..0000000
Binary files a/assets/materials/atrait/atrait_down.dds and /dev/null differ
diff --git a/assets/materials/atrait/atrait_over.dds b/assets/materials/atrait/atrait_over.dds
deleted file mode 100644
index 9335b04..0000000
Binary files a/assets/materials/atrait/atrait_over.dds and /dev/null differ
diff --git a/assets/materials/atrait/atrait_up.dds b/assets/materials/atrait/atrait_up.dds
deleted file mode 100644
index 1cf2479..0000000
Binary files a/assets/materials/atrait/atrait_up.dds and /dev/null differ
diff --git a/assets/materials/wtrait/wtrait_down.dds b/assets/materials/wtrait/wtrait_down.dds
deleted file mode 100644
index 6feea5a..0000000
Binary files a/assets/materials/wtrait/wtrait_down.dds and /dev/null differ
diff --git a/assets/materials/wtrait/wtrait_over.dds b/assets/materials/wtrait/wtrait_over.dds
deleted file mode 100644
index bd364ef..0000000
Binary files a/assets/materials/wtrait/wtrait_over.dds and /dev/null differ
diff --git a/assets/materials/wtrait/wtrait_up.dds b/assets/materials/wtrait/wtrait_up.dds
deleted file mode 100644
index 59f2ef1..0000000
Binary files a/assets/materials/wtrait/wtrait_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/avaweapon/avaweapon_down.dds b/assets/miscellaneous/avaweapon/avaweapon_down.dds
deleted file mode 100644
index 6ab5ab6..0000000
Binary files a/assets/miscellaneous/avaweapon/avaweapon_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/avaweapon/avaweapon_over.dds b/assets/miscellaneous/avaweapon/avaweapon_over.dds
deleted file mode 100644
index deb14e4..0000000
Binary files a/assets/miscellaneous/avaweapon/avaweapon_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/avaweapon/avaweapon_up.dds b/assets/miscellaneous/avaweapon/avaweapon_up.dds
deleted file mode 100644
index 859ffaf..0000000
Binary files a/assets/miscellaneous/avaweapon/avaweapon_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/bait/bait_down.dds b/assets/miscellaneous/bait/bait_down.dds
deleted file mode 100644
index 0c67eb8..0000000
Binary files a/assets/miscellaneous/bait/bait_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/bait/bait_over.dds b/assets/miscellaneous/bait/bait_over.dds
deleted file mode 100644
index 21cc4a0..0000000
Binary files a/assets/miscellaneous/bait/bait_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/bait/bait_up.dds b/assets/miscellaneous/bait/bait_up.dds
deleted file mode 100644
index 8e8e053..0000000
Binary files a/assets/miscellaneous/bait/bait_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/glyphs/glyphs_down.dds b/assets/miscellaneous/glyphs/glyphs_down.dds
deleted file mode 100644
index 283aed6..0000000
Binary files a/assets/miscellaneous/glyphs/glyphs_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/glyphs/glyphs_over.dds b/assets/miscellaneous/glyphs/glyphs_over.dds
deleted file mode 100644
index b701af4..0000000
Binary files a/assets/miscellaneous/glyphs/glyphs_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/glyphs/glyphs_up.dds b/assets/miscellaneous/glyphs/glyphs_up.dds
deleted file mode 100644
index 6d8cdf5..0000000
Binary files a/assets/miscellaneous/glyphs/glyphs_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/soulgem/soulgem_down.dds b/assets/miscellaneous/soulgem/soulgem_down.dds
deleted file mode 100644
index c3988d0..0000000
Binary files a/assets/miscellaneous/soulgem/soulgem_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/soulgem/soulgem_over.dds b/assets/miscellaneous/soulgem/soulgem_over.dds
deleted file mode 100644
index 4d26d0b..0000000
Binary files a/assets/miscellaneous/soulgem/soulgem_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/soulgem/soulgem_up.dds b/assets/miscellaneous/soulgem/soulgem_up.dds
deleted file mode 100644
index 6dfbe32..0000000
Binary files a/assets/miscellaneous/soulgem/soulgem_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/trash/trash_down.dds b/assets/miscellaneous/trash/trash_down.dds
deleted file mode 100644
index eb8d1b1..0000000
Binary files a/assets/miscellaneous/trash/trash_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/trash/trash_over.dds b/assets/miscellaneous/trash/trash_over.dds
deleted file mode 100644
index 2184ed2..0000000
Binary files a/assets/miscellaneous/trash/trash_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/trash/trash_up.dds b/assets/miscellaneous/trash/trash_up.dds
deleted file mode 100644
index 8dc9ac1..0000000
Binary files a/assets/miscellaneous/trash/trash_up.dds and /dev/null differ
diff --git a/assets/miscellaneous/trophy/trophy_down.dds b/assets/miscellaneous/trophy/trophy_down.dds
deleted file mode 100644
index 64e2512..0000000
Binary files a/assets/miscellaneous/trophy/trophy_down.dds and /dev/null differ
diff --git a/assets/miscellaneous/trophy/trophy_over.dds b/assets/miscellaneous/trophy/trophy_over.dds
deleted file mode 100644
index a2bd140..0000000
Binary files a/assets/miscellaneous/trophy/trophy_over.dds and /dev/null differ
diff --git a/assets/miscellaneous/trophy/trophy_up.dds b/assets/miscellaneous/trophy/trophy_up.dds
deleted file mode 100644
index 39e9dfa..0000000
Binary files a/assets/miscellaneous/trophy/trophy_up.dds and /dev/null differ
diff --git a/assets/weapons/bow_down.dds b/assets/weapons/bow_down.dds
deleted file mode 100644
index 73c0f5a..0000000
Binary files a/assets/weapons/bow_down.dds and /dev/null differ
diff --git a/assets/weapons/bow_over.dds b/assets/weapons/bow_over.dds
deleted file mode 100644
index eac0968..0000000
Binary files a/assets/weapons/bow_over.dds and /dev/null differ
diff --git a/assets/weapons/bow_up.dds b/assets/weapons/bow_up.dds
deleted file mode 100644
index 9a5892f..0000000
Binary files a/assets/weapons/bow_up.dds and /dev/null differ
diff --git a/assets/weapons/destruction_down.dds b/assets/weapons/destruction_down.dds
deleted file mode 100644
index 0e4cfe7..0000000
Binary files a/assets/weapons/destruction_down.dds and /dev/null differ
diff --git a/assets/weapons/destruction_over.dds b/assets/weapons/destruction_over.dds
deleted file mode 100644
index 88db22c..0000000
Binary files a/assets/weapons/destruction_over.dds and /dev/null differ
diff --git a/assets/weapons/destruction_up.dds b/assets/weapons/destruction_up.dds
deleted file mode 100644
index fc26c06..0000000
Binary files a/assets/weapons/destruction_up.dds and /dev/null differ
diff --git a/assets/weapons/healing_down.dds b/assets/weapons/healing_down.dds
deleted file mode 100644
index d07892a..0000000
Binary files a/assets/weapons/healing_down.dds and /dev/null differ
diff --git a/assets/weapons/healing_over.dds b/assets/weapons/healing_over.dds
deleted file mode 100644
index 7409cdb..0000000
Binary files a/assets/weapons/healing_over.dds and /dev/null differ
diff --git a/assets/weapons/healing_up.dds b/assets/weapons/healing_up.dds
deleted file mode 100644
index 7c5767a..0000000
Binary files a/assets/weapons/healing_up.dds and /dev/null differ
diff --git a/assets/weapons/onehanded_down.dds b/assets/weapons/onehanded_down.dds
deleted file mode 100644
index 8266507..0000000
Binary files a/assets/weapons/onehanded_down.dds and /dev/null differ
diff --git a/assets/weapons/onehanded_over.dds b/assets/weapons/onehanded_over.dds
deleted file mode 100644
index 6d1ecf7..0000000
Binary files a/assets/weapons/onehanded_over.dds and /dev/null differ
diff --git a/assets/weapons/onehanded_up.dds b/assets/weapons/onehanded_up.dds
deleted file mode 100644
index d9797b5..0000000
Binary files a/assets/weapons/onehanded_up.dds and /dev/null differ
diff --git a/assets/weapons/twohanded_down.dds b/assets/weapons/twohanded_down.dds
deleted file mode 100644
index df881aa..0000000
Binary files a/assets/weapons/twohanded_down.dds and /dev/null differ
diff --git a/assets/weapons/twohanded_over.dds b/assets/weapons/twohanded_over.dds
deleted file mode 100644
index fc1c255..0000000
Binary files a/assets/weapons/twohanded_over.dds and /dev/null differ
diff --git a/assets/weapons/twohanded_up.dds b/assets/weapons/twohanded_up.dds
deleted file mode 100644
index a5c3dac..0000000
Binary files a/assets/weapons/twohanded_up.dds and /dev/null differ
diff --git a/libs/LibAddonMenu-2.0/LICENSE b/libs/LibAddonMenu-2.0/LICENSE
deleted file mode 100644
index f69cbd4..0000000
--- a/libs/LibAddonMenu-2.0/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-               The Artistic License 2.0
-
-           Copyright (c) 2016 Ryan Lakanen (Seerah)
-
-     Everyone is permitted to copy and distribute verbatim copies
-      of this license document, but changing it is not allowed.
-
-Preamble
-
-This license establishes the terms under which a given free software
-Package may be copied, modified, distributed, and/or redistributed.
-The intent is that the Copyright Holder maintains some artistic
-control over the development of that Package while still keeping the
-Package available as open source and free software.
-
-You are always permitted to make arrangements wholly outside of this
-license directly with the Copyright Holder of a given Package.  If the
-terms of this license do not permit the full use that you propose to
-make of the Package, you should contact the Copyright Holder and seek
-a different licensing arrangement.
-
-Definitions
-
-    "Copyright Holder" means the individual(s) or organization(s)
-    named in the copyright notice for the entire Package.
-
-    "Contributor" means any party that has contributed code or other
-    material to the Package, in accordance with the Copyright Holder's
-    procedures.
-
-    "You" and "your" means any person who would like to copy,
-    distribute, or modify the Package.
-
-    "Package" means the collection of files distributed by the
-    Copyright Holder, and derivatives of that collection and/or of
-    those files. A given Package may consist of either the Standard
-    Version, or a Modified Version.
-
-    "Distribute" means providing a copy of the Package or making it
-    accessible to anyone else, or in the case of a company or
-    organization, to others outside of your company or organization.
-
-    "Distributor Fee" means any fee that you charge for Distributing
-    this Package or providing support for this Package to another
-    party.  It does not mean licensing fees.
-
-    "Standard Version" refers to the Package if it has not been
-    modified, or has been modified only in ways explicitly requested
-    by the Copyright Holder.
-
-    "Modified Version" means the Package, if it has been changed, and
-    such changes were not explicitly requested by the Copyright
-    Holder.
-
-    "Original License" means this Artistic License as Distributed with
-    the Standard Version of the Package, in its current version or as
-    it may be modified by The Perl Foundation in the future.
-
-    "Source" form means the source code, documentation source, and
-    configuration files for the Package.
-
-    "Compiled" form means the compiled bytecode, object code, binary,
-    or any other form resulting from mechanical transformation or
-    translation of the Source form.
-
-
-Permission for Use and Modification Without Distribution
-
-(1)  You are permitted to use the Standard Version and create and use
-Modified Versions for any purpose without restriction, provided that
-you do not Distribute the Modified Version.
-
-
-Permissions for Redistribution of the Standard Version
-
-(2)  You may Distribute verbatim copies of the Source form of the
-Standard Version of this Package in any medium without restriction,
-either gratis or for a Distributor Fee, provided that you duplicate
-all of the original copyright notices and associated disclaimers.  At
-your discretion, such verbatim copies may or may not include a
-Compiled form of the Package.
-
-(3)  You may apply any bug fixes, portability changes, and other
-modifications made available from the Copyright Holder.  The resulting
-Package will still be considered the Standard Version, and as such
-will be subject to the Original License.
-
-
-Distribution of Modified Versions of the Package as Source
-
-(4)  You may Distribute your Modified Version as Source (either gratis
-or for a Distributor Fee, and with or without a Compiled form of the
-Modified Version) provided that you clearly document how it differs
-from the Standard Version, including, but not limited to, documenting
-any non-standard features, executables, or modules, and provided that
-you do at least ONE of the following:
-
-    (a)  make the Modified Version available to the Copyright Holder
-    of the Standard Version, under the Original License, so that the
-    Copyright Holder may include your modifications in the Standard
-    Version.
-
-    (b)  ensure that installation of your Modified Version does not
-    prevent the user installing or running the Standard Version. In
-    addition, the Modified Version must bear a name that is different
-    from the name of the Standard Version.
-
-    (c)  allow anyone who receives a copy of the Modified Version to
-    make the Source form of the Modified Version available to others
-    under
-
-    (i)  the Original License or
-
-    (ii)  a license that permits the licensee to freely copy,
-    modify and redistribute the Modified Version using the same
-    licensing terms that apply to the copy that the licensee
-    received, and requires that the Source form of the Modified
-    Version, and of any works derived from it, be made freely
-    available in that license fees are prohibited but Distributor
-    Fees are allowed.
-
-
-Distribution of Compiled Forms of the Standard Version
-or Modified Versions without the Source
-
-(5)  You may Distribute Compiled forms of the Standard Version without
-the Source, provided that you include complete instructions on how to
-get the Source of the Standard Version.  Such instructions must be
-valid at the time of your distribution.  If these instructions, at any
-time while you are carrying out such distribution, become invalid, you
-must provide new instructions on demand or cease further distribution.
-If you provide valid instructions or cease distribution within thirty
-days after you become aware that the instructions are invalid, then
-you do not forfeit any of your rights under this license.
-
-(6)  You may Distribute a Modified Version in Compiled form without
-the Source, provided that you comply with Section 4 with respect to
-the Source of the Modified Version.
-
-
-Aggregating or Linking the Package
-
-(7)  You may aggregate the Package (either the Standard Version or
-Modified Version) with other packages and Distribute the resulting
-aggregation provided that you do not charge a licensing fee for the
-Package.  Distributor Fees are permitted, and licensing fees for other
-components in the aggregation are permitted. The terms of this license
-apply to the use and Distribution of the Standard or Modified Versions
-as included in the aggregation.
-
-(8) You are permitted to link Modified and Standard Versions with
-other works, to embed the Package in a larger work of your own, or to
-build stand-alone binary or bytecode versions of applications that
-include the Package, and Distribute the result without restriction,
-provided the result does not expose a direct interface to the Package.
-
-
-Items That are Not Considered Part of a Modified Version
-
-(9) Works (including, but not limited to, modules and scripts) that
-merely extend or make use of the Package, do not, by themselves, cause
-the Package to be a Modified Version.  In addition, such works are not
-considered parts of the Package itself, and are not subject to the
-terms of this license.
-
-
-General Provisions
-
-(10)  Any use, modification, and distribution of the Standard or
-Modified Versions is governed by this Artistic License. By using,
-modifying or distributing the Package, you accept this license. Do not
-use, modify, or distribute the Package, if you do not accept this
-license.
-
-(11)  If your Modified Version has been derived from a Modified
-Version made by someone other than you, you are nevertheless required
-to ensure that your Modified Version complies with the requirements of
-this license.
-
-(12)  This license does not grant you the right to use any trademark,
-service mark, tradename, or logo of the Copyright Holder.
-
-(13)  This license includes the non-exclusive, worldwide,
-free-of-charge patent license to make, have made, use, offer to sell,
-sell, import and otherwise transfer the Package with respect to any
-patent claims licensable by the Copyright Holder that are necessarily
-infringed by the Package. If you institute patent litigation
-(including a cross-claim or counterclaim) against any party alleging
-that the Package constitutes direct or contributory patent
-infringement, then this Artistic License to you shall terminate on the
-date that such litigation is filed.
-
-(14)  Disclaimer of Warranty:
-THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
-IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
-LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
deleted file mode 100644
index cb97a2e..0000000
--- a/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+++ /dev/null
@@ -1,1186 +0,0 @@
--- LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)         --
--- Distributed under The Artistic License 2.0 (see LICENSE)     --
-------------------------------------------------------------------
-
-
---Register LAM with LibStub
-local MAJOR, MINOR = "LibAddonMenu-2.0", 23
-local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not lam then return end --the same or newer version of this lib is already loaded into memory
-
-local messages = {}
-local MESSAGE_PREFIX = "[LAM2] "
-local function PrintLater(msg)
-    if CHAT_SYSTEM.primaryContainer then
-        d(MESSAGE_PREFIX .. msg)
-    else
-        messages[#messages + 1] = msg
-    end
-end
-
-local function FlushMessages()
-    for i = 1, #messages do
-        d(MESSAGE_PREFIX .. messages[i])
-    end
-    messages = {}
-end
-
-if LAMSettingsPanelCreated and not LAMCompatibilityWarning then
-    PrintLater("An old version of LibAddonMenu with compatibility issues was detected. For more information on how to proceed search for LibAddonMenu on esoui.com")
-    LAMCompatibilityWarning = true
-end
-
---UPVALUES--
-local wm = WINDOW_MANAGER
-local em = EVENT_MANAGER
-local sm = SCENE_MANAGER
-local cm = CALLBACK_MANAGER
-local tconcat = table.concat
-local tinsert = table.insert
-
-local MIN_HEIGHT = 26
-local HALF_WIDTH_LINE_SPACING = 2
-local OPTIONS_CREATION_RUNNING = 1
-local OPTIONS_CREATED = 2
-local LAM_CONFIRM_DIALOG = "LAM_CONFIRM_DIALOG"
-local LAM_DEFAULTS_DIALOG = "LAM_DEFAULTS"
-local LAM_RELOAD_DIALOG = "LAM_RELOAD_DIALOG"
-
-local addonsForList = {}
-local addonToOptionsMap = {}
-local optionsState = {}
-lam.widgets = lam.widgets or {}
-local widgets = lam.widgets
-lam.util = lam.util or {}
-local util = lam.util
-lam.controlsForReload = lam.controlsForReload or {}
-local controlsForReload = lam.controlsForReload
-
-local function GetDefaultValue(default)
-    if type(default) == "function" then
-        return default()
-    end
-    return default
-end
-
-local function GetStringFromValue(value)
-    if type(value) == "function" then
-        return value()
-    elseif type(value) == "number" then
-        return GetString(value)
-    end
-    return value
-end
-
-local function CreateBaseControl(parent, controlData, controlName)
-    local control = wm:CreateControl(controlName or controlData.reference, parent.scroll or parent, CT_CONTROL)
-    control.panel = parent.panel or parent -- if this is in a submenu, panel is the submenu's parent
-    control.data = controlData
-
-    control.isHalfWidth = controlData.width == "half"
-    local width = 510 -- set default width in case a custom parent object is passed
-    if control.panel.GetWidth ~= nil then width = control.panel:GetWidth() - 60 end
-    control:SetWidth(width)
-    return control
-end
-
-local function CreateLabelAndContainerControl(parent, controlData, controlName)
-    local control = CreateBaseControl(parent, controlData, controlName)
-    local width = control:GetWidth()
-
-    local container = wm:CreateControl(nil, control, CT_CONTROL)
-    container:SetDimensions(width / 3, MIN_HEIGHT)
-    control.container = container
-
-    local label = wm:CreateControl(nil, control, CT_LABEL)
-    label:SetFont("ZoFontWinH4")
-    label:SetHeight(MIN_HEIGHT)
-    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-    label:SetText(GetStringFromValue(controlData.name))
-    control.label = label
-
-    if control.isHalfWidth then
-        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
-        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-        label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
-        container:SetAnchor(TOPRIGHT, control.label, BOTTOMRIGHT, 0, HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetDimensions(width, MIN_HEIGHT)
-        container:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
-        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-        label:SetAnchor(TOPRIGHT, container, TOPLEFT, 5, 0)
-    end
-
-    control.data.tooltipText = GetStringFromValue(control.data.tooltip)
-    control:SetMouseEnabled(true)
-    control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-    control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    return control
-end
-
-local function GetTopPanel(panel)
-    while panel.panel and panel.panel ~= panel do
-        panel = panel.panel
-    end
-    return panel
-end
-
-local function IsSame(objA, objB)
-    if #objA ~= #objB then return false end
-    for i = 1, #objA do
-        if objA[i] ~= objB[i] then return false end
-    end
-    return true
-end
-
-local function RefreshReloadUIButton()
-    lam.requiresReload = false
-
-    for i = 1, #controlsForReload do
-        local reloadControl = controlsForReload[i]
-        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
-            lam.requiresReload = true
-            break
-        end
-    end
-
-    lam.applyButton:SetHidden(not lam.requiresReload)
-end
-
-local function RequestRefreshIfNeeded(control)
-    -- if our parent window wants to refresh controls, then fire the callback
-    local panel = GetTopPanel(control.panel)
-    local panelData = panel.data
-    if panelData.registerForRefresh then
-        cm:FireCallbacks("LAM-RefreshPanel", control)
-    end
-    RefreshReloadUIButton()
-end
-
-local function RegisterForRefreshIfNeeded(control)
-    -- if our parent window wants to refresh controls, then add this to the list
-    local panel = GetTopPanel(control.panel)
-    local panelData = panel.data
-    if panelData.registerForRefresh or panelData.registerForDefaults then
-        tinsert(panel.controlsToRefresh or {}, control) -- prevent errors on custom panels
-    end
-end
-
-local function RegisterForReloadIfNeeded(control)
-    if control.data.requiresReload then
-        tinsert(controlsForReload, control)
-        control.startValue = {control.data.getFunc()}
-    end
-end
-
-local function GetConfirmDialog()
-    if(not ESO_Dialogs[LAM_CONFIRM_DIALOG]) then
-        ESO_Dialogs[LAM_CONFIRM_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = "",
-            },
-            mainText = {
-                text = "",
-            },
-            buttons = {
-                [1] = {
-                    text = SI_DIALOG_CONFIRM,
-                    callback = function(dialog) end,
-                },
-                [2] = {
-                    text = SI_DIALOG_CANCEL,
-                }
-            }
-        }
-    end
-    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
-end
-
-local function ShowConfirmationDialog(title, body, callback)
-    local dialog = GetConfirmDialog()
-    dialog.title.text = title
-    dialog.mainText.text = body
-    dialog.buttons[1].callback = callback
-    ZO_Dialogs_ShowDialog(LAM_CONFIRM_DIALOG)
-end
-
-local function GetDefaultsDialog()
-    if(not ESO_Dialogs[LAM_DEFAULTS_DIALOG]) then
-        ESO_Dialogs[LAM_DEFAULTS_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP,
-            },
-            mainText = {
-                text = SI_OPTIONS_RESET_PROMPT,
-            },
-            buttons = {
-                [1] = {
-                    text = SI_OPTIONS_RESET,
-                    callback = function(dialog) end,
-                },
-                [2] = {
-                    text = SI_DIALOG_CANCEL,
-                }
-            }
-        }
-    end
-    return ESO_Dialogs[LAM_DEFAULTS_DIALOG]
-end
-
-local function ShowDefaultsDialog(panel)
-    local dialog = GetDefaultsDialog()
-    dialog.buttons[1].callback = function()
-        panel:ForceDefaults()
-        RefreshReloadUIButton()
-    end
-    ZO_Dialogs_ShowDialog(LAM_DEFAULTS_DIALOG)
-end
-
-local function DiscardChangesOnReloadControls()
-    for i = 1, #controlsForReload do
-        local reloadControl = controlsForReload[i]
-        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
-            reloadControl:UpdateValue(false, unpack(reloadControl.startValue))
-        end
-    end
-    lam.requiresReload = false
-    lam.applyButton:SetHidden(true)
-end
-
-local function StorePanelForReopening()
-    local saveData = ZO_Ingame_SavedVariables["LAM"] or {}
-    saveData.reopenPanel = lam.currentAddonPanel:GetName()
-    ZO_Ingame_SavedVariables["LAM"] = saveData
-end
-
-local function RetrievePanelForReopening()
-    local saveData = ZO_Ingame_SavedVariables["LAM"]
-    if(saveData) then
-        ZO_Ingame_SavedVariables["LAM"] = nil
-        return _G[saveData.reopenPanel]
-    end
-end
-
-local function HandleReloadUIPressed()
-    StorePanelForReopening()
-    ReloadUI()
-end
-
-local function HandleLoadDefaultsPressed()
-    ShowDefaultsDialog(lam.currentAddonPanel)
-end
-
-local function GetReloadDialog()
-    if(not ESO_Dialogs[LAM_RELOAD_DIALOG]) then
-        ESO_Dialogs[LAM_RELOAD_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = util.L["RELOAD_DIALOG_TITLE"],
-            },
-            mainText = {
-                text = util.L["RELOAD_DIALOG_TEXT"],
-            },
-            buttons = {
-                [1] = {
-                    text = util.L["RELOAD_DIALOG_RELOAD_BUTTON"],
-                    callback = function() ReloadUI() end,
-                },
-                [2] = {
-                    text = util.L["RELOAD_DIALOG_DISCARD_BUTTON"],
-                    callback = DiscardChangesOnReloadControls,
-                }
-            },
-            noChoiceCallback = DiscardChangesOnReloadControls,
-        }
-    end
-    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
-end
-
-local function ShowReloadDialogIfNeeded()
-    if lam.requiresReload then
-        local dialog = GetReloadDialog()
-        ZO_Dialogs_ShowDialog(LAM_RELOAD_DIALOG)
-    end
-end
-
-local function UpdateWarning(control)
-    local warning
-    if control.data.warning ~= nil then
-        warning = util.GetStringFromValue(control.data.warning)
-    end
-
-    if control.data.requiresReload then
-        if not warning then
-            warning = string.format("|cff0000%s", util.L["RELOAD_UI_WARNING"])
-        else
-            warning = string.format("%s\n\n|cff0000%s", warning, util.L["RELOAD_UI_WARNING"])
-        end
-    end
-
-    if not warning then
-        control.warning:SetHidden(true)
-    else
-        control.warning.data = {tooltipText = warning}
-        control.warning:SetHidden(false)
-    end
-end
-
-local localization = {
-    en = {
-        PANEL_NAME = "Addons",
-        AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Author: <<X:1>>"
-        VERSION = "Version: <<X:1>>",
-        WEBSITE = "Visit Website",
-        PANEL_INFO_FONT = "$(CHAT_FONT)|14|soft-shadow-thin",
-        RELOAD_UI_WARNING = "Changes to this setting require an UI reload in order to take effect.",
-        RELOAD_DIALOG_TITLE = "UI Reload required",
-        RELOAD_DIALOG_TEXT = "Some changes require an UI reload in order to take effect. Do you want to reload now or discard the changes?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Reload",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Discard",
-    },
-    fr = { -- provided by Ayantir
-        PANEL_NAME = "Extensions",
-        WEBSITE = "Visiter le site Web",
-        RELOAD_UI_WARNING = "La modification de ce paramètre requiert un rechargement de l'UI pour qu'il soit pris en compte.",
-        RELOAD_DIALOG_TITLE = "Reload UI requis",
-        RELOAD_DIALOG_TEXT = "Certaines modifications requièrent un rechargement de l'UI pour qu'ils soient pris en compte. Souhaitez-vous recharger l'interface maintenant ou annuler les modifications ?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Recharger",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Annuler",
-    },
-    de = { -- provided by sirinsidiator
-        PANEL_NAME = "Erweiterungen",
-        WEBSITE = "Webseite besuchen",
-        RELOAD_UI_WARNING = "Änderungen an dieser Option werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird.",
-        RELOAD_DIALOG_TITLE = "Neuladen benötigt",
-        RELOAD_DIALOG_TEXT = "Einige Änderungen werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird. Wollt Ihr sie jetzt neu laden oder die Änderungen verwerfen?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Neu laden",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Verwerfen",
-    },
-    ru = { -- provided by TERAB1T
-        PANEL_NAME = "Дополнения",
-        VERSION = "Версия: <<X:1>>",
-        WEBSITE = "Посетить сайт",
-        PANEL_INFO_FONT = "RuESO/fonts/Univers57.otf|14|soft-shadow-thin",
-    },
-    es = { -- provided by silvereyes333
-        WEBSITE = "Vaya al sitio web",
-    },
-    jp = { -- provided by k0ta0uchi
-        PANEL_NAME = "アドオン設定",
-        WEBSITE = "ウェブサイトを見る",
-    },
-    zh = { -- provided by bssthu
-        PANEL_NAME = "插件",
-        VERSION = "版本: <<X:1>>",
-        WEBSITE = "访问网站",
-        PANEL_INFO_FONT = "EsoZh/fonts/univers57.otf|14|soft-shadow-thin",
-    },
-}
-
-util.L = ZO_ShallowTableCopy(localization[GetCVar("Language.2")], localization["en"])
-util.GetTooltipText = GetStringFromValue -- deprecated, use util.GetStringFromValue instead
-util.GetStringFromValue = GetStringFromValue
-util.GetDefaultValue = GetDefaultValue
-util.CreateBaseControl = CreateBaseControl
-util.CreateLabelAndContainerControl = CreateLabelAndContainerControl
-util.RequestRefreshIfNeeded = RequestRefreshIfNeeded
-util.RegisterForRefreshIfNeeded = RegisterForRefreshIfNeeded
-util.RegisterForReloadIfNeeded = RegisterForReloadIfNeeded
-util.GetTopPanel = GetTopPanel
-util.ShowConfirmationDialog = ShowConfirmationDialog
-util.UpdateWarning = UpdateWarning
-
-local ADDON_DATA_TYPE = 1
-local RESELECTING_DURING_REBUILD = true
-local USER_REQUESTED_OPEN = true
-
-
---INTERNAL FUNCTION
---scrolls ZO_ScrollList `list` to move the row corresponding to `data`
--- into view (does nothing if there is no such row in the list)
---unlike ZO_ScrollList_ScrollDataIntoView, this function accounts for
--- fading near the list's edges - it avoids the fading area by scrolling
--- a little further than the ZO function
-local function ScrollDataIntoView(list, data)
-    local targetIndex = data.sortIndex
-    if not targetIndex then return end
-
-    local scrollMin, scrollMax = list.scrollbar:GetMinMax()
-    local scrollTop = list.scrollbar:GetValue()
-    local controlHeight = list.controlHeight
-    local targetMin = controlHeight * (targetIndex - 1) - 64
-    -- subtracting 64 ain't arbitrary, it's the maximum fading height
-    -- (libraries/zo_templates/scrolltemplates.lua/UpdateScrollFade)
-
-    if targetMin < scrollTop then
-        ZO_ScrollList_ScrollAbsolute(list, zo_max(targetMin, scrollMin))
-    else
-        local listHeight = ZO_ScrollList_GetHeight(list)
-        local targetMax = controlHeight * targetIndex + 64 - listHeight
-
-        if targetMax > scrollTop then
-            ZO_ScrollList_ScrollAbsolute(list, zo_min(targetMax, scrollMax))
-        end
-    end
-end
-
-
---INTERNAL FUNCTION
---constructs a string pattern from the text in `searchEdit` control
--- * metacharacters are escaped, losing their special meaning
--- * whitespace matches anything (including empty substring)
---if there is nothing but whitespace, returns nil
---otherwise returns a filter function, which takes a `data` table argument
--- and returns true iff `data.filterText` matches the pattern
-local function GetSearchFilterFunc(searchEdit)
-    local text = searchEdit:GetText():lower()
-    local pattern = text:match("(%S+.-)%s*$")
-
-    if not pattern then -- nothing but whitespace
-        return nil
-    end
-
-    -- escape metacharacters, e.g. "ESO-Datenbank.de" => "ESO%-Datenbank%.de"
-    pattern = pattern:gsub("[-*+?^$().[%]%%]", "%%%0")
-
-    -- replace whitespace with "match shortest anything"
-    pattern = pattern:gsub("%s+", ".-")
-
-    return function(data)
-        return data.filterText:lower():find(pattern) ~= nil
-    end
-end
-
-
---INTERNAL FUNCTION
---populates `addonList` with entries from `addonsForList`
--- addonList = ZO_ScrollList control
--- filter = [optional] function(data)
-local function PopulateAddonList(addonList, filter)
-    local entryList = ZO_ScrollList_GetDataList(addonList)
-    local numEntries = 0
-    local selectedData = nil
-
-    ZO_ScrollList_Clear(addonList)
-
-    for i, data in ipairs(addonsForList) do
-        if not filter or filter(data) then
-            local dataEntry = ZO_ScrollList_CreateDataEntry(ADDON_DATA_TYPE, data)
-            numEntries = numEntries + 1
-            data.sortIndex = numEntries
-            entryList[numEntries] = dataEntry
-            -- select the first panel passing the filter, or the currently
-            -- shown panel, but only if it passes the filter as well
-            if selectedData == nil or data.panel == lam.currentAddonPanel then
-                selectedData = data
-            end
-        else
-            data.sortIndex = nil
-        end
-    end
-
-    ZO_ScrollList_Commit(addonList)
-
-    if selectedData then
-        if selectedData.panel == lam.currentAddonPanel then
-            ZO_ScrollList_SelectData(addonList, selectedData, nil, RESELECTING_DURING_REBUILD)
-        else
-            ZO_ScrollList_SelectData(addonList, selectedData, nil)
-        end
-        ScrollDataIntoView(addonList, selectedData)
-    end
-end
-
-
---METHOD: REGISTER WIDGET--
---each widget has its version checked before loading,
---so we only have the most recent one in memory
---Usage:
--- widgetType = "string"; the type of widget being registered
--- widgetVersion = integer; the widget's version number
-LAMCreateControl = LAMCreateControl or {}
-local lamcc = LAMCreateControl
-
-function lam:RegisterWidget(widgetType, widgetVersion)
-    if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
-        return false
-    else
-        widgets[widgetType] = widgetVersion
-        return true
-    end
-end
-
--- INTERNAL METHOD: hijacks the handlers for the actions in the OptionsWindow layer if not already done
-local function InitKeybindActions()
-    if not lam.keybindsInitialized then
-        lam.keybindsInitialized = true
-        ZO_PreHook(KEYBOARD_OPTIONS, "ApplySettings", function()
-            if lam.currentPanelOpened then
-                if not lam.applyButton:IsHidden() then
-                    HandleReloadUIPressed()
-                end
-                return true
-            end
-        end)
-        ZO_PreHook("ZO_Dialogs_ShowDialog", function(dialogName)
-            if lam.currentPanelOpened and dialogName == "OPTIONS_RESET_TO_DEFAULTS" then
-                if not lam.defaultButton:IsHidden() then
-                    HandleLoadDefaultsPressed()
-                end
-                return true
-            end
-        end)
-    end
-end
-
--- INTERNAL METHOD: fires the LAM-PanelOpened callback if not already done
-local function OpenCurrentPanel()
-    if lam.currentAddonPanel and not lam.currentPanelOpened then
-        lam.currentPanelOpened = true
-        lam.defaultButton:SetHidden(not lam.currentAddonPanel.data.registerForDefaults)
-        cm:FireCallbacks("LAM-PanelOpened", lam.currentAddonPanel)
-    end
-end
-
--- INTERNAL METHOD: fires the LAM-PanelClosed callback if not already done
-local function CloseCurrentPanel()
-    if lam.currentAddonPanel and lam.currentPanelOpened then
-        lam.currentPanelOpened = false
-        cm:FireCallbacks("LAM-PanelClosed", lam.currentAddonPanel)
-    end
-end
-
---METHOD: OPEN TO ADDON PANEL--
---opens to a specific addon's option panel
---Usage:
--- panel = userdata; the panel returned by the :RegisterOptionsPanel method
-local locSettings = GetString(SI_GAME_MENU_SETTINGS)
-function lam:OpenToPanel(panel)
-
-    -- find and select the panel's row in addon list
-
-    local addonList = lam.addonList
-    local selectedData = nil
-
-    for _, addonData in ipairs(addonsForList) do
-        if addonData.panel == panel then
-            selectedData = addonData
-            ScrollDataIntoView(addonList, selectedData)
-            break
-        end
-    end
-
-    ZO_ScrollList_SelectData(addonList, selectedData)
-    ZO_ScrollList_RefreshVisible(addonList, selectedData)
-
-    local srchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
-    srchEdit:Clear()
-
-    -- note that ZO_ScrollList doesn't require `selectedData` to be actually
-    -- present in the list, and that the list will only be populated once LAM
-    -- "Addon Settings" menu entry is selected for the first time
-
-    local function openAddonSettingsMenu()
-        local gameMenu = ZO_GameMenu_InGame.gameMenu
-        local settingsMenu = gameMenu.headerControls[locSettings]
-
-        if settingsMenu then -- an instance of ZO_TreeNode
-            local children = settingsMenu:GetChildren()
-            for i = 1, (children and #children or 0) do
-                local childNode = children[i]
-                local data = childNode:GetData()
-                if data and data.id == lam.panelId then
-                    -- found LAM "Addon Settings" node, yay!
-                    childNode:GetTree():SelectNode(childNode)
-                    break
-                end
-            end
-        end
-    end
-
-    if sm:GetScene("gameMenuInGame"):GetState() == SCENE_SHOWN then
-        openAddonSettingsMenu()
-    else
-        sm:CallWhen("gameMenuInGame", SCENE_SHOWN, openAddonSettingsMenu)
-        sm:Show("gameMenuInGame")
-    end
-end
-
-local TwinOptionsContainer_Index = 0
-local function TwinOptionsContainer(parent, leftWidget, rightWidget)
-    TwinOptionsContainer_Index = TwinOptionsContainer_Index + 1
-    local cParent = parent.scroll or parent
-    local panel = parent.panel or cParent
-    local container = wm:CreateControl("$(parent)TwinContainer" .. tostring(TwinOptionsContainer_Index),
-        cParent, CT_CONTROL)
-    container:SetResizeToFitDescendents(true)
-    container:SetAnchor(select(2, leftWidget:GetAnchor(0) ))
-
-    leftWidget:ClearAnchors()
-    leftWidget:SetAnchor(TOPLEFT, container, TOPLEFT)
-    rightWidget:SetAnchor(TOPLEFT, leftWidget, TOPRIGHT, 5, 0)
-
-    leftWidget:SetWidth( leftWidget:GetWidth() - 2.5 ) -- fixes bad alignment with 'full' controls
-    rightWidget:SetWidth( rightWidget:GetWidth() - 2.5 )
-
-    leftWidget:SetParent(container)
-    rightWidget:SetParent(container)
-
-    container.data = {type = "container"}
-    container.panel = panel
-    return container
-end
-
---INTERNAL FUNCTION
---creates controls when options panel is first shown
---controls anchoring of these controls in the panel
-local function CreateOptionsControls(panel)
-    local addonID = panel:GetName()
-    if(optionsState[addonID] == OPTIONS_CREATED) then
-        return false
-    elseif(optionsState[addonID] == OPTIONS_CREATION_RUNNING) then
-        return true
-    end
-    optionsState[addonID] = OPTIONS_CREATION_RUNNING
-
-    local function CreationFinished()
-        optionsState[addonID] = OPTIONS_CREATED
-        cm:FireCallbacks("LAM-PanelControlsCreated", panel)
-        OpenCurrentPanel()
-    end
-
-    local optionsTable = addonToOptionsMap[addonID]
-    if optionsTable then
-        local function CreateAndAnchorWidget(parent, widgetData, offsetX, offsetY, anchorTarget, wasHalf)
-            local widget
-            local status, err = pcall(function() widget = LAMCreateControl[widgetData.type](parent, widgetData) end)
-            if not status then
-                return err or true, offsetY, anchorTarget, wasHalf
-            else
-                local isHalf = (widgetData.width == "half")
-                if not anchorTarget then -- the first widget in a panel is just placed in the top left corner
-                    widget:SetAnchor(TOPLEFT)
-                    anchorTarget = widget
-                elseif wasHalf and isHalf then -- when the previous widget was only half width and this one is too, we place it on the right side
-                    widget.lineControl = anchorTarget
-                    isHalf = false
-                    offsetY = 0
-                    anchorTarget = TwinOptionsContainer(parent, anchorTarget, widget)
-                else -- otherwise we just put it below the previous one normally
-                    widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15)
-                    offsetY = 0
-                    anchorTarget = widget
-                end
-                return false, offsetY, anchorTarget, isHalf
-            end
-        end
-
-        local THROTTLE_TIMEOUT, THROTTLE_COUNT = 10, 20
-        local fifo = {}
-        local anchorOffset, lastAddedControl, wasHalf
-        local CreateWidgetsInPanel, err
-
-        local function PrepareForNextPanel()
-            anchorOffset, lastAddedControl, wasHalf = 0, nil, false
-        end
-
-        local function SetupCreationCalls(parent, widgetDataTable)
-            fifo[#fifo + 1] = PrepareForNextPanel
-            local count = #widgetDataTable
-            for i = 1, count, THROTTLE_COUNT do
-                fifo[#fifo + 1] = function()
-                    CreateWidgetsInPanel(parent, widgetDataTable, i, zo_min(i + THROTTLE_COUNT - 1, count))
-                end
-            end
-            return count ~= NonContiguousCount(widgetDataTable)
-        end
-
-        CreateWidgetsInPanel = function(parent, widgetDataTable, startIndex, endIndex)
-            for i=startIndex,endIndex do
-                local widgetData = widgetDataTable[i]
-                if not widgetData then
-                    PrintLater("Skipped creation of missing entry in the settings menu of " .. addonID .. ".")
-                else
-                    local widgetType = widgetData.type
-                    local offsetX = 0
-                    local isSubmenu = (widgetType == "submenu")
-                    if isSubmenu then
-                        wasHalf = false
-                        offsetX = 5
-                    end
-
-                    err, anchorOffset, lastAddedControl, wasHalf = CreateAndAnchorWidget(parent, widgetData, offsetX, anchorOffset, lastAddedControl, wasHalf)
-                    if err then
-                        PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, widgetData.name or "unnamed", addonID))
-                    end
-
-                    if isSubmenu then
-                        if SetupCreationCalls(lastAddedControl, widgetData.controls) then
-                            PrintLater(("The sub menu '%s' of %s is missing some entries."):format(widgetData.name or "unnamed", addonID))
-                        end
-                    end
-                end
-            end
-        end
-
-        local function DoCreateSettings()
-            if #fifo > 0 then
-                local nextCall = table.remove(fifo, 1)
-                nextCall()
-                if(nextCall == PrepareForNextPanel) then
-                    DoCreateSettings()
-                else
-                    zo_callLater(DoCreateSettings, THROTTLE_TIMEOUT)
-                end
-            else
-                CreationFinished()
-            end
-        end
-
-        if SetupCreationCalls(panel, optionsTable) then
-            PrintLater(("The settings menu of %s is missing some entries."):format(addonID))
-        end
-        DoCreateSettings()
-    else
-        CreationFinished()
-    end
-
-    return true
-end
-
---INTERNAL FUNCTION
---handles switching between panels
-local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel
-    local currentlySelected = lam.currentAddonPanel
-    if currentlySelected and currentlySelected ~= panel then
-        currentlySelected:SetHidden(true)
-        CloseCurrentPanel()
-    end
-    lam.currentAddonPanel = panel
-
-    -- refresh visible rows to reflect panel IsHidden status
-    ZO_ScrollList_RefreshVisible(lam.addonList)
-
-    if not CreateOptionsControls(panel) then
-        OpenCurrentPanel()
-    end
-
-    cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-
-local CheckSafetyAndInitialize
-
---METHOD: REGISTER ADDON PANEL
---registers your addon with LibAddonMenu and creates a panel
---Usage:
--- addonID = "string"; unique ID which will be the global name of your panel
--- panelData = table; data object for your panel - see controls\panel.lua
-function lam:RegisterAddonPanel(addonID, panelData)
-    CheckSafetyAndInitialize(addonID)
-    local container = lam:GetAddonPanelContainer()
-    local panel = lamcc.panel(container, panelData, addonID) --addonID==global name of panel
-    panel:SetHidden(true)
-    panel:SetAnchorFill(container)
-    panel:SetHandler("OnShow", ToggleAddonPanels)
-
-    local function stripMarkup(str)
-        return str:gsub("|[Cc]%x%x%x%x%x%x", ""):gsub("|[Rr]", "")
-    end
-
-    local filterParts = {panelData.name, nil, nil}
-    -- append keywords and author separately, the may be nil
-    filterParts[#filterParts + 1] = panelData.keywords
-    filterParts[#filterParts + 1] = panelData.author
-
-    local addonData = {
-        panel = panel,
-        name = stripMarkup(panelData.name),
-        filterText = stripMarkup(tconcat(filterParts, "\t")):lower(),
-    }
-
-    tinsert(addonsForList, addonData)
-
-    if panelData.slashCommand then
-        SLASH_COMMANDS[panelData.slashCommand] = function()
-            lam:OpenToPanel(panel)
-        end
-    end
-
-    return panel --return for authors creating options manually
-end
-
-
---METHOD: REGISTER OPTION CONTROLS
---registers the options you want shown for your addon
---these are stored in a table where each key-value pair is the order
---of the options in the panel and the data for that control, respectively
---see exampleoptions.lua for an example
---see controls\<widget>.lua for each widget type
---Usage:
--- addonID = "string"; the same string passed to :RegisterAddonPanel
--- optionsTable = table; the table containing all of the options controls and their data
-function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sliderData, buttonData, etc}
-    addonToOptionsMap[addonID] = optionsTable
-end
-
---INTERNAL FUNCTION
---creates LAM's Addon Settings entry in ZO_GameMenu
-local function CreateAddonSettingsMenuEntry()
-    local panelData = {
-        id = KEYBOARD_OPTIONS.currentPanelId,
-        name = util.L["PANEL_NAME"],
-    }
-
-    KEYBOARD_OPTIONS.currentPanelId = panelData.id + 1
-    KEYBOARD_OPTIONS.panelNames[panelData.id] = panelData.name
-
-    lam.panelId = panelData.id
-
-    local addonListSorted = false
-
-    function panelData.callback()
-        sm:AddFragment(lam:GetAddonSettingsFragment())
-        KEYBOARD_OPTIONS:ChangePanels(lam.panelId)
-
-        local title = LAMAddonSettingsWindow:GetNamedChild("Title")
-        title:SetText(panelData.name)
-
-        if not addonListSorted and #addonsForList > 0 then
-            local searchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
-            --we're about to show our list for the first time - let's sort it
-            table.sort(addonsForList, function(a, b) return a.name < b.name end)
-            PopulateAddonList(lam.addonList, GetSearchFilterFunc(searchEdit))
-            addonListSorted = true
-        end
-    end
-
-    function panelData.unselectedCallback()
-        sm:RemoveFragment(lam:GetAddonSettingsFragment())
-        if SetCameraOptionsPreviewModeEnabled then -- available since API version 100011
-            SetCameraOptionsPreviewModeEnabled(false)
-        end
-    end
-
-    ZO_GameMenu_AddSettingPanel(panelData)
-end
-
-
---INTERNAL FUNCTION
---creates the left-hand menu in LAM's window
-local function CreateAddonList(name, parent)
-    local addonList = wm:CreateControlFromVirtual(name, parent, "ZO_ScrollList")
-
-    local function addonListRow_OnMouseDown(control, button)
-        if button == 1 then
-            local data = ZO_ScrollList_GetData(control)
-            ZO_ScrollList_SelectData(addonList, data, control)
-        end
-    end
-
-    local function addonListRow_OnMouseEnter(control)
-        ZO_ScrollList_MouseEnter(addonList, control)
-    end
-
-    local function addonListRow_OnMouseExit(control)
-        ZO_ScrollList_MouseExit(addonList, control)
-    end
-
-    local function addonListRow_Select(previouslySelectedData, selectedData, reselectingDuringRebuild)
-        if not reselectingDuringRebuild then
-            if previouslySelectedData then
-                previouslySelectedData.panel:SetHidden(true)
-            end
-            if selectedData then
-                selectedData.panel:SetHidden(false)
-                PlaySound(SOUNDS.MENU_SUBCATEGORY_SELECTION)
-            end
-        end
-    end
-
-    local function addonListRow_Setup(control, data)
-        control:SetText(data.name)
-        control:SetSelected(not data.panel:IsHidden())
-    end
-
-    ZO_ScrollList_AddDataType(addonList, ADDON_DATA_TYPE, "ZO_SelectableLabel", 28, addonListRow_Setup)
-    -- I don't know how to make highlights clear properly; they often
-    -- get stuck and after a while the list is full of highlighted rows
-    --ZO_ScrollList_EnableHighlight(addonList, "ZO_ThinListHighlight")
-    ZO_ScrollList_EnableSelection(addonList, "ZO_ThinListHighlight", addonListRow_Select)
-
-    local addonDataType = ZO_ScrollList_GetDataTypeTable(addonList, ADDON_DATA_TYPE)
-    local addonListRow_CreateRaw = addonDataType.pool.m_Factory
-
-    local function addonListRow_Create(pool)
-        local control = addonListRow_CreateRaw(pool)
-        control:SetHandler("OnMouseDown", addonListRow_OnMouseDown)
-        --control:SetHandler("OnMouseEnter", addonListRow_OnMouseEnter)
-        --control:SetHandler("OnMouseExit", addonListRow_OnMouseExit)
-        control:SetHeight(28)
-        control:SetFont("ZoFontHeader")
-        control:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
-        control:SetVerticalAlignment(TEXT_ALIGN_CENTER)
-        control:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-        return control
-    end
-
-    addonDataType.pool.m_Factory = addonListRow_Create
-
-    return addonList
-end
-
-
---INTERNAL FUNCTION
-local function CreateSearchFilterBox(name, parent)
-    local boxControl = wm:CreateControl(name, parent, CT_CONTROL)
-
-    local srchButton =  wm:CreateControl("$(parent)Button", boxControl, CT_BUTTON)
-    srchButton:SetDimensions(32, 32)
-    srchButton:SetAnchor(LEFT, nil, LEFT, 2, 0)
-    srchButton:SetNormalTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_up.dds")
-    srchButton:SetPressedTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_down.dds")
-    srchButton:SetMouseOverTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_over.dds")
-
-    local srchEdit = wm:CreateControlFromVirtual("$(parent)Edit", boxControl, "ZO_DefaultEdit")
-    srchEdit:SetAnchor(LEFT, srchButton, RIGHT, 4, 1)
-    srchEdit:SetAnchor(RIGHT, nil, RIGHT, -4, 1)
-    srchEdit:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-
-    local srchBg = wm:CreateControl("$(parent)Bg", boxControl, CT_BACKDROP)
-    srchBg:SetAnchorFill()
-    srchBg:SetAlpha(0)
-    srchBg:SetCenterColor(0, 0, 0, 0.5)
-    srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
-    srchBg:SetEdgeTexture("", 1, 1, 0, 0)
-
-    -- search backdrop should appear whenever you hover over either
-    -- the magnifying glass button or the edit field (which is only
-    -- visible when it contains some text), and also while the edit
-    -- field has keyboard focus
-
-    local srchActive = false
-    local srchHover = false
-
-    local function srchBgUpdateAlpha()
-        if srchActive or srchEdit:HasFocus() then
-            srchBg:SetAlpha(srchHover and 0.8 or 0.6)
-        else
-            srchBg:SetAlpha(srchHover and 0.6 or 0.0)
-        end
-    end
-
-    local function srchMouseEnter(control)
-        srchHover = true
-        srchBgUpdateAlpha()
-    end
-
-    local function srchMouseExit(control)
-        srchHover = false
-        srchBgUpdateAlpha()
-    end
-
-    boxControl:SetMouseEnabled(true)
-    boxControl:SetHitInsets(1, 1, -1, -1)
-    boxControl:SetHandler("OnMouseEnter", srchMouseEnter)
-    boxControl:SetHandler("OnMouseExit", srchMouseExit)
-
-    srchButton:SetHandler("OnMouseEnter", srchMouseEnter)
-    srchButton:SetHandler("OnMouseExit", srchMouseExit)
-
-    local focusLostTime = 0
-
-    srchButton:SetHandler("OnClicked", function(self)
-        srchEdit:Clear()
-        if GetFrameTimeMilliseconds() - focusLostTime < 100 then
-            -- re-focus the edit box if it lost focus due to this
-            -- button click (note that this handler may run a few
-            -- frames later)
-            srchEdit:TakeFocus()
-        end
-    end)
-
-    srchEdit:SetHandler("OnMouseEnter", srchMouseEnter)
-    srchEdit:SetHandler("OnMouseExit", srchMouseExit)
-    srchEdit:SetHandler("OnFocusGained", srchBgUpdateAlpha)
-
-    srchEdit:SetHandler("OnFocusLost", function()
-        focusLostTime = GetFrameTimeMilliseconds()
-        srchBgUpdateAlpha()
-    end)
-
-    srchEdit:SetHandler("OnEscape", function(self)
-        self:Clear()
-        self:LoseFocus()
-    end)
-
-    srchEdit:SetHandler("OnTextChanged", function(self)
-        local filterFunc = GetSearchFilterFunc(self)
-        if filterFunc then
-            srchActive = true
-            srchBg:SetEdgeColor(ZO_SECOND_CONTRAST_TEXT:UnpackRGBA())
-            srchButton:SetState(BSTATE_PRESSED)
-        else
-            srchActive = false
-            srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
-            srchButton:SetState(BSTATE_NORMAL)
-        end
-        srchBgUpdateAlpha()
-        PopulateAddonList(lam.addonList, filterFunc)
-        PlaySound(SOUNDS.SPINNER_DOWN)
-    end)
-
-    return boxControl
-end
-
-
---INTERNAL FUNCTION
---creates LAM's Addon Settings top-level window
-local function CreateAddonSettingsWindow()
-    local tlw = wm:CreateTopLevelWindow("LAMAddonSettingsWindow")
-    tlw:SetHidden(true)
-    tlw:SetDimensions(1010, 914) -- same height as ZO_OptionsWindow
-
-    ZO_ReanchorControlForLeftSidePanel(tlw)
-
-    -- create black background for the window (mimic ZO_RightFootPrintBackground)
-
-    local bgLeft = wm:CreateControl("$(parent)BackgroundLeft", tlw, CT_TEXTURE)
-    bgLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_left.dds")
-    bgLeft:SetDimensions(1024, 1024)
-    bgLeft:SetAnchor(TOPLEFT, nil, TOPLEFT)
-    bgLeft:SetDrawLayer(DL_BACKGROUND)
-    bgLeft:SetExcludeFromResizeToFitExtents(true)
-
-    local bgRight = wm:CreateControl("$(parent)BackgroundRight", tlw, CT_TEXTURE)
-    bgRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_right.dds")
-    bgRight:SetDimensions(64, 1024)
-    bgRight:SetAnchor(TOPLEFT, bgLeft, TOPRIGHT)
-    bgRight:SetDrawLayer(DL_BACKGROUND)
-    bgRight:SetExcludeFromResizeToFitExtents(true)
-
-    -- create gray background for addon list (mimic ZO_TreeUnderlay)
-
-    local underlayLeft = wm:CreateControl("$(parent)UnderlayLeft", tlw, CT_TEXTURE)
-    underlayLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_left.dds")
-    underlayLeft:SetDimensions(256, 1024)
-    underlayLeft:SetAnchor(TOPLEFT, bgLeft, TOPLEFT)
-    underlayLeft:SetDrawLayer(DL_BACKGROUND)
-    underlayLeft:SetExcludeFromResizeToFitExtents(true)
-
-    local underlayRight = wm:CreateControl("$(parent)UnderlayRight", tlw, CT_TEXTURE)
-    underlayRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_right.dds")
-    underlayRight:SetDimensions(128, 1024)
-    underlayRight:SetAnchor(TOPLEFT, underlayLeft, TOPRIGHT)
-    underlayRight:SetDrawLayer(DL_BACKGROUND)
-    underlayRight:SetExcludeFromResizeToFitExtents(true)
-
-    -- create title bar (mimic ZO_OptionsWindow)
-
-    local title = wm:CreateControl("$(parent)Title", tlw, CT_LABEL)
-    title:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 70)
-    title:SetFont("ZoFontWinH1")
-    title:SetModifyTextType(MODIFY_TEXT_TYPE_UPPERCASE)
-
-    local divider = wm:CreateControlFromVirtual("$(parent)Divider", tlw, "ZO_Options_Divider")
-    divider:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 108)
-
-    -- create search filter box
-
-    local srchBox = CreateSearchFilterBox("$(parent)SearchFilter", tlw)
-    srchBox:SetAnchor(TOPLEFT, nil, TOPLEFT, 63, 120)
-    srchBox:SetDimensions(260, 30)
-
-    -- create scrollable addon list
-
-    local addonList = CreateAddonList("$(parent)AddonList", tlw)
-    addonList:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 160)
-    addonList:SetDimensions(285, 665)
-
-    lam.addonList = addonList -- for easy access from elsewhere
-
-    -- create container for option panels
-
-    local panelContainer = wm:CreateControl("$(parent)PanelContainer", tlw, CT_CONTROL)
-    panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
-    panelContainer:SetDimensions(645, 675)
-
-    local defaultButton = wm:CreateControlFromVirtual("$(parent)ResetToDefaultButton", tlw, "ZO_DialogButton")
-    ZO_KeybindButtonTemplate_Setup(defaultButton, "OPTIONS_LOAD_DEFAULTS", HandleLoadDefaultsPressed, GetString(SI_OPTIONS_DEFAULTS))
-    defaultButton:SetAnchor(TOPLEFT, panelContainer, BOTTOMLEFT, 0, 2)
-    lam.defaultButton = defaultButton
-
-    local applyButton = wm:CreateControlFromVirtual("$(parent)ApplyButton", tlw, "ZO_DialogButton")
-    ZO_KeybindButtonTemplate_Setup(applyButton, "OPTIONS_APPLY_CHANGES", HandleReloadUIPressed, GetString(SI_ADDON_MANAGER_RELOAD))
-    applyButton:SetAnchor(TOPRIGHT, panelContainer, BOTTOMRIGHT, 0, 2)
-    applyButton:SetHidden(true)
-    lam.applyButton = applyButton
-
-    return tlw
-end
-
-
---INITIALIZING
-local safeToInitialize = false
-local hasInitialized = false
-
-local eventHandle = table.concat({MAJOR, MINOR}, "r")
-local function OnLoad(_, addonName)
-    -- wait for the first loaded event
-    em:UnregisterForEvent(eventHandle, EVENT_ADD_ON_LOADED)
-    safeToInitialize = true
-end
-em:RegisterForEvent(eventHandle, EVENT_ADD_ON_LOADED, OnLoad)
-
-local function OnActivated(_, initial)
-    em:UnregisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED)
-    FlushMessages()
-
-    local reopenPanel = RetrievePanelForReopening()
-    if not initial and reopenPanel then
-        lam:OpenToPanel(reopenPanel)
-    end
-end
-em:RegisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED, OnActivated)
-
-function CheckSafetyAndInitialize(addonID)
-    if not safeToInitialize then
-        local msg = string.format("The panel with id '%s' was registered before addon loading has completed. This might break the AddOn Settings menu.", addonID)
-        PrintLater(msg)
-    end
-    if not hasInitialized then
-        hasInitialized = true
-    end
-end
-
-
---TODO documentation
-function lam:GetAddonPanelContainer()
-    local fragment = lam:GetAddonSettingsFragment()
-    local window = fragment:GetControl()
-    return window:GetNamedChild("PanelContainer")
-end
-
-
---TODO documentation
-function lam:GetAddonSettingsFragment()
-    assert(hasInitialized or safeToInitialize)
-    if not LAMAddonSettingsFragment then
-        local window = CreateAddonSettingsWindow()
-        LAMAddonSettingsFragment = ZO_FadeSceneFragment:New(window, true, 100)
-        LAMAddonSettingsFragment:RegisterCallback("StateChange", function(oldState, newState)
-            if(newState == SCENE_FRAGMENT_SHOWN) then
-                InitKeybindActions()
-                PushActionLayerByName("OptionsWindow")
-                OpenCurrentPanel()
-            elseif(newState == SCENE_FRAGMENT_HIDDEN) then
-                CloseCurrentPanel()
-                RemoveActionLayerByName("OptionsWindow")
-                ShowReloadDialogIfNeeded()
-            end
-        end)
-        CreateAddonSettingsMenuEntry()
-    end
-    return LAMAddonSettingsFragment
-end
diff --git a/libs/LibAddonMenu-2.0/controls/button.lua b/libs/LibAddonMenu-2.0/controls/button.lua
deleted file mode 100644
index 89d5b08..0000000
--- a/libs/LibAddonMenu-2.0/controls/button.lua
+++ /dev/null
@@ -1,91 +0,0 @@
---[[buttonData = {
-    type = "button",
-    name = "My Button", -- string id or function returning a string
-    func = function() end,
-    tooltip = "Button's tooltip text.", -- string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    icon = "icon/path.dds", --(optional)
-    isDangerous = false, -- boolean, if set to true, the button text will be red and a confirmation dialog with the button label and warning text will show on click before the callback is executed (optional)
-    warning = "Will need to reload the UI.", --(optional)
-    reference = "MyAddonButton", -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 11
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("button", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable = control.data.disabled
-    if type(disable) == "function" then
-        disable = disable()
-    end
-    control.button:SetEnabled(not disable)
-end
-
---controlName is optional
-local MIN_HEIGHT = 28 -- default_button height
-local HALF_WIDTH_LINE_SPACING = 2
-function LAMCreateControl.button(parent, buttonData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, buttonData, controlName)
-    control:SetMouseEnabled(true)
-
-    local width = control:GetWidth()
-    if control.isHalfWidth then
-        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetDimensions(width, MIN_HEIGHT)
-    end
-
-    if buttonData.icon then
-        control.button = wm:CreateControl(nil, control, CT_BUTTON)
-        control.button:SetDimensions(26, 26)
-        control.button:SetNormalTexture(buttonData.icon)
-        control.button:SetPressedOffset(2, 2)
-    else
-        --control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
-        control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
-        control.button:SetWidth(width / 3)
-        control.button:SetText(LAM.util.GetStringFromValue(buttonData.name))
-        if buttonData.isDangerous then control.button:SetNormalFontColor(ZO_ERROR_COLOR:UnpackRGBA()) end
-    end
-    local button = control.button
-    button:SetAnchor(control.isHalfWidth and CENTER or RIGHT)
-    button:SetClickSound("Click")
-    button.data = {tooltipText = LAM.util.GetStringFromValue(buttonData.tooltip)}
-    button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-    button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    button:SetHandler("OnClicked", function(...)
-        local args = {...}
-        local function callback()
-            buttonData.func(unpack(args))
-            LAM.util.RequestRefreshIfNeeded(control)
-        end
-
-        if(buttonData.isDangerous) then
-            local title = LAM.util.GetStringFromValue(buttonData.name)
-            local body = LAM.util.GetStringFromValue(buttonData.warning)
-            LAM.util.ShowConfirmationDialog(title, body, callback)
-        else
-            callback()
-        end
-    end)
-
-    if buttonData.warning ~= nil then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    if buttonData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/checkbox.lua b/libs/LibAddonMenu-2.0/controls/checkbox.lua
deleted file mode 100644
index 6696dd7..0000000
--- a/libs/LibAddonMenu-2.0/controls/checkbox.lua
+++ /dev/null
@@ -1,142 +0,0 @@
---[[checkboxData = {
-    type = "checkbox",
-    name = "My Checkbox", -- or string id or function returning a string
-    getFunc = function() return db.var end,
-    setFunc = function(value) db.var = value doStuff() end,
-    tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", -- or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- a boolean or function that returns a boolean (optional)
-    reference = "MyAddonCheckbox", -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 14
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
---label
-local enabledColor = ZO_DEFAULT_ENABLED_COLOR
-local enabledHLcolor = ZO_HIGHLIGHT_TEXT
-local disabledColor = ZO_DEFAULT_DISABLED_COLOR
-local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
---checkbox
-local checkboxColor = ZO_NORMAL_TEXT
-local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
-
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
-    control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
-    --control:SetMouseEnabled(not disable)
-    --control:SetMouseEnabled(true)
-
-    control.isDisabled = disable
-end
-
-local function ToggleCheckbox(control)
-    if control.value then
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.checkbox:SetText(control.checkedText)
-    else
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.checkbox:SetText(control.uncheckedText)
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-    elseif value ~= nil then --our value could be false
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-    end
-    control.value = value
-
-    ToggleCheckbox(control)
-end
-
-local function OnMouseEnter(control)
-    ZO_Options_OnMouseEnter(control)
-
-    if control.isDisabled then return end
-
-    local label = control.label
-    if control.value then
-        label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-    else
-        label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    end
-    control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-end
-
-local function OnMouseExit(control)
-    ZO_Options_OnMouseExit(control)
-
-    if control.isDisabled then return end
-
-    local label = control.label
-    if control.value then
-        label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    else
-        label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    end
-    control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-end
-
---controlName is optional
-function LAMCreateControl.checkbox(parent, checkboxData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, checkboxData, controlName)
-    control:SetHandler("OnMouseEnter", OnMouseEnter)
-    control:SetHandler("OnMouseExit", OnMouseExit)
-    control:SetHandler("OnMouseUp", function(control)
-        if control.isDisabled then return end
-        PlaySound(SOUNDS.DEFAULT_CLICK)
-        control.value = not control.value
-        control:UpdateValue(false, control.value)
-    end)
-
-    control.checkbox = wm:CreateControl(nil, control.container, CT_LABEL)
-    local checkbox = control.checkbox
-    checkbox:SetAnchor(LEFT, control.container, LEFT, 0, 0)
-    checkbox:SetFont("ZoFontGameBold")
-    checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-    control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
-    control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
-
-    if checkboxData.warning ~= nil or checkboxData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.data.tooltipText = LAM.util.GetStringFromValue(checkboxData.tooltip)
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if checkboxData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/colorpicker.lua b/libs/LibAddonMenu-2.0/controls/colorpicker.lua
deleted file mode 100644
index a57aab0..0000000
--- a/libs/LibAddonMenu-2.0/controls/colorpicker.lua
+++ /dev/null
@@ -1,106 +0,0 @@
---[[colorpickerData = {
-    type = "colorpicker",
-    name = "My Color Picker", -- or string id or function returning a string
-    getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional)
-    setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional)
-    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color
-    reference = "MyAddonColorpicker" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 13
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-
-    control.isDisabled = disable
-end
-
-local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
-    if forceDefault then --if we are forcing defaults
-        local color = LAM.util.GetDefaultValue(control.data.default)
-        valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
-        control.data.setFunc(valueR, valueG, valueB, valueA)
-    elseif valueR and valueG and valueB then
-        control.data.setFunc(valueR, valueG, valueB, valueA or 1)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        valueR, valueG, valueB, valueA = control.data.getFunc()
-    end
-
-    control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
-end
-
-function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, colorpickerData, controlName)
-
-    control.color = control.container
-    local color = control.color
-
-    control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
-    local thumb = control.thumb
-    thumb:SetDimensions(36, 18)
-    thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
-
-    color.border = wm:CreateControl(nil, color, CT_TEXTURE)
-    local border = color.border
-    border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
-    border:SetTextureCoords(0, .625, 0, .8125)
-    border:SetDimensions(40, 22)
-    border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
-
-    local function ColorPickerCallback(r, g, b, a)
-        control:UpdateValue(false, r, g, b, a)
-    end
-
-    control:SetHandler("OnMouseUp", function(self, btn, upInside)
-        if self.isDisabled then return end
-
-        if upInside then
-            local r, g, b, a = colorpickerData.getFunc()
-            COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name))
-        end
-    end)
-
-    if colorpickerData.warning ~= nil or colorpickerData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip)
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if colorpickerData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/custom.lua b/libs/LibAddonMenu-2.0/controls/custom.lua
deleted file mode 100644
index 40a7c42..0000000
--- a/libs/LibAddonMenu-2.0/controls/custom.lua
+++ /dev/null
@@ -1,35 +0,0 @@
---[[customData = {
-    type = "custom",
-    reference = "MyAddonCustomControl", --(optional) unique name for your control to use as reference
-    refreshFunc = function(customControl) end, --(optional) function to call when panel/controls refresh
-    width = "full", --or "half" (optional)
-} ]]
-
-local widgetVersion = 7
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("custom", widgetVersion) then return end
-
-local function UpdateValue(control)
-    if control.data.refreshFunc then
-        control.data.refreshFunc(control)
-    end
-end
-
-local MIN_HEIGHT = 26
-function LAMCreateControl.custom(parent, customData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, customData, controlName)
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if control.isHalfWidth then --note these restrictions
-        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
-    else
-        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
-    end
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/description.lua b/libs/LibAddonMenu-2.0/controls/description.lua
deleted file mode 100644
index da207a0..0000000
--- a/libs/LibAddonMenu-2.0/controls/description.lua
+++ /dev/null
@@ -1,60 +0,0 @@
---[[descriptionData = {
-    type = "description",
-    text = "My description text to display.", -- or string id or function returning a string
-    title = "My Title", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    reference = "MyAddonDescription" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("description", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateValue(control)
-    if control.title then
-        control.title:SetText(LAM.util.GetStringFromValue(control.data.title))
-    end
-    control.desc:SetText(LAM.util.GetStringFromValue(control.data.text))
-end
-
-function LAMCreateControl.description(parent, descriptionData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, descriptionData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if isHalfWidth then
-        control:SetDimensionConstraints(width / 2, 0, width / 2, 0)
-    else
-        control:SetDimensionConstraints(width, 0, width, 0)
-    end
-
-    control.desc = wm:CreateControl(nil, control, CT_LABEL)
-    local desc = control.desc
-    desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
-    desc:SetFont("ZoFontGame")
-    desc:SetText(LAM.util.GetStringFromValue(descriptionData.text))
-    desc:SetWidth(isHalfWidth and width / 2 or width)
-
-    if descriptionData.title then
-        control.title = wm:CreateControl(nil, control, CT_LABEL)
-        local title = control.title
-        title:SetWidth(isHalfWidth and width / 2 or width)
-        title:SetAnchor(TOPLEFT, control, TOPLEFT)
-        title:SetFont("ZoFontWinH4")
-        title:SetText(LAM.util.GetStringFromValue(descriptionData.title))
-        desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
-    else
-        desc:SetAnchor(TOPLEFT)
-    end
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-
-end
diff --git a/libs/LibAddonMenu-2.0/controls/divider.lua b/libs/LibAddonMenu-2.0/controls/divider.lua
deleted file mode 100644
index 8089539..0000000
--- a/libs/LibAddonMenu-2.0/controls/divider.lua
+++ /dev/null
@@ -1,45 +0,0 @@
---[[dividerData = {
-    type = "divider",
-    width = "full", --or "half" (optional)
-    height = 10, (optional)
-    alpha = 0.25, (optional)
-    reference = "MyAddonDivider" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 2
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("divider", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local MIN_HEIGHT = 10
-local MAX_HEIGHT = 50
-local MIN_ALPHA = 0
-local MAX_ALPHA = 1
-local DEFAULT_ALPHA = 0.25
-
-local function GetValueInRange(value, min, max, default)
-    if not value or type(value) ~= "number" then
-        return default
-    end
-    return math.min(math.max(min, value), max)
-end
-
-function LAMCreateControl.divider(parent, dividerData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, dividerData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    local height = GetValueInRange(dividerData.height, MIN_HEIGHT, MAX_HEIGHT, MIN_HEIGHT)
-    local alpha = GetValueInRange(dividerData.alpha, MIN_ALPHA, MAX_ALPHA, DEFAULT_ALPHA)
-
-    control:SetDimensions(isHalfWidth and width / 2 or width, height)
-
-    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
-    local divider = control.divider
-    divider:SetWidth(isHalfWidth and width / 2 or width)
-    divider:SetAnchor(TOPLEFT)
-    divider:SetAlpha(alpha)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/dropdown.lua b/libs/LibAddonMenu-2.0/controls/dropdown.lua
deleted file mode 100644
index 2349ba6..0000000
--- a/libs/LibAddonMenu-2.0/controls/dropdown.lua
+++ /dev/null
@@ -1,211 +0,0 @@
---[[dropdownData = {
-    type = "dropdown",
-    name = "My Dropdown", -- or string id or function returning a string
-    choices = {"table", "of", "choices"},
-    choicesValues = {"foo", 2, "three"}, -- if specified, these values will get passed to setFunc instead (optional)
-    getFunc = function() return db.var end,
-    setFunc = function(var) db.var = var doStuff() end,
-    tooltip = "Dropdown's tooltip text.", -- or string id or function returning a string (optional)
-    choicesTooltips = {"tooltip 1", "tooltip 2", "tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
-    sort = "name-up", --or "name-down", "numeric-up", "numeric-down", "value-up", "value-down", "numericvalue-up", "numericvalue-down" (optional) - if not provided, list will not be sorted
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonDropdown" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 16
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local SORT_BY_VALUE         = { ["value"] = {} }
-local SORT_BY_VALUE_NUMERIC = { ["value"] = { isNumeric = true } }
-local SORT_TYPES = {
-    name = ZO_SORT_BY_NAME,
-    numeric = ZO_SORT_BY_NAME_NUMERIC,
-    value = SORT_BY_VALUE,
-    numericvalue = SORT_BY_VALUE_NUMERIC,
-}
-local SORT_ORDERS = {
-    up = ZO_SORT_ORDER_UP,
-    down = ZO_SORT_ORDER_DOWN,
-}
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.dropdown:SetEnabled(not disable)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.dropdown:SetSelectedItem(control.choices[value])
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.dropdown:SetSelectedItem(control.choices[value])
-    end
-end
-
-local function DropdownCallback(control, choiceText, choice)
-    choice.control:UpdateValue(false, choice.value or choiceText)
-end
-
-local function SetupTooltips(comboBox, choicesTooltips)
-    local function ShowTooltip(control)
-        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
-        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.tooltip))
-        InformationTooltipTopLevel:BringWindowToTop()
-    end
-    local function HideTooltip(control)
-        ClearTooltip(InformationTooltip)
-    end
-
-    -- allow for tooltips on the drop down entries
-    local originalShow = comboBox.ShowDropdownInternal
-    comboBox.ShowDropdownInternal = function(comboBox)
-        originalShow(comboBox)
-        local entries = ZO_Menu.items
-        for i = 1, #entries do
-            local entry = entries[i]
-            local control = entries[i].item
-            control.tooltip = choicesTooltips[i]
-            entry.onMouseEnter = control:GetHandler("OnMouseEnter")
-            entry.onMouseExit = control:GetHandler("OnMouseExit")
-            ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
-            ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
-        end
-    end
-
-    local originalHide = comboBox.HideDropdownInternal
-    comboBox.HideDropdownInternal = function(self)
-        local entries = ZO_Menu.items
-        for i = 1, #entries do
-            local entry = entries[i]
-            local control = entries[i].item
-            control:SetHandler("OnMouseEnter", entry.onMouseEnter)
-            control:SetHandler("OnMouseExit", entry.onMouseExit)
-            control.tooltip = nil
-        end
-        originalHide(self)
-    end
-end
-
-local function UpdateChoices(control, choices, choicesValues, choicesTooltips)
-    control.dropdown:ClearItems() --remove previous choices --(need to call :SetSelectedItem()?)
-    ZO_ClearTable(control.choices)
-
-    --build new list of choices
-    local choices = choices or control.data.choices
-    local choicesValues = choicesValues or control.data.choicesValues
-    local choicesTooltips = choicesTooltips or control.data.choicesTooltips
-
-    if choicesValues then
-        assert(#choices == #choicesValues, "choices and choicesValues need to have the same size")
-    end
-
-    if choicesTooltips then
-        assert(#choices == #choicesTooltips, "choices and choicesTooltips need to have the same size")
-        SetupTooltips(control.dropdown, choicesTooltips)
-    end
-
-    for i = 1, #choices do
-        local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
-        entry.control = control
-        if choicesValues then
-            entry.value = choicesValues[i]
-        end
-        control.choices[entry.value or entry.name] = entry.name
-        control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE) --if sort type/order isn't specified, then don't sort
-    end
-end
-
-local function GrabSortingInfo(sortInfo)
-    local t, i = {}, 1
-    for info in string.gmatch(sortInfo, "([^%-]+)") do
-        t[i] = info
-        i = i + 1
-    end
-
-    return t
-end
-
-function LAMCreateControl.dropdown(parent, dropdownData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, dropdownData, controlName)
-    control.choices = {}
-
-    local countControl = parent
-    local name = parent:GetName()
-    if not name or #name == 0 then
-        countControl = LAMCreateControl
-        name = "LAM"
-    end
-    local comboboxCount = (countControl.comboboxCount or 0) + 1
-    countControl.comboboxCount = comboboxCount
-    control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, "ZO_ComboBox")
-
-    local combobox = control.combobox
-    combobox:SetAnchor(TOPLEFT)
-    combobox:SetDimensions(control.container:GetDimensions())
-    combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-    control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
-    local dropdown = control.dropdown
-    dropdown:SetSortsItems(false) -- need to sort ourselves in order to be able to sort by value
-
-    ZO_PreHook(dropdown, "UpdateItems", function(self)
-        assert(not self.m_sortsItems, "built-in dropdown sorting was reactivated, sorting is handled by LAM")
-        if control.m_sortOrder ~= nil and control.m_sortType then
-            local sortKey = next(control.m_sortType)
-            local sortFunc = function(item1, item2) return ZO_TableOrderingFunction(item1, item2, sortKey, control.m_sortType, control.m_sortOrder) end
-            table.sort(self.m_sortedItems, sortFunc)
-        end
-    end)
-
-    if dropdownData.sort then
-        local sortInfo = GrabSortingInfo(dropdownData.sort)
-        control.m_sortType, control.m_sortOrder = SORT_TYPES[sortInfo[1]], SORT_ORDERS[sortInfo[2]]
-    elseif dropdownData.choicesValues then
-        control.m_sortType, control.m_sortOrder = ZO_SORT_ORDER_UP, SORT_BY_VALUE
-    end
-
-    if dropdownData.warning ~= nil or dropdownData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateChoices = UpdateChoices
-    control:UpdateChoices(dropdownData.choices, dropdownData.choicesValues)
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if dropdownData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/editbox.lua b/libs/LibAddonMenu-2.0/controls/editbox.lua
deleted file mode 100644
index d6baf11..0000000
--- a/libs/LibAddonMenu-2.0/controls/editbox.lua
+++ /dev/null
@@ -1,156 +0,0 @@
---[[editboxData = {
-    type = "editbox",
-    name = "My Editbox", -- or string id or function returning a string
-    getFunc = function() return db.text end,
-    setFunc = function(text) db.text = text doStuff() end,
-    tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional)
-    isMultiline = true, --boolean (optional)
-    isExtraWide = true, --boolean (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.text, -- default value or function that returns the default value (optional)
-    reference = "MyAddonEditbox" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 14
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("editbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-    --control.editbox:SetEditEnabled(not disable)
-    control.editbox:SetMouseEnabled(not disable)
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.editbox:SetText(value)
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.editbox:SetText(value)
-    end
-end
-
-local MIN_HEIGHT = 24
-local HALF_WIDTH_LINE_SPACING = 2
-function LAMCreateControl.editbox(parent, editboxData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName)
-
-    local container = control.container
-    control.bg = wm:CreateControlFromVirtual(nil, container, "ZO_EditBackdrop")
-    local bg = control.bg
-    bg:SetAnchorFill()
-
-    if editboxData.isMultiline then
-        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
-        control.editbox:SetHandler("OnMouseWheel", function(self, delta)
-            if self:HasFocus() then --only set focus to new spots if the editbox is currently in use
-                local cursorPos = self:GetCursorPosition()
-                local text = self:GetText()
-                local textLen = text:len()
-                local newPos
-                if delta > 0 then --scrolling up
-                    local reverseText = text:reverse()
-                    local revCursorPos = textLen - cursorPos
-                    local revPos = reverseText:find("\n", revCursorPos+1)
-                    newPos = revPos and textLen - revPos
-                else --scrolling down
-                    newPos = text:find("\n", cursorPos+1)
-                end
-                if newPos then --if we found a new line, then scroll, otherwise don't
-                    self:SetCursorPosition(newPos)
-                end
-            end
-        end)
-    else
-        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
-    end
-    local editbox = control.editbox
-    editbox:SetText(editboxData.getFunc())
-    editbox:SetMaxInputChars(3000)
-    editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
-    editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
-    editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    local MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0
-
-    control.label:ClearAnchors()
-    container:ClearAnchors()
-
-    control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
-
-    if control.isHalfWidth then
-        container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
-    end
-
-    if editboxData.isExtraWide then
-        container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0)
-    else
-        container:SetWidth(MIN_WIDTH * 3.2)
-    end
-
-    if editboxData.isMultiline then
-        container:SetHeight(MIN_HEIGHT * 3)
-    else
-        container:SetHeight(MIN_HEIGHT)
-    end
-
-    if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then
-        control:SetHeight(container:GetHeight())
-    else
-        control:SetHeight(container:GetHeight() + control.label:GetHeight())
-    end
-
-    editbox:ClearAnchors()
-    editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2)
-    editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2)
-
-    if editboxData.warning ~= nil or editboxData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        if editboxData.isExtraWide then
-            control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0)
-        else
-            control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
-        end
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if editboxData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/header.lua b/libs/LibAddonMenu-2.0/controls/header.lua
deleted file mode 100644
index eadff38..0000000
--- a/libs/LibAddonMenu-2.0/controls/header.lua
+++ /dev/null
@@ -1,42 +0,0 @@
---[[headerData = {
-    type = "header",
-    name = "My Header", -- or string id or function returning a string
-    width = "full", --or "half" (optional)
-    reference = "MyAddonHeader" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("header", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateValue(control)
-    control.header:SetText(LAM.util.GetStringFromValue(control.data.name))
-end
-
-local MIN_HEIGHT = 30
-function LAMCreateControl.header(parent, headerData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, headerData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    control:SetDimensions(isHalfWidth and width / 2 or width, MIN_HEIGHT)
-
-    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
-    local divider = control.divider
-    divider:SetWidth(isHalfWidth and width / 2 or width)
-    divider:SetAnchor(TOPLEFT)
-
-    control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local header = control.header
-    header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
-    header:SetAnchor(BOTTOMRIGHT)
-    header:SetText(LAM.util.GetStringFromValue(headerData.name))
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/iconpicker.lua b/libs/LibAddonMenu-2.0/controls/iconpicker.lua
deleted file mode 100644
index 65c7782..0000000
--- a/libs/LibAddonMenu-2.0/controls/iconpicker.lua
+++ /dev/null
@@ -1,436 +0,0 @@
---[[iconpickerData = {
-    type = "iconpicker",
-    name = "My Icon Picker", -- or string id or function returning a string
-    choices = {"texture path 1", "texture path 2", "texture path 3"},
-    getFunc = function() return db.var end,
-    setFunc = function(var) db.var = var doStuff() end,
-    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
-    choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
-    maxColumns = 5, -- number of icons in one row (optional)
-    visibleRows = 4.5, -- number of visible rows (optional)
-    iconSize = 28, -- size of the icons (optional)
-    defaultColor = ZO_ColorDef:New("FFFFFF"), -- default color of the icons (optional)
-    width = "full", --or "half" (optional)
-    beforeShow = function(control, iconPicker) return preventShow end, --(optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonIconPicker" -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("iconpicker", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local IconPickerMenu = ZO_Object:Subclass()
-local iconPicker
-LAM.util.GetIconPickerMenu = function()
-    if not iconPicker then
-        iconPicker = IconPickerMenu:New("LAMIconPicker")
-        local sceneFragment = LAM:GetAddonSettingsFragment()
-        ZO_PreHook(sceneFragment, "OnHidden", function()
-            if not iconPicker.control:IsHidden() then
-                iconPicker:Clear()
-            end
-        end)
-    end
-    return iconPicker
-end
-
-function IconPickerMenu:New(...)
-    local object = ZO_Object.New(self)
-    object:Initialize(...)
-    return object
-end
-
-function IconPickerMenu:Initialize(name)
-    local control = wm:CreateTopLevelWindow(name)
-    control:SetDrawTier(DT_HIGH)
-    control:SetHidden(true)
-    self.control = control
-
-    local scrollContainer = wm:CreateControlFromVirtual(name .. "ScrollContainer", control, "ZO_ScrollContainer")
-    -- control:SetDimensions(control.container:GetWidth(), height) -- adjust to icon size / col count
-    scrollContainer:SetAnchorFill()
-    ZO_Scroll_SetUseFadeGradient(scrollContainer, false)
-    ZO_Scroll_SetHideScrollbarOnDisable(scrollContainer, false)
-    ZO_VerticalScrollbarBase_OnMouseExit(scrollContainer:GetNamedChild("ScrollBar")) -- scrollbar initialization seems to be broken so we force it to update the correct alpha value
-    local scroll = GetControl(scrollContainer, "ScrollChild")
-    self.scroll = scroll
-    self.scrollContainer = scrollContainer
-
-    local bg = wm:CreateControl(nil, scrollContainer, CT_BACKDROP)
-    bg:SetAnchor(TOPLEFT, scrollContainer, TOPLEFT, 0, -3)
-    bg:SetAnchor(BOTTOMRIGHT, scrollContainer, BOTTOMRIGHT, 2, 5)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-
-    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
-    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
-    mungeOverlay:SetDrawLevel(1)
-    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
-    mungeOverlay:SetAnchorFill()
-
-    local mouseOver = wm:CreateControl(nil, scrollContainer, CT_TEXTURE)
-    mouseOver:SetDrawLevel(2)
-    mouseOver:SetTexture("EsoUI/Art/Buttons/minmax_mouseover.dds")
-    mouseOver:SetHidden(true)
-
-    local function IconFactory(pool)
-        local icon = wm:CreateControl(name .. "Entry" .. pool:GetNextControlId(), scroll, CT_TEXTURE)
-        icon:SetMouseEnabled(true)
-        icon:SetDrawLevel(3)
-        icon:SetHandler("OnMouseEnter", function()
-            mouseOver:SetAnchor(TOPLEFT, icon, TOPLEFT, 0, 0)
-            mouseOver:SetAnchor(BOTTOMRIGHT, icon, BOTTOMRIGHT, 0, 0)
-            mouseOver:SetHidden(false)
-            if self.customOnMouseEnter then
-                self.customOnMouseEnter(icon)
-            else
-                self:OnMouseEnter(icon)
-            end
-        end)
-        icon:SetHandler("OnMouseExit", function()
-            mouseOver:ClearAnchors()
-            mouseOver:SetHidden(true)
-            if self.customOnMouseExit then
-                self.customOnMouseExit(icon)
-            else
-                self:OnMouseExit(icon)
-            end
-        end)
-        icon:SetHandler("OnMouseUp", function(control, ...)
-            PlaySound("Click")
-            icon.OnSelect(icon, icon.texture)
-            self:Clear()
-        end)
-        return icon
-    end
-
-    local function ResetFunction(icon)
-        icon:ClearAnchors()
-    end
-
-    self.iconPool = ZO_ObjectPool:New(IconFactory, ResetFunction)
-    self:SetMaxColumns(1)
-    self.icons = {}
-    self.color = ZO_DEFAULT_ENABLED_COLOR
-
-    EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
-        if self.refCount ~= nil then
-            local moc = wm:GetMouseOverControl()
-            if(moc:GetOwningWindow() ~= control) then
-                self.refCount = self.refCount - 1
-                if self.refCount <= 0 then
-                    self:Clear()
-                end
-            end
-        end
-    end)
-end
-
-function IconPickerMenu:OnMouseEnter(icon)
-    InitializeTooltip(InformationTooltip, icon, TOPLEFT, 0, 0, BOTTOMRIGHT)
-    SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(icon.tooltip))
-    InformationTooltipTopLevel:BringWindowToTop()
-end
-
-function IconPickerMenu:OnMouseExit(icon)
-    ClearTooltip(InformationTooltip)
-end
-
-function IconPickerMenu:SetMaxColumns(value)
-    self.maxCols = value ~= nil and value or 5
-end
-
-local DEFAULT_SIZE = 28
-function IconPickerMenu:SetIconSize(value)
-    local iconSize = DEFAULT_SIZE
-    if value ~= nil then iconSize = math.max(iconSize, value) end
-    self.iconSize = iconSize
-end
-
-function IconPickerMenu:SetVisibleRows(value)
-    self.visibleRows = value ~= nil and value or 4.5
-end
-
-function IconPickerMenu:SetMouseHandlers(onEnter, onExit)
-    self.customOnMouseEnter = onEnter
-    self.customOnMouseExit = onExit
-end
-
-function IconPickerMenu:UpdateDimensions()
-    local iconSize = self.iconSize
-    local width = iconSize * self.maxCols + 20
-    local height = iconSize * self.visibleRows
-    self.control:SetDimensions(width, height)
-
-    local icons = self.icons
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:SetDimensions(iconSize, iconSize)
-    end
-end
-
-function IconPickerMenu:UpdateAnchors()
-    local iconSize = self.iconSize
-    local col, maxCols = 1, self.maxCols
-    local previousCol, previousRow
-    local scroll = self.scroll
-    local icons = self.icons
-
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:ClearAnchors()
-        if i == 1 then
-            icon:SetAnchor(TOPLEFT, scroll, TOPLEFT, 0, 0)
-            previousRow = icon
-        elseif col == 1 then
-            icon:SetAnchor(TOPLEFT, previousRow, BOTTOMLEFT, 0, 0)
-            previousRow = icon
-        else
-            icon:SetAnchor(TOPLEFT, previousCol, TOPRIGHT, 0, 0)
-        end
-        previousCol = icon
-        col = col >= maxCols and 1 or col + 1
-    end
-end
-
-function IconPickerMenu:Clear()
-    self.icons = {}
-    self.iconPool:ReleaseAllObjects()
-    self.control:SetHidden(true)
-    self.color = ZO_DEFAULT_ENABLED_COLOR
-    self.refCount = nil
-    self.parent = nil
-    self.customOnMouseEnter = nil
-    self.customOnMouseExit = nil
-end
-
-function IconPickerMenu:AddIcon(texturePath, callback, tooltip)
-    local icon, key = self.iconPool:AcquireObject()
-    icon:SetTexture(texturePath)
-    icon:SetColor(self.color:UnpackRGBA())
-    icon.texture = texturePath
-    icon.tooltip = tooltip
-    icon.OnSelect = callback
-    self.icons[#self.icons + 1] = icon
-end
-
-function IconPickerMenu:Show(parent)
-    if #self.icons == 0 then return false end
-    if not self.control:IsHidden() then self:Clear() return false end
-    self:UpdateDimensions()
-    self:UpdateAnchors()
-
-    local control = self.control
-    control:ClearAnchors()
-    control:SetAnchor(TOPLEFT, parent, BOTTOMLEFT, 0, 8)
-    control:SetHidden(false)
-    control:BringWindowToTop()
-    self.parent = parent
-    self.refCount = 2
-
-    return true
-end
-
-function IconPickerMenu:SetColor(color)
-    local icons = self.icons
-    self.color = color
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:SetColor(color:UnpackRGBA())
-    end
-end
-
--------------------------------------------------------------
-
-local function UpdateChoices(control, choices, choicesTooltips)
-    local data = control.data
-    if not choices then
-        choices, choicesTooltips = data.choices, data.choicesTooltips or {}
-    end
-    local addedChoices = {}
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    iconPicker:Clear()
-    for i = 1, #choices do
-        local texture = choices[i]
-        if not addedChoices[texture] then -- remove duplicates
-            iconPicker:AddIcon(choices[i], function(self, texture)
-                control.icon:SetTexture(texture)
-                data.setFunc(texture)
-                LAM.util.RequestRefreshIfNeeded(control)
-            end, LAM.util.GetStringFromValue(choicesTooltips[i]))
-        addedChoices[texture] = true
-        end
-    end
-end
-
-local function IsDisabled(control)
-    if type(control.data.disabled) == "function" then
-        return control.data.disabled()
-    else
-        return control.data.disabled
-    end
-end
-
-local function SetColor(control, color)
-    local icon = control.icon
-    if IsDisabled(control) then
-        icon:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        icon.color = color or control.data.defaultColor or ZO_DEFAULT_ENABLED_COLOR
-        icon:SetColor(icon.color:UnpackRGBA())
-    end
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:SetColor(icon.color)
-    end
-end
-
-local function UpdateDisabled(control)
-    local disable = IsDisabled(control)
-
-    control.dropdown:SetMouseEnabled(not disable)
-    control.dropdownButton:SetEnabled(not disable)
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:Clear()
-    end
-
-    SetColor(control, control.icon.color)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.icon:SetTexture(value)
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.icon:SetTexture(value)
-    end
-end
-
-local MIN_HEIGHT = 26
-local HALF_WIDTH_LINE_SPACING = 2
-local function SetIconSize(control, size)
-    local icon = control.icon
-    icon.size = size
-    icon:SetDimensions(size, size)
-
-    local height = size + 4
-    control.dropdown:SetDimensions(size + 20, height)
-    height = math.max(height, MIN_HEIGHT)
-    control.container:SetHeight(height)
-    if control.lineControl then
-        control.lineControl:SetHeight(MIN_HEIGHT + size + HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetHeight(height)
-    end
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:SetIconSize(size)
-        iconPicker:UpdateDimensions()
-        iconPicker:UpdateAnchors()
-    end
-end
-
-function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, iconpickerData, controlName)
-
-    local function ShowIconPicker()
-        local iconPicker = LAM.util.GetIconPickerMenu()
-        if iconPicker.parent == control.container then
-            iconPicker:Clear()
-        else
-            iconPicker:SetMaxColumns(iconpickerData.maxColumns)
-            iconPicker:SetVisibleRows(iconpickerData.visibleRows)
-            iconPicker:SetIconSize(control.icon.size)
-            UpdateChoices(control)
-            iconPicker:SetColor(control.icon.color)
-            if iconpickerData.beforeShow then
-                if iconpickerData.beforeShow(control, iconPicker) then
-                    iconPicker:Clear()
-                    return
-                end
-            end
-            iconPicker:Show(control.container)
-        end
-    end
-
-    local iconSize = iconpickerData.iconSize ~= nil and iconpickerData.iconSize or DEFAULT_SIZE
-    control.dropdown = wm:CreateControl(nil, control.container, CT_CONTROL)
-    local dropdown = control.dropdown
-    dropdown:SetAnchor(LEFT, control.container, LEFT, 0, 0)
-    dropdown:SetMouseEnabled(true)
-    dropdown:SetHandler("OnMouseUp", ShowIconPicker)
-    dropdown:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    dropdown:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    control.icon = wm:CreateControl(nil, dropdown, CT_TEXTURE)
-    local icon = control.icon
-    icon:SetAnchor(LEFT, dropdown, LEFT, 3, 0)
-    icon:SetDrawLevel(2)
-
-    local dropdownButton = wm:CreateControlFromVirtual(nil, dropdown, "ZO_DropdownButton")
-    dropdownButton:SetDimensions(16, 16)
-    dropdownButton:SetHandler("OnClicked", ShowIconPicker)
-    dropdownButton:SetAnchor(RIGHT, dropdown, RIGHT, -3, 0)
-    control.dropdownButton = dropdownButton
-
-    control.bg = wm:CreateControl(nil, dropdown, CT_BACKDROP)
-    local bg = control.bg
-    bg:SetAnchor(TOPLEFT, dropdown, TOPLEFT, 0, -3)
-    bg:SetAnchor(BOTTOMRIGHT, dropdown, BOTTOMRIGHT, 2, 5)
-    bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
-    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
-    mungeOverlay:SetDrawLevel(1)
-    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
-    mungeOverlay:SetAnchorFill()
-
-    if iconpickerData.warning ~= nil or iconpickerData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, control.container, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateChoices = UpdateChoices
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    control.SetColor = SetColor
-    control:SetColor()
-    control.SetIconSize = SetIconSize
-    control:SetIconSize(iconSize)
-
-    if iconpickerData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/panel.lua b/libs/LibAddonMenu-2.0/controls/panel.lua
deleted file mode 100644
index 1404686..0000000
--- a/libs/LibAddonMenu-2.0/controls/panel.lua
+++ /dev/null
@@ -1,126 +0,0 @@
---[[panelData = {
-    type = "panel",
-    name = "Window Title", -- or string id or function returning a string
-    displayName = "My Longer Window Title",  -- or string id or function returning a string (optional) (can be useful for long addon names or if you want to colorize it)
-    author = "Seerah",  -- or string id or function returning a string (optional)
-    version = "2.0",  -- or string id or function returning a string (optional)
-    website = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where the addon can be updated (optional)
-    keywords = "settings", -- additional keywords for search filter (it looks for matches in name..keywords..author) (optional)
-    slashCommand = "/myaddon", -- will register a keybind to open to this panel (don't forget to include the slash!) (optional)
-    registerForRefresh = true, --boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
-    registerForDefaults = true, --boolean (optional) (will set all options controls back to default values)
-    resetFunc = function() print("defaults reset") end, --(optional) custom function to run after settings are reset to defaults
-} ]]
-
-
-local widgetVersion = 13
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("panel", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-
-local function RefreshPanel(control)
-    local panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
-    local panelControls = panel.controlsToRefresh
-
-    for i = 1, #panelControls do
-        local updateControl = panelControls[i]
-        if updateControl ~= control and updateControl.UpdateValue then
-            updateControl:UpdateValue()
-        end
-        if updateControl.UpdateDisabled then
-            updateControl:UpdateDisabled()
-        end
-        if updateControl.UpdateWarning then
-            updateControl:UpdateWarning()
-        end
-    end
-end
-
-local function ForceDefaults(panel)
-    local panelControls = panel.controlsToRefresh
-
-    for i = 1, #panelControls do
-        local updateControl = panelControls[i]
-        if updateControl.UpdateValue and updateControl.data.default ~= nil then
-            updateControl:UpdateValue(true)
-        end
-    end
-
-    if panel.data.resetFunc then
-        panel.data.resetFunc()
-    end
-
-    cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-
-local callbackRegistered = false
-LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
-local SEPARATOR = " - "
-local LINK_COLOR = ZO_ColorDef:New("5959D5")
-local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
-
-function LAMCreateControl.panel(parent, panelData, controlName)
-    local control = wm:CreateControl(controlName, parent, CT_CONTROL)
-
-    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local label = control.label
-    label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 4)
-    label:SetText(LAM.util.GetStringFromValue(panelData.displayName or panelData.name))
-
-    if panelData.author or panelData.version then
-        control.info = wm:CreateControl(nil, control, CT_LABEL)
-        local info = control.info
-        info:SetFont(LAM.util.L["PANEL_INFO_FONT"])
-        info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
-
-        local output = {}
-        if panelData.author then
-            output[#output + 1] = zo_strformat(LAM.util.L["AUTHOR"], LAM.util.GetStringFromValue(panelData.author))
-        end
-        if panelData.version then
-            output[#output + 1] = zo_strformat(LAM.util.L["VERSION"], LAM.util.GetStringFromValue(panelData.version))
-        end
-        info:SetText(table.concat(output, SEPARATOR))
-    end
-
-    if panelData.website then
-        control.website = wm:CreateControl(nil, control, CT_BUTTON)
-        local website = control.website
-        website:SetClickSound("Click")
-        website:SetFont(LAM.util.L["PANEL_INFO_FONT"])
-        website:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
-        website:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
-        if(control.info) then
-            website:SetAnchor(TOPLEFT, control.info, TOPRIGHT, 0, 0)
-            website:SetText(string.format("|cffffff%s|r%s", SEPARATOR, LAM.util.L["WEBSITE"]))
-        else
-            website:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
-            website:SetText(LAM.util.L["WEBSITE"])
-        end
-        website:SetDimensions(website:GetLabelControl():GetTextDimensions())
-        website:SetHandler("OnClicked", function()
-            RequestOpenUnsafeURL(panelData.website)
-        end)
-    end
-
-    control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
-    LAMCreateControl.scrollCount = LAMCreateControl.scrollCount + 1
-    local container = control.container
-    container:SetAnchor(TOPLEFT, control.info or label, BOTTOMLEFT, 0, 20)
-    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
-    control.scroll = GetControl(control.container, "ScrollChild")
-    control.scroll:SetResizeToFitPadding(0, 20)
-
-    if panelData.registerForRefresh and not callbackRegistered then --don't want to register our callback more than once
-        cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
-        callbackRegistered = true
-    end
-
-    control.ForceDefaults = ForceDefaults
-    control.data = panelData
-    control.controlsToRefresh = {}
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/separator.dds b/libs/LibAddonMenu-2.0/controls/separator.dds
deleted file mode 100644
index 02bb2ab..0000000
Binary files a/libs/LibAddonMenu-2.0/controls/separator.dds and /dev/null differ
diff --git a/libs/LibAddonMenu-2.0/controls/slider.lua b/libs/LibAddonMenu-2.0/controls/slider.lua
deleted file mode 100644
index 209a7e7..0000000
--- a/libs/LibAddonMenu-2.0/controls/slider.lua
+++ /dev/null
@@ -1,212 +0,0 @@
---[[sliderData = {
-    type = "slider",
-    name = "My Slider", -- or string id or function returning a string
-    getFunc = function() return db.var end,
-    setFunc = function(value) db.var = value doStuff() end,
-    min = 0,
-    max = 20,
-    step = 1, --(optional)
-    clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
-    decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
-    autoSelect = false, -- boolean, automatically select everything in the text input field when it gains focus (optional)
-    inputLocation = "below", -- or "right", determines where the input field is shown. This should not be used within the addon menu and is for custom sliders (optional)
-    tooltip = "Slider's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonSlider" -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 12
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("slider", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local strformat = string.format
-
-local function RoundDecimalToPlace(d, place)
-    return tonumber(strformat("%." .. tostring(place) .. "f", d))
-end
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.slider:SetEnabled(not disable)
-    control.slidervalue:SetEditEnabled(not disable)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-    elseif value then
-        if control.data.decimals then
-            value = RoundDecimalToPlace(value, control.data.decimals)
-        end
-        if control.data.clampInput ~= false then
-            value = math.max(math.min(value, control.data.max), control.data.min)
-        end
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-    end
-
-    control.slider:SetValue(value)
-    control.slidervalue:SetText(value)
-end
-
-function LAMCreateControl.slider(parent, sliderData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, sliderData, controlName)
-    local isInputOnRight = sliderData.inputLocation == "right"
-
-    --skipping creating the backdrop...  Is this the actual slider texture?
-    control.slider = wm:CreateControl(nil, control.container, CT_SLIDER)
-    local slider = control.slider
-    slider:SetAnchor(TOPLEFT)
-    slider:SetHeight(14)
-    if(isInputOnRight) then
-        slider:SetAnchor(TOPRIGHT, nil, nil, -60)
-    else
-        slider:SetAnchor(TOPRIGHT)
-    end
-    slider:SetMouseEnabled(true)
-    slider:SetOrientation(ORIENTATION_HORIZONTAL)
-    --put nil for highlighted texture file path, and what look to be texture coords
-    slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
-    local minValue = sliderData.min
-    local maxValue = sliderData.max
-    slider:SetMinMax(minValue, maxValue)
-    slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    slider:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
-    local bg = slider.bg
-    bg:SetCenterColor(0, 0, 0)
-    bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
-    bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
-
-    control.minText = wm:CreateControl(nil, slider, CT_LABEL)
-    local minText = control.minText
-    minText:SetFont("ZoFontGameSmall")
-    minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
-    minText:SetText(sliderData.min)
-
-    control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
-    local maxText = control.maxText
-    maxText:SetFont("ZoFontGameSmall")
-    maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
-    maxText:SetText(sliderData.max)
-
-    control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
-    if(isInputOnRight) then
-        control.slidervalueBG:SetDimensions(60, 26)
-        control.slidervalueBG:SetAnchor(LEFT, slider, RIGHT, 5, 0)
-    else
-        control.slidervalueBG:SetDimensions(50, 18)
-        control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
-    end
-    control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
-    local slidervalue = control.slidervalue
-    slidervalue:ClearAnchors()
-    slidervalue:SetAnchor(TOPLEFT, control.slidervalueBG, TOPLEFT, 3, 1)
-    slidervalue:SetAnchor(BOTTOMRIGHT, control.slidervalueBG, BOTTOMRIGHT, -3, -1)
-    slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
-    if(isInputOnRight) then
-        slidervalue:SetFont("ZoFontGameLarge")
-    else
-        slidervalue:SetFont("ZoFontGameSmall")
-    end
-
-    local isHandlingChange = false
-    local function HandleValueChanged(value)
-        if isHandlingChange then return end
-        if sliderData.decimals then
-            value = RoundDecimalToPlace(value, sliderData.decimals)
-        end
-        isHandlingChange = true
-        slider:SetValue(value)
-        slidervalue:SetText(value)
-        isHandlingChange = false
-    end
-
-    slidervalue:SetHandler("OnEscape", function(self)
-        HandleValueChanged(sliderData.getFunc())
-        self:LoseFocus()
-    end)
-    slidervalue:SetHandler("OnEnter", function(self)
-        self:LoseFocus()
-    end)
-    slidervalue:SetHandler("OnFocusLost", function(self)
-        local value = tonumber(self:GetText())
-        control:UpdateValue(false, value)
-    end)
-    slidervalue:SetHandler("OnTextChanged", function(self)
-        local input = self:GetText()
-        if(#input > 1 and not input:sub(-1):match("[0-9]")) then return end
-        local value = tonumber(input)
-        if(value) then
-            HandleValueChanged(value)
-        end
-    end)
-    if(sliderData.autoSelect) then
-        ZO_PreHookHandler(slidervalue, "OnFocusGained", function(self)
-            self:SelectAll()
-        end)
-    end
-
-    local range = maxValue - minValue
-    slider:SetValueStep(sliderData.step or 1)
-    slider:SetHandler("OnValueChanged", function(self, value, eventReason)
-        if eventReason == EVENT_REASON_SOFTWARE then return end
-        HandleValueChanged(value)
-    end)
-    slider:SetHandler("OnSliderReleased", function(self, value)
-        control:UpdateValue(false, value)
-    end)
-    slider:SetHandler("OnMouseWheel", function(self, value)
-        if(not self:GetEnabled()) then return end
-        local new_value = (tonumber(slidervalue:GetText()) or sliderData.min or 0) + ((sliderData.step or 1) * value)
-        control:UpdateValue(false, new_value)
-    end)
-
-    if sliderData.warning ~= nil or sliderData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-
-    if sliderData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/submenu.lua b/libs/LibAddonMenu-2.0/controls/submenu.lua
deleted file mode 100644
index 1766a1f..0000000
--- a/libs/LibAddonMenu-2.0/controls/submenu.lua
+++ /dev/null
@@ -1,108 +0,0 @@
---[[submenuData = {
-    type = "submenu",
-    name = "Submenu Title", -- or string id or function returning a string
-    tooltip = "My submenu tooltip", -- -- or string id or function returning a string (optional)
-    controls = {sliderData, buttonData} --(optional) used by LAM
-    reference = "MyAddonSubmenu" --(optional) unique global reference to control
-} ]]
-
-local widgetVersion = 11
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("submenu", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local am = ANIMATION_MANAGER
-
-local function UpdateValue(control)
-    control.label:SetText(LAM.util.GetStringFromValue(control.data.name))
-    if control.data.tooltip then
-        control.label.data.tooltipText = LAM.util.GetStringFromValue(control.data.tooltip)
-    end
-end
-
-local function AnimateSubmenu(clicked)
-    local control = clicked:GetParent()
-    control.open = not control.open
-
-    if control.open then
-        control.animation:PlayFromStart()
-    else
-        control.animation:PlayFromEnd()
-    end
-end
-
-function LAMCreateControl.submenu(parent, submenuData, controlName)
-    local width = parent:GetWidth() - 45
-    local control = wm:CreateControl(controlName or submenuData.reference, parent.scroll or parent, CT_CONTROL)
-    control.panel = parent
-    control.data = submenuData
-
-    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local label = control.label
-    label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
-    label:SetDimensions(width, 30)
-    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-    label:SetText(LAM.util.GetStringFromValue(submenuData.name))
-    label:SetMouseEnabled(true)
-    if submenuData.tooltip then
-        label.data = {tooltipText = LAM.util.GetStringFromValue(submenuData.tooltip)}
-        label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-        label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    end
-
-    control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
-    local scroll = control.scroll
-    scroll:SetParent(control)
-    scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
-    scroll:SetDimensionConstraints(width + 5, 0, width + 5, 0)
-
-    control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
-    local bg = control.bg
-    bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
-    bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-
-    control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
-    local arrow = control.arrow
-    arrow:SetDimensions(28, 28)
-    arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds") --list_sortup for the other way
-    arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
-
-    --figure out the cool animation later...
-    control.animation = am:CreateTimeline()
-    local animation = control.animation
-    animation:SetPlaybackType(ANIMATION_SIZE, 0) --2nd arg = loop count
-
-    control:SetResizeToFitDescendents(true)
-    control.open = false
-    label:SetHandler("OnMouseUp", AnimateSubmenu)
-    animation:SetHandler("OnStop", function(self, completedPlaying)
-        scroll:SetResizeToFitDescendents(control.open)
-        if control.open then
-            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
-            scroll:SetResizeToFitPadding(5, 20)
-        else
-            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
-            scroll:SetResizeToFitPadding(5, 0)
-            scroll:SetHeight(0)
-        end
-    end)
-
-    --small strip at the bottom of the submenu that you can click to close it
-    control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
-    local btmToggle = control.btmToggle
-    btmToggle:SetMouseEnabled(true)
-    btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
-    btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
-    btmToggle:SetHeight(15)
-    btmToggle:SetAlpha(0)
-    btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/libs/LibAddonMenu-2.0/controls/texture.lua b/libs/LibAddonMenu-2.0/controls/texture.lua
deleted file mode 100644
index 29dda7c..0000000
--- a/libs/LibAddonMenu-2.0/controls/texture.lua
+++ /dev/null
@@ -1,45 +0,0 @@
---[[textureData = {
-    type = "texture",
-    image = "file/path.dds",
-    imageWidth = 64, --max of 250 for half width, 510 for full
-    imageHeight = 32, --max of 100
-    tooltip = "Image's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    reference = "MyAddonTexture" --(optional) unique global reference to control
-} ]]
-
---add texture coords support?
-
-local widgetVersion = 9
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("texture", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local MIN_HEIGHT = 26
-function LAMCreateControl.texture(parent, textureData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, textureData, controlName)
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if control.isHalfWidth then --note these restrictions
-        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
-    else
-        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
-    end
-
-    control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
-    local texture = control.texture
-    texture:SetAnchor(CENTER)
-    texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
-    texture:SetTexture(textureData.image)
-
-    if textureData.tooltip then
-        texture:SetMouseEnabled(true)
-        texture.data = {tooltipText = LAM.util.GetStringFromValue(textureData.tooltip)}
-        texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-        texture:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    end
-
-    return control
-end
diff --git a/libs/LibCustomMenu/LibCustomMenu.lua b/libs/LibCustomMenu/LibCustomMenu.lua
deleted file mode 100644
index b4a003d..0000000
--- a/libs/LibCustomMenu/LibCustomMenu.lua
+++ /dev/null
@@ -1,570 +0,0 @@
--- authors: votan, sirinsidiator
--- thanks to: baertram & circonian
-
--- Register with LibStub
-local MAJOR, MINOR = "LibCustomMenu", 5
-local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not lib then return end -- the same or newer version of this lib is already loaded into memory
-
-local wm = WINDOW_MANAGER
-
------ Common -----
-local function SetupDivider(pool, control)
-	local function GetTextDimensions(self)
-		return 32, 7
-	end
-	local function Noop(self)
-	end
-
-	local label = wm:CreateControlFromVirtual("$(parent)Name", control, "ZO_BaseTooltipDivider")
-	label:ClearAnchors()
-	label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 2)
-	label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 2)
-	-- First and last time the anchors are set
-	label.ClearAnchors = Noop
-	label.SetAnchor = Noop
-
-	label.SetText = Noop
-	label.SetFont = Noop
-	label.GetTextDimensions = GetTextDimensions
-	label.SetHorizontalAlignment = Noop
-	label:SetHidden(false)
-	control.nameLabel = label
-
-	control:SetMouseEnabled(false)
-end
-
-lib.DIVIDER = "-"
-
------ Sub Menu -----
-
-local Submenu = ZO_Object:Subclass()
-
-local SUBMENU_ITEM_MOUSE_ENTER = 1
-local SUBMENU_ITEM_MOUSE_EXIT = 2
-local SUBMENU_SHOW_TIMEOUT = 350
-local SUBMENU_HIDE_TIMEOUT = 350
-
-local submenuCallLaterHandle
-local nextId = 1
-local function ClearTimeout()
-	if (submenuCallLaterHandle ~= nil) then
-		EVENT_MANAGER:UnregisterForUpdate(submenuCallLaterHandle)
-		submenuCallLaterHandle = nil
-	end
-end
-
-local function SetTimeout(callback)
-	if (submenuCallLaterHandle ~= nil) then ClearTimeout() end
-	submenuCallLaterHandle = "LibCustomMenuSubMenuTimeout" .. nextId
-	nextId = nextId + 1
-
-	EVENT_MANAGER:RegisterForUpdate(submenuCallLaterHandle, SUBMENU_SHOW_TIMEOUT, function()
-		ClearTimeout()
-		if callback then callback() end
-	end )
-end
-
-local function GetValueOrCallback(arg, ...)
-	if type(arg) == "function" then
-		return arg(...)
-	else
-		return arg
-	end
-end
-
-function Submenu:New(...)
-	local object = ZO_Object.New(self)
-	object:Initialize(...)
-	return object
-end
-
-function Submenu:Initialize(name)
-	self.window = ZO_Menus
-
-	local submenuControl = self.window:CreateControl(name, CT_CONTROL)
-	submenuControl:SetClampedToScreen(true)
-	submenuControl:SetMouseEnabled(true)
-	submenuControl:SetHidden(true)
-	-- OnMouseEnter: Stop hiding of submenu initiated by mouse exit of parent
-	submenuControl:SetHandler("OnMouseEnter", ClearTimeout)
-
-	local function ExitSubMenu() if self.parent and self.parent.OnSelect then self.parent:OnSelect(SUBMENU_ITEM_MOUSE_EXIT) end end
-	submenuControl:SetHandler("OnMouseExit", function(control) SetTimeout(ExitSubMenu) end)
-
-	submenuControl:SetHandler("OnHide", function(control) ClearTimeout() self:Clear() end)
-	submenuControl:SetDrawLevel(ZO_Menu:GetDrawLevel() + 1)
-
-	local bg = submenuControl:CreateControl("$(parent)BG", CT_BACKDROP)
-	-- bg:SetCenterColor(0, 0, 0, .93)
-	bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
-	bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
-	bg:SetInsets(16, 16, -16, -16)
-	bg:SetAnchorFill()
-
-	local overlay = bg:CreateControl("$(parent)MungeOverlay", CT_TEXTURE)
-	overlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
-	overlay:SetAddressMode(TEX_MODE_WRAP)
-	overlay:SetAnchor(TOPLEFT)
-	overlay:SetAnchor(BOTTOMRIGHT)
-
-	self.highlight = CreateControlFromVirtual("$(parent)Highlight", submenuControl, "ZO_SelectionHighlight")
-	self.highlight:SetHidden(true)
-
-	self.control = submenuControl
-
-	local upInside = false
-	local function MouseEnter(control)
-		upInside = true
-		ClearTimeout()
-		self:SetSelectedIndex(control.index)
-	end
-	local function MouseExit(control)
-		upInside = false
-		if (self.selectedIndex == control.index) then
-			self:SetSelectedIndex(nil)
-		end
-	end
-	local function MouseUp(control, button)
-		if upInside == true and button == MOUSE_BUTTON_INDEX_LEFT then
-			ZO_Menu_SetLastCommandWasFromMenu(true)
-			if control.checkbox then
-				-- The checkbox click handler will handle it
-				ZO_CheckButton_OnClicked(control.checkbox, button)
-			else
-				if not control.OnSelect() then
-					ClearMenu()
-				end
-			end
-		end
-	end
-
-	local function ItemFactory(pool)
-		local control = CreateControlFromVirtual("ZO_SubMenuItem", submenuControl, "ZO_MenuItem", pool:GetNextControlId())
-		control.nameLabel = GetControl(control, "Name")
-
-		control:SetHandler("OnMouseEnter", MouseEnter)
-		control:SetHandler("OnMouseExit", MouseExit)
-		control:SetHandler("OnMouseDown", IgnoreMouseDownEditFocusLoss)
-		control:SetHandler("OnMouseUp", MouseUp)
-
-		return control
-	end
-
-	local function ResetFunction(control)
-		control:SetHidden(true)
-		control:ClearAnchors()
-		control.OnSelect = nil
-		control.menuIndex = nil
-	end
-
-	local function DividerFactory(pool)
-		local control = CreateControlFromVirtual("ZO_CustomSubMenuDivider", submenuControl, "ZO_NotificationsRowButton", pool:GetNextControlId())
-		SetupDivider(pool, control)
-		return control
-	end
-
-	local function ResetCheckbox(checkbox)
-		ResetFunction(checkbox)
-	end
-
-	local function CheckBoxMouseEnter(control)
-		MouseEnter(control:GetParent())
-	end
-	local function CheckBoxMouseExit(control)
-		MouseExit(control:GetParent())
-	end
-	local function CheckBoxMouseUp(control)
-		self.refCount =(self.refCount or 0) + 1
-		local parent = control:GetParent()
-		parent.OnSelect(ZO_CheckButton_IsChecked(control))
-	end
-	local function CheckBoxFactory(pool)
-		local control = CreateControlFromVirtual("ZO_CustomSubMenuItemCheckButton", submenuControl, "ZO_CheckButton", pool:GetNextControlId())
-		control.nameLabel = control
-
-		control:SetHandler("OnMouseEnter", CheckBoxMouseEnter)
-		control:SetHandler("OnMouseExit", CheckBoxMouseExit)
-
-		ZO_CheckButton_SetToggleFunction(control, CheckBoxMouseUp)
-
-		return control
-	end
-
-
-	self.itemPool = ZO_ObjectPool:New(ItemFactory, ResetFunction)
-	self.dividerPool = ZO_ObjectPool:New(DividerFactory, ResetFunction)
-	self.checkBoxPool = ZO_ObjectPool:New(CheckBoxFactory, ResetCheckbox)
-	self.items = { }
-
-	EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
-		if self.refCount ~= nil then
-			local moc = wm:GetMouseOverControl()
-			if (moc:GetOwningWindow() ~= submenuControl) then
-				self.refCount = self.refCount - 1
-				if self.refCount <= 0 then
-					self:Clear()
-				end
-			end
-		end
-	end )
-end
-
-function Submenu:SetSelectedIndex(index)
-	if (index) then
-		index = zo_max(zo_min(index, #self.items), 1)
-	end
-
-	if (self.selectedIndex ~= index) then
-		self:UnselectItem(self.selectedIndex)
-		self:SelectItem(index)
-	end
-end
-
-function Submenu:UnselectItem(index)
-	local item = self.items[index]
-	if item then
-		self.highlight:SetHidden(true)
-		local nameControl = item.nameLabel
-		nameControl:SetColor(nameControl.normalColor:UnpackRGBA())
-
-		self.selectedIndex = nil
-	end
-end
-
-function Submenu:SelectItem(index)
-	local item = self.items[index]
-	if item then
-		local highlight = self.highlight
-
-		highlight:ClearAnchors()
-
-		highlight:SetAnchor(TOPLEFT, item, TOPLEFT, -2, -2)
-		highlight:SetAnchor(BOTTOMRIGHT, item, BOTTOMRIGHT, 2, 2)
-
-		highlight:SetHidden(false)
-
-		local nameControl = item.nameLabel
-		nameControl:SetColor(nameControl.highlightColor:UnpackRGBA())
-
-		self.selectedIndex = index
-	end
-end
-
-function Submenu:UpdateAnchors()
-	local iconSize = self.iconSize
-	local previousItem = self.control
-	local items = self.items
-	local width, height = 0, 0
-	local padding = ZO_Menu.menuPad
-
-	for i = 1, #items do
-		local item = items[i]
-		local textWidth, textHeight = item.nameLabel:GetTextDimensions()
-		width = math.max(textWidth + padding * 2, width)
-		height = height + textHeight
-		item:ClearAnchors()
-		if i == 1 then
-			item:SetAnchor(TOPLEFT, previousItem, TOPLEFT, padding, padding)
-			item:SetAnchor(TOPRIGHT, previousItem, TOPRIGHT, - padding, padding)
-		else
-			item:SetAnchor(TOPLEFT, previousItem, BOTTOMLEFT, 0, item.itemYPad)
-			item:SetAnchor(TOPRIGHT, previousItem, BOTTOMRIGHT, 0, item.itemYPad)
-		end
-
-		item:SetHidden(false)
-		item:SetDimensions(textWidth, textHeight)
-		previousItem = item
-	end
-
-	self.control:SetDimensions(width + padding * 2, height + padding * 2)
-end
-
-function Submenu:Clear()
-	self:UnselectItem(self.selectedIndex)
-	self.items = { }
-	self.itemPool:ReleaseAllObjects()
-	self.dividerPool:ReleaseAllObjects()
-	self.checkBoxPool:ReleaseAllObjects()
-	self.control:SetHidden(true)
-	self.refCount = nil
-end
-
-local DEFAULT_TEXT_COLOR = ZO_ColorDef:New(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_NORMAL))
-local DEFAULT_TEXT_HIGHLIGHT = ZO_ColorDef:New(GetInterfaceColor(INTERFACE_COLOR_TYPE_TEXT_COLORS, INTERFACE_TEXT_COLOR_CONTEXT_HIGHLIGHT))
-
-function Submenu:AddItem(entry, myfont, normalColor, highlightColor, itemYPad)
-	local visible
-	if entry.visible ~= nil then visible = entry.visible else visible = true end
-	if not GetValueOrCallback(visible, ZO_Menu) then return end
-
-	local item, key
-	local itemType = entry.itemType or MENU_ADD_OPTION_LABEL
-	if itemType == MENU_ADD_OPTION_LABEL then
-		item, key = entry.label ~= lib.DIVIDER and self.itemPool:AcquireObject() or self.dividerPool:AcquireObject()
-	elseif itemType == MENU_ADD_OPTION_CHECKBOX then
-		item, key = self.itemPool:AcquireObject()
-	else
-		error(string.format("Unknown menu entry itemType: %s", itemType))
-	end
-
-	item.OnSelect = entry.callback
-	item.index = #self.items + 1
-	self.items[item.index] = item
-
-	local nameControl = item.nameLabel
-
-	local entryFont = GetValueOrCallback(entry.myfont, ZO_Menu, item) or myfont
-	local normColor = GetValueOrCallback(entry.normalColor, ZO_Menu, item) or normalColor
-	local highColor = GetValueOrCallback(entry.highlightColor, ZO_Menu, item) or highlightColor
-	myfont = entryFont or "ZoFontGame"
-	nameControl.normalColor = normColor or DEFAULT_TEXT_COLOR
-	nameControl.highlightColor = highColor or DEFAULT_TEXT_HIGHLIGHT
-
-	nameControl:SetFont(myfont)
-
-	local text = GetValueOrCallback(entry.label, ZO_Menu, item)
-
-	local checkboxItemControl = nil
-	if itemType == MENU_ADD_OPTION_CHECKBOX then
-		checkboxItemControl = self.checkBoxPool:AcquireObject()
-		checkboxItemControl:SetParent(item)
-		checkboxItemControl.menuIndex = item.index
-		checkboxItemControl:ClearAnchors()
-		checkboxItemControl:SetHidden(false)
-		checkboxItemControl:SetAnchor(LEFT, nil, LEFT, 2, -1)
-		text = string.format(" |u18:0::|u%s", text)
-		ZO_CheckButton_SetCheckState(checkboxItemControl, GetValueOrCallback(entry.checked, ZO_Menu, item) or false)
-	end
-	item.checkbox = checkboxItemControl
-
-	nameControl:SetText(text)
-
-	local enabled = not GetValueOrCallback(entry.disabled or false, ZO_Menu, item)
-	nameControl:SetColor((enabled and nameControl.normalColor or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
-	item:SetMouseEnabled(enabled)
-end
-
-function Submenu:Show(parent)
-	if not self.control:IsHidden() then self:Clear() return false end
-	self:UpdateAnchors()
-
-	local padding = ZO_Menu.menuPad
-	local control = self.control
-	control:ClearAnchors()
-	-- If there is not enough space on the right side, use the left side. Like Windows.
-	if (parent:GetRight() + control:GetWidth()) < GuiRoot:GetRight() then
-		control:SetAnchor(TOPLEFT, parent, TOPRIGHT, -1, - padding)
-	else
-		control:SetAnchor(TOPRIGHT, parent, TOPLEFT, 1, - padding)
-	end
-	control:SetHidden(false)
-	self.parent = parent
-	self.refCount = 2
-
-	return true
-end
-
-local function SubMenuItemFactory(pool)
-	local control = CreateControlFromVirtual("ZO_CustomSubMenuItem", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
-
-	local arrowContainer = control:CreateControl("$(parent)Arrow", CT_CONTROL)
-	-- we need this in order to control the menu with independently of the texture size
-	arrowContainer:SetAnchor(RIGHT, control, RIGHT, 0, 0)
-	arrowContainer:SetDimensions(32, 16)
-
-	local arrow = arrowContainer:CreateControl("$(parent)Texture", CT_TEXTURE)
-	arrow:SetAnchor(RIGHT, arrowContainer, RIGHT, 0, 0)
-	arrow:SetDimensions(16, 20)
-	arrow:SetTexture("EsoUI/Art/Miscellaneous/colorPicker_slider_vertical.dds")
-	arrow:SetTextureCoords(0, 0.5, 0, 1)
-
-	-- we assign the submenu arrow to checkbox because the context menu will add the desired width automatically that way
-	control.checkbox = arrowContainer
-
-	local clicked = false
-	local function MouseEnter(control)
-		ZO_Menu_EnterItem(control)
-		clicked = false
-		SetTimeout( function() if control.OnSelect then control:OnSelect(SUBMENU_ITEM_MOUSE_ENTER) end end)
-	end
-	local function MouseExit(control)
-		ZO_Menu_ExitItem(control)
-		if not clicked then
-			SetTimeout( function() if control.OnSelect then control:OnSelect(SUBMENU_ITEM_MOUSE_EXIT) end end)
-		end
-	end
-	local function MouseDown(control)
-		IgnoreMouseDownEditFocusLoss()
-		-- re-open sub menu on click
-		clicked = true
-		control:OnSelect(SUBMENU_ITEM_MOUSE_ENTER)
-	end
-
-	local label = wm:CreateControl("$(parent)Name", control, CT_LABEL)
-	label:SetAnchor(TOPLEFT)
-	control.nameLabel = label
-
-	control:SetHandler("OnMouseEnter", MouseEnter)
-	control:SetHandler("OnMouseExit", MouseExit)
-	control:SetHandler("OnMouseDown", MouseDown)
-
-	return control
-end
-
------ Standard Menu -----
-
-local function ResetMenuItem(button)
-	button:SetHidden(true)
-	button:ClearAnchors()
-	button.menuIndex = nil
-	button.OnSelect = nil
-end
-
-local function ResetCheckBox(checkBox)
-	ResetMenuItem(checkBox)
-	ZO_CheckButton_SetToggleFunction(checkBox, nil)
-end
-
-local upInside = false
-
-local function MenuItemFactory(pool)
-	local control = CreateControlFromVirtual("ZO_CustomMenuItem", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
-	local function MouseEnter()
-		upInside = true
-		ZO_Menu_EnterItem(control)
-	end
-	local function MouseExit()
-		upInside = false
-		ZO_Menu_ExitItem(control)
-	end
-	local function MouseUp()
-		if upInside == true then
-			ZO_Menu_ClickItem(control, 1)
-		end
-	end
-
-	local label = wm:CreateControl("$(parent)Name", control, CT_LABEL)
-	label:SetAnchor(TOPLEFT)
-	control.nameLabel = label
-
-	control:SetHandler("OnMouseEnter", MouseEnter)
-	control:SetHandler("OnMouseExit", MouseExit)
-	control:SetHandler("OnMouseDown", IgnoreMouseDownEditFocusLoss)
-	control:SetHandler("OnMouseUp", MouseUp)
-
-	return control
-end
-
-local function CheckBoxFactory(pool)
-	local control = CreateControlFromVirtual("ZO_CustomMenuItemCheckButton", ZO_Menu, "ZO_CheckButton", pool:GetNextControlId())
-	control.nameLabel = control
-
-	local function MouseEnter()
-		ZO_Menu_EnterItem(control)
-	end
-	local function MouseExit()
-		ZO_Menu_ExitItem(control)
-	end
-	control:SetHandler("OnMouseEnter", MouseEnter)
-	control:SetHandler("OnMouseExit", MouseExit)
-	return control
-end
-
-local function DividerFactory(pool)
-	local control = CreateControlFromVirtual("ZO_CustomMenuDivider", ZO_Menu, "ZO_NotificationsRowButton", pool:GetNextControlId())
-	SetupDivider(pool, control)
-	return control
-end
-
------ Public API -----
-
-function AddCustomMenuItem(mytext, myfunction, itemType, myFont, normalColor, highlightColor, itemYPad, horizontalAlignment)
-	local orgItemPool = ZO_Menu.itemPool
-	local orgCheckboxItemPool = ZO_Menu.checkBoxPool
-
-	ZO_Menu.itemPool = mytext ~= lib.DIVIDER and lib.itemPool or lib.dividerPool
-	ZO_Menu.checkBoxPool = lib.checkBoxPool
-
-	local index = AddMenuItem(mytext, myfunction, itemType, myFont, normalColor, highlightColor, itemYPad, horizontalAlignment)
-
-	ZO_Menu.itemPool = orgItemPool
-	ZO_Menu.checkBoxPool = orgCheckboxItemPool
-
-	return index
-end
-
-function AddCustomSubMenuItem(mytext, entries, myfont, normalColor, highlightColor, itemYPad)
-	local function CreateSubMenu(control, state)
-		if (state == SUBMENU_ITEM_MOUSE_ENTER) then
-			lib.submenu:Clear()
-			local currentEntries = GetValueOrCallback(entries, ZO_Menu, control)
-			local entry
-			for i = 1, #currentEntries do
-				entry = currentEntries[i]
-				lib.submenu:AddItem(entry, myfont, normalColor, highlightColor, itemYPad)
-			end
-			lib.submenu:Show(control)
-		elseif (state == SUBMENU_ITEM_MOUSE_EXIT) then
-			lib.submenu:Clear()
-		end
-	end
-
-	local orgItemPool = ZO_Menu.itemPool
-	local orgCheckboxItemPool = ZO_Menu.checkBoxPool
-
-	ZO_Menu.itemPool = lib.submenuPool
-	ZO_Menu.checkBoxPool = lib.checkBoxPool
-
-	local index = AddMenuItem(mytext, CreateSubMenu, MENU_ADD_OPTION_LABEL, myfont, normalColor, highlightColor, itemYPad)
-
-	ZO_Menu.itemPool = orgItemPool
-	ZO_Menu.checkBoxPool = orgCheckboxItemPool
-
-	return index
-end
-
-local function HookClearMenu()
-	local orgClearMenu = ClearMenu
-	function ClearMenu()
-		ClearTimeout()
-		orgClearMenu()
-		lib.itemPool:ReleaseAllObjects()
-		lib.submenuPool:ReleaseAllObjects()
-		lib.checkBoxPool:ReleaseAllObjects()
-		lib.dividerPool:ReleaseAllObjects()
-		lib.submenu:Clear()
-	end
-end
-
-local function HookAddSlotAction()
-	function ZO_InventorySlotActions:AddCustomSlotAction(...)
-		local orgItemPool = ZO_Menu.itemPool
-		local orgCheckboxItemPool = ZO_Menu.checkBoxPool
-
-		ZO_Menu.itemPool = lib.itemPool
-		ZO_Menu.checkBoxPool = lib.checkBoxPool
-
-		self:AddSlotAction(...)
-
-		ZO_Menu.itemPool = orgItemPool
-		ZO_Menu.checkBoxPool = orgCheckboxItemPool
-	end
-end
-
----- Init -----
-
-local function OnAddonLoaded(event, name)
-	if name:find("^ZO_") then return end
-	EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
-	lib.itemPool = ZO_ObjectPool:New(MenuItemFactory, ResetMenuItem)
-	lib.submenuPool = ZO_ObjectPool:New(SubMenuItemFactory, ResetMenuItem)
-	lib.checkBoxPool = ZO_ObjectPool:New(CheckBoxFactory, ResetCheckBox)
-	lib.dividerPool = ZO_ObjectPool:New(DividerFactory, ResetMenuItem)
-	lib.submenu = Submenu:New("LibCustomMenuSubmenu")
-	HookClearMenu()
-	HookAddSlotAction()
-end
-
-EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_ADD_ON_LOADED, OnAddonLoaded)
diff --git a/libs/LibCustomMenu/Unlicense.rtf b/libs/LibCustomMenu/Unlicense.rtf
deleted file mode 100644
index 68a49da..0000000
--- a/libs/LibCustomMenu/Unlicense.rtf
+++ /dev/null
@@ -1,24 +0,0 @@
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <http://unlicense.org/>
diff --git a/libs/LibCustomTitles/LibCustomTitles.lua b/libs/LibCustomTitles/LibCustomTitles.lua
deleted file mode 100644
index bf76cf8..0000000
--- a/libs/LibCustomTitles/LibCustomTitles.lua
+++ /dev/null
@@ -1,295 +0,0 @@
---[[
-Author: Ayantir
-Filename: LibCustomTitles.lua
-Version: 11
-]]--
-
---[[
-
-This software is under : CreativeCommons CC BY-NC-SA 4.0
-Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-You are free to:
-
-    Share — copy and redistribute the material in any medium or format
-    Adapt — remix, transform, and build upon the material
-    The licensor cannot revoke these freedoms as long as you follow the license terms.
-
-
-Under the following terms:
-
-    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-    NonCommercial — You may not use the material for commercial purposes.
-    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
-    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
-
-
-Please read full licence at :
-http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
-
-]]--
-
-local libLoaded
-local LIB_NAME, VERSION = "LibCustomTitles", 11
-local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
-if not LibCustomTitles then return end
-
-function LibCustomTitles:Init()
-
-	local CT_NO_TITLE = 0
-	local CT_TITLE_ACCOUNT = 1
-	local CT_TITLE_CHARACTER = 2
-
-	-- Default override
-	local overriden = {
-		en = "Volunteer",
-		fr = "Volontaire",
-		de = "Freiwillige",
-	}
-
-	local customTitles = {
-
-		["@Ayantir"] = { -- Dev / EU. v1
-			ov = true,
-			en = "The Enlightened",
-			fr = "Mangeuse de Gâteaux",
-			de = "Die Erleuchtete",
-		},
-
-		["@Baertram"] = { -- Dev / EU. v4
-			ov = true,
-			en = "Ursa Major",
-			fr = "Ursa Major",
-			de = "Ursa Major",
-		},
-
-		["@sirinsidiator"] = { -- Dev / EU. v5
-			["Illonia Ithildû"] = {
-				ov = true,
-				en = "Planeswalker",
-				fr = "Arpenteuse de Mondes",
-				de = "Weltenwanderer",
-			},
-			ov = true,
-			en = "Absolutely Not Suspicious",
-			fr = "Carrément pas suspect",
-			de = "Absolut Nicht Verdächtig",
-		},
-
-		["@Randactyl"] = { -- Dev / NA. v6
-			["Vedrasi Rilim"] = {
-				ov = true,
-				en = "Glorious Leader",
-			},
-			ov = true,
-			en = "No Lollygaggin'",
-		},
-
-		["@Wedgez"] = { -- NA. v8
-			ov = true,
-			en = "Golden Light Master",
-		},
-
-		["@Ign0tus"] = { -- NA. v8
-			["Smudgê"] = {
-				ov = true,
-				en = "Infiltrator",
-			},
-			["Nefandus Pravus"] = {
-				ov = true,
-				en = "Nightlord",
-			},
-			["Zero Divisor"] = {
-				ov = true,
-				en = "Executioner",
-			},
-			ov = true,
-			en = "Sweetroll Thief",
-		},
-
-		["@dOpiate"] = { -- Dev / EU. v8
-			["Harmful"] = {
-				ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
-				en = "The Butcher",
-				fr = "Le Boucher",
-				de = "Der Metzger",
-			},
-		},
-
-		["@LadyHermione"] = { -- NA v9
-			["Lady Hermione Sophia"] = {
-				ov = true,
-				en = "Know-It-All",
-			},
-		},
-
-		["@Tarsalterror"] = { -- NA v9
-			ov = {en = "Enemy of Coldharbour", fr = "Ennemi de Havreglace", de = "Feind Kalthafens"},
-			en = "Fancy Man of Cornwood",
-		},
-
-		["@manavortex"] = { -- EU v10
-			["Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-		},
-
-		["@Valorin"] = { -- EU v10
-			["Valorin Telvanni"] = {
-				ov = {en = "Savior of Nirn", fr = "Sauveur de Nirn", de = "Retter Nirns"},
-				en = "Aetherial Blade",
-				fr = "Lame Ethérée",
-				de = "Ätherklinge",
-			},
-		},
-
-		["@manorin"] = { -- EU v10
-			["Foryn Telvanni"] = {
-				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-				en = "Hero",
-				fr = "Héros",
-				de = "Helt",
-			},
-		},
-
-		["@Chivana"] = { -- EU v11
-			["Chivana"] = {
-				ov = true,
-				en = "Amazon Queen",
-				fr = "Reine Amazone",
-				de = "Amazonaskönigin",
-			},
-		},
-
-		["@Mythk"] = { -- NA v11
-			ov = {en = "Recruit", fr = "Recrue", de = "Rekrutin"},
-			en = "The One and Only",
-			fr = "Le Seul et l'Unique",
-		},
-
-		["@susmitds"] = { -- NA. v11
-			["Shadow Kitter"] = {
-				ov = true,
-				en = "Emperor Slayer",
-			},
-			["Venom Kitter"] = {
-				ov = true,
-				en = "Poison Angel",
-			},
-			["Wind Kitter"] = {
-				ov = true,
-				en = "Cyclone Walker",
-			},
-			["Lumina Kitter"] = {
-				ov = true,
-				en = "Darklight Seeker",
-			},
-			["Thunder Xyler"] = {
-				ov = true,
-				en = "Unbound Infinium",
-			},
-			["Light Xyler"] = {
-				ov = true,
-				en = "Everglow Hunter",
-			},
-			["Fire Xyler"] = {
-				ov = true,
-				en = "Eternal Inferno",
-			},
-			["Void Xyler"] = {
-				ov = true,
-				en = "Existential Anomaly",
-			},
-		},
-
-		["@JasminTheSecond"] = { -- EU v11
-			["Durac"] = {
-				ov = true,
-				en = "The Lost",
-				fr = "L'égaré",
-				de = "Der Verschollene",
-			},
-		},
-
-	}
-
-	local lang = GetCVar("Language.2")
-
-	local function GetCustomTitleType(displayName, unitName)
-		if customTitles[displayName] then
-			if customTitles[displayName][unitName] then
-				return CT_TITLE_CHARACTER
-			end
-			return CT_TITLE_ACCOUNT
-		end
-		return CT_NO_TITLE
-	end
-
-	local function GetModifiedTitle(originalTitle, displayName, unitName, registerType)
-
-		local title = originalTitle
-		if registerType == CT_TITLE_CHARACTER then
-			if customTitles[displayName][unitName].ov then
-				if type(customTitles[displayName][unitName].ov) == "boolean" then
-					if originalTitle == overriden[lang] then
-						title = customTitles[displayName][unitName][lang] or originalTitle
-					end
-				elseif originalTitle == customTitles[displayName][unitName].ov[lang] then
-					title = customTitles[displayName][unitName][lang] or originalTitle
-				end
-			end
-		elseif registerType == CT_TITLE_ACCOUNT then
-			if customTitles[displayName].ov then
-				if type(customTitles[displayName].ov) == "boolean" then
-					if originalTitle == overriden[lang] then
-						title = customTitles[displayName][lang] or originalTitle
-					end
-				elseif originalTitle == customTitles[displayName].ov[lang] then
-					title = customTitles[displayName][lang] or originalTitle
-				end
-			end
-		end
-
-		return title
-
-	end
-
-	local GetUnitTitle_original = GetUnitTitle
-	GetUnitTitle = function(unitTag)
-		local unitTitleOriginal = GetUnitTitle_original(unitTag)
-		local unitDisplayName = GetUnitDisplayName(unitTag)
-		local unitCharacterName = GetUnitName(unitTag)
-		local registerType = GetCustomTitleType(unitDisplayName, unitCharacterName)
-		if registerType ~= CT_NO_TITLE then
-			return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName, registerType)
-		end
-		return unitTitleOriginal
-	end
-
-	local GetTitle_original = GetTitle
-	GetTitle = function(index)
-		local titleOriginal = GetTitle_original(index)
-		local displayName = GetDisplayName()
-		local characterName = GetUnitName("player")
-		local registerType = GetCustomTitleType(displayName, characterName)
-		if registerType ~= CT_NO_TITLE then
-			return GetModifiedTitle(titleOriginal, displayName, characterName, registerType)
-		end
-		return titleOriginal
-	end
-
-end
-
-local function OnAddonLoaded()
-	if not libLoaded then
-		libLoaded = true
-		local LCC = LibStub('LibCustomTitles')
-		LCC:Init()
-		EVENT_MANAGER:UnregisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED)
-	end
-end
-
-EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
\ No newline at end of file
diff --git a/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua b/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
deleted file mode 100644
index aaa18d1..0000000
--- a/libs/LibMediaProvider-1.0/LibMediaProvider-1.0.lua
+++ /dev/null
@@ -1,163 +0,0 @@
---LibMediaProvider-1.0 is inspired by and borrows from LibSharedMedia-3.0 for World of Warcraft by Elkano
---LibSharedMedia-3.0 and LibMediaProvider-1.0 are under the LGPL-2.1 license
-
-local MAJOR, MINOR = "LibMediaProvider-1.0", 7 -- remember to increase manually on changes
-local LMP = LibStub:NewLibrary(MAJOR, MINOR)
-if not LMP then return end
-
-local cm = CALLBACK_MANAGER
-local tinsert = table.insert
-local tsort = table.sort
-local pairs = pairs
-
-LMP.DefaultMedia = LMP.DefaultMedia or {}
-LMP.MediaList = LMP.MediaList or {}
-LMP.MediaTable = LMP.MediaTable or {}
-if not LMP.MediaType then
-	LMP.MediaType = {
-		BACKGROUND = "background",	-- background textures
-		BORDER = "border",			-- border textures
-		FONT = "font",				-- fonts
-		STATUSBAR = "statusbar",	-- statusbar textures
-		SOUND = "sound",			-- sound files
-	}
-end
-local defaultMedia = LMP.DefaultMedia
-local mediaList = LMP.MediaList
-local mediaTable = LMP.MediaTable
-
---DEFAULT UI MEDIA--
--- BACKGROUND
-LMP.MediaTable.background = LMP.MediaTable.background or {}
---commented out because it still leaves a white texture behind - addons can use alpha to hide the background
---LMP.MediaTable.background["None"]				= ""
-LMP.MediaTable.background["ESO Black"]			= "EsoUI/Art/Miscellaneous/borderedinset_center.dds"
-LMP.MediaTable.background["ESO Chat"]			= "EsoUI/Art/chatwindow/chat_bg_center.dds"
-LMP.MediaTable.background["ESO Gray"]			= "EsoUI/Art/itemtooltip/simpleprogbarbg_center.dds"
-LMP.MediaTable.background["Solid"]				= ""
---LMP.DefaultMedia.background = "None"
-LMP.DefaultMedia.background = "Solid"
-
--- BORDER
-LMP.MediaTable.border = LMP.MediaTable.border or {}
---commented out because it still leaves a white texture behind - addons can use alpha to hide the border
---LMP.MediaTable.border["None"]					= ""
-LMP.MediaTable.border["ESO Gold"]				= "EsoUI/Art/Miscellaneous/borderedinsettransparent_edgefile.dds"
-LMP.MediaTable.border["ESO Chat"]				= "EsoUI/Art/chatwindow/chat_bg_edge.dds"
-LMP.MediaTable.border["ESO Rounded"]			= "EsoUI/Art/miscellaneous/interactkeyframe_edge.dds"
-LMP.MediaTable.border["ESO Blue Highlight"]		= "EsoUI/Art/miscellaneous/textentry_highlight_edge.dds"
-LMP.MediaTable.border["ESO Blue Glow"]			= "EsoUI/Art/crafting/crafting_tooltip_glow_edge_blue64.dds"
-LMP.MediaTable.border["ESO Red Glow"]			= "EsoUI/Art/crafting/crafting_tooltip_glow_edge_red64.dds"
-LMP.MediaTable.border["ESO Red Overlay"]		= "EsoUI/Art/uicombatoverlay/uicombatoverlayedge.dds"
---LMP.DefaultMedia.border = "None"
-LMP.DefaultMedia.border = "ESO Gold"
-
--- FONT
-LMP.MediaTable.font = LMP.MediaTable.font or {}
-LMP.MediaTable.font["ProseAntique"]				= "EsoUI/Common/Fonts/ProseAntiquePSMT.otf"
-LMP.MediaTable.font["Consolas"]					= "EsoUI/Common/Fonts/consola.ttf"
-LMP.MediaTable.font["Futura Condensed Light"]	= "EsoUI/Common/Fonts/FuturaStd-CondensedLight.otf"
-LMP.MediaTable.font["Futura Condensed"]			= "EsoUI/Common/Fonts/FuturaStd-Condensed.otf"
-LMP.MediaTable.font["Skyrim Handwritten"]		= "EsoUI/Common/Fonts/Handwritten_Bold.otf"
-LMP.MediaTable.font["Trajan Pro"]				= "EsoUI/Common/Fonts/trajanpro-regular.otf"
-LMP.MediaTable.font["Univers 55"]				= "EsoUI/Common/Fonts/univers55.otf"
-LMP.MediaTable.font["Univers 57"]				= "EsoUI/Common/Fonts/univers57.otf"
-LMP.MediaTable.font["Univers 67"]				= "EsoUI/Common/Fonts/univers67.otf"
-LMP.DefaultMedia.font = "Univers 55"
-
--- STATUSBAR
-LMP.MediaTable.statusbar = LMP.MediaTable.statusbar or {}
---LMP.MediaTable.statusbar["ESO Basic"]			= "EsoUI/Art/miscellaneous/progressbar_genericfill_tall.dds"
-LMP.MediaTable.statusbar["ESO Basic"]			= ""
-LMP.DefaultMedia.statusbar = "ESO Basic"
-
--- SOUND
-LMP.MediaTable.sound = LMP.MediaTable.sound or {}
-LMP.MediaTable.sound["None"]					= ""
-LMP.MediaTable.sound["AvA Gate Open"]			= SOUNDS.AVA_GATE_OPENED
-LMP.MediaTable.sound["AvA Gate Close"]			= SOUNDS.AVA_GATE_CLOSED
-LMP.MediaTable.sound["Emperor Coronated"]		= SOUNDS.EMPEROR_CORONATED_DAGGERFALL
-LMP.MediaTable.sound["Level Up"]				= SOUNDS.LEVEL_UP
-LMP.MediaTable.sound["Skill Gained"]			= SOUNDS.SKILL_GAINED
-LMP.MediaTable.sound["Ability Purchased"]		= SOUNDS.ABILITY_SKILL_PURCHASED
-LMP.MediaTable.sound["Book Acquired"]			= SOUNDS.BOOK_ACQUIRED
-LMP.MediaTable.sound["Unlock"]					= SOUNDS.LOCKPICKING_UNLOCKED
-LMP.MediaTable.sound["Enchanting Extract"]		= SOUNDS.ENCHANTING_EXTRACT_START_ANIM
-LMP.MediaTable.sound["Enchanting Create"]		= SOUNDS.ENCHANTING_CREATE_TOOLTIP_GLOW
-LMP.MediaTable.sound["Blacksmith Improve"]		= SOUNDS.BLACKSMITH_IMPROVE_TOOLTIP_GLOW_SUCCESS
-LMP.DefaultMedia.sound = "None"
-
-local function rebuildMediaList(mediatype)
-	local mtable = mediaTable[mediatype]
-	if not mtable then return end
-	if not mediaList[mediatype] then mediaList[mediatype] = {} end
-	local mlist = mediaList[mediatype]
-	-- list can only get larger, so simply overwrite it
-	local i = 0
-	for k in pairs(mtable) do
-		i = i + 1
-		mlist[i] = k
-	end
-	tsort(mlist)
-end
-
-function LMP:Register(mediatype, key, data)
-	if type(mediatype) ~= "string" then
-		error(MAJOR..":Register(mediatype, key, data) - mediatype must be string, got "..type(mediatype))
-	end
-	if type(key) ~= "string" then
-		error(MAJOR..":Register(mediatype, key, data) - key must be string, got "..type(key))
-	end
-	mediatype = mediatype:lower()
-	if not mediaTable[mediatype] then
-		mediaTable[mediatype] = {}
-	end
-
-	local mtable = mediaTable[mediatype]
-	if mtable[key] then
-		return false
-	end
-	mtable[key] = data
-	rebuildMediaList(mediatype)
-	cm:FireCallbacks("LibMediaProvider_Registered", mediatype, key)
-	return true
-end
-
-function LMP:Fetch(mediatype, key)
-	local mtt = mediaTable[mediatype]
-	local result = (mtt and mtt[key]) or (defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])
-	return result ~= "" and result or nil
-end
-
-function LMP:IsValid(mediatype, key)
-	return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
-end
-
-function LMP:HashTable(mediatype)
-	return mediaTable[mediatype]
-end
-
-function LMP:List(mediatype)
-	if not mediaTable[mediatype] then
-		return nil
-	end
-	if not mediaList[mediatype] then
-		rebuildMediaList(mediatype)
-	end
-	return mediaList[mediatype]
-end
-
-function LMP:GetDefault(mediatype)
-	return defaultMedia[mediatype]
-end
-
-function LMP:SetDefault(mediatype, key)
-	if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
-		defaultMedia[mediatype] = key
-		return true
-	else
-		return false
-	end
-end
-
-
diff --git a/libs/LibScroll/LibScroll.lua b/libs/LibScroll/LibScroll.lua
deleted file mode 100644
index 5e363c4..0000000
--- a/libs/LibScroll/LibScroll.lua
+++ /dev/null
@@ -1,145 +0,0 @@
-
-
-local MAJOR, MINOR = "LibScroll", 1
-local libScroll, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not libScroll then return end	--the same or newer version of this lib is already loaded into memory
-
-local ROW_TYPE_ID 			= 1
-local DEFAULT_ROW_HEIGHT 	= 30
-local DEFAULT_SCROLL_WIDTH 	= 250
-local DEFAULT_SCROLL_HEIGHT = 400
-
--- Adds scroll list categories:
-local function AddCategories(scrollList, categories)
-	if not categories then return end
-
-	for k,category in pairs(categories) do
-		local categoryId = tonumber(category)
-		if categoryId then
-			-- not handling parent categories
-			ZO_ScrollList_AddCategory(scrollList, categoryId, nil)
-		end
-	end
-end
-
--- Used to get scroll list categories so they can be reloaded
--- after an Update. This is also used in case users manually add/remove
--- categories after the scrollList has been created & the original
--- categories may no longer be valid
-local function GetListCategories(self)
-	local categories = {}
-
-	for categoryId in pairs(self.categories) do
-		table.insert(categories, categoryId)
-	end
-	return categories
-end
-
---[[ Must use deepTableCopy or it WILL crash if the user passes in a dataTable that is stored in saved variables. This is because ZO_ScrollList_CreateDataEntry creates a recursive reference to the data. Although this is only necessary for data saved in saved vars, I'm doing it to protect users against themselves
---]]
-local function UpdateScrollList(scrollList, dataTable)
-	local dataTableCopy = ZO_DeepTableCopy(dataTable)
-	local dataList 		= ZO_ScrollList_GetDataList(scrollList)
-	-- backup the current categories so we can reload them
-	local currentCategories = GetListCategories(scrollList)
-
-	ZO_ScrollList_Clear(scrollList)
-
-	AddCategories(scrollList, currentCategories)
-
-	-- Add data items to the list
-	for k, dataItem in ipairs(dataTableCopy) do
-		local entry = ZO_ScrollList_CreateDataEntry(ROW_TYPE_ID, dataItem, dataItem.categoryId)
-		table.insert(dataList, entry)
-	end
-
-	local sortFn = scrollList.SortFunction
-
-	if sortFn then
-		table.sort(dataList, sortFn)
-	end
-
-	ZO_ScrollList_Commit(scrollList)
-end
-
---=======================================================--
---== Available Functions (by scrollList.reference) ==--
---=======================================================--
--- These are fairly simple even for a beginner
--- are they worth putting in here?
---=======================================================--
-local function ShowAllCategories(self)
-	for k,catInfo in pairs(self.categories) do
-		ZO_ScrollList_ShowCategory(self, catInfo.id)
-	end
-end
-local function ShowOnlyCategory(self, categoryId)
-	ZO_ScrollList_HideAllCategories(self)
-	ZO_ScrollList_ShowCategory(self, categoryId)
-end
-local function ShowCategory(self, categoryId)
-	ZO_ScrollList_ShowCategory(self, categoryId)
-end
-local function HideAllCategories(self)
-	ZO_ScrollList_HideAllCategories(self)
-end
-local function HideCategory(self, categoryId)
-	ZO_ScrollList_HideCategory(self, categoryId)
-end
-local function ClearList(self)
-	ZO_ScrollList_Clear(self)
-	ZO_ScrollList_Commit(self)
-end
-
-local function CreateScrollList(scrollData)
-	local listName = scrollData.name
-	local parent = scrollData.parent
-
-	if not listName or type(listName) ~= "string" then return end
-	if not parent then return end
-
-	local listWidth = scrollData.width or DEFAULT_SCROLL_WIDTH
-	local listheight = scrollData.height or DEFAULT_SCROLL_HEIGHT
-	local rowHeight = scrollData.rowHeight or DEFAULT_ROW_HEIGHT
-	local template = scrollData.rowTemplate or "ZO_SelectableLabel"
-	local setupCallback = scrollData.setupCallback
-	local selectCallback = scrollData.selectCallback
-	-- Decided not to use a default or else it would force a highlight
-	-- which some users may not want
-	--local selectTemplate = scrollData.selectTemplate or "ZO_ThinListHighlight"
-	local selectTemplate = scrollData.selectTemplate
-
-	local scrollList = WINDOW_MANAGER:CreateControlFromVirtual(listName, parent, "ZO_ScrollList")
-
-	if not scrollList then return end
-
-	scrollList:SetDimensions(listWidth, listheight)
-
-	ZO_ScrollList_AddDataType(scrollList, ROW_TYPE_ID, template, rowHeight, setupCallback, scrollData.hideCallback, scrollData.dataTypeSelectSound, scrollData.resetControlCallback)
-
-	if selectTemplate or selectCallback then
-		ZO_ScrollList_EnableSelection(scrollList, selectTemplate, selectCallback)
-	end
-
-	AddCategories(scrollList, scrollData.categories)
-
-	-- Easy Access References:
-	scrollList.scrollData 		= scrollData
-	scrollList.SortFunction 	= scrollData.sortFunction
-
-	-- Easy Access Functions:
-	scrollList.Clear				= ClearList
-	scrollList.Update	 			= UpdateScrollList
-	scrollList.ShowAllCategories	= ShowAllCategories
-	scrollList.ShowOnlyCategory 	= ShowOnlyCategory
-	scrollList.ShowCategory 		= ShowCategory
-	scrollList.HideAllCategories 	= HideAllCategories
-	scrollList.HideCategory			= HideCategory
-
-	return scrollList
-end
-
-function libScroll:CreateScrollList(scrollData)
-	if not scrollData then return end
-	return CreateScrollList(scrollData)
-end
diff --git a/libs/LibStub/LibStub.lua b/libs/LibStub/LibStub.lua
deleted file mode 100644
index 0e6bf67..0000000
--- a/libs/LibStub/LibStub.lua
+++ /dev/null
@@ -1,38 +0,0 @@
--- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
--- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
--- LibStub developed for World of Warcraft by above members of the WowAce community.
--- Ported to Elder Scrolls Online by Seerah
-
-local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
-local LibStub = _G[LIBSTUB_MAJOR]
-
-local strformat = string.format
-if not LibStub or LibStub.minor < LIBSTUB_MINOR then
-	LibStub = LibStub or {libs = {}, minors = {} }
-	_G[LIBSTUB_MAJOR] = LibStub
-	LibStub.minor = LIBSTUB_MINOR
-
-	function LibStub:NewLibrary(major, minor)
-		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
-		if type(minor) ~= "number" then
-			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
-		end
-
-		local oldminor = self.minors[major]
-		if oldminor and oldminor >= minor then return nil end
-		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
-		return self.libs[major], oldminor
-	end
-
-	function LibStub:GetLibrary(major, silent)
-		if not self.libs[major] and not silent then
-			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
-		end
-		return self.libs[major], self.minors[major]
-	end
-
-	function LibStub:IterateLibraries() return pairs(self.libs) end
-	setmetatable(LibStub, { __call = LibStub.GetLibrary })
-end
-
-LibStub.SILENT = true
\ No newline at end of file