changed directory structure

git [04-22-18 - 13:43]
changed directory structure
Filename
FurCContextMenu.lua
FurCControlBridge.lua
FurCData.lua
FurCDataParser.lua
FurCDatabaseQuery.lua
FurCEvents.lua
FurCFilter.lua
FurCGui.lua
FurCMenu.lua
FurCSettingsAdapter.lua
FurCTooltip.lua
FurCUtil.lua
FurnitureCatalogue.txt
FurnitureCatalogue/FurCContextMenu.lua
FurnitureCatalogue/FurCControlBridge.lua
FurnitureCatalogue/FurCData.lua
FurnitureCatalogue/FurCDataParser.lua
FurnitureCatalogue/FurCDatabaseQuery.lua
FurnitureCatalogue/FurCEvents.lua
FurnitureCatalogue/FurCFilter.lua
FurnitureCatalogue/FurCGui.lua
FurnitureCatalogue/FurCMenu.lua
FurnitureCatalogue/FurCSettingsAdapter.lua
FurnitureCatalogue/FurCTooltip.lua
FurnitureCatalogue/FurCUtil.lua
FurnitureCatalogue/FurnitureCatalogue.txt
FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport.lua
FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport_Menu.lua
FurnitureCatalogue/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
FurnitureCatalogue/data/AchievementVendors.lua
FurnitureCatalogue/data/EventItems.lua
FurnitureCatalogue/data/Homestead/H_AchievementVendors.lua
FurnitureCatalogue/data/Homestead/H_Cyrodiil.lua
FurnitureCatalogue/data/Homestead/H_EventItems.lua
FurnitureCatalogue/data/Homestead/H_LuxuryFurnisher.lua
FurnitureCatalogue/data/Homestead/H_Recipes.lua
FurnitureCatalogue/data/Homestead/H_Rollis.lua
FurnitureCatalogue/data/LuxuryFurnisher.lua
FurnitureCatalogue/data/MiscItemSources.lua
FurnitureCatalogue/data/Morrowind/M_AchievementVendors.lua
FurnitureCatalogue/data/Morrowind/M_EventItems.lua
FurnitureCatalogue/data/Morrowind/M_LuxuryFurnisher.lua
FurnitureCatalogue/data/Morrowind/M_Recipes.lua
FurnitureCatalogue/data/Reach/HotR_AchievementVendors.lua
FurnitureCatalogue/data/Reach/HotR_LuxuryFurnisher.lua
FurnitureCatalogue/data/Reach/HotR_Recipes.lua
FurnitureCatalogue/data/Reach/HotR_Rollis.lua
FurnitureCatalogue/data/RecipeSources.lua
FurnitureCatalogue/data/Recipes.lua
FurnitureCatalogue/data/Rollis.lua
FurnitureCatalogue/data/RumourRecipes.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/LICENSE
FurnitureCatalogue/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/button.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/checkbox.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/colorpicker.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/custom.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/description.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/divider.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/dropdown.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/editbox.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/header.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/iconpicker.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/panel.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/slider.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/submenu.lua
FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/texture.lua
FurnitureCatalogue/libs/LibAsync/LibAsync.lua
FurnitureCatalogue/libs/LibCustomMenu/LibCustomMenu.lua
FurnitureCatalogue/libs/LibCustomMenu/Unlicense.rtf
FurnitureCatalogue/libs/LibCustomTitles/LibCustomTitles.lua
FurnitureCatalogue/libs/LibStub/LibStub.lua
FurnitureCatalogue/locale/de.lua
FurnitureCatalogue/locale/en.lua
FurnitureCatalogue/locale/fr.lua
FurnitureCatalogue/locale/jp.lua
FurnitureCatalogue/locale/ru.lua
FurnitureCatalogue/startup.lua
FurnitureCatalogue/textures/all_down.dds
FurnitureCatalogue/textures/all_over.dds
FurnitureCatalogue/textures/all_up.dds
FurnitureCatalogue/textures/arcane_down.dds
FurnitureCatalogue/textures/arcane_over.dds
FurnitureCatalogue/textures/arcane_up.dds
FurnitureCatalogue/textures/artifact_down.dds
FurnitureCatalogue/textures/artifact_over.dds
FurnitureCatalogue/textures/artifact_up.dds
FurnitureCatalogue/textures/known_down.dds
FurnitureCatalogue/textures/known_over.dds
FurnitureCatalogue/textures/known_up.dds
FurnitureCatalogue/textures/legendary_down.dds
FurnitureCatalogue/textures/legendary_over.dds
FurnitureCatalogue/textures/legendary_up.dds
FurnitureCatalogue/textures/magic_down.dds
FurnitureCatalogue/textures/magic_over.dds
FurnitureCatalogue/textures/magic_up.dds
FurnitureCatalogue/textures/over.dds
FurnitureCatalogue/textures/unknown_down.dds
FurnitureCatalogue/textures/unknown_over.dds
FurnitureCatalogue/textures/unknown_up.dds
FurnitureCatalogue/textures/white_down.dds
FurnitureCatalogue/textures/white_over.dds
FurnitureCatalogue/textures/white_up.dds
FurnitureCatalogue/xml/Bindings.xml
FurnitureCatalogue/xml/FurnitureCatalogue.xml
FurnitureCatalogue_Export/FurCDataExport.lua
FurnitureCatalogue_Export/FurCDataExport_Menu.lua
FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
data/AchievementVendors.lua
data/EventItems.lua
data/Homestead/H_AchievementVendors.lua
data/Homestead/H_Cyrodiil.lua
data/Homestead/H_EventItems.lua
data/Homestead/H_LuxuryFurnisher.lua
data/Homestead/H_Recipes.lua
data/Homestead/H_Rollis.lua
data/LuxuryFurnisher.lua
data/MiscItemSources.lua
data/Morrowind/M_AchievementVendors.lua
data/Morrowind/M_EventItems.lua
data/Morrowind/M_LuxuryFurnisher.lua
data/Morrowind/M_Recipes.lua
data/Reach/HotR_AchievementVendors.lua
data/Reach/HotR_LuxuryFurnisher.lua
data/Reach/HotR_Recipes.lua
data/Reach/HotR_Rollis.lua
data/RecipeSources.lua
data/Recipes.lua
data/Rollis.lua
data/RumourRecipes.lua
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/slider.lua
libs/LibAddonMenu-2.0/controls/submenu.lua
libs/LibAddonMenu-2.0/controls/texture.lua
libs/LibAsync/LibAsync.lua
libs/LibCustomMenu/LibCustomMenu.lua
libs/LibCustomMenu/Unlicense.rtf
libs/LibCustomTitles/LibCustomTitles.lua
libs/LibStub/LibStub.lua
locale/de.lua
locale/en.lua
locale/fr.lua
locale/jp.lua
locale/ru.lua
startup.lua
xml/Bindings.xml
xml/FurnitureCatalogue.xml
diff --git a/FurCContextMenu.lua b/FurCContextMenu.lua
new file mode 100644
index 0000000..c443060
--- /dev/null
+++ b/FurCContextMenu.lua
@@ -0,0 +1,168 @@
+FurC_LinkHandlerBackup_OnLinkMouseUp = nil
+
+local FURC_S_SHOPPINGLIST_1 = GetString(SI_FURC_ONE_TO_SHOPPINGLIST)
+local FURC_S_SHOPPINGLIST_5 = GetString(SI_FURC_FIVE_TO_SHOPPINGLIST)
+local FURC_S_TOGGLE_SL = GetString(SI_FURC_TOGGLE_SHOPPINGLIST)
+
+function AddFurnitureShoppingListMenuEntry(itemId, calledFromFurC)
+	if calledFromFurC then
+		if (not FurC.GetEnableShoppingList()) then return end
+		if (nil ==	moc()) or (nil == FurnitureShoppingListAdd) then return end
+		local controlName = moc():GetName() or ""
+		if nil == moc():GetName():match("_ListItem_") then return end
+	end
+	local itemLink = FurC.GetItemLink(itemId)
+	if nil == FurC.Find(itemLink) then return end
+	AddCustomMenuItem(FURC_S_SHOPPINGLIST_1,
+		function()
+			FurnitureShoppingListAdd(itemLink)
+		end,
+	MENU_ADD_OPTION_LABEL)
+	AddCustomMenuItem(FURC_S_SHOPPINGLIST_5,
+		function()
+			FurnitureShoppingListAdd(itemLink)
+			FurnitureShoppingListAdd(itemLink)
+			FurnitureShoppingListAdd(itemLink)
+			FurnitureShoppingListAdd(itemLink)
+			FurnitureShoppingListAdd(itemLink)
+		end,
+	MENU_ADD_OPTION_LABEL)
+	AddCustomMenuItem(FURC_S_TOGGLE_SL,
+		function()
+			FurnitureShoppingListWindow_Toggle()
+		end,
+	MENU_ADD_OPTION_LABEL)
+
+end
+
+local function addMenuItems(itemLink, recipeArray)
+
+	recipeArray = recipeArray or FurC.Find(itemLink)
+	if (nil == recipeArray) then return end
+	-- ClearMenu()
+
+	AddCustomMenuItem(GetString(SI_FURC_MENU_HEADER),
+		function() FurC.ToChat(itemLink) end,
+		MENU_ADD_OPTION_LABEL
+	)
+	local faveText = FurC.IsFavorite(itemLink, recipeArray) and GetString(SI_FURC_REMOVE_FAVE) or GetString(SI_FURC_ADD_FAVE)
+	AddCustomMenuItem(faveText,
+		function() FurC.Fave(itemLink, recipeArray) end,
+		MENU_ADD_OPTION_LABEL
+	)
+
+	if recipeArray.origin ~= FURC_CRAFTING then
+		AddCustomMenuItem(GetString(SI_FURC_POST_ITEMSOURCE),
+			function() FurC.PrintSource(itemLink, recipeArray) end,
+			MENU_ADD_OPTION_LABEL
+		)
+	else
+		if IsItemLinkFurnitureRecipe(itemLink) then
+			AddCustomMenuItem(GetString(SI_FURC_POST_ITEM),
+			function() FurC.ToChat(GetItemLinkRecipeResultItemLink(itemLink)) end,
+				MENU_ADD_OPTION_LABEL
+			)
+		elseif nil ~= recipeArray.blueprint then
+			AddCustomMenuItem(GetString(SI_FURC_POST_RECIPE),
+			function() FurC.ToChat(FurC.GetItemLink(recipeArray.blueprint)) end,
+				MENU_ADD_OPTION_LABEL
+			)
+		end
+		AddCustomMenuItem(GetString(SI_FURC_POST_MATERIAL),
+			function() FurC.ToChat(itemLink .. ": " .. FurC.GetMats(itemLink, recipeArray, true)) end,
+			MENU_ADD_OPTION_LABEL
+		)
+		AddFurnitureShoppingListMenuEntry(itemLink, true)
+	end
+	-- ShowMenu()
+
+end
+
+function FurC_HandleClickEvent(itemLink, button, control)		-- button being mouseButton here
+	if (type(itemLink) == 'string' and #itemLink > 0) then
+		local handled = LINK_HANDLER:FireCallbacks(LINK_HANDLER.LINK_MOUSE_UP_EVENT, itemLink, button, ZO_LinkHandler_ParseLink(itemLink))
+		if (not handled) then
+			FurC_LinkHandlerBackup_OnLinkMouseUp(itemLink, button, control)
+			if (button == 2 and itemLink ~= '') then
+				addMenuItems(itemLink, FurC.Find(itemLink))
+			end
+			ShowMenu(control)
+        end
+    end
+end
+
+
+function FurC_HandleMouseEnter(inventorySlot)
+	local inventorySlot = moc()
+
+	if nil == inventorySlot or nil == inventorySlot.dataEntry then return end
+	local data = inventorySlot.dataEntry.data
+	if nil == data then return end
+
+	local bagId, slotIndex = data.bagId, data.slotIndex
+	FurC.CurrentLink = GetItemLink(bagId, slotIndex)
+	if nil == FurC.CurrentLink then return end
+
+end
+
+
+-- thanks Randactyl for helping me with the handler :)
+function FurC_HandleInventoryContextMenu(control)
+
+	local st = ZO_InventorySlot_GetType(control)
+    local itemLink = nil
+    if st == SLOT_TYPE_ITEM
+	or st == SLOT_TYPE_BANK_ITEM
+	or st == SLOT_TYPE_GUILD_BANK_ITEM
+	or st == SLOT_TYPE_TRADING_HOUSE_POST_ITEM then
+        local bagId, slotId = ZO_Inventory_GetBagAndIndex(control)
+        itemLink = GetItemLink(bagId, slotId, linkStyle)
+    end
+    if st == SLOT_TYPE_TRADING_HOUSE_ITEM_RESULT then
+        itemLink = GetTradingHouseSearchResultItemLink(ZO_Inventory_GetSlotIndex(control), linkStyle)
+    end
+    if st == SLOT_TYPE_TRADING_HOUSE_ITEM_LISTING then
+        itemLink = GetTradingHouseListingItemLink(ZO_Inventory_GetSlotIndex(control), linkStyle)
+    end
+
+	local recipeArray = FurC.Find(itemLink)
+	-- d(recipeArray)
+	if nil == recipeArray then return end
+
+	zo_callLater(function()
+		addMenuItems(itemLink, recipeArray)
+		ShowMenu()
+	end, 50)
+
+
+end
+
+
+function FurC.OnControlMouseUp(control, button)
+
+	if nil == control then return end
+
+	if button ~= 2 then return end
+	local itemLink = control.itemLink
+
+	if nil == itemLink then return end
+	local recipeArray = FurC.Find(itemLink)
+	if nil == recipeArray then return end
+	zo_callLater(function()
+		ItemTooltip:SetHidden(true)
+		ClearMenu()
+		addMenuItems(itemLink, recipeArray)
+		ShowMenu()
+	end, 50)
+
+end
+
+function FurC.InitRightclickMenu()
+	FurC_LinkHandlerBackup_OnLinkMouseUp = ZO_LinkHandler_OnLinkMouseUp
+	ZO_LinkHandler_OnLinkMouseUp = function(itemLink, button, control) FurC_HandleClickEvent(itemLink, button, control) end
+	ZO_PreHook('ZO_InventorySlot_OnMouseEnter', FurC_HandleMouseEnter)
+	ZO_PreHook('ZO_InventorySlot_ShowContextMenu', function(rowControl)
+		FurC_HandleInventoryContextMenu(rowControl)
+	end)
+end
+
diff --git a/FurCControlBridge.lua b/FurCControlBridge.lua
new file mode 100644
index 0000000..8f9a7a0
--- /dev/null
+++ b/FurCControlBridge.lua
@@ -0,0 +1,258 @@
+local FurC 		= FurnitureCatalogue
+local control 	= FurnitureCatalogueControl
+FurC.Visible	= false
+
+local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
+
+local function p(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+	FurC.DebugOut(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+end
+
+
+function FurC.LoadFrameInfo(calledFrom)
+	local settings = FurC.settings.gui
+
+	FurCGui:ClearAnchors()
+	FurCGui:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, settings.lastX, settings.lastY)
+
+	FurCGui:SetWidth(settings.width)
+	FurCGui:SetHeight(settings.height)
+
+	zo_callLater(function() FurC.UpdateInventoryScroll() end, 100)
+
+end
+
+function FurC.SaveFrameInfo(calledFrom)
+	local settings = FurC.settings["gui"]
+
+	settings.lastX	= FurCGui:GetLeft()
+	settings.lastY	= FurCGui:GetTop()
+	settings.width	= FurCGui:GetWidth()
+	settings.height	= FurCGui:GetHeight()
+
+	FurC.UpdateInventoryScroll()
+
+end
+
+function FurC.OnResizeStop()
+
+	FurC.SaveFrameInfo()
+	FurC.UpdateLineVisibility()
+	FurC.UpdateInventoryScroll()
+
+end
+
+function FurC.ChangeTemplateFromButton(value)
+
+	local control = FurCGui_Header_Bar1_TemplateLarge
+	local otherControl = FurCGui_Header_Bar1_TemplateTiny
+
+	if value then
+		otherControl = FurCGui_Header_Bar1_TemplateLarge
+		control = FurCGui_Header_Bar1_TemplateTiny
+	end
+	control:SetHidden(true)
+	otherControl:SetHidden(false)
+
+	FurC.SetTinyUi(value)
+end
+
+function FurC.GUIButtonHideOnMouseUp()
+	FurCGui:SetHidden(true)
+end
+
+local function forceRefresh()
+	FurC.WipeDatabase()
+end
+
+function FurC.GUIButtonRefreshOnMouseUp(control, mouseButton)
+	if mouseButton == 1 then
+		FurC.ScanRecipes(false, true)
+	elseif mouseButton == 2 then
+		FurC.ScanRecipes(true, false)
+	elseif mouseButton == 3 then
+		if LAM and LAM.util then
+			LAM.util.ShowConfirmationDialog(
+				GetString(SI_FURC_DIALOGUE_RESET_DB_HEADER),
+				GetString(SI_FURC_DIALOGUE_RESET_DB_BODY),
+				forceRefresh
+			)
+		end
+	end
+end
+
+function FurC.GuiShowTooltip(control, tooltiptext, reAnchor)
+	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
+	InformationTooltip:SetHidden(false)
+	InformationTooltip:ClearLines()
+	InformationTooltip:AddLine(tooltiptext)
+
+	if reAnchor then
+		InformationTooltip:ClearAnchors()
+		InformationTooltip:SetAnchor(TOPRIGHT, control, TOPLEFT, -10)
+	end
+end
+function FurC.GuiHideTooltip(control)
+	InformationTooltip:ClearLines()
+	InformationTooltip:SetHidden(true)
+end
+
+function FurC.GuiOnSearchBoxClick(control, mouseButton, doubleClick)
+	FurC_SearchBoxText:SetText("")
+	if mouseButton == 2 or doubleClick then
+		control:SetText("")
+	end
+end
+
+local FURC_S_FILTERDEFAULT = GetString(SI_FURC_TEXTBOX_FILTER_DEFAULT)
+
+function FurC.GuiOnSearchBoxFocusOut(control)
+	if control:GetText() and control:GetText() ~= "" then
+        FurC.GuiOnSliderUpdate(FurCGui_ListHolder_Slider, 0)
+		FurC.UpdateGui()
+    end
+	FurC_SearchBoxText:SetText(FURC_S_FILTERDEFAULT)
+end
+
+function FurC.GuiOnScroll(control, delta)
+	if not delta then return end
+	if delta == 0 then return end
+
+	local slider = FurCGui_ListHolder_Slider
+--	slider.locked = true
+	-- negative delta means scrolling down
+
+	local value = (FurCGui_ListHolder.dataOffset - delta)
+	local total = #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines
+
+	if value < 0 then value = 0 end
+	if value > total then value = total end
+	FurCGui_ListHolder.dataOffset  = value
+
+	FurC.UpdateInventoryScroll()
+
+
+	slider:SetValue(FurCGui_ListHolder.dataOffset)
+
+	FurC.GuiLineOnMouseEnter(moc())
+end
+
+function FurC.GuiOnSliderUpdate(slider, value)
+	if not value or slider and slider.locked then return end
+	local relativeValue = math.floor(FurCGui_ListHolder.dataOffset - value)
+	FurC.GuiOnScroll(slider, relativeValue)
+end
+
+function FurC.GuiShowFilterTooltip(control, label)
+	label = control.tooltip or label
+	FurC.GuiShowTooltip(control, label)
+end
+local currentLink, currentId
+
+
+function FurC.GuiLineOnMouseEnter(lineControl)
+	currentLink, currentId = nil
+
+	if not lineControl or not lineControl.itemLink or lineControl.itemLink == "" then return end
+	currentLink = lineControl.itemLink
+	currentId = lineControl.itemId
+
+	if nil == currentLink then return end
+
+
+	InitializeTooltip(ItemTooltip, lineControl, LEFT, 0, 0, 0)
+	ItemTooltip:SetLink(currentLink)
+end
+function FurC.GuiLineOnMouseExit(lineControl)
+	ItemTooltip:SetHidden(true)
+end
+
+function FurC.Donate(control, mouseButton)
+
+	local amount = 2000
+	if mouseButton == 2 then
+		amount = 10000
+	elseif mouseButton == 3 then
+		amount = 25000
+	end
+
+	SCENE_MANAGER:Show('mailSend')
+	zo_callLater(function()
+	ZO_MailSendToField:SetText("@manavortex")
+	ZO_MailSendSubjectField:SetText("Thank you for Furniture Catalogue!")
+	QueueMoneyAttachment(amount)
+	ZO_MailSendBodyField:TakeFocus() end, 200)
+end
+
+function FurC.OnControlDoubleClick(control)
+	FurC.ToChat(control.itemLink)
+end
+
+
+function FurC.GuiVirtualMouseOver(control)
+	FurC.GuiShowTooltip(control, control.tooltip)
+end
+function FurC.GuiVirtualMouseOut(control)
+	FurC.GuiHideTooltip(control)
+end
+
+
+function FurC.GuiQualityMouseUp(control, button)
+if button == 2 then FurC.SetFilterQuality(0) end
+	FurC.SetFilterQuality(control.quality)
+end
+function FurC.GuiCraftingTypeMouseUp(control)
+	FurC.SetFilterCraftingType(control.craftingType)
+end
+
+
+local sortBy		= nil
+local sortDirection = "down"
+
+local function getButtonTex(key)
+	if key ~= sortBy then
+		return "esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
+	end
+	return "esoui/art/miscellaneous/list_sortheader_icon_sort" .. sortDirection .. ".dds"
+end
+
+function FurC.GetSortParams()
+	return sortBy, sortDirection
+end
+
+function FurC.GuiOnSort(key)
+
+	-- set icon texture
+	if sortBy and sortBy == key then
+		sortDirection = ((sortDirection == "up" and "down") or "up")
+	else
+		sortBy = key
+		sortDirection = "up"
+	end
+
+	FurCGui_Header_SortBar_Name_Button:SetNormalTexture(getButtonTex("itemName"))
+	FurCGui_Header_SortBar_Quality_Button:SetNormalTexture(getButtonTex("itemQuality"))
+
+	FurC.UpdateGui()
+end
+
+
+function FurC.UpdateDropdownChoice(dropdownName, value)
+	if nil == dropdownName then
+		FurC.UpdateDropdownChoice("Version", value)
+		FurC.UpdateDropdownChoice("Character", value)
+		FurC.UpdateDropdownChoice("Source", value)
+		return
+	end
+	InformationTooltip:SetHidden(true)
+	value = value or FurC.GetDropdownChoiceTextual(dropdownName)
+
+	local controlName 	= "FurC_Dropdown"..dropdownName
+	local control 		= _G[controlName]
+	if nil == control then return end
+	control:GetNamedChild("SelectedItemText"):SetText(value)
+end
+
+function FurC.RefreshCounter()
+	FurC_RecipeCount:SetText(#FurCGui_ListHolder.dataLines)
+end
\ No newline at end of file
diff --git a/FurCData.lua b/FurCData.lua
new file mode 100644
index 0000000..ed203f2
--- /dev/null
+++ b/FurCData.lua
@@ -0,0 +1,527 @@
+local currentChar				= FurnitureCatalogue.CharacterName
+local task 						= LibStub("LibAsync"):Create("FurnitureCatalogue_ScanDataFiles")
+local task2 					= LibStub("LibAsync"):Create("FurnitureCatalogue_ScanCharacterKnowledge")
+local characterAlliance 		= GetUnitAlliance('player')
+
+local NUMBER_TYPE 				= "number"
+local STRING_TYPE 				= "string"
+local STRING_EMPTY 				= ""
+
+local lastLink 					= nil
+local recipeArray 				= nil
+
+local FURC_STRING_TRADINGHOUSE = "Seen in trading house"
+
+local function getCurrentChar()
+	if nil == currentChar then currentChar = zo_strformat(GetUnitName("player")) end
+	return currentChar
+end
+
+local p = FurC.DebugOut
+
+local function startupMessage(text)
+	if FurC.GetStartupSilently() then return end
+	d(text)
+end
+
+local function getItemId(itemLink)
+	if nil == itemLink or STRING_EMPTY == itemLink then return end
+	if type(itemLink) == NUMBER_TYPE and itemLink > 9999 then return itemLink end
+	local _, _, _, itemId = ZO_LinkHandler_ParseLink(itemLink)
+	return tonumber(itemId)
+end
+FurC.GetItemId = getItemId
+
+local function getItemLink(itemId)
+    if nil == itemId then return end
+	itemId = tostring(itemId)
+	if #itemId > 55 then return itemId end
+	if #itemId < 4 then return end
+	return zo_strformat("|H1:item:<<1>>:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0|h|h", itemId)
+end
+FurC.GetItemLink = getItemLink
+
+local function trySaveDevDebug(recipeArray)
+	if not (FurC.AccountName == "@manavortex" or FurC.AccountName == "@Manorin") then return end
+	if recipeArray.origin ~= FURC_DROP then return end
+	itemLink = (nil ~= recipeArray.blueprintLink and recipeArray.blueprintLink) or recipeArray.itemId
+	FurnitureCatalogue.devSettings[itemLink] = "true, -- " .. GetItemLinkName(itemLink)
+end
+
+local function addDatabaseEntry(recipeKey, recipeArray)
+	if recipeKey and recipeArray and {} ~= recipeArray then
+		FurC.settings.data[recipeKey] = recipeArray
+	end
+end
+
+
+local function makeMaterial(recipeKey, recipeArray, tryPlaintext, forcePlaintext)
+
+	if nil == recipeArray or (nil == recipeArray.blueprint and nil == recipeArray.recipeIndex and nil == recipeArray.recipeListIndex) then
+		return "couldn't get material list, please re-scan character knowledge"
+	end
+	local ret = ""
+	local ingredients = FurC.GetIngredients(recipeKey, recipeArray)
+	forcePlaintext = forcePlaintext or tryPlaintext and NonContiguousCount(ingredients) > 4
+	for ingredientLink, qty in pairs(ingredients) do
+		-- auto-capitalize because for some reason the ZOS API doesn't
+		local itemText = (forcePlaintext and string.gsub(" "..GetItemLinkName(ingredientLink), "%W%l", string.upper):sub(2)) or ingredientLink
+		 ret = zo_strformat("<<1>> <<2>>x <<3>>, ", ret, qty, itemText)
+	end
+	return ret:sub(0, -3)
+
+end
+FurC.GetMats = makeMaterial
+
+function FurC.GetIngredients(itemLink, recipeArray)
+	recipeArray = recipeArray or FurC.Find(itemLink)
+	local ingredients = {}
+	if recipeArray.blueprint then
+		local blueprintLink = FurC.GetItemLink(recipeArray.blueprint)
+		numIngredients = GetItemLinkRecipeNumIngredients(blueprintLink)
+		for ingredientIndex=1, numIngredients do
+			name, _, qty 				= GetItemLinkRecipeIngredientInfo(blueprintLink, ingredientIndex)
+			ingredientLink 				= GetItemLinkRecipeIngredientItemLink(blueprintLink, ingredientIndex)
+			ingredients[ingredientLink]	= qty
+		end
+	else
+		_, name, numIngredients = GetRecipeInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex)
+		for ingredientIndex=1, numIngredients do
+			name, _, qty 					= GetRecipeIngredientItemInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex, ingredientIndex)
+			ingredientLink 					= GetRecipeIngredientItemLink(recipeArray.recipeListIndex, recipeArray.recipeIndex, ingredientIndex)
+			ingredients[ingredientLink]		= qty
+		end
+	end
+	return ingredients
+end
+
+local function parseFurnitureItem(itemLink, override)					-- saves to DB, returns recipeArray
+
+	if not (
+	override or IsItemLinkPlaceableFurniture(itemLink)
+	or  GetItemLinkItemType(itemLink) == ITEMTYPE_FURNITURE
+	) then return end
+
+	local recipeKey 					= getItemId(itemLink)
+	local recipeArray 					= FurC.settings.data[recipeKey]
+	if nil ~= recipeArray then return recipeArray end
+
+	recipeArray = {}
+
+	addDatabaseEntry(recipeKey, recipeArray)
+
+	return recipeArray
+end
+
+local function parseBlueprint(blueprintLink)				-- saves to DB, returns recipeArray
+
+	local itemLink 		= GetItemLinkRecipeResultItemLink(blueprintLink, LINK_STYLE_BRACKETS)
+	local blueprintId 	= getItemId(blueprintLink)
+	local recipeKey 	= getItemId(itemLink)
+	if nil == recipeKey or -- we don't have a key to access the database
+		nil == itemLink or -- we don't have an item link to parse
+		nil == GetItemLinkName(itemLink) -- we didn't find an item result for our recipe
+	then return end
+
+	local recipeArray 			= FurC.settings.data[recipeKey] or {}
+	recipeArray.origin			= recipeArray.origin			or FURC_CRAFTING
+	recipeArray.characters		= recipeArray.characters		or {}
+	recipeArray.craftingSkill	= recipeArray.craftingSkill		or GetItemLinkCraftingSkillType(blueprintLink)
+	recipeArray.blueprint 		= recipeArray.blueprint 		or getItemId(blueprintLink)
+
+
+	if (IsItemLinkRecipeKnown(blueprintLink)) then
+		recipeArray.characters[getCurrentChar()] 	= true
+	end
+	addDatabaseEntry(recipeKey, recipeArray)
+	return recipeArray
+
+end
+
+
+function FurC.Find(itemOrBlueprintLink)						-- sets recipeArray, returns it - calls scanItemLink
+
+
+	if tonumber(itemOrBlueprintLink) == itemOrBlueprintLink then itemOrBlueprintLink = FurC.GetItemLink(itemOrBlueprintLink) end
+	if nil == itemOrBlueprintLink or #itemOrBlueprintLink == 0 then return end
+	p("scanItemLink(<<1>>)...", itemOrBlueprintLink)		-- do not return empty arrays. If this returns nil, abort!
+
+	if itemOrBlueprintLink == lastLink and nil ~= recipeArray then
+		return recipeArray
+	else
+		recipeArray = nil
+		lastLink = itemOrBlueprintLink
+	end
+
+	if IsItemLinkFurnitureRecipe(itemOrBlueprintLink) then
+		recipeArray = parseBlueprint(itemOrBlueprintLink)
+	elseif IsItemLinkPlaceableFurniture(itemOrBlueprintLink) then
+		recipeArray = parseFurnitureItem(itemOrBlueprintLink)
+	end
+
+	return recipeArray
+end
+
+function FurC.Delete(itemOrBlueprintLink)						-- sets recipeArray, returns it - calls scanItemLink
+	local recipeArray = scanItemLink(itemOrBlueprintLink)
+	if nil == recipeArray then return end
+	local itemLink = recipeArray.itemId
+	local itemKey = getItemId(itemLink)
+	FurC.settings.data[itemKey] = nil
+end
+
+function FurC.GetEntry(itemOrBlueprintLink)
+	local itemLink =  (IsItemLinkFurnitureRecipe(itemOrBlueprintLink) and GetRecipeResultItemLink(itemOrBlueprintLink)) or itemOrBlueprintLink
+	local recipeArray = FurC.Find(itemLink)
+	d(string.format("Trying to get entry for %s: %s", itemLink, recipeArray))
+	if not recipeArray then return end
+	local itemId = getItemId(itemOrBlueprintLink)
+	if recipeArray.blueprint then
+		itemId = getItemId(GetItemLinkRecipeResultItemLink(blueprintLink))
+	end
+	return itemId, recipeArray
+
+end
+
+function FurC.IsFavorite(itemLink, recipeArray)
+	recipeArray = recipeArray or FurC.Find(itemLink)
+	return recipeArray.favorite
+end
+function FurC.Fave(itemLink, recipeArray)
+	recipeArray = recipeArray or FurC.Find(itemLink)
+	recipeArray.favorite = not recipeArray.favorite
+	if not recipeArray.favorite then
+		recipeArray.favorite = nil
+	end
+
+	FurC.UpdateGui()
+end
+
+local function scanRecipeIndices(recipeListIndex, recipeIndex)		-- returns recipeArray or nil, initialises
+
+	local itemLink = GetRecipeResultItemLink(recipeListIndex, recipeIndex, LINK_STYLE_BRACKETS)
+	if nil == itemLink or #itemLink == 0 or not IsItemLinkPlaceableFurniture(itemLink) then return end
+
+	local recipeKey = getItemId(itemLink)
+
+	local recipeArray 			= FurC.settings.data[recipeKey] or {}
+	recipeArray.origin 			= FURC_CRAFTING
+	recipeArray.version			= recipeArray.version or 2
+	recipeArray.recipeListIndex = recipeArray.recipeListIndex or recipeListIndex
+	recipeArray.recipeIndex 	= recipeArray.recipeIndex or recipeIndex
+
+	recipeArray.characters		= recipeArray.characters or {}
+
+
+
+	if GetRecipeInfo(recipeListIndex, recipeIndex) then
+		recipeArray.characters[getCurrentChar()] 	= true
+		FurC.settings.accountCharacters = FurC.settings.accountCharacters or {}
+		FurC.settings.accountCharacters[getCurrentChar()] = FurC.settings.accountCharacters[getCurrentChar()] or true
+	end
+
+
+	addDatabaseEntry(recipeKey, recipeArray)
+	return recipeArray
+
+end
+
+function FurC.TryCreateRecipeEntry(recipeListIndex, recipeIndex)	-- returns scanRecipeIndices, called from Events.lua
+	return scanRecipeIndices(recipeListIndex, recipeIndex)
+end
+
+function FurC.IsAccountKnown(recipeKey, recipeArray)
+	if recipeKey == nil and recipeArray == nil then return false end
+	recipeArray = recipeArray or FurC.settings.data[recipeKey]
+	return not (nil == recipeArray or nil == recipeArray.characters or NonContiguousCount(recipeArray.characters) == 0)
+end
+
+function FurC.CanCraft(recipeKey, recipeArray)
+	if recipeKey == nil  and recipeArray == nil then return false end
+	recipeArray = recipeArray or FurC.settings.data[recipeKey]
+	if FurC.IsAccountKnown(recipeKey, recipeArray) then
+		return recipeArray.characters[getCurrentChar()]
+	end
+	return false
+end
+
+function FurC.GetCraftingSkillType(recipeKey, recipeArray)
+
+	local itemLink 			= FurC.GetItemLink(recipeKey)
+	local craftingSkillType	= GetItemLinkCraftingSkillType(itemLink)
+
+	if 0 == craftingSkillType and recipeArray.blueprint then
+		craftingSkillType = GetItemLinkRecipeCraftingSkillType(FurC.GetItemLink(recipeArray.blueprint))
+	elseif 0 == craftingSkillType and recipeArray.recipeListIndex and recipeArray.recipeIndex then
+		_, _, _, _, _, _, craftingSkillType = GetRecipeInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex)
+	end
+
+	return craftingSkillType
+end
+
+
+local function scanCharacter()
+	local listName, numRecipes
+	for recipeListIndex=1, GetNumRecipeLists() do
+		listName, numRecipes = GetRecipeListInfo(recipeListIndex)
+		for recipeIndex=1, numRecipes do
+			scanRecipeIndices(recipeListIndex, recipeIndex) --	returns true on success
+		end
+	end
+	p((GetString(SI_FURC_DEBUG_CHARSCANCOMPLETE)))
+end
+FurC.ScanCharacter = scanCharacter
+
+function FurC.RescanRumourRecipes()
+
+	local function rescan()
+		for itemId, recipeArray in pairs(FurC.settings.data) do
+			if recipeArray.source == FURC_RUMOUR then
+				local itemLink = recipeArray[itemLink]
+				if not FurC.RumourRecipes[itemLink] then
+					recipeArray.source = FURC_CRAFTING
+					recipeArray.origin = nil
+				end
+			end
+		end
+	end
+
+	task:Call(rescan)
+	:Then(FurC.UpdateGui)
+end
+
+local recipeArray
+local function scanFromFiles(shouldScanCharacter)
+	local function parseZoneData(zoneName, zoneData, versionNumber, origin)
+		for vendorName, vendorData in pairs(zoneData) do
+			for itemId, itemData in pairs(vendorData) do
+
+				recipeArray = parseFurnitureItem(FurC.GetItemLink(itemId), true)
+				if not recipeArray then
+						p("Error when scanning <<1>>", itemId)
+					else
+
+					recipeArray.origin			= origin
+					recipeArray.version			= versionNumber
+					addDatabaseEntry(itemId, recipeArray)
+				end
+
+			end
+		end
+	end
+
+	local function scanRecipeFile()
+		local recipeKey, recipeArray
+		local function scanArray(ary, versionNumber, origin)
+			if nil == ary then return end
+
+			for key, recipeId in ipairs(ary) do
+				local recipeLink = FurC.GetItemLink(recipeId)
+				local itemLink = GetItemLinkRecipeResultItemLink(recipeLink) or FurC.GetItemLink(recipeId)
+				recipeArray = FurC.Find(itemLink) or parseBlueprint(recipeLink) or parseFurnitureItem(itemLink)
+				local recipeListIndex, recipeIndex = GetItemLinkGrantedRecipeIndices(recipeLink)
+				if nil == recipeArray then
+					p("scanRecipeFile: error for <<1>> (ID was <<2>>)", recipeLink, recipeId)
+				else
+					recipeKey 					= getItemId(itemLink)
+					recipeArray.version 	 	= versionNumber
+					recipeArray.origin 			= origin
+					recipeArray.blueprint		= recipeId
+					addDatabaseEntry(recipeKey, recipeArray)
+				end
+			end
+		end
+
+		for versionNumber, versionData in pairs(FurC.Recipes) do
+			scanArray(versionData, versionNumber, FURC_CRAFTING)
+		end
+		for versionNumber, versionData in pairs(FurC.RollisRecipes) do
+			scanArray(versionData, versionNumber, FURC_CRAFTING)
+		end
+		for versionNumber, versionData in pairs(FurC.FaustinaRecipes) do
+			scanArray(versionData, versionNumber, FURC_CRAFTING)
+		end
+	end
+
+	local function scanRollis()
+		for versionNumber, versionData in pairs(FurC.Rollis) do
+			for itemId, itemSource in pairs(versionData) do
+				recipeArray = parseFurnitureItem(FurC.GetItemLink(recipeId), true)
+				if nil ~= recipeArray then
+					recipeArray.version = versionNumber
+					recipeArray.origin = FURC_ROLLIS
+					addDatabaseEntry(itemId, recipeArray)
+				end
+			end
+		end
+		for versionNumber, versionData in pairs(FurC.Faustina) do
+			for itemId, itemSource in pairs(versionData) do
+				recipeArray = parseFurnitureItem(FurC.GetItemLink(recipeId), true)
+				if nil ~= recipeArray then
+					recipeArray.version = versionNumber
+					recipeArray.origin = FURC_ROLLIS
+					addDatabaseEntry(itemId, recipeArray)
+				end
+			end
+		end
+	end
+
+	local function scanFestivalFiles()
+		for versionNumber, versionData in pairs(FurC.EventItems) do
+			for eventName, eventData in pairs(versionData) do
+				for eventItemSource, eventItemData in pairs(eventData) do
+					for itemId, _ in pairs(eventItemData) do
+						recipeArray             = {}
+						recipeArray.craftable 	= false
+						recipeArray.version 	= versionNumber
+						recipeArray.origin 		= FURC_FESTIVAL_DROP
+						addDatabaseEntry(itemId, recipeArray)
+					end
+				end
+			end
+		end
+	end
+
+	local function scanMiscItemFile()
+		for versionNumber, versionData in pairs(FurC.MiscItemSources) do
+			for origin, originData in pairs(versionData) do
+				for itemId, itemSource in pairs(originData) do
+					local itemLink = FurC.GetItemLink(itemId)
+					recipeArray = parseFurnitureItem(FurC.GetItemLink(itemId))
+					if nil ~= recipeArray then
+						recipeArray.version = versionNumber
+						recipeArray.origin  = origin
+						addDatabaseEntry(itemId, recipeArray)
+					else
+						p("scanMiscItemFile: Error when scanning <<1>> (<<2>>) -> <<3>>", itemLink, itemId, origin)
+					end
+				end
+			end
+		end
+	end
+
+	local function scanVendorFiles()
+
+		FurC.InitAchievementVendorList()
+		local recipeKey, recipeArray, itemSource
+
+		for versionNumber, versionData in pairs(FurC.AchievementVendors) do
+			for zoneName, zoneData in pairs(versionData) do
+				parseZoneData(zoneName, zoneData, versionNumber, FURC_VENDOR)
+			end
+		end
+
+		for versionNumber, vendorData in pairs(FurC.LuxuryFurnisher) do
+			for itemId, itemData in pairs(vendorData) do
+					 local recipeArray 			= {}
+
+					recipeArray.origin			= FURC_LUXURY
+					recipeArray.version			= versionNumber
+					addDatabaseEntry(itemId, recipeArray)
+			end
+		end
+
+		for versionNumber, versionData in pairs(FurC.PVP) do
+			for zoneName, zoneData in pairs(versionData) do
+				parseZoneData(zoneName, zoneData, versionNumber, FURC_PVP)
+			end
+		end
+	end
+
+	local function scanRumourRecipes()
+		for index, blueprintId in pairs(FurC.RumourRecipes) do
+			local blueprintLink = FurC.GetItemLink(blueprintId)
+			local itemLink = GetItemLinkRecipeResultItemLink(blueprintLink, LINK_STYLE_BRACKETS)
+			if #itemLink == 0 then itemLink = blueprintLink end
+			local itemId = getItemId(itemLink)
+			recipeArray = parseBlueprint(blueprintLink) or parseFurnitureItem(itemLink) or {}
+			if blueprintId ~= itemId then
+				recipeArray.blueprint = blueprintId
+			end
+			recipeArray.recipeListIndex, recipeArray.recipeIndex =  GetItemLinkGrantedRecipeIndices(blueprintLink)
+			recipeArray.origin = FURC_RUMOUR
+			recipeArray.verion = FURC_HOMESTEAD
+			addDatabaseEntry(itemId, recipeArray)
+		end
+	end
+	FurC.IsLoading(true)
+
+	task:Call(scanRollis)
+	:Then(scanRecipeFile)
+	:Then(scanVendorFiles)
+	:Then(scanRollis)
+	:Then(scanFestivalFiles)
+	:Then(scanMiscItemFile)
+	:Then(scanRumourRecipes)
+	:Then(
+	function()
+		if shouldScanCharacter then
+			scanCharacter()
+		else
+			startupMessage(GetString(SI_FURC_VERBOSE_STARTUP))
+		end
+	end)
+	:Then(FurC.UpdateGui)
+	startupMessage(GetString(SI_FURC_VERBOSE_DB_UPTODATE))
+
+end
+
+function FurC.ScanFromFiles(scanCharacterKnowledge)
+	return scanFromFiles(scanCharacterKnowledge)
+end
+
+local function getScanFromFiles()
+
+	if (FurC.settings.version < FurC.version) then
+		FurC.settings.version = FurC.version
+		return true
+	end
+
+	return FurC.settings.data == {}
+end
+
+local function getScanCharacter()
+	if nil == FurC.settings.accountCharacters[FurC.CharacterName] then
+		FurC.settings.accountCharacters[FurC.CharacterName] = false
+		return true
+	end
+end
+
+function FurC.ScanRecipes(shouldScanFiles, shouldScanCharacter)								-- returns database
+
+	shouldScanFiles = shouldScanFiles or getScanFromFiles()
+	shouldScanCharacter = (shouldScanCharacter or getScanCharacter())
+	if (shouldScanFiles) then
+		p(GetString(SI_FURC_VERBOSE_SCANNING_DATA_FILE))
+		scanFromFiles(shouldScanCharacter)
+	elseif (shouldScanCharacter) then
+		p(GetString(SI_FURC_VERBOSE_SCANNING_CHARS))
+		scanCharacter()
+	end
+end
+
+function FurC.GetItemDescription(recipeKey, recipeArray, stripColor)
+	recipeArray = recipeArray or FurC.Find(recipeKey, recipeArray)
+	if not recipeArray then return "" end
+	local origin = recipeArray.origin
+	if origin == FURC_CRAFTING or origin == FURC_WRIT_VENDOR then
+		return FurC.GetMats(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_ROLLIS then
+		return FurC.getRollisSource(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_LUXURY then
+		return FurC.getLuxurySource(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_GUILDSTORE then
+		return FURC_STRING_TRADINGHOUSE
+	elseif origin == FURC_VENDOR then
+		return FurC.getAchievementVendorSource(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_FESTIVAL_DROP then
+		return FurC.getEventDropSource(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_PVP then
+		return FurC.getPvpSource(recipeKey, recipeArray, stripColor)
+	elseif origin == FURC_RUMOUR then
+		return FurC.getRumourSource(recipeKey, recipeArray, stripColor)
+	else
+		itemSource = FurC.GetMiscItemSource(recipeKey, recipeArray, stripColor)
+	end
+	return itemSource or GetString(SI_FURC_ITEMSOURCE_EMPTY)
+end
\ No newline at end of file
diff --git a/FurCDataParser.lua b/FurCDataParser.lua
new file mode 100644
index 0000000..37a60de
--- /dev/null
+++ b/FurCDataParser.lua
@@ -0,0 +1,81 @@
+local db		= FurnitureCatalogue.settings["data"]
+
+local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+
+function FurC.PrintCraftingStation(itemId, recipeArray)
+	local craftingType = FurC.GetCraftingSkillType(itemId, recipeArray)
+	if not craftingType or not GetCraftingSkillName(craftingType) then return "" end
+	return string.format(" (%s)", GetCraftingSkillName(craftingType))
+end
+
+local function prefillChatBox(output, refresh)
+
+	output = zo_strformat(output)
+	if nil == output or FURC_EMPTY_STRING == output then return end
+	local editControl = CHAT_SYSTEM.textEntry.editControl
+
+	if not refresh then
+		output = editControl:GetText() .. output
+	elseif CHAT_SYSTEM.textEntry.editControl:HasFocus() then
+		editControl:Clear()
+	end
+
+	-- trying to get rid of that double click error...
+	if IsProtectedFunction("StartChatInput") then
+		CallSecureProtected("StartChatInput", output)
+	else
+		StartChatInput(output)
+	end
+end
+
+function FurC.ToChat(output, refresh)
+	if type(output) == "number" then
+		output = FurC.GetItemLink(output)
+	end
+	prefillChatBox(output, refresh)
+end
+
+local function stripColor(aString)
+	if nil == aString then return "" end
+	return aString:gsub("|%l%l%d%d%d%d%d", ""):gsub("|%l%l%d%l%l%d%d", ""):gsub("|c25C31E", ""):gsub("|r", "")
+end
+
+local function getNameFromEntry(recipeArray)
+	if nil == recipeArray then return "" end
+	if nil == recipeArray.itemName and nil ~= recipeArray.itemId then
+		recipeArray.itemName = GetItemLinkName(recipeArray.itemId)
+	end
+	return recipeArray.itemName or ""
+end
+
+function FurC.PrintSource(itemLink, recipeArray)
+	if nil == recipeArray then recipeArray = FurC.Find(itemLink) end
+	if nil == recipeArray then return end
+
+	local source = FurC.GetItemDescription(FurC.GetItemId(itemLink), recipeArray, true)
+	local output = string.format("%s: %s", itemLink, source)
+	if recipeArray.achievement and recipeArray.achievement ~= "" then
+		output = string.format("%s, requires %s", output, recipeArray.achievement)
+	end
+
+	FurC.ToChat(output, true)
+end
+
+function FurC.FindByName(namePart)
+	local ret = {}
+	local itemName = ""
+	-- d(zo_strformat("Looking for <<1>>... \n", namePart))
+	for itemId, recipeArray in pairs(FurC.settings["data"]) do
+		-- d(zo_strformat("<<1>>: <<2>> (<<3>>)", recipeArray.itemId, getNameFromEntry(recipeArray), string.match(string.lower(getNameFromEntry(recipeArray)), string.lower(namePart))))
+		if nil ~= string.match(string.lower(getNameFromEntry(recipeArray)), string.lower(namePart)) then
+			table.insert(ret, recipeArray)
+		end
+	end
+	return ret
+end
+
+local function capitalise(str)
+	str = str:gsub("^(%l)(%w*)", function(a,b) return string.upper(a)..b end)
+	return str
+end
\ No newline at end of file
diff --git a/FurCDatabaseQuery.lua b/FurCDatabaseQuery.lua
new file mode 100644
index 0000000..7a5c1e3
--- /dev/null
+++ b/FurCDatabaseQuery.lua
@@ -0,0 +1,194 @@
+local FurC = FurC
+
+local vendorColor 	= "d68957"
+local goldColor 	= "e5da40"
+local apColor 		= "25C31E"
+local tvColor		= "5EA4FF"
+local voucherColor	= "82BCFF"
+local p 			= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+local function colorise(str, col, ret)
+	str = tostring(str)
+	if str:find("%d000$") then str = str:gsub("000$", "k") end
+	if ret then return str end
+	return string.format("|c%s%s|r", col, str)
+end
+
+local function getRollisSource(recipeKey, recipeArray)
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+	if not recipeArray then return end
+
+	local versionData = FurC.Rollis[recipeArray.version]
+
+	if nil ~= versionData and nil ~= versionData[recipeKey] then
+		local itemPrice = zo_strformat(GetString(SI_FURC_STRING_FOR_VOUCHERS), colorise(versionData[recipeKey], voucherColor))
+		return zo_strformat(GetString(SI_FURC_STRING_ROLLIS), itemPrice)
+	end
+
+	versionData = FurC.Faustina[recipeArray.version]
+	if nil ~= versionData and nil ~= versionData[recipeKey] then
+		local itemPrice = zo_strformat(GetString(SI_FURC_STRING_FOR_VOUCHERS), colorise(versionData[recipeKey], voucherColor))
+		return zo_strformat(GetString(SI_FURC_STRING_FAUSTINA), itemPrice)
+	end
+
+	return GetString(SI_FURC_STRING_VOUCHER_VENDOR)
+end
+FurC.getRollisSource = getRollisSource
+
+
+local function getLuxurySource(recipeKey, recipeArray, stripColor)
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+	if not recipeArray then return end
+	local versionData = FurC.LuxuryFurnisher[recipeArray.version]
+	if not versionData then return GetString(SI_FURC_STRING_FETCHER) end
+
+	local itemData = versionData[recipeKey]
+
+	if nil ~= itemData then
+		local weekendString = (nil == itemData.itemDate and "") or zo_strformat(GetString(SI_FURC_STRING_WEEKEND_AROUND), itemData.itemDate)
+		return zo_strformat(
+			GetString(SI_FURC_STRING_WASSOLDBY),
+			colorise(GetString(SI_FURC_STRING_ASSHOLE), vendorColor, stripColor),
+			colorise(GetString(SI_FURC_STRING_HC), vendorColor, stripColor),
+			colorise(itemData.itemPrice, goldColor, stripColor),
+			weekendString
+		)
+	end
+	return GetString(SI_FURC_STRING_FETCHER)
+end
+FurC.getLuxurySource = getLuxurySource
+
+local function getPvpSource(recipeKey, recipeArray, stripColor)
+
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+	if not recipeArray then return end
+	local versionData = FurC.PVP[recipeArray.version]
+	if not versionData then return "getPvpSource: nil" end
+
+	for vendorName, vendorData in pairs(versionData) do
+		for locationName, locationData in pairs(vendorData) do
+			if nil ~= locationData[recipeKey] then
+				return zo_strformat(
+					GetString(SI_FURC_STRING_VENDOR),
+					colorise(vendorName, 	vendorColor, stripColor),
+					colorise(locationName, 	vendorColor, stripColor),
+					colorise(locationData[recipeKey].itemPrice, 	apColor, stripColor),
+					GetString(SI_FURC_STRING_AP)
+				)
+			end
+		end
+	end
+
+	return "getPvpSource"
+
+end
+FurC.getPvpSource = getPvpSource
+
+local function getAchievementVendorSource(recipeKey, recipeArray, stripColor)
+
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+	if not recipeArray then return end
+	local versionData = FurC.AchievementVendors[recipeArray.version]
+	if not versionData then
+		return zo_strformat("getAchievementVendorSource: failed version lookup for ID <<1>> [<<2>>]", recipeKey, recipeArray.version)
+	end
+
+	local databaseEntry
+
+	for zoneName, zoneData in pairs(versionData) do
+		for vendorName, vendorData in pairs(zoneData) do
+			databaseEntry = vendorData[recipeKey]
+			if nil ~= databaseEntry then
+				return zo_strformat(
+					GetString(SI_FURC_STRING_VENDOR),
+					colorise(vendorName, 				vendorColor, stripColor),
+					colorise(zoneName, 					vendorColor, stripColor),
+					colorise(databaseEntry.itemPrice, 	goldColor, 	 stripColor),
+					""
+				)
+			end
+		end
+	end
+	return zo_strformat("getAchievementVendorSource, found version data but no item data for <<1>> ", recipeKey)
+end
+FurC.getAchievementVendorSource = getAchievementVendorSource
+
+local function getEventDropSource(recipeKey, recipeArray, stripColor)
+
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+	if not recipeArray then return end
+	local versionData = FurC.EventItems[recipeArray.version]
+	local itemPriceString = "getEventDropSource: couldn't find " .. tostring(recipeKey)
+	if not versionData then
+		return itemPriceString
+	end
+	for versionNumber, versionData in pairs(FurC.EventItems) do
+			for eventName, eventData in pairs(versionData) do
+				for eventItemSource, eventSourceData in pairs(eventData) do
+					if eventSourceData[recipeKey] then
+						itemPriceString = zo_strformat(
+							GetString(SI_FURC_FESTIVAL_DROP),
+							colorise(eventName, 			vendorColor, stripColor),
+							colorise(eventItemSource, 		vendorColor, stripColor)
+						)
+						local additionalsource = tostring(eventSourceData[recipeKey]) or ""
+						if #additionalsource > 4 then
+							itemPriceString = itemPriceString .. "\n" .. additionalsource
+						end
+						return itemPriceString
+					end
+				end
+			end
+		end
+
+	return itemPriceString
+end
+FurC.getEventDropSource = getEventDropSource
+
+function FurC.GetMiscItemSource(recipeKey, recipeArray)
+	if not recipeArray or not recipeArray.version or not recipeArray.origin then return end
+
+	if recipeArray.origin == FURC_RUMOUR then
+		return FurC.getRumourSource(recipeKey, recipeArray)
+	end
+
+	local versionFiles = FurC.MiscItemSources[recipeArray.version]
+	if not versionFiles then return end
+	local originData = versionFiles[recipeArray.origin]
+	if nil == originData then return end
+	return originData[recipeKey]
+end
+
+local function getRecipeSource(recipeKey, recipeArray)
+	if nil == recipeKey and nil == recipeArray then return end
+	if nil == FurC.RecipeSources then return end
+	recipeArray = recipeArray or FurC.Find(recipeKey)
+
+	recipeKey = recipeArray.blueprint or recipeKey
+
+	return (recipeArray.origin == FURC_RUMOUR and FurC.getRumourSource(recipeKey, recipeArray)) or FurC.RecipeSources[recipeKey]
+end
+FurC.getRecipeSource = getRecipeSource
+
+function FurC.getRumourSource(recipeKey, recipeArray)
+	return (recipeArray.blueprint and GetString(SI_FURC_RUMOUR_SOURCE_RECIPE)) or GetString(SI_FURC_RUMOUR_SOURCE_ITEM)
+end
+
+function FurC.GetCrafterList(itemLink, recipeArray)
+	if nil == recipeArray and nil == itemLink then return end
+	recipeArray = recipeArray or FurC.Find(itemLink)
+	if nil == recipeArray then
+		d("")
+		d(recipeArray)
+		zo_strformat("FurC.GetCrafterList called for a non-craftable")
+	end
+
+	if nil == recipeArray.characters or NonContiguousCount(recipeArray.characters) == 0 then
+		return GetString(SI_FURC_STRING_CANNOT_CRAFT)
+	end
+	local ret = GetString(SI_FURC_STRING_CRAFTABLE_BY)
+	for characterName, characterKnowledge in pairs(recipeArray.characters) do
+		ret = string.format("%s %s, ", ret, characterName)
+	end
+	return ret:sub(0, -3)
+end
diff --git a/FurCEvents.lua b/FurCEvents.lua
new file mode 100644
index 0000000..7dcc543
--- /dev/null
+++ b/FurCEvents.lua
@@ -0,0 +1,85 @@
+local em	= EVENT_MANAGER
+local p 	= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+local function onRecipeLearned(eventCode, recipeListIndex, recipeIndex)
+	p(FURC_STRING_RECIPELEARNED, GetRecipeResultItemLink(recipeListIndex, recipeIndex, LINK_STYLE_BRACKETS), recipeListIndex, recipeIndex)
+	FurC.TryCreateRecipeEntry(recipeListIndex, recipeIndex)
+	FurC.UpdateGui()
+end
+
+local wm = WINDOW_MANAGER
+
+local function createIcon(control)
+	local icon = wm:CreateControlFromVirtual(control:GetName().."FurCIcon", control, "FurC_SlotIconKnownYes")
+	icon:SetAnchor(BOTTOMLEFT, control:GetNamedChild("Button"), BOTTOMLEFT, -15, -10)
+	icon:SetHidden(true)
+	control.icon = icon
+	return icon
+end
+
+local function getItemKnowledge(itemLink)
+	local recipeArray = FurC.Find(itemLink)
+	if FurC.GetUseInventoryIconsOnChar() then
+		return FurC.CanCraft(itemId, recipeArray)
+	end
+	return FurC.IsAccountKnown(itemId, recipeArray)
+
+end
+
+local function updateItemInInventory(control)
+	if 'listSlot' ~= control.slotControlType then return end
+	local icon = control.icon or createIcon(control)
+	local data = control.dataEntry.data
+
+	local bagId = data.bagId
+	local slotId = data.slotIndex
+	local itemLink = GetItemLink(bagId, slotId)
+
+	if not IsItemLinkFurnitureRecipe(itemLink) then
+		icon:SetHidden(true)
+		return
+	end
+	local known = getItemKnowledge(itemLink)
+
+	local hidden = known and FurC.GetHideKnownInventoryIcons() or (not FurC.GetUseInventoryIcons())
+	icon:SetHidden(hidden)
+
+	local templateName = "FurC_SlotIconKnown" .. ((known and "Yes") or "No")
+
+	WINDOW_MANAGER:ApplyTemplateToControl(icon, templateName)
+
+end
+
+function FurC.SetupInventoryRecipeIcons(calledRecursively)
+	if nil ~= ResearchAssistant then return end
+	local function isValidBag(bagId, inventory)
+		if bagId == BAG_WORN 				then return false end
+		if bagId == BAG_VIRTUAL 			then return false end
+		local listView = inventory.listView
+		if not listView 					then return false end
+		if not listView.dataTypes 			then return false end
+		if not listView.dataTypes[1] 		then return false end
+		return nil ~= listView.dataTypes[1].setupCallback
+	end
+
+	local inventories = PLAYER_INVENTORY.inventories
+	if not inventories and not calledRecursively then
+		return zo_callLater(function() FurC.SetupInventoryRecipeIcons(true) end, 1000)
+	end
+	-- ruthlessly stolen from Dryzler's Inventory, then tweaked
+	for bagId, inventory in pairs(inventories) do
+		if isValidBag(bagId, inventory) then
+
+			ZO_PreHook( inventory.listView.dataTypes[1], "setupCallback",
+				function(control, slot) updateItemInInventory(control) end
+			)
+
+		end
+	end
+end
+
+
+
+function FurC.RegisterEvents()
+	em:RegisterForEvent("FurnitureCatalogue", EVENT_RECIPE_LEARNED, onRecipeLearned)
+end
\ No newline at end of file
diff --git a/FurCFilter.lua b/FurCFilter.lua
new file mode 100644
index 0000000..edbd444
--- /dev/null
+++ b/FurCFilter.lua
@@ -0,0 +1,180 @@
+local p 						= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+local searchString 				= ""
+local dropdownChoiceVersion		= 1
+local dropdownTextVersion		= "All"
+local ddSource		= 1
+local dropdownTextSource		= "All"
+local dropdownChoiceCharacter	= 1
+local ddTextCharacter			= "Accountwide"
+local qualityFilter 			= {}
+local craftingTypeFilter 		= {}
+
+local hideBooks 				= false
+local hideRumours				= false
+local hideCrownStore			= false
+local mergeLuxuryAndSales		= false
+local filterAllOnTextSearch		= false
+
+local sourceIndices
+
+local recipeArray, itemId, itemLink, itemType, sItemType, itemName, recipeIndex, recipeListIndex
+
+function FurC.SetFilter(useDefaults, skipRefresh)
+	ClearTooltip(InformationTooltip)
+	sourceIndices 					= FurC.SourceIndices
+	searchString 					= FurC.GetSearchFilter()
+
+	if useDefaults then
+		dropdownChoiceVersion		= tonumber(FurC.GetDefaultDropdownChoice("Version"))
+		ddSource					= FurC.GetDefaultDropdownChoice("Source")
+		dropdownChoiceCharacter 	= FurC.GetDefaultDropdownChoice("Character")
+	else
+		dropdownChoiceVersion		= tonumber(FurC.GetDropdownChoice("Version"))
+		ddSource					= FurC.GetDropdownChoice("Source")
+		dropdownChoiceCharacter 	= FurC.GetDropdownChoice("Character")
+	end
+
+	-- we need to hold the text here, in case it's not "All"
+	ddTextCharacter				= FurC.GetDropdownChoiceTextual("Character")
+
+	qualityFilter 				= FurC.GetFilterQuality()
+	craftingTypeFilter			= FurC.GetFilterCraftingType()
+	hideBooks					= FurC.GetHideBooks()
+	hideRumours					= FurC.GetHideRumourRecipes()
+	mergeLuxuryAndSales 		= FurC.GetMergeLuxuryAndSales()
+	hideCrownStore 				= FurC.GetHideCrownStoreItems()
+
+    -- ignore filtered items when no dropdown filter is set and there's a text search?
+    filterAllOnTextSearch       = FurC.GetFilterAllOnText() and #searchString > 0 and
+                                    FURC_NONE == ddSource and
+                                    FURC_NONE == dropdownChoiceVersion and
+                                    FURC_NONE == dropdownChoiceCharacter
+
+	if not skipRefresh then
+		zo_callLater(FurC.UpdateLineVisibility, 200)
+	end
+end
+
+function FurC.InitFilters()
+	FurC.SetFilterCraftingType(0)
+	FurC.SetFilterQuality(0)
+	FurC.SetDropdownChoice("Source", FurC.GetDefaultDropdownChoiceText("Source"), FurC.GetDefaultDropdownChoice("Source"))
+	FurC.SetDropdownChoice("Character", FurC.GetDefaultDropdownChoiceText("Character"), FurC.GetDefaultDropdownChoice("Character"))
+	FurC.SetDropdownChoice("Version", FurC.GetDefaultDropdownChoiceText("Version"), FurC.GetDefaultDropdownChoice("Version"))
+end
+
+
+local function isRecipeArrayKnown()
+	if nil == recipeArray or nil == recipeArray.characters then return end
+	 if dropdownChoiceCharacter == 1 then
+		for name, value in pairs(recipeArray.characters) do
+			if (value) then return true end
+		end
+	 else
+		return recipeArray.characters[ddTextCharacter]
+	end
+end
+
+-- Version: All, Homestead, Morrowind
+local function matchVersionDropdown()
+	return dropdownChoiceVersion == 1 or recipeArray.version == dropdownChoiceVersion
+end
+
+local function shouldBeHidden()
+	return (ddSource ~= FURC_RUMOUR and recipeArray.origin == FURC_RUMOUR and hideRumours) or
+	(ddSource ~= FURC_CROWN and recipeArray.origin == FURC_CROWN and hideCrownStore)
+end
+
+-- Source: All, All (craftable), Craftable (known), craftable (unknown), purchaseable
+local function matchSourceDropdown()
+
+	-- "All", don't care
+	if FURC_NONE						== ddSource then  -- All
+		return true
+	elseif FURC_CRAFTING_KNOWN 			== ddSource then
+		return recipeArray.origin 		== FURC_CRAFTING and isRecipeArrayKnown(recipeArray)
+	elseif FURC_CRAFTING_UNKNOWN 		== ddSource then
+		return recipeArray.origin 		== FURC_CRAFTING and not isRecipeArrayKnown(recipeArray)
+	elseif FURC_FAVE 					== ddSource then
+		return recipeArray.favorite
+	elseif FURC_VENDOR 					== ddSource then
+		return (recipeArray.origin 		== FURC_VENDOR or (mergeLuxuryAndSales and recipeArray.origin == FURC_LUXURY))
+	elseif FURC_RUMOUR 					== ddSource then
+		return recipeArray.origin 		== FURC_RUMOUR
+	elseif FURC_WRIT_VENDOR 			== ddSource then
+		return recipeArray.origin 		== FURC_ROLLIS
+	elseif FURC_OTHER					== ddSource then
+		return (
+			recipeArray.origin == FURC_FESTIVAL_DROP or
+			recipeArray.origin == FURC_DROP 	     or
+			recipeArray.origin == FURC_FISHING 	     or
+			recipeArray.origin == FURC_JUSTICE 	     or
+			recipeArray.origin == FURC_GUILDSTORE
+		)
+	else return recipeArray.origin  == ddSource end
+
+	-- we're checking character knowledge
+	return 1 == dropdownChoiceCharacter or recipeArray.origin == FURC_CRAFTING
+
+end
+
+local function matchDropdownFilter()
+	return matchVersionDropdown() and matchSourceDropdown()
+end
+
+local function matchSearchString()
+	if #searchString == 0 then return true end
+    local caseSensitive = nil ~= string.match(searchString, "%u")
+    local itemName = GetItemLinkName(itemLink)
+    local matchme = (caseSensitive and itemName) or string.lower(itemName)
+    return string.match(matchme, searchString)
+end
+
+local function matchCraftingTypeFilter()
+	if not recipeArray.origin == FURC_CRAFTING then return false end
+	local filterType = FurC.GetCraftingSkillType(itemId, recipeArray)
+	return filterType and filterType > 0 and craftingTypeFilter[filterType]
+end
+local function matchQualityFilter()
+	return qualityFilter[GetItemLinkQuality(itemLink)]
+end
+
+local function filterBooks(itemId, recipeArray)
+	if not (hideBooks or filterAllOnTextSearch and FurC.GetFilterAllOnTextNoBooks()) then return false end
+	local versionData = FurC.Books[recipeArray.version]
+	if nil == versionData then return end
+	return nil ~= versionData[itemId]
+end
+
+function FurC.MatchFilter(currentItemId, currentRecipeArray)
+
+	itemId = currentItemId
+	itemLink = FurC.GetItemLink(itemId)
+	recipeArray = currentRecipeArray or FurC.Find(itemLink)
+	itemType, sItemType = GetItemLinkItemType(itemLink)
+
+    if  filterBooks(itemId, recipeArray)			                        then return false end
+
+
+    if recipeArray.origin == FURC_RUMOUR then
+        if filterAllOnTextSearch and not FurC.GetFilterAllOnTextNoRumour() then return false end
+        if (hideRumours and recipeArray.origin == FURC_RUMOUR) then return false end
+    end
+
+    if recipeArray.origin == FURC_CROWN then
+        if filterAllOnTextSearch and FurC.GetFilterAllOnTextNoCrown() then return false end
+        if hideCrownStore and ddSource ~= FURC_CROWN then return false end
+    end
+
+    if not (filterAllOnTextSearch or  matchDropdownFilter()) then return false end
+
+
+     if not matchSearchString                                                then return false end
+    if not matchSearchString() 												    then return false end
+	if not (FurC.settings.filterCraftingTypeAll or matchCraftingTypeFilter())	then return false end
+	if not (FurC.settings.filterQualityAll 		or matchQualityFilter())		then return false end
+
+	return true
+
+end
\ No newline at end of file
diff --git a/FurCGui.lua b/FurCGui.lua
new file mode 100644
index 0000000..85ee73e
--- /dev/null
+++ b/FurCGui.lua
@@ -0,0 +1,481 @@
+FurC.SlotTemplate		= "FurC_SlotTemplate"
+FurC.KnowledgeFilter 	= "All (Accountwide)"
+FurC.SearchString 		= ""
+FurC.ScrollSortUp 		= true
+local checkWasUpdated	= false
+local task 				= LibStub("LibAsync"):Create("FurnitureCatalogue_updateLineVisibility")
+local otherTask 		= LibStub("LibAsync"):Create("FurnitureCatalogue_ToggleGui")
+local async 			= LibStub("LibAsync"):Create("FurnitureCatalogue_forLoop")
+
+
+local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+local sortTable = FurC.SortTable
+
+local function sort(myTable)
+	local sortName, sortDirection = FurC.GetSortParams()
+	sortName = sortName or "itemName"
+	local sortUp = ((ZO_SORT_ORDER_UP and sortDirection == "up") or ZO_SORT_ORDER_DOWN)
+	return sortTable(myTable, sortName, sortUp)
+end
+
+local headerHeight = FurCGui_Header:GetHeight()
+
+function FurC.CalculateMaxLines()
+	FurCGui_ListHolder:SetHeight(FurCGui:GetHeight() - headerHeight)
+	FurCGui_ListHolder.maxLines = math.floor((FurCGui_ListHolder:GetHeight()) / FurCGui_ListHolder.lines[1]:GetHeight() )
+	return FurCGui_ListHolder.maxLines
+end
+
+local function updateLineVisibility()
+
+
+	local function fillLine(curLine, curData, lineIndex)
+		if nil == curLine then return end
+
+		local dataLines = FurCGui_ListHolder.dataLines
+		local maxLines = FurCGui_ListHolder.maxLines
+
+		local hidden = lineIndex > #dataLines or lineIndex > maxLines
+		curLine:SetHidden(hidden)
+		if nil == curData or curLine:IsHidden() then
+			curLine.itemLink = ""
+			curLine.itemId 	 = 0
+			curLine.icon:SetTexture(nil)
+			curLine.icon:SetAlpha(0)
+			curLine.text:SetText("")
+			curLine.mats:SetText("")
+		else
+			curLine.itemLink 	= curData.itemLink
+			curLine.itemId 	 	= curData.itemId
+			curLine.icon:SetTexture(GetItemLinkIcon(curData.itemLink))
+			curLine.icon:SetAlpha(1)
+			local text 			=  curData.itemLink:gsub("H1", "H0")
+			curLine.text:SetText(((curData.favorite and "* ") or "").. text)
+			local mats = FurC.GetItemDescription(curData.itemId, curData)
+			curLine.mats:SetText(mats)
+		end
+	end
+
+	local isEmpty = #FurCGui_ListHolder.dataLines == 0
+
+	FurCGui_ListHolder:SetHidden(	isEmpty)
+	FurCGui_Empty:SetHidden(		not	isEmpty)
+
+	if isEmpty then return end
+
+	FurC.CalculateMaxLines()
+
+	task:Call(function()
+		local maxLines = FurCGui_ListHolder.maxLines
+		local dataLines = FurCGui_ListHolder.dataLines
+
+		local offset =	FurCGui_ListHolder_Slider:GetValue()
+		if offset > #dataLines then offset = 0 end
+		FurCGui_ListHolder_Slider:SetValue(offset)
+
+		local curLine, curData
+
+		for i=1, FurCGui_ListHolder:GetNumChildren() do
+			curLine = FurCGui_ListHolder.lines[i]
+			curData = FurCGui_ListHolder.dataLines[offset + i]
+			fillLine(curLine, curData, i)
+		end
+		FurCGui_ListHolder_Slider:SetMinMax(0, #dataLines)
+
+	end)
+end
+FurC.UpdateLineVisibility =	updateLineVisibility
+
+function FurC.IsLoading(isBuffering)
+
+	FurCGui_Wait:SetHidden(not isBuffering)
+
+	local isEmpty = #FurCGui_ListHolder.dataLines == 0
+
+	FurCGui_ListHolder:SetHidden(isBuffering or isEmpty)
+	FurCGui_Empty:SetHidden(isBuffering or not isEmpty)
+
+end
+
+-- fill the shown item list with items that match current filter(s)
+local function updateScrollDataLinesData()
+	local dataLines = {}
+	task:Call(function()
+		local index = 0
+
+		data = FurC.settings.data
+
+		local itemLink
+		 -- async:For(pairs(data)):Do( function(itemId, recipeArray)
+		for itemId, recipeArray in pairs(data) do
+			if FurC.MatchFilter(itemId, recipeArray) then
+				itemLink = FurC.GetItemLink(itemId)
+				if itemLink then
+					tempDataLine 			= ZO_DeepTableCopy({}, recipeArray)
+					tempDataLine.itemId		= itemId
+					tempDataLine.itemLink	= itemLink
+					tempDataLine.itemName	= GetItemLinkName(itemLink)
+					table.insert(dataLines, tempDataLine)
+				end
+			end
+		 end
+		 -- end)
+
+		end)
+	:Then(function()
+		dataLines = sort(dataLines)
+		FurCGui_ListHolder.dataLines = dataLines
+		FurC_RecipeCount:SetText(#dataLines)
+	end)
+
+end
+
+
+function FurC.UpdateGui(useDefaults)
+	if FurCGui:IsHidden() then return end
+
+	otherTask:Call(function()
+
+		FurC.IsLoading(true)
+		FurC.LastFilter = useDefaults
+		FurC.SetFilter(useDefaults, true)
+	end)
+	:Then(updateScrollDataLinesData)
+	:Then(function()  zo_callLater(function()
+
+		FurC.IsLoading(false)
+		updateLineVisibility()
+
+	end, 200) end)
+end
+
+function FurC.UpdateInventoryScroll()
+	local index = 0
+	FurCGui_ListHolder.dataOffset = FurCGui_ListHolder.dataOffset or 0
+	FurCGui_ListHolder.dataOffset = math.max(FurCGui_ListHolder.dataOffset, 0)
+
+	FurC.CalculateMaxLines()
+
+	local total = #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines
+	if total > 0 then
+		FurCGui_ListHolder_Slider:SetMinMax(0, total)
+	end
+
+	updateLineVisibility()
+end
+
+function FurC.SetLineHeight(applyTemplate)
+	local curLine
+	local size = FurC.GetFontSize()
+
+	local nameFont = string.format("$(%s)|$(KB_%s)|soft-shadow-thin", (FurC.GetTinyUi() and "MEDIUM_FONT") or "BOLD_FONT", size)
+	local matsFont = string.format("$(MEDIUM_FONT)|$(KB_%s)|soft-shadow-thin", size)
+
+	for i = 1, #FurCGui_ListHolder.lines do
+		curLine = FurCGui_ListHolder.lines[i]
+		if applyTemplate then
+			WINDOW_MANAGER:ApplyTemplateToControl(curLine, FurC.SlotTemplate)
+		end
+		curLine:GetNamedChild("Name"):SetFont(nameFont)
+		curLine:GetNamedChild("Mats"):SetFont(matsFont)
+		curLine:SetHeight( size + (FurC.GetTinyUi() and 8 or 20))
+	end
+	FurC.CalculateMaxLines()
+end
+
+function FurC.ApplyLineTemplate()
+
+	local function resizeDropdowns(controlSize)
+		local controlList = {
+			[1] = FurC_DropdownSource,
+			[2] = FurC_DropdownCharacter,
+			[3] = FurC_DropdownVersion
+		}
+		for _, control in pairs(controlList) do
+			control:SetWidth(controlSize)
+		end
+		FurC_Search:SetWidth(controlSize-19)
+	end
+	if FurC.GetTinyUi() then
+		FurC.SlotTemplate = "FurC_SlotTemplateTiny"
+		resizeDropdowns(230) -- first column width: 230
+		FurCGui_Header_SortBar_Quality:ClearAnchors()
+		FurCGui_Header_SortBar_Quality:SetAnchor(TOPLEFT, FurCGui_Header_SortBar_Name, TOPRIGHT, -82)
+	else
+		FurC.SlotTemplate = "FurC_SlotTemplate"
+		resizeDropdowns(300) -- first column width: 280
+		FurCGui_Header_SortBar_Quality:ClearAnchors()
+		FurCGui_Header_SortBar_Quality:SetAnchor(TOPLEFT, FurCGui_Header_SortBar_Name, TOPRIGHT, 0)
+	end
+
+	FurC.SetLineHeight(true)
+
+	local minWidth 	= 2*(FurC_DropdownCharacter:GetWidth()) + FurC_TypeFilter:GetWidth() + 40
+	local minHeight = 2*FurCGui_Header:GetHeight()
+	FurCGui:SetDimensionConstraints(minWidth, minHeight)
+
+	task:Call(function() updateLineVisibility() end)
+end
+
+local addedDropdownCharacterNames = {}
+
+local function createGui()
+
+	local function createInventoryScroll()
+		-- FurC.DebugOut("CreateInventoryScroll")
+
+		local function createLine(i, predecessor)
+
+			predecessor = predecessor or FurCGui_ListHolder
+
+			local line = WINDOW_MANAGER:CreateControlFromVirtual("FurC_ListItem_".. i, FurCGui_ListHolder, FurC.SlotTemplate)
+			line.icon 	= line:GetNamedChild("Button"):GetNamedChild("Icon")
+			line.text 	= line:GetNamedChild("Name")
+			line.mats 	= line:GetNamedChild("Mats")
+
+			line:SetHidden(false)
+			line:SetMouseEnabled(true)
+
+			if i == 1 then
+				line:SetAnchor(TOPLEFT, FurCGui_ListHolder, TOPLEFT, 0, 4)
+				line:SetAnchor(TOPRIGHT, FurCGui_ListHolder, TOPRIGHT, 0, 0)
+			else
+				line:SetAnchor(TOPLEFT, predecessor, BOTTOMLEFT, 	0, 0)
+				line:SetAnchor(TOPRIGHT, predecessor, BOTTOMRIGHT, 	0, 0)
+			end
+			return line
+		end
+
+		FurCGui_ListHolder.dataOffset = 0
+		FurCGui_ListHolder.maxLines = 60
+		FurCGui_ListHolder.dataLines = {}
+		FurCGui_ListHolder.lines = {}
+		FurCGui_ListHolder.NameSort = FurCGui_Header_SortBar:GetNamedChild("_Name")
+		FurCGui_ListHolder.NameSort.icon = FurCGui_ListHolder.NameSort:GetNamedChild("_Button")
+		FurCGui_ListHolder.QualitySort = FurCGui_Header_SortBar:GetNamedChild("_Quality")
+		FurCGui_ListHolder.QualitySort.icon = FurCGui_ListHolder.QualitySort:GetNamedChild("_Button")
+
+		--local width = 250 -- FurCGui_ListHolder:GetWidth()
+		local text = "       No Collected Data"
+
+		for i=1, FurCGui_ListHolder.maxLines do
+			FurCGui_ListHolder.lines[i] = createLine(i, predecessor)
+			predecessor = FurCGui_ListHolder.lines[i]
+		end
+
+		-- setup slider
+		FurCGui_ListHolder_Slider:SetMinMax(0, #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines)
+
+		return FurCGui_ListHolder.lines
+	end
+
+	local function createQualityFilters()
+		local buttons = {}
+		local quality = 0
+		local function createQualityFilter(name, color, tooltip)
+			local parent 		= FurC_QualityFilter
+
+			local predecessor 	= buttons[#buttons] or parent
+			local controlType	= "FurC_QualityFilterButton"
+
+			local button 		= WINDOW_MANAGER:CreateControlFromVirtual(parent:GetName()..name, parent, controlType)
+			local ctrlName		= string.lower(name)
+			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_up.dds", 		ctrlName))
+			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_over.dds", 	ctrlName))
+			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_down.dds", 	ctrlName))
+			button.quality 		= quality
+			button.tooltip 		= tooltip
+
+
+			local otherAnchor 		= ((predecessor == parent) and LEFT) or RIGHT
+			local xOffset		= ((predecessor == parent) and 0) or 6
+			button:SetAnchor(LEFT, predecessor, otherAnchor, xOffset)
+			quality = quality +1
+
+			return button
+
+		end
+
+
+		buttons[quality+1]	= createQualityFilter("All", 		nil, 					"All Items")
+
+		buttons[quality+1]	= createQualityFilter("White", 		ITEM_QUALITY_NORMAL, 	"White quality")
+		buttons[quality+1]	= createQualityFilter("Magic", 		ITEM_QUALITY_MAGIC, 	"Magic quality")
+		buttons[quality+1]	= createQualityFilter("Arcane", 	ITEM_QUALITY_ARCANE, 	"Superior quality")
+		buttons[quality+1]	= createQualityFilter("Artifact",	ITEM_QUALITY_ARTIFACT, 	"Epic quality")
+		buttons[quality+1]	= createQualityFilter("Legendary",  ITEM_QUALITY_LEGENDARY, "Legendary quality")
+
+		FurC.GuiElements.qualityButtons = buttons
+
+	end
+
+	local function createCraftingTypeFilters()
+		local buttons = {}
+
+		local function createCraftingTypeFilter(craftingType, textureName)
+			local parent 				= FurC_TypeFilter
+			local predecessor 			= buttons[#buttons] or parent
+
+			local name 					= parent:GetName() .. "Button" .. tostring(craftingType)
+
+			local button 				= WINDOW_MANAGER:CreateControlFromVirtual(name, parent, "FurC_CraftingTypeFilterButton")
+
+			button:SetNormalTexture(	string.format("%s%s", textureName, "_up.dds"))
+			button:SetMouseOverTexture(	string.format("%s%s", textureName, "_over.dds"))
+			button:SetPressedTexture(	string.format("%s%s", textureName,"_down.dds"))
+			button.craftingType 		= craftingType
+			button.tooltip 				= (craftingType > 0 and GetCraftingSkillName(craftingType)) or GetString("SI_ITEMFILTERTYPE", ITEMFILTERTYPE_ALL)
+
+			local otherAnchor 			= ((predecessor == parent) and TOPLEFT) or TOPRIGHT
+			button:SetAnchor(TOPLEFT, predecessor, otherAnchor, 0)
+
+			return button
+
+		end
+
+		buttons[CRAFTING_TYPE_INVALID]			= createCraftingTypeFilter(CRAFTING_TYPE_INVALID, 			"esoui/art/inventory/inventory_tabicon_all")
+		buttons[CRAFTING_TYPE_BLACKSMITHING]	= createCraftingTypeFilter(CRAFTING_TYPE_BLACKSMITHING, 	"esoui/art/inventory/inventory_tabicon_craftbag_blacksmithing")
+		buttons[CRAFTING_TYPE_CLOTHIER]			= createCraftingTypeFilter(CRAFTING_TYPE_CLOTHIER, 			"esoui/art/inventory/inventory_tabicon_craftbag_clothing")
+		buttons[CRAFTING_TYPE_ENCHANTING]		= createCraftingTypeFilter(CRAFTING_TYPE_ENCHANTING,		"esoui/art/inventory/inventory_tabicon_craftbag_enchanting")
+		buttons[CRAFTING_TYPE_ALCHEMY]			= createCraftingTypeFilter(CRAFTING_TYPE_ALCHEMY, 			"esoui/art/inventory/inventory_tabicon_craftbag_alchemy")
+		buttons[CRAFTING_TYPE_WOODWORKING]		= createCraftingTypeFilter(CRAFTING_TYPE_WOODWORKING, 		"esoui/art/inventory/inventory_tabicon_craftbag_woodworking")
+		buttons[CRAFTING_TYPE_PROVISIONING]		= createCraftingTypeFilter(CRAFTING_TYPE_PROVISIONING, 		"esoui/art/inventory/inventory_tabicon_craftbag_provisioning")
+
+		FurC.GuiElements.craftingTypeFilters 	= buttons
+
+	end
+
+	local function createInventoryDropdown(dropdownName)
+		local controlName 		= string.format("%s%s", "FurC_Dropdown", dropdownName)
+		local control 			= _G[controlName]
+		local dropdownData 		= FurnitureCatalogue.DropdownData
+		local validChoices 		= dropdownData[string.format("%s%s", "Choices", dropdownName)]
+		local choicesTooltips 	= dropdownData[string.format("%s%s", "Tooltips", dropdownName)]
+		local comboBox
+
+
+		control.comboBox = control.comboBox or ZO_ComboBox_ObjectFromContainer(control)
+		comboBox = control.comboBox
+
+		local function HideTooltip(control)
+			ClearTooltip(InformationTooltip)
+		end
+
+		-- ruthlessly stolen from LAM
+		local function SetupTooltips(comboBox, choicesTooltips)
+			local function ShowTooltip(control)
+				InitializeTooltip(InformationTooltip, control, TOPRIGHT, -10, 0, TOPLEFT)
+				SetTooltipText(InformationTooltip, control.tooltip)
+				InformationTooltipTopLevel:BringWindowToTop()
+			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]
+					if control.tooltip then
+						entry.onMouseEnter = control:GetHandler("OnMouseEnter")
+						entry.onMouseExit = control:GetHandler("OnMouseExit")
+						ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
+						ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
+					end
+
+				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
+				HideTooltip(self)
+				originalHide(self)
+			end
+		end
+
+		function OnItemSelect(control, choiceText, somethingElse)
+			local dropdownName = tostring(control.m_name):gsub("FurC_Dropdown", "")
+			FurC.SetDropdownChoice(dropdownName, choiceText)
+			HideTooltip(control)
+			PlaySound(SOUNDS.POSITIVE_CLICK)
+		end
+
+		comboBox:SetSortsItems(false)
+		local originalShow = comboBox.ShowDropdownInternal
+
+		if dropdownName == "Character" then
+			for _, characterName in ipairs(FurC.GetAccountCrafters()) do
+				addedDropdownCharacterNames[characterName] = true
+				table.insert(validChoices, characterName)
+				table.insert(dropdownData["Tooltips"..dropdownName], zo_strformat(GetString(SI_FURC_STRING_RECIPESFORCHAR), characterName))
+			end
+		end
+
+		for i = 1, #validChoices do
+			entry = comboBox:CreateItemEntry(validChoices[i], OnItemSelect)
+			comboBox:AddItem(entry)
+			if validChoices[i] == FurC.GetDropdownChoiceTextual(dropdownName) then
+				comboBox:SetSelectedItem(validChoices[i])
+			end
+		end
+
+		SetupTooltips(comboBox, dropdownData["Tooltips"..dropdownName])
+
+		return control
+	end
+
+	createInventoryScroll()
+	createQualityFilters()
+	createCraftingTypeFilters()
+	createInventoryDropdown("Source")
+	createInventoryDropdown("Version")
+	createInventoryDropdown("Character")
+	FurC.ChangeTemplateFromButton(FurC.GetTinyUi())
+	FurC.SetFontSize(FurC.GetFontSize())
+	FurC.LoadFrameInfo()
+	FurC.InitFilters()
+
+end
+
+function FurnitureCatalogue_Toggle()
+	SCENE_MANAGER:ToggleTopLevel(FurCGui)
+	if FurCGui:IsHidden() then return end
+	FurCGui_Empty:SetHidden(true)
+	zo_callLater(function() FurC.UpdateGui(FurC.GetResetDropdownChoice()) end, 500)
+end
+
+
+function FurC.InitGui()
+
+	local control = FurCGui
+	local settings = FurC.settings["gui"]
+	FurC.GuiElements = {}
+	if nil ~= control then
+		control:SetHeight(settings.height)
+		control:SetWidth(settings.width)
+	end
+
+	createGui()
+
+
+	local slider = FurCGui_ListHolder_Slider
+	slider:SetMinMax(1, #FurCGui_ListHolder.dataLines)
+
+	FurC.UpdateGui(FurC.GetResetDropdownChoice())
+
+	FurC_Label:GetNamedChild("_2"):SetText(GetString(SI_FURC_LABEL_ENTRIES))
+
+	SCENE_MANAGER:RegisterTopLevel(FurCGui, false)
+end
\ No newline at end of file
diff --git a/FurCMenu.lua b/FurCMenu.lua
new file mode 100644
index 0000000..2e0a530
--- /dev/null
+++ b/FurCMenu.lua
@@ -0,0 +1,409 @@
+function FurC.CreateSettings(savedVars, defaults)
+
+	local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
+	local panelData = {
+		type = "panel",
+		name = FurC.name,
+		displayName = name,
+	 	author = FurC.author,
+		version = FurC.version,
+		registerForRefresh = true,
+		registerForDefaults = true,
+		slashCommand = "/furc",	}
+	LAM:RegisterAddonPanel("FurC_OptionsPanel", panelData)
+	local optionsData = { -- optionsData
+
+		-- first section
+		{ -- checkbox: Debug output
+			type = "checkbox",
+			name = GetString(SI_FURC_STRING_MENU_DEBUG),
+			tooltip = "",
+			getFunc = function() return FurC.GetEnableDebug() end,
+			setFunc = function(value) FurC.SetEnableDebug(value) end
+		},
+		{ -- button: Reset database
+			type = "button",
+			name 	= GetString(SI_FURC_STRING_MENU_RESET_DB_NAME),
+			tooltip = GetString(SI_FURC_STRING_MENU_RESET_DB_TT),
+			warning = GetString(SI_FURC_STRING_MENU_RESET_DB_WARNING),
+			func = function()
+				FurC.WipeDatabase()
+			end,
+		},
+		{ -- button: Reset database
+			type 	= "button",
+			name 	= GetString(SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME),
+			width	= "half",
+			tooltip = GetString(SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT),
+			func 	= function() FurC.RescanRumourRecipes() end,
+		},
+		{ -- button: Re-scan data
+			type 	= "button",
+			name	= GetString(SI_FURC_STRING_MENU_SCAN_FILES_NAME),
+			tooltip = GetString(SI_FURC_STRING_MENU_SCAN_FILES_TT),
+			width 	= "half",
+			func 	= function()
+				FurC.ScanRecipes(true, false)
+				FurC.UpdateGui()
+			end,
+		},
+		{ -- button: Re-scan data
+			type 	= "button",
+			name 	= GetString(SI_FURC_STRING_MENU_SCAN_CHAR_NAME),
+			tooltip = GetString(SI_FURC_STRING_MENU_SCAN_CHAR_TT),
+			width 	= "half",
+			func = function()
+				FurC.ScanRecipes(false, true)
+				FurC.UpdateGui()
+			end,
+		},
+		{ -- dropdown: delete character
+			type = "dropdown",
+			name = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_NAME),
+			tooltip = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_TT),
+			warning = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_WARNING),
+			choices = FurC.GetAccountCharacters(),
+			getFunc = function() return end,
+			setFunc = function(value)
+				FurC.DeleteCharacter(value)
+			end,
+		},
+
+
+		-- =======================================================================================
+		-- header: Furniture Shopping List integration
+		-- =======================================================================================
+		{	-- header: Furniture Shopping List integration
+			type = "header",
+			name = "Furniture Shopping List",
+		},
+		{ -- checkbox: Enable
+			type 	= "checkbox",
+			name 	= GetString(SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST),
+			getFunc = function() return (FurC.GetEnableShoppingList()) end,
+			setFunc = function(value) FurC.SetEnableShoppingList(value) end
+		},
+
+
+		-- =======================================================================================
+		-- header: UI and performance
+		-- =======================================================================================
+		{	-- header: UI and performance
+			type = "header",
+			name = "Performance",
+		},
+
+		{ -- checkbox: Skip Initial Scan
+			type 	= "checkbox",
+			name 	= GetString(SI_FURC_STRING_MENU_SKIP_INITIALSCAN),
+			tooltip = GetString(SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT),
+			getFunc = function() return FurC.GetSkipInitialScan() end,
+			setFunc = function(value) FurC.SetSkipInitialScan(value) end
+		},
+		-- =======================================================================================
+		-- header: Inventory and bank
+		-- =======================================================================================
+		{	-- header: Inventory and bank
+			type = "submenu",
+			name = GetString(SI_FURC_STRING_MENU_HEADER_ICONS),
+			controls = {
+				{ -- checkbox: Add items to known/unknown recipes?
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_ADD_ITEMS_NAME),
+					tooltip = GetString(SI_FURC_STRING_MENU_ADD_ITEMS_TT),
+					getFunc = function() return FurC.GetUseInventoryIcons() end,
+					setFunc = function(value) FurC.SetUseInventoryIcons(value) end
+				},
+				{ -- checkbox: Only mark unknown recipes
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_IT_UNKNOWN_NAME),
+					getFunc = function() return FurC.GetHideKnownInventoryIcons() end,
+					setFunc = function(value) FurC.SetHideKnownInventoryIcons(value) end
+				},
+				{ -- checkbox: Add items to known/unknown recipes?
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_IT_THIS_ONLY),
+					tooltip = GetString(SI_FURC_STRING_MENU_IT_THIS_ONLY_TT),
+					getFunc = function() return FurC.GetUseInventoryIconsOnChar() end,
+					setFunc = function(value) FurC.SetUseInventoryIconsOnChar(value) end
+				},
+			},
+		},
+		-- =======================================================================================
+		-- header: UI and performance
+		-- =======================================================================================
+		{	-- header: UI and performance
+			type = "header",
+			name = "User Interface",
+		},
+		{ -- checkbox: use small interface?
+			type 	= "checkbox",
+			name 	= GetString(SI_FURC_STRING_MENU_USETINY),
+			tooltip = GetString(SI_FURC_STRING_MENU_USETINY_TT),
+			getFunc = function() return FurC.GetTinyUi() end,
+			setFunc = function(value) FurC.SetTinyUi(value) end
+		},
+		{ -- checkbox: use small interface?
+			type 	= "checkbox",
+			name 	= GetString(SI_FURC_STRING_MENU_STARTSILENT),
+			tooltip = GetString(SI_FURC_STRING_MENU_STARTSILENT_TT),
+			getFunc = function() return FurC.GetStartupSilently() end,
+			setFunc = function(value) FurC.SetStartupSilently(value) end
+		},
+		{ -- slider: font size
+			type 	= "slider",
+			name 	= GetString(SI_FURC_STRING_MENU_FONTSIZE),
+			tooltip = GetString(SI_FURC_STRING_MENU_FONTSIZE_TT),
+			min 	= 10,
+			max 	= 28,
+			getFunc = function() return FurC.GetFontSize() end,
+			setFunc = function(value) FurC.SetFontSize(value) end
+		},
+		{	type = "submenu",
+			name = GetString(SI_FURC_STRING_MENU_DEFAULT_DD),
+			controls = {
+				{ -- description: Default dropdown
+					type = "description",
+					name = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_USE),
+					text = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT),
+				},
+
+				{ -- checkbox: Persistent?
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_RESET),
+					tooltip = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT),
+					getFunc = function() return FurC.GetResetDropdownChoice() end,
+					setFunc = function(value) FurC.SetResetDropdownChoice(value) end
+				},
+				{ -- dropdown: default source
+					type 	= "dropdown",
+					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE),
+					choices = FurC.GetChoicesSource(),
+					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Source") end,
+					setFunc = function(value) FurC.SetDefaultDropdownChoice("Source", value) end
+				},
+				{ -- dropdown: default character
+					type 	= "dropdown",
+					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_CHAR),
+					choices = FurnitureCatalogue.DropdownData.ChoicesCharacter,
+					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Character") end,
+					setFunc = function(value) FurC.SetDefaultDropdownChoice("Character", value) end
+				},
+				{ -- dropdown: default version
+					type = "dropdown",
+					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_VERSION),
+					choices = FurnitureCatalogue.DropdownData.ChoicesVersion,
+					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Version") end,
+					setFunc = function(value) FurC.SetDefaultDropdownChoice("Version", value) end
+				},
+			},
+		},
+
+
+		-- =======================================================================================
+		-- submenu: Catalogue filtering
+		-- =======================================================================================
+		{	type = "submenu",
+			name = GetString(SI_FURC_STRING_MENU_FILTERING),
+			controls = {
+                 {	type = "submenu",
+                    name = GetString(SI_FURC_STRING_MENU_HEADER_F_ALL_ON_TEXT),
+                    controls = {
+                        { -- description: Default dropdown
+                            type = "description",
+                            name = GetString(SI_FURC_STRING_MENU_F_ALL_ON_TEXT),
+                            text = GetString(SI_FURC_STRING_MENU_HEADER_F_ALL_DESC),
+                        },
+
+                        { -- checkbox: Filter everything when text searching without dropdown
+                            type 	= "checkbox",
+                            name 	= GetString(SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT),
+                            tooltip = GetString(SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT_TT),
+                            getFunc = function() return FurC.GetFilterAllOnText() end,
+                            setFunc = function(value) FurC.SetFilterAllOnText(value) end
+                        },
+                        { -- checkbox: Exclude books from these
+                            type 	= "checkbox",
+                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_BOOKS),
+                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_BOOKS_TT),
+                            getFunc = function() return FurC.GetFilterAllOnTextNoBooks() end,
+                            setFunc = function(value) FurC.SetFilterAllOnTextNoBooks(value) end,
+                            disabled = not FurC.GetFilterAllOnText()
+                        },
+                        { -- checkbox: Exclude crown store items from these
+                            type 	= "checkbox",
+                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_CROWN),
+                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_CROWN_TT),
+                            getFunc = function() return FurC.GetFilterAllOnTextNoCrown() end,
+                            setFunc = function(value) FurC.GetFilterAllOnTextNoCrown(value) end,
+                            disabled = not FurC.GetFilterAllOnText()
+                        },
+                        { -- checkbox: Exclude crown store items from these
+                            type 	= "checkbox",
+                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR),
+                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR_TT),
+                            getFunc = function() return FurC.GetFilterAllOnTextNoRumour() end,
+                            setFunc = function(value) FurC.GetFilterAllOnTextNoRumour(value) end,
+                            disabled = not FurC.GetFilterAllOnText()
+                        },
+                    },
+                },
+
+
+				-- ===============================================================================
+				-- header: Mages guild books
+				-- ===============================================================================
+				{	-- header: Mages guild books
+					type = "header",
+					name = GetString(SI_FURC_STRING_MENU_FILTER_BOOKS),
+				},
+				{ -- checkbox: Hide Mages' guild books
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_FILTER_BOOKS_N),
+					tooltip = GetString(SI_FURC_STRING_MENU_FILTER_BOOKS_TT),
+					getFunc = function() return FurC.GetHideBooks() end,
+					setFunc = function(value) FurC.SetHideBooks(value) end
+				},
+
+				{	-- header: Luxury items
+					type 	= "header",
+					name 	= GetString(SI_FURC_STRING_MENU_LUXURY),
+				},
+				{ -- checkbox: Hide Mages' guild books
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_LUXURY_N),
+					tooltip = GetString(SI_FURC_STRING_MENU_LUXURY_TT),
+					warning = GetString(SI_FURC_STRING_MENU_LUXURY_WARN),
+					getFunc = function() return FurC.GetMergeLuxuryAndSales() end,
+					setFunc = function(value) FurC.SetMergeLuxuryAndSales(value) end
+				},
+
+
+				-- ===============================================================================
+				-- header: Rumour Recipes
+				-- ===============================================================================
+				{	-- header: rumour recipes
+					type 	= "header",
+					name 	= "Rumour Recipes",
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type 	= "description",
+					name 	= GetString(SI_FURC_STRING_MENU_RUMOUR),
+					text 	= GetString(SI_FURC_STRING_MENU_RUMOUR_DESC),
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_RUMOUR_N),
+					getFunc = function() return FurC.GetHideRumourRecipes() end,
+					setFunc = function(value) FurC.SetHideRumourRecipes(value) end
+				},
+				{	-- header: rumour recipes
+					type = "header",
+					name = "Crown store",
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type = "description",
+					name = GetString(SI_FURC_STRING_MENU_CROWN),
+					text = GetString(SI_FURC_STRING_MENU_CROWN_DESC),
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_CROWN_N),
+					getFunc = function() return FurC.GetHideCrownStoreItems() end,
+					setFunc = function(value) FurC.SetHideCrownStoreItems(value) end
+				},
+                --[[
+				{	-- header: rumour recipes
+					type = "header",
+					name = GetString(SI_FURC_STRING_MENU_HIDE_MENU),
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type = "description",
+					name = GetString(SI_FURC_STRING_MENU_HIDE_MENU),
+					text = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
+				},
+				{ -- checkbox: Hide rumour recipes menu entry
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR),
+					warning = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
+					getFunc = function() return FurC.GetHideRumourRecipesEntry() end,
+					setFunc = function(value) FurC.SetHideRumourRecipesEntry(value) end
+				},
+				{ -- checkbox: Hide doubtful recipes
+					type 	= "checkbox",
+					name 	= GetString(SI_FURC_STRING_MENU_HIDE_MENU_CROWN),
+					warning = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
+					getFunc = function() return FurC.GetHideCrownStoreEntry() end,
+					setFunc = function(value) FurC.SetHideCrownStoreEntry(value) end
+				},
+                ]]
+			},
+		},
+
+		-- =======================================================================================
+		-- header: Tooltip
+		-- =======================================================================================
+		{	-- header: Tooltip
+			type 	= "header",
+			name 	= "Tooltip",
+		},
+		{ -- checkbox: Disable
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP),
+			getFunc 	= function() return (not FurC.GetDisableTooltips()) end,
+			setFunc 	= function(value) FurC.SetDisableTooltips(not value) end
+		},
+		{ -- checkbox: Colorize tooltips for clarity?
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_COLOR),
+			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT),
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return FurC.GetColouredTooltips() end,
+			setFunc 	= function(value) FurC.SetColouredTooltips(value) end
+		},
+		{ -- checkbox: Hide 'known by' from tooltip
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN),
+			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT),
+			width		= "half",
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return (FurC.GetHideKnowledge()) end,
+			setFunc 	= function(value) FurC.SetHideKnowledge(value) end
+		},
+		{ -- checkbox: Hide 'known by' from tooltip
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN),
+			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT),
+			width		= "half",
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return (FurC.GetHideUnknown()) end,
+			setFunc 	= function(value) FurC.SetHideUnknown(value) end
+		},
+		{ -- checkbox: Hide item source
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE),
+			tooltip 	= "",
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return (FurC.GetHideSource()) end,
+			setFunc 	= function(value) FurC.SetHideSource(value) end
+		},
+		{ -- checkbox: Hide item source
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION),
+			tooltip 	= "",
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return (FurC.GetHideCraftingStation()) end,
+			setFunc 	= function(value) FurC.SetHideCraftingStation(value) end
+		},
+		{ -- checkbox: Hide materials from tooltip
+			type 		= "checkbox",
+			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL),
+			tooltip 	= "",
+			disabled 	= FurC.GetDisableTooltips(),
+			getFunc 	= function() return (FurC.GetHideMats()) end,
+			setFunc 	= function(value) FurC.SetHideMats(value) end
+		},
+	} -- optionsData end
+
+	LAM:RegisterOptionControls("FurC_OptionsPanel", optionsData)
+end
diff --git a/FurCSettingsAdapter.lua b/FurCSettingsAdapter.lua
new file mode 100644
index 0000000..7d52de0
--- /dev/null
+++ b/FurCSettingsAdapter.lua
@@ -0,0 +1,479 @@
+local task 		= LibStub("LibAsync"):Create("FurnitureCatalogue_Settings")
+
+local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+function FurC.GetDontScanTradingHouse()
+	return FurC.settings["dontScanTradingHouse"]
+end
+function FurC.SetDontScanTradingHouse(value)
+	FurC.settings["dontScanTradingHouse"] = value
+end
+
+function FurC.GetEnableDebug()
+	return FurC.settings["enableDebug"]
+end
+function FurC.SetEnableDebug(value)
+	FurC.settings["enableDebug"] = value
+end
+function FurC.GetHideRumourRecipes()
+	return FurC.settings["hideDoubtfuls"]
+end
+function FurC.SetHideRumourRecipes(value)
+	FurC.settings["hideDoubtfuls"] = value
+	FurC.updateDropdownData()
+	FurC.UpdateGui()
+end
+function FurC.GetHideCrownStoreItems()
+	return FurC.settings["hideCrownstore"]
+end
+function FurC.SetHideCrownStoreItems(value)
+	FurC.settings["hideCrownstore"] = value
+	FurC.updateDropdownData()
+	FurC.UpdateGui()
+end
+function FurC.GetHideRumourRecipesEntry()
+	return FurC.settings["hideRumourEntry"]
+end
+function FurC.SetHideRumourRecipesEntry(value)
+	FurC.settings["hideRumourEntry"] = value
+	FurC.updateDropdownData()
+	FurC.UpdateGui()
+end
+function FurC.GetHideCrownStoreEntry()
+	return FurC.settings["hideCrownStoreEntry"]
+end
+function FurC.SetHideCrownStoreEntry(value)
+	FurC.settings["hideCrownStoreEntry"] = value
+	FurC.updateDropdownData()
+	FurC.UpdateGui()
+end
+
+
+function FurC.GetFilterAllOnText()
+	return FurC.settings["filterAllOnText"]
+end
+function FurC.SetFilterAllOnText(value)
+	FurC.settings["filterAllOnText"] = value
+	FurC.UpdateGui()
+end
+
+function FurC.GetFilterAllOnTextNoRumour()
+	return FurC.settings["filterAllOnTextNoRumour"]
+end
+function FurC.GetFilterAllOnTextNoRumour(value)
+	FurC.settings["filterAllOnTextNoRumour"] = value
+	FurC.UpdateGui()
+end
+
+function FurC.GetFilterAllOnTextNoBooks()
+	return FurC.settings["filterAllOnTextNoBooks"]
+end
+function FurC.GetFilterAllOnTextNoBooks(value)
+	FurC.settings["filterAllOnTextNoBooks"] = value
+	FurC.UpdateGui()
+end
+
+function FurC.GetFilterAllOnTextNoCrown()
+	return FurC.settings["filterAllOnTextNoCrown"]
+end
+function FurC.GetFilterAllOnTextNoCrown(value)
+	FurC.settings["filterAllOnTextNoCrown"] = value
+	FurC.UpdateGui()
+end
+
+
+
+function FurC.GetFontSize()
+	if FurC.settings["fontSize"] < 10 then
+		FurC.settings["fontSize"] = 10
+	end
+	return FurC.settings["fontSize"]
+end
+function FurC.SetFontSize(value)
+	if nil == value then value = FurC.GetFontSize() end
+	if value == 0 then value = 18 end
+	FurC.settings["fontSize"] = value
+
+	local size = tostring(value)
+
+
+	FurC.SetLineHeight()
+
+	task:Call(function()	FurC.UpdateGui() end)
+end
+
+
+---------------------------
+--------- Tooltip ---------
+---------------------------
+function FurC.GetDisableTooltips()
+	return FurC.settings["disableTooltips"]
+end
+function FurC.SetDisableTooltips(value)
+	FurC.settings["disableTooltips"] = value
+end
+
+function FurC.GetColouredTooltips()
+	return FurC.settings["coloredTooltips"]
+end
+function FurC.SetColouredTooltips(value)
+	FurC.settings["coloredTooltips"] = value
+end
+
+function FurC.GetHideKnowledge()
+	return FurC.settings["hideKnowledge"]
+end
+function FurC.SetHideKnowledge(value)
+	FurC.settings["hideKnowledge"] = value
+end
+function FurC.GetHideUnknown()
+	return FurC.settings["hideUnknown"]
+end
+function FurC.SetHideUnknown(value)
+	FurC.settings["hideUnknown"] = value
+end
+
+function FurC.GetHideMats()
+	return FurC.settings["hideMats"]
+end
+function FurC.SetHideMats(value)
+	FurC.settings["hideMats"] = value
+end
+
+function FurC.GetHideSource()
+	return FurC.settings["hideSource"]
+end
+function FurC.SetHideSource(value)
+	FurC.settings["hideSource"] = value
+end
+
+function FurC.GetHideCraftingStation()
+	return FurC.settings["hideCraftingStation"]
+end
+function FurC.SetHideCraftingStation(value)
+	FurC.settings["hideCraftingStation"] = value
+end
+
+function FurC.GetEnableShoppingList()
+	return FurC.settings["enableShoppingList"]
+end
+function FurC.SetEnableShoppingList(value)
+	FurC.settings["enableShoppingList"] = value
+end
+
+---------------------------
+-------- /Tooltip ---------
+---------------------------
+
+---------------------------
+--------- Filters ---------
+---------------------------
+
+local function containsTrue(ary)
+	for key, value in pairs(ary) do
+		if value then return true end
+	end
+end
+
+function FurC.GetFilterQuality()
+	return FurC.settings.filterQuality
+end
+function FurC.SetFilterQuality(quality)
+
+	local controls = FurC.GuiElements.qualityButtons
+	local filterArray = FurC.settings.filterQuality
+
+	quality = quality or 0
+
+	if quality == 0 then
+		for key, value in pairs (filterArray) do
+			FurC.settings.filterQuality[key] = false
+		end
+	else
+		filterArray[quality] = not filterArray[quality]
+	end
+	FurC.settings.filterQualityAll = not containsTrue(filterArray)
+
+	for key, control in pairs (controls) do
+		control:SetState((filterArray[key-1] and BSTATE_PRESSED) or BSTATE_NORMAL)
+	end
+	FurC.GuiOnScroll(nil, 0)
+	FurC.SetFilter()
+	FurC.UpdateGui()
+end
+
+function FurC.GetFilterCraftingType()
+	return FurC.settings.filterCraftingType
+end
+function FurC.SetFilterCraftingType(craftingType)
+
+	local controls 		= 	FurC.GuiElements.craftingTypeFilters
+	local filterArray 	= 	FurC.settings.filterCraftingType
+
+	if craftingType == 0 then
+		for key, value in pairs (filterArray) do
+			filterArray[key] = false
+		end
+	else
+		filterArray[craftingType] = not filterArray[craftingType]
+	end
+
+	FurC.settings.filterCraftingTypeAll = not containsTrue(filterArray)
+
+	for key, control in pairs (controls) do
+		control:SetState((filterArray[key] and BSTATE_PRESSED) or BSTATE_NORMAL)
+	end
+
+	FurC.GuiOnScroll(FurCGui_ListHolder_Slider, 0)
+	FurC.SetFilter()
+	FurC.UpdateGui()
+end
+
+
+function FurC.GetSearchFilter()
+	if (not FurC.SearchFilter) or FurC.SearchFilter == "Filter by text search" then
+		FurC.SearchFilter = FurC_SearchBox:GetText() or ""
+	end
+
+	return FurC.SearchFilter or ""
+end
+
+function FurC.GuiSetSearchboxTextFrom(control)
+	-- call asynchronely to prevent lagging. Praise votan.
+	task:Call(function()
+		local text = control:GetText()
+        control:GetNamedChild("Text"):SetText((text == "" and "Filter by text search") or "")
+
+		FurC.SearchFilter = text
+
+		FurC.GuiOnSliderUpdate(FurCGui_ListHolder_Slider, 0)
+		FurC.UpdateGui()
+	end)
+end
+
+function FurC.GetHideBooks()
+	return FurC.settings["hideBooks"]
+end
+function FurC.SetHideBooks(value)
+	FurC.settings["hideBooks"] = value
+	FurC.UpdateGui()
+end
+function FurC.GetMergeLuxuryAndSales()
+	return FurC.settings["mergeLuxuryAndSales"]
+end
+function FurC.SetMergeLuxuryAndSales(value)
+	FurC.settings["mergeLuxuryAndSales"] = value
+	FurC.UpdateGui()
+end
+
+
+---------------------------
+--------- Dropdown --------
+---------------------------
+FurC.DropdownChoices = {
+	["Source"] = nil,
+	["Version"] = nil,
+	["Character"] = nil,
+}
+function FurC.GetDropdownChoice(dropdownName)
+	return (FurC.DropdownChoices[dropdownName] or FurC.GetDefaultDropdownChoice(dropdownName))
+end
+function FurC.GetDropdownText(dropdownName)
+	local dropdown = FurC.DropdownData[dropdownName]
+	local key = FurC.GetDropdownChoice(dropdownName)
+	return dropdown[key]
+end
+local function getDropdownIndex(dropdownName, value)
+	local dropdown = FurC.DropdownData["Choices"..dropdownName]
+	for listKey, listValue in pairs(dropdown) do
+		if listValue == value then return listKey end
+	end
+	dropdown[#dropdown+1] = value
+	return #dropdown
+end
+
+
+local dropdownData = FurC.DropdownData
+
+-- Source: All, All (craftable), Craftable (known), craftable (unknown), purchaseable
+-- Character: Accountwide, crafter1, crafter2...
+-- Version: All, Homestead, Morrowind
+function FurC.SetDropdownChoice(dropdownName, textValue, dropdownIndex)
+	textValue = textValue or FurC.GetDefaultDropdownChoice(dropdownName)
+	local dropdownIndex = dropdownIndex or getDropdownIndex(dropdownName, textValue) or 0
+
+	-- p("FurC.SetDropdownChoice(<<1>>, <<2>> (Index: <<3>>))", dropdownName, textValue, dropdownIndex)
+
+	-- if we're setting the dropdown menu "source" to "purchaseable", set "character" to "All"
+	FurC.DropdownChoices[dropdownName] = dropdownIndex
+
+	if dropdownName == "Source" then
+		if dropdownIndex > FURC_CRAFTING_UNKNOWN or dropdownIndex < FURC_CRAFTING then
+			FurC.DropdownChoices["Character"] = 1
+			FurC_DropdownCharacter:GetNamedChild("SelectedItemText"):SetText(FurnitureCatalogue.DropdownData.ChoicesCharacter[1])
+		end
+	end
+	-- if we're setting the characters array to something other than 1, we can't use source 1 or 5
+	if dropdownName == "Character" and (dropdownIndex > 1) then
+		if FurC.DropdownChoices["Source"] > FURC_CRAFTING_UNKNOWN or FurC.DropdownChoices["Source"] < FURC_CRAFTING then
+			local knownIndex = FURC_CRAFTING_KNOWN
+			FurC.DropdownChoices["Source"] = knownIndex
+			FurC_DropdownSource:GetNamedChild("SelectedItemText"):SetText(FurnitureCatalogue.DropdownData.ChoicesSource[knownIndex])
+		end
+	end
+
+	FurC.DropdownChoices[dropdownName] = dropdownIndex
+
+	zo_callLater(function() FurC.UpdateGui() end, 500)
+
+end
+
+function FurC.GetDefaultDropdownChoiceText(dropdownName)
+	return FurC.DropdownData["Choices"..dropdownName][FurC.GetDefaultDropdownChoice(dropdownName)]
+end
+
+function FurC.GetDefaultDropdownChoice(dropdownName)
+	return FurC.settings.dropdownDefaults[dropdownName]
+end
+function FurC.SetDefaultDropdownChoice(dropdownName, value)
+	local dropdownIndex = getDropdownIndex(dropdownName, value)
+	local dropdown = FurC.DropdownData["Choices"..dropdownName]
+	FurC.settings.dropdownDefaults[dropdownName] = dropdownIndex
+	-- FurC.UpdateDropdownChoice(dropdownName, value, dropdownIndex)
+	-- FurC.UpdateGui()
+end
+function FurC.GetResetDropdownChoice()
+	return FurC.settings["resetDropdownChoice"]
+end
+function FurC.SetResetDropdownChoice(value)
+	FurC.settings["resetDropdownChoice"] = value
+end
+
+function FurC.GetDropdownChoiceTextual(dropdownName)
+	local value = FurC.GetDropdownChoice(dropdownName)
+	local dropdown = FurC.DropdownData["Choices"..dropdownName]
+	return FurC.DropdownData["Choices"..dropdownName][value]
+end
+function FurC.GetDefaultDropdownChoiceTextual()
+	return FurC.DropdownData["Choices"..dropdownName][FurC.GetDefaultDropdownChoice(dropdownName)]
+end
+
+function FurC.GetAccountCrafters()
+	local ret = {}
+	for characterName, isCrafter in pairs(FurC.settings.accountCharacters) do
+		if isCrafter then table.insert(ret, characterName) end
+	end
+	return ret
+end
+function FurC.GetAccountCharacters()
+	local ret = {}
+	for characterName, isCrafter in pairs(FurC.settings.accountCharacters) do
+		table.insert(ret, characterName)
+	end
+	return ret
+end
+
+function FurC.GetSkipInitialScan()
+	return FurC.settings["skipInitialScan"]
+end
+function FurC.SetSkipInitialScan(value)
+	FurC.settings["skipInitialScan"] = value
+end
+
+---------------------------
+-------- /Dropdown --------
+-------- /Filters  --------
+---------------------------
+
+function FurC.GetUseInventoryIcons()
+	return FurC.settings["useInventoryIcons"]
+end
+function FurC.SetUseInventoryIcons(value)
+	FurC.settings["useInventoryIcons"] = value
+end
+
+function FurC.GetUseInventoryIconsOnChar()
+	return FurC.settings["useInventoryIconsOnChar"]
+end
+function FurC.SetUseInventoryIconsOnChar(value)
+	FurC.settings["useInventoryIconsOnChar"] = value
+end
+
+function FurC.GetHideKnownInventoryIcons()
+	return FurC.settings["hideKnownInventoryIcons"]
+end
+function FurC.SetHideKnownInventoryIcons(value)
+	FurC.settings["hideKnownInventoryIcons"] = value
+end
+
+function FurC.GetStartupSilently()
+	return FurC.settings["startupSilently"]
+end
+function FurC.SetStartupSilently(value)
+	FurC.settings["startupSilently"] = value;
+end
+
+function FurC.GetTinyUi()
+	return FurC.settings["useTinyUi"]
+end
+function FurC.SetTinyUi(value)
+	FurC.settings["useTinyUi"] 	= value
+	FurC.SlotTemplate 			= "FurC_SlotTemplate" .. ((value and "Tiny") or "")
+	FurC.ApplyLineTemplate()
+end
+
+
+function FurC.GetListOffset()
+	return FurC.ListOffset or 0
+end
+
+function FurC.SetListOffset(value)
+	FurC.ListOffset = value
+end
+
+
+
+function FurC.WipeDatabase()
+	d("|cFFFFFFresetting |r|c2266ffFurniture Catalogue |r|cFFFFFFdata...|r")
+	FurC.settings.data = {}
+	FurC.settings.accountCharacters = {}
+	FurC.settings.excelExport = {}
+	FurC.ScanRecipes(true, true)
+	-- d("FurnitureCatalogue: Scan complete")
+end
+
+function FurC.DeleteCharacter(characterName)
+
+	d("Now deleting recipe knowledge for " .. characterName)
+
+	for key, value in pairs(FurC.settings.accountCharacters) do
+		if value == characterName then
+			FurC.settings.accountCharacters[key] = false
+		end
+	end
+
+	for recipeKey, recipeArray in pairs(FurC.settings.data) do
+		if recipeArray.craftable then
+			recipeArray.characters[characterName] = nil
+		end
+	end
+
+	local guiDropdownEntries = FurC_Dropdown.comboBox.m_sortedItems
+	if nil == guiDropdownEntries then return end
+	for index, data in pairs(guiDropdownEntries) do
+		if data.name == characterName then
+			FurC_Dropdown.comboBox.m_sortedItems[index] = nil
+			return
+		end
+	end
+	d(zo_strformat("<<1>> deleted from |c2266ffFurniture Catalogue|r database. Entry will disappear from settings dropdown after the next reloadui.", characterName))
+
+end
+
+function FurC.GetCurrentCharacterName()
+	if nil == FurC.CharacterName then FurC.CharacterName = zo_strformat(GetUnitName('player')) end
+	return FurC.CharacterName
+end
+
+
+
\ No newline at end of file
diff --git a/FurCTooltip.lua b/FurCTooltip.lua
new file mode 100644
index 0000000..ccba0c8
--- /dev/null
+++ b/FurCTooltip.lua
@@ -0,0 +1,112 @@
+local async = LibStub("LibAsync")
+local task = async:Create("FurnitureCatalogue_Tooltip")
+
+local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+local function tryColorize(text, datInteger)
+	if nil == text then text = datInteger end
+	if (not FurC.GetColouredTooltips()) or not text then return text end
+	return text:gsub("cannot craft", "|cFF0000cannot craft|r"):gsub("Can be crafted", "|c00FF00Can be crafted|r")
+end
+
+local function addTooltipData(control, itemLink)
+
+	if FurC.GetDisableTooltips() then return end
+	local itemId, recipeArray = nil
+	if nil == itemLink or FURC_EMPTY_STRING == itemLink then return end
+	local isRecipe = IsItemLinkFurnitureRecipe(itemLink)
+
+	itemLink = (isRecipe and GetItemLinkRecipeResultItemLink(itemLink)) or itemLink
+
+	itemId 		= FurC.GetItemId(itemLink)
+	recipeArray = FurC.Find(itemLink)
+
+	-- |H0:item:118206:5:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0|h|h
+
+	if not recipeArray then return end			-- Find does not return nil, empty table instead
+
+	local unknown 	= not FurC.CanCraft(itemId, recipeArray)
+	local stringTable = {}
+
+
+	local function add(t, arg)
+		if nil ~= arg then t[#t + 1] = arg end
+		return t
+	end
+
+	-- if craftable:
+	if isRecipe or recipeArray.origin == FURC_CRAFTING then
+		if unknown and not FurC.GetHideUnknown() or not FurC.GetHideKnowledge() then
+			local crafterList = FurC.GetCrafterList(itemLink, recipeArray)
+			if crafterList then
+				stringTable = add(stringTable, tryColorize(crafterList))
+			end
+		end
+		if not isRecipe and (not FurC.GetHideCraftingStation()) then
+			stringTable = add(stringTable, FurC.PrintCraftingStation(itemId, recipeArray))
+		end
+		if isRecipe then
+			stringTable = add(stringTable, FurC.getRecipeSource(itemId, recipeArray))
+		end
+		-- check if we should show mats
+		if not (FurC.GetHideMats() or isRecipe) then
+			stringTable = add(stringTable, FurC.GetMats(itemLink, recipeArray, true):gsub(", ", "\n"))
+		end
+	else
+		if not FurC.GetHideSource() then
+			stringTable = add(stringTable, FurC.GetItemDescription(itemId, recipeArray))
+		end
+		stringTable = add(stringTable, recipeArray.achievement)
+	end
+
+	if #stringTable == 0 then return end
+
+	control:AddVerticalPadding(8)
+	ZO_Tooltip_AddDivider(control)
+
+	for i = 1, #stringTable do
+		control:AddLine(zo_strformat("<<C:1>>", stringTable[i]))
+	end
+
+end
+
+local function TooltipHook(tooltipControl, method, linkFunc)
+	local origMethod = tooltipControl[method]
+
+	tooltipControl[method] = function(self, ...)
+		origMethod(self, ...)
+		addTooltipData(self, linkFunc(...))
+	end
+end
+
+local function ReturnItemLink(itemLink)
+	return FurC.GetItemLink(itemLink)
+end
+
+do
+	local identifier = FurC.name .. "Tooltips"
+	-- hook real late
+	local function HookToolTips()
+		EVENT_MANAGER:UnregisterForUpdate(identifier)
+		TooltipHook(ItemTooltip, 	"SetBagItem", 				GetItemLink)
+		TooltipHook(ItemTooltip, 	"SetTradeItem", 			GetTradeItemLink)
+		TooltipHook(ItemTooltip, 	"SetBuybackItem",			GetBuybackItemLink)
+		TooltipHook(ItemTooltip, 	"SetStoreItem", 			GetStoreItemLink)
+		TooltipHook(ItemTooltip, 	"SetAttachedMailItem", 		GetAttachedItemLink)
+		TooltipHook(ItemTooltip, 	"SetLootItem", 				GetLootItemLink)
+		TooltipHook(ItemTooltip, 	"SetTradingHouseItem", 		GetTradingHouseSearchResultItemLink)
+		TooltipHook(ItemTooltip, 	"SetTradingHouseListing", 	GetTradingHouseListingItemLink)
+		TooltipHook(ItemTooltip, 	"SetLink", 					ReturnItemLink)
+		TooltipHook(PopupTooltip, 	"SetLink", 					ReturnItemLink)
+	end
+	-- hook late
+	local function DeferHookToolTips()
+		EVENT_MANAGER:UnregisterForEvent(identifier, EVENT_PLAYER_ACTIVATED)
+		EVENT_MANAGER:RegisterForUpdate(identifier, 100, HookToolTips)
+	end
+	function FurC.CreateTooltips()
+		EVENT_MANAGER:RegisterForEvent(identifier, EVENT_PLAYER_ACTIVATED, DeferHookToolTips)
+	end
+
+
+end
\ No newline at end of file
diff --git a/FurCUtil.lua b/FurCUtil.lua
new file mode 100644
index 0000000..dc09a2a
--- /dev/null
+++ b/FurCUtil.lua
@@ -0,0 +1,38 @@
+local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
+
+-- ruthlessly stolen from TextureIt
+function FurC.SortTable(tTable, sortKey, SortOrderUp)
+	local keys = {}
+	for k in pairs(tTable) do table.insert(keys, k) end
+	table.sort(keys, function(a, b)
+		if nil == tTable[a] or nil == tTable[b] then
+
+		elseif nil == tTable[a][sortKey] then
+			d(tTable[a])
+		elseif nil == tTable[b][sortKey] then
+			d(tTable[b])
+		else
+			if SortOrderUp then
+				return tTable[a][sortKey] > tTable[b][sortKey]
+			else
+				return tTable[a][sortKey] < tTable[b][sortKey]
+			end
+		end
+
+	end)
+
+	local ret = {}
+	local scannedLinks = {}
+	local itemLink, entry
+	for _, k in ipairs(keys) do
+		entry = tTable[k]
+		-- d(entry)
+		itemLink = entry["itemLink"]
+		ingredients = entry["ingredients"]
+		local index = scannedLinks[itemLink] or k
+
+		table.insert(ret, entry)
+	end
+
+	return ret
+end
diff --git a/FurnitureCatalogue.txt b/FurnitureCatalogue.txt
new file mode 100644
index 0000000..296655c
--- /dev/null
+++ b/FurnitureCatalogue.txt
@@ -0,0 +1,79 @@
+## Title: FurnitureCatalogue
+## Author: manavortex
+## Version: 2.2.13
+## APIVersion: 100022
+## SavedVariables: FurnitureCatalogue_Settings
+## OptionalDependsOn: pChat
+
+libs\LibStub\LibStub.lua
+libs\LibAsync\LibAsync.lua
+libs\LibCustomTitles\LibCustomTitles.lua
+libs\LibCustomMenu\LibCustomMenu.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
+
+locale\en.lua
+locale\$(language).lua
+
+xml\Bindings.xml
+xml\FurnitureCatalogue.xml
+
+startup.lua
+
+FurCSettingsAdapter.lua
+FurCMenu.lua
+FurCEvents.lua
+
+data\Morrowind\M_Recipes.lua
+data\Homestead\H_Recipes.lua
+data\Reach\HotR_Recipes.lua
+data\Recipes.lua
+data\RecipeSources.lua
+
+data\Homestead\H_AchievementVendors.lua
+data\Morrowind\M_AchievementVendors.lua
+data\Reach\HotR_AchievementVendors.lua
+data\AchievementVendors.lua
+
+data\LuxuryFurnisher.lua
+data\Homestead\H_LuxuryFurnisher.lua
+data\Morrowind\M_LuxuryFurnisher.lua
+data\Reach\HotR_LuxuryFurnisher.lua
+
+data\Homestead\H_Rollis.lua
+data\Reach\HotR_Rollis.lua
+data\Rollis.lua
+
+data\Homestead\H_EventItems.lua
+data\Morrowind\M_EventItems.lua
+data\EventItems.lua
+
+
+data\MiscItemSources.lua
+data\Homestead\H_Cyrodiil.lua
+
+data\RumourRecipes.lua
+
+FurCUtil.lua
+
+FurCDatabaseQuery.lua
+FurCData.lua
+FurCDataParser.lua
+FurCFilter.lua
+FurCGui.lua
+FurCContextMenu.lua
+FurCControlBridge.lua
+FurCTooltip.lua
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCContextMenu.lua b/FurnitureCatalogue/FurCContextMenu.lua
deleted file mode 100644
index c443060..0000000
--- a/FurnitureCatalogue/FurCContextMenu.lua
+++ /dev/null
@@ -1,168 +0,0 @@
-FurC_LinkHandlerBackup_OnLinkMouseUp = nil
-
-local FURC_S_SHOPPINGLIST_1 = GetString(SI_FURC_ONE_TO_SHOPPINGLIST)
-local FURC_S_SHOPPINGLIST_5 = GetString(SI_FURC_FIVE_TO_SHOPPINGLIST)
-local FURC_S_TOGGLE_SL = GetString(SI_FURC_TOGGLE_SHOPPINGLIST)
-
-function AddFurnitureShoppingListMenuEntry(itemId, calledFromFurC)
-	if calledFromFurC then
-		if (not FurC.GetEnableShoppingList()) then return end
-		if (nil ==	moc()) or (nil == FurnitureShoppingListAdd) then return end
-		local controlName = moc():GetName() or ""
-		if nil == moc():GetName():match("_ListItem_") then return end
-	end
-	local itemLink = FurC.GetItemLink(itemId)
-	if nil == FurC.Find(itemLink) then return end
-	AddCustomMenuItem(FURC_S_SHOPPINGLIST_1,
-		function()
-			FurnitureShoppingListAdd(itemLink)
-		end,
-	MENU_ADD_OPTION_LABEL)
-	AddCustomMenuItem(FURC_S_SHOPPINGLIST_5,
-		function()
-			FurnitureShoppingListAdd(itemLink)
-			FurnitureShoppingListAdd(itemLink)
-			FurnitureShoppingListAdd(itemLink)
-			FurnitureShoppingListAdd(itemLink)
-			FurnitureShoppingListAdd(itemLink)
-		end,
-	MENU_ADD_OPTION_LABEL)
-	AddCustomMenuItem(FURC_S_TOGGLE_SL,
-		function()
-			FurnitureShoppingListWindow_Toggle()
-		end,
-	MENU_ADD_OPTION_LABEL)
-
-end
-
-local function addMenuItems(itemLink, recipeArray)
-
-	recipeArray = recipeArray or FurC.Find(itemLink)
-	if (nil == recipeArray) then return end
-	-- ClearMenu()
-
-	AddCustomMenuItem(GetString(SI_FURC_MENU_HEADER),
-		function() FurC.ToChat(itemLink) end,
-		MENU_ADD_OPTION_LABEL
-	)
-	local faveText = FurC.IsFavorite(itemLink, recipeArray) and GetString(SI_FURC_REMOVE_FAVE) or GetString(SI_FURC_ADD_FAVE)
-	AddCustomMenuItem(faveText,
-		function() FurC.Fave(itemLink, recipeArray) end,
-		MENU_ADD_OPTION_LABEL
-	)
-
-	if recipeArray.origin ~= FURC_CRAFTING then
-		AddCustomMenuItem(GetString(SI_FURC_POST_ITEMSOURCE),
-			function() FurC.PrintSource(itemLink, recipeArray) end,
-			MENU_ADD_OPTION_LABEL
-		)
-	else
-		if IsItemLinkFurnitureRecipe(itemLink) then
-			AddCustomMenuItem(GetString(SI_FURC_POST_ITEM),
-			function() FurC.ToChat(GetItemLinkRecipeResultItemLink(itemLink)) end,
-				MENU_ADD_OPTION_LABEL
-			)
-		elseif nil ~= recipeArray.blueprint then
-			AddCustomMenuItem(GetString(SI_FURC_POST_RECIPE),
-			function() FurC.ToChat(FurC.GetItemLink(recipeArray.blueprint)) end,
-				MENU_ADD_OPTION_LABEL
-			)
-		end
-		AddCustomMenuItem(GetString(SI_FURC_POST_MATERIAL),
-			function() FurC.ToChat(itemLink .. ": " .. FurC.GetMats(itemLink, recipeArray, true)) end,
-			MENU_ADD_OPTION_LABEL
-		)
-		AddFurnitureShoppingListMenuEntry(itemLink, true)
-	end
-	-- ShowMenu()
-
-end
-
-function FurC_HandleClickEvent(itemLink, button, control)		-- button being mouseButton here
-	if (type(itemLink) == 'string' and #itemLink > 0) then
-		local handled = LINK_HANDLER:FireCallbacks(LINK_HANDLER.LINK_MOUSE_UP_EVENT, itemLink, button, ZO_LinkHandler_ParseLink(itemLink))
-		if (not handled) then
-			FurC_LinkHandlerBackup_OnLinkMouseUp(itemLink, button, control)
-			if (button == 2 and itemLink ~= '') then
-				addMenuItems(itemLink, FurC.Find(itemLink))
-			end
-			ShowMenu(control)
-        end
-    end
-end
-
-
-function FurC_HandleMouseEnter(inventorySlot)
-	local inventorySlot = moc()
-
-	if nil == inventorySlot or nil == inventorySlot.dataEntry then return end
-	local data = inventorySlot.dataEntry.data
-	if nil == data then return end
-
-	local bagId, slotIndex = data.bagId, data.slotIndex
-	FurC.CurrentLink = GetItemLink(bagId, slotIndex)
-	if nil == FurC.CurrentLink then return end
-
-end
-
-
--- thanks Randactyl for helping me with the handler :)
-function FurC_HandleInventoryContextMenu(control)
-
-	local st = ZO_InventorySlot_GetType(control)
-    local itemLink = nil
-    if st == SLOT_TYPE_ITEM
-	or st == SLOT_TYPE_BANK_ITEM
-	or st == SLOT_TYPE_GUILD_BANK_ITEM
-	or st == SLOT_TYPE_TRADING_HOUSE_POST_ITEM then
-        local bagId, slotId = ZO_Inventory_GetBagAndIndex(control)
-        itemLink = GetItemLink(bagId, slotId, linkStyle)
-    end
-    if st == SLOT_TYPE_TRADING_HOUSE_ITEM_RESULT then
-        itemLink = GetTradingHouseSearchResultItemLink(ZO_Inventory_GetSlotIndex(control), linkStyle)
-    end
-    if st == SLOT_TYPE_TRADING_HOUSE_ITEM_LISTING then
-        itemLink = GetTradingHouseListingItemLink(ZO_Inventory_GetSlotIndex(control), linkStyle)
-    end
-
-	local recipeArray = FurC.Find(itemLink)
-	-- d(recipeArray)
-	if nil == recipeArray then return end
-
-	zo_callLater(function()
-		addMenuItems(itemLink, recipeArray)
-		ShowMenu()
-	end, 50)
-
-
-end
-
-
-function FurC.OnControlMouseUp(control, button)
-
-	if nil == control then return end
-
-	if button ~= 2 then return end
-	local itemLink = control.itemLink
-
-	if nil == itemLink then return end
-	local recipeArray = FurC.Find(itemLink)
-	if nil == recipeArray then return end
-	zo_callLater(function()
-		ItemTooltip:SetHidden(true)
-		ClearMenu()
-		addMenuItems(itemLink, recipeArray)
-		ShowMenu()
-	end, 50)
-
-end
-
-function FurC.InitRightclickMenu()
-	FurC_LinkHandlerBackup_OnLinkMouseUp = ZO_LinkHandler_OnLinkMouseUp
-	ZO_LinkHandler_OnLinkMouseUp = function(itemLink, button, control) FurC_HandleClickEvent(itemLink, button, control) end
-	ZO_PreHook('ZO_InventorySlot_OnMouseEnter', FurC_HandleMouseEnter)
-	ZO_PreHook('ZO_InventorySlot_ShowContextMenu', function(rowControl)
-		FurC_HandleInventoryContextMenu(rowControl)
-	end)
-end
-
diff --git a/FurnitureCatalogue/FurCControlBridge.lua b/FurnitureCatalogue/FurCControlBridge.lua
deleted file mode 100644
index 8f9a7a0..0000000
--- a/FurnitureCatalogue/FurCControlBridge.lua
+++ /dev/null
@@ -1,258 +0,0 @@
-local FurC 		= FurnitureCatalogue
-local control 	= FurnitureCatalogueControl
-FurC.Visible	= false
-
-local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
-
-local function p(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-	FurC.DebugOut(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-end
-
-
-function FurC.LoadFrameInfo(calledFrom)
-	local settings = FurC.settings.gui
-
-	FurCGui:ClearAnchors()
-	FurCGui:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, settings.lastX, settings.lastY)
-
-	FurCGui:SetWidth(settings.width)
-	FurCGui:SetHeight(settings.height)
-
-	zo_callLater(function() FurC.UpdateInventoryScroll() end, 100)
-
-end
-
-function FurC.SaveFrameInfo(calledFrom)
-	local settings = FurC.settings["gui"]
-
-	settings.lastX	= FurCGui:GetLeft()
-	settings.lastY	= FurCGui:GetTop()
-	settings.width	= FurCGui:GetWidth()
-	settings.height	= FurCGui:GetHeight()
-
-	FurC.UpdateInventoryScroll()
-
-end
-
-function FurC.OnResizeStop()
-
-	FurC.SaveFrameInfo()
-	FurC.UpdateLineVisibility()
-	FurC.UpdateInventoryScroll()
-
-end
-
-function FurC.ChangeTemplateFromButton(value)
-
-	local control = FurCGui_Header_Bar1_TemplateLarge
-	local otherControl = FurCGui_Header_Bar1_TemplateTiny
-
-	if value then
-		otherControl = FurCGui_Header_Bar1_TemplateLarge
-		control = FurCGui_Header_Bar1_TemplateTiny
-	end
-	control:SetHidden(true)
-	otherControl:SetHidden(false)
-
-	FurC.SetTinyUi(value)
-end
-
-function FurC.GUIButtonHideOnMouseUp()
-	FurCGui:SetHidden(true)
-end
-
-local function forceRefresh()
-	FurC.WipeDatabase()
-end
-
-function FurC.GUIButtonRefreshOnMouseUp(control, mouseButton)
-	if mouseButton == 1 then
-		FurC.ScanRecipes(false, true)
-	elseif mouseButton == 2 then
-		FurC.ScanRecipes(true, false)
-	elseif mouseButton == 3 then
-		if LAM and LAM.util then
-			LAM.util.ShowConfirmationDialog(
-				GetString(SI_FURC_DIALOGUE_RESET_DB_HEADER),
-				GetString(SI_FURC_DIALOGUE_RESET_DB_BODY),
-				forceRefresh
-			)
-		end
-	end
-end
-
-function FurC.GuiShowTooltip(control, tooltiptext, reAnchor)
-	InitializeTooltip(InformationTooltip, control, BOTTOM, 0, 0, 0)
-	InformationTooltip:SetHidden(false)
-	InformationTooltip:ClearLines()
-	InformationTooltip:AddLine(tooltiptext)
-
-	if reAnchor then
-		InformationTooltip:ClearAnchors()
-		InformationTooltip:SetAnchor(TOPRIGHT, control, TOPLEFT, -10)
-	end
-end
-function FurC.GuiHideTooltip(control)
-	InformationTooltip:ClearLines()
-	InformationTooltip:SetHidden(true)
-end
-
-function FurC.GuiOnSearchBoxClick(control, mouseButton, doubleClick)
-	FurC_SearchBoxText:SetText("")
-	if mouseButton == 2 or doubleClick then
-		control:SetText("")
-	end
-end
-
-local FURC_S_FILTERDEFAULT = GetString(SI_FURC_TEXTBOX_FILTER_DEFAULT)
-
-function FurC.GuiOnSearchBoxFocusOut(control)
-	if control:GetText() and control:GetText() ~= "" then
-        FurC.GuiOnSliderUpdate(FurCGui_ListHolder_Slider, 0)
-		FurC.UpdateGui()
-    end
-	FurC_SearchBoxText:SetText(FURC_S_FILTERDEFAULT)
-end
-
-function FurC.GuiOnScroll(control, delta)
-	if not delta then return end
-	if delta == 0 then return end
-
-	local slider = FurCGui_ListHolder_Slider
---	slider.locked = true
-	-- negative delta means scrolling down
-
-	local value = (FurCGui_ListHolder.dataOffset - delta)
-	local total = #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines
-
-	if value < 0 then value = 0 end
-	if value > total then value = total end
-	FurCGui_ListHolder.dataOffset  = value
-
-	FurC.UpdateInventoryScroll()
-
-
-	slider:SetValue(FurCGui_ListHolder.dataOffset)
-
-	FurC.GuiLineOnMouseEnter(moc())
-end
-
-function FurC.GuiOnSliderUpdate(slider, value)
-	if not value or slider and slider.locked then return end
-	local relativeValue = math.floor(FurCGui_ListHolder.dataOffset - value)
-	FurC.GuiOnScroll(slider, relativeValue)
-end
-
-function FurC.GuiShowFilterTooltip(control, label)
-	label = control.tooltip or label
-	FurC.GuiShowTooltip(control, label)
-end
-local currentLink, currentId
-
-
-function FurC.GuiLineOnMouseEnter(lineControl)
-	currentLink, currentId = nil
-
-	if not lineControl or not lineControl.itemLink or lineControl.itemLink == "" then return end
-	currentLink = lineControl.itemLink
-	currentId = lineControl.itemId
-
-	if nil == currentLink then return end
-
-
-	InitializeTooltip(ItemTooltip, lineControl, LEFT, 0, 0, 0)
-	ItemTooltip:SetLink(currentLink)
-end
-function FurC.GuiLineOnMouseExit(lineControl)
-	ItemTooltip:SetHidden(true)
-end
-
-function FurC.Donate(control, mouseButton)
-
-	local amount = 2000
-	if mouseButton == 2 then
-		amount = 10000
-	elseif mouseButton == 3 then
-		amount = 25000
-	end
-
-	SCENE_MANAGER:Show('mailSend')
-	zo_callLater(function()
-	ZO_MailSendToField:SetText("@manavortex")
-	ZO_MailSendSubjectField:SetText("Thank you for Furniture Catalogue!")
-	QueueMoneyAttachment(amount)
-	ZO_MailSendBodyField:TakeFocus() end, 200)
-end
-
-function FurC.OnControlDoubleClick(control)
-	FurC.ToChat(control.itemLink)
-end
-
-
-function FurC.GuiVirtualMouseOver(control)
-	FurC.GuiShowTooltip(control, control.tooltip)
-end
-function FurC.GuiVirtualMouseOut(control)
-	FurC.GuiHideTooltip(control)
-end
-
-
-function FurC.GuiQualityMouseUp(control, button)
-if button == 2 then FurC.SetFilterQuality(0) end
-	FurC.SetFilterQuality(control.quality)
-end
-function FurC.GuiCraftingTypeMouseUp(control)
-	FurC.SetFilterCraftingType(control.craftingType)
-end
-
-
-local sortBy		= nil
-local sortDirection = "down"
-
-local function getButtonTex(key)
-	if key ~= sortBy then
-		return "esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
-	end
-	return "esoui/art/miscellaneous/list_sortheader_icon_sort" .. sortDirection .. ".dds"
-end
-
-function FurC.GetSortParams()
-	return sortBy, sortDirection
-end
-
-function FurC.GuiOnSort(key)
-
-	-- set icon texture
-	if sortBy and sortBy == key then
-		sortDirection = ((sortDirection == "up" and "down") or "up")
-	else
-		sortBy = key
-		sortDirection = "up"
-	end
-
-	FurCGui_Header_SortBar_Name_Button:SetNormalTexture(getButtonTex("itemName"))
-	FurCGui_Header_SortBar_Quality_Button:SetNormalTexture(getButtonTex("itemQuality"))
-
-	FurC.UpdateGui()
-end
-
-
-function FurC.UpdateDropdownChoice(dropdownName, value)
-	if nil == dropdownName then
-		FurC.UpdateDropdownChoice("Version", value)
-		FurC.UpdateDropdownChoice("Character", value)
-		FurC.UpdateDropdownChoice("Source", value)
-		return
-	end
-	InformationTooltip:SetHidden(true)
-	value = value or FurC.GetDropdownChoiceTextual(dropdownName)
-
-	local controlName 	= "FurC_Dropdown"..dropdownName
-	local control 		= _G[controlName]
-	if nil == control then return end
-	control:GetNamedChild("SelectedItemText"):SetText(value)
-end
-
-function FurC.RefreshCounter()
-	FurC_RecipeCount:SetText(#FurCGui_ListHolder.dataLines)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCData.lua b/FurnitureCatalogue/FurCData.lua
deleted file mode 100644
index ed203f2..0000000
--- a/FurnitureCatalogue/FurCData.lua
+++ /dev/null
@@ -1,527 +0,0 @@
-local currentChar				= FurnitureCatalogue.CharacterName
-local task 						= LibStub("LibAsync"):Create("FurnitureCatalogue_ScanDataFiles")
-local task2 					= LibStub("LibAsync"):Create("FurnitureCatalogue_ScanCharacterKnowledge")
-local characterAlliance 		= GetUnitAlliance('player')
-
-local NUMBER_TYPE 				= "number"
-local STRING_TYPE 				= "string"
-local STRING_EMPTY 				= ""
-
-local lastLink 					= nil
-local recipeArray 				= nil
-
-local FURC_STRING_TRADINGHOUSE = "Seen in trading house"
-
-local function getCurrentChar()
-	if nil == currentChar then currentChar = zo_strformat(GetUnitName("player")) end
-	return currentChar
-end
-
-local p = FurC.DebugOut
-
-local function startupMessage(text)
-	if FurC.GetStartupSilently() then return end
-	d(text)
-end
-
-local function getItemId(itemLink)
-	if nil == itemLink or STRING_EMPTY == itemLink then return end
-	if type(itemLink) == NUMBER_TYPE and itemLink > 9999 then return itemLink end
-	local _, _, _, itemId = ZO_LinkHandler_ParseLink(itemLink)
-	return tonumber(itemId)
-end
-FurC.GetItemId = getItemId
-
-local function getItemLink(itemId)
-    if nil == itemId then return end
-	itemId = tostring(itemId)
-	if #itemId > 55 then return itemId end
-	if #itemId < 4 then return end
-	return zo_strformat("|H1:item:<<1>>:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0|h|h", itemId)
-end
-FurC.GetItemLink = getItemLink
-
-local function trySaveDevDebug(recipeArray)
-	if not (FurC.AccountName == "@manavortex" or FurC.AccountName == "@Manorin") then return end
-	if recipeArray.origin ~= FURC_DROP then return end
-	itemLink = (nil ~= recipeArray.blueprintLink and recipeArray.blueprintLink) or recipeArray.itemId
-	FurnitureCatalogue.devSettings[itemLink] = "true, -- " .. GetItemLinkName(itemLink)
-end
-
-local function addDatabaseEntry(recipeKey, recipeArray)
-	if recipeKey and recipeArray and {} ~= recipeArray then
-		FurC.settings.data[recipeKey] = recipeArray
-	end
-end
-
-
-local function makeMaterial(recipeKey, recipeArray, tryPlaintext, forcePlaintext)
-
-	if nil == recipeArray or (nil == recipeArray.blueprint and nil == recipeArray.recipeIndex and nil == recipeArray.recipeListIndex) then
-		return "couldn't get material list, please re-scan character knowledge"
-	end
-	local ret = ""
-	local ingredients = FurC.GetIngredients(recipeKey, recipeArray)
-	forcePlaintext = forcePlaintext or tryPlaintext and NonContiguousCount(ingredients) > 4
-	for ingredientLink, qty in pairs(ingredients) do
-		-- auto-capitalize because for some reason the ZOS API doesn't
-		local itemText = (forcePlaintext and string.gsub(" "..GetItemLinkName(ingredientLink), "%W%l", string.upper):sub(2)) or ingredientLink
-		 ret = zo_strformat("<<1>> <<2>>x <<3>>, ", ret, qty, itemText)
-	end
-	return ret:sub(0, -3)
-
-end
-FurC.GetMats = makeMaterial
-
-function FurC.GetIngredients(itemLink, recipeArray)
-	recipeArray = recipeArray or FurC.Find(itemLink)
-	local ingredients = {}
-	if recipeArray.blueprint then
-		local blueprintLink = FurC.GetItemLink(recipeArray.blueprint)
-		numIngredients = GetItemLinkRecipeNumIngredients(blueprintLink)
-		for ingredientIndex=1, numIngredients do
-			name, _, qty 				= GetItemLinkRecipeIngredientInfo(blueprintLink, ingredientIndex)
-			ingredientLink 				= GetItemLinkRecipeIngredientItemLink(blueprintLink, ingredientIndex)
-			ingredients[ingredientLink]	= qty
-		end
-	else
-		_, name, numIngredients = GetRecipeInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex)
-		for ingredientIndex=1, numIngredients do
-			name, _, qty 					= GetRecipeIngredientItemInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex, ingredientIndex)
-			ingredientLink 					= GetRecipeIngredientItemLink(recipeArray.recipeListIndex, recipeArray.recipeIndex, ingredientIndex)
-			ingredients[ingredientLink]		= qty
-		end
-	end
-	return ingredients
-end
-
-local function parseFurnitureItem(itemLink, override)					-- saves to DB, returns recipeArray
-
-	if not (
-	override or IsItemLinkPlaceableFurniture(itemLink)
-	or  GetItemLinkItemType(itemLink) == ITEMTYPE_FURNITURE
-	) then return end
-
-	local recipeKey 					= getItemId(itemLink)
-	local recipeArray 					= FurC.settings.data[recipeKey]
-	if nil ~= recipeArray then return recipeArray end
-
-	recipeArray = {}
-
-	addDatabaseEntry(recipeKey, recipeArray)
-
-	return recipeArray
-end
-
-local function parseBlueprint(blueprintLink)				-- saves to DB, returns recipeArray
-
-	local itemLink 		= GetItemLinkRecipeResultItemLink(blueprintLink, LINK_STYLE_BRACKETS)
-	local blueprintId 	= getItemId(blueprintLink)
-	local recipeKey 	= getItemId(itemLink)
-	if nil == recipeKey or -- we don't have a key to access the database
-		nil == itemLink or -- we don't have an item link to parse
-		nil == GetItemLinkName(itemLink) -- we didn't find an item result for our recipe
-	then return end
-
-	local recipeArray 			= FurC.settings.data[recipeKey] or {}
-	recipeArray.origin			= recipeArray.origin			or FURC_CRAFTING
-	recipeArray.characters		= recipeArray.characters		or {}
-	recipeArray.craftingSkill	= recipeArray.craftingSkill		or GetItemLinkCraftingSkillType(blueprintLink)
-	recipeArray.blueprint 		= recipeArray.blueprint 		or getItemId(blueprintLink)
-
-
-	if (IsItemLinkRecipeKnown(blueprintLink)) then
-		recipeArray.characters[getCurrentChar()] 	= true
-	end
-	addDatabaseEntry(recipeKey, recipeArray)
-	return recipeArray
-
-end
-
-
-function FurC.Find(itemOrBlueprintLink)						-- sets recipeArray, returns it - calls scanItemLink
-
-
-	if tonumber(itemOrBlueprintLink) == itemOrBlueprintLink then itemOrBlueprintLink = FurC.GetItemLink(itemOrBlueprintLink) end
-	if nil == itemOrBlueprintLink or #itemOrBlueprintLink == 0 then return end
-	p("scanItemLink(<<1>>)...", itemOrBlueprintLink)		-- do not return empty arrays. If this returns nil, abort!
-
-	if itemOrBlueprintLink == lastLink and nil ~= recipeArray then
-		return recipeArray
-	else
-		recipeArray = nil
-		lastLink = itemOrBlueprintLink
-	end
-
-	if IsItemLinkFurnitureRecipe(itemOrBlueprintLink) then
-		recipeArray = parseBlueprint(itemOrBlueprintLink)
-	elseif IsItemLinkPlaceableFurniture(itemOrBlueprintLink) then
-		recipeArray = parseFurnitureItem(itemOrBlueprintLink)
-	end
-
-	return recipeArray
-end
-
-function FurC.Delete(itemOrBlueprintLink)						-- sets recipeArray, returns it - calls scanItemLink
-	local recipeArray = scanItemLink(itemOrBlueprintLink)
-	if nil == recipeArray then return end
-	local itemLink = recipeArray.itemId
-	local itemKey = getItemId(itemLink)
-	FurC.settings.data[itemKey] = nil
-end
-
-function FurC.GetEntry(itemOrBlueprintLink)
-	local itemLink =  (IsItemLinkFurnitureRecipe(itemOrBlueprintLink) and GetRecipeResultItemLink(itemOrBlueprintLink)) or itemOrBlueprintLink
-	local recipeArray = FurC.Find(itemLink)
-	d(string.format("Trying to get entry for %s: %s", itemLink, recipeArray))
-	if not recipeArray then return end
-	local itemId = getItemId(itemOrBlueprintLink)
-	if recipeArray.blueprint then
-		itemId = getItemId(GetItemLinkRecipeResultItemLink(blueprintLink))
-	end
-	return itemId, recipeArray
-
-end
-
-function FurC.IsFavorite(itemLink, recipeArray)
-	recipeArray = recipeArray or FurC.Find(itemLink)
-	return recipeArray.favorite
-end
-function FurC.Fave(itemLink, recipeArray)
-	recipeArray = recipeArray or FurC.Find(itemLink)
-	recipeArray.favorite = not recipeArray.favorite
-	if not recipeArray.favorite then
-		recipeArray.favorite = nil
-	end
-
-	FurC.UpdateGui()
-end
-
-local function scanRecipeIndices(recipeListIndex, recipeIndex)		-- returns recipeArray or nil, initialises
-
-	local itemLink = GetRecipeResultItemLink(recipeListIndex, recipeIndex, LINK_STYLE_BRACKETS)
-	if nil == itemLink or #itemLink == 0 or not IsItemLinkPlaceableFurniture(itemLink) then return end
-
-	local recipeKey = getItemId(itemLink)
-
-	local recipeArray 			= FurC.settings.data[recipeKey] or {}
-	recipeArray.origin 			= FURC_CRAFTING
-	recipeArray.version			= recipeArray.version or 2
-	recipeArray.recipeListIndex = recipeArray.recipeListIndex or recipeListIndex
-	recipeArray.recipeIndex 	= recipeArray.recipeIndex or recipeIndex
-
-	recipeArray.characters		= recipeArray.characters or {}
-
-
-
-	if GetRecipeInfo(recipeListIndex, recipeIndex) then
-		recipeArray.characters[getCurrentChar()] 	= true
-		FurC.settings.accountCharacters = FurC.settings.accountCharacters or {}
-		FurC.settings.accountCharacters[getCurrentChar()] = FurC.settings.accountCharacters[getCurrentChar()] or true
-	end
-
-
-	addDatabaseEntry(recipeKey, recipeArray)
-	return recipeArray
-
-end
-
-function FurC.TryCreateRecipeEntry(recipeListIndex, recipeIndex)	-- returns scanRecipeIndices, called from Events.lua
-	return scanRecipeIndices(recipeListIndex, recipeIndex)
-end
-
-function FurC.IsAccountKnown(recipeKey, recipeArray)
-	if recipeKey == nil and recipeArray == nil then return false end
-	recipeArray = recipeArray or FurC.settings.data[recipeKey]
-	return not (nil == recipeArray or nil == recipeArray.characters or NonContiguousCount(recipeArray.characters) == 0)
-end
-
-function FurC.CanCraft(recipeKey, recipeArray)
-	if recipeKey == nil  and recipeArray == nil then return false end
-	recipeArray = recipeArray or FurC.settings.data[recipeKey]
-	if FurC.IsAccountKnown(recipeKey, recipeArray) then
-		return recipeArray.characters[getCurrentChar()]
-	end
-	return false
-end
-
-function FurC.GetCraftingSkillType(recipeKey, recipeArray)
-
-	local itemLink 			= FurC.GetItemLink(recipeKey)
-	local craftingSkillType	= GetItemLinkCraftingSkillType(itemLink)
-
-	if 0 == craftingSkillType and recipeArray.blueprint then
-		craftingSkillType = GetItemLinkRecipeCraftingSkillType(FurC.GetItemLink(recipeArray.blueprint))
-	elseif 0 == craftingSkillType and recipeArray.recipeListIndex and recipeArray.recipeIndex then
-		_, _, _, _, _, _, craftingSkillType = GetRecipeInfo(recipeArray.recipeListIndex, recipeArray.recipeIndex)
-	end
-
-	return craftingSkillType
-end
-
-
-local function scanCharacter()
-	local listName, numRecipes
-	for recipeListIndex=1, GetNumRecipeLists() do
-		listName, numRecipes = GetRecipeListInfo(recipeListIndex)
-		for recipeIndex=1, numRecipes do
-			scanRecipeIndices(recipeListIndex, recipeIndex) --	returns true on success
-		end
-	end
-	p((GetString(SI_FURC_DEBUG_CHARSCANCOMPLETE)))
-end
-FurC.ScanCharacter = scanCharacter
-
-function FurC.RescanRumourRecipes()
-
-	local function rescan()
-		for itemId, recipeArray in pairs(FurC.settings.data) do
-			if recipeArray.source == FURC_RUMOUR then
-				local itemLink = recipeArray[itemLink]
-				if not FurC.RumourRecipes[itemLink] then
-					recipeArray.source = FURC_CRAFTING
-					recipeArray.origin = nil
-				end
-			end
-		end
-	end
-
-	task:Call(rescan)
-	:Then(FurC.UpdateGui)
-end
-
-local recipeArray
-local function scanFromFiles(shouldScanCharacter)
-	local function parseZoneData(zoneName, zoneData, versionNumber, origin)
-		for vendorName, vendorData in pairs(zoneData) do
-			for itemId, itemData in pairs(vendorData) do
-
-				recipeArray = parseFurnitureItem(FurC.GetItemLink(itemId), true)
-				if not recipeArray then
-						p("Error when scanning <<1>>", itemId)
-					else
-
-					recipeArray.origin			= origin
-					recipeArray.version			= versionNumber
-					addDatabaseEntry(itemId, recipeArray)
-				end
-
-			end
-		end
-	end
-
-	local function scanRecipeFile()
-		local recipeKey, recipeArray
-		local function scanArray(ary, versionNumber, origin)
-			if nil == ary then return end
-
-			for key, recipeId in ipairs(ary) do
-				local recipeLink = FurC.GetItemLink(recipeId)
-				local itemLink = GetItemLinkRecipeResultItemLink(recipeLink) or FurC.GetItemLink(recipeId)
-				recipeArray = FurC.Find(itemLink) or parseBlueprint(recipeLink) or parseFurnitureItem(itemLink)
-				local recipeListIndex, recipeIndex = GetItemLinkGrantedRecipeIndices(recipeLink)
-				if nil == recipeArray then
-					p("scanRecipeFile: error for <<1>> (ID was <<2>>)", recipeLink, recipeId)
-				else
-					recipeKey 					= getItemId(itemLink)
-					recipeArray.version 	 	= versionNumber
-					recipeArray.origin 			= origin
-					recipeArray.blueprint		= recipeId
-					addDatabaseEntry(recipeKey, recipeArray)
-				end
-			end
-		end
-
-		for versionNumber, versionData in pairs(FurC.Recipes) do
-			scanArray(versionData, versionNumber, FURC_CRAFTING)
-		end
-		for versionNumber, versionData in pairs(FurC.RollisRecipes) do
-			scanArray(versionData, versionNumber, FURC_CRAFTING)
-		end
-		for versionNumber, versionData in pairs(FurC.FaustinaRecipes) do
-			scanArray(versionData, versionNumber, FURC_CRAFTING)
-		end
-	end
-
-	local function scanRollis()
-		for versionNumber, versionData in pairs(FurC.Rollis) do
-			for itemId, itemSource in pairs(versionData) do
-				recipeArray = parseFurnitureItem(FurC.GetItemLink(recipeId), true)
-				if nil ~= recipeArray then
-					recipeArray.version = versionNumber
-					recipeArray.origin = FURC_ROLLIS
-					addDatabaseEntry(itemId, recipeArray)
-				end
-			end
-		end
-		for versionNumber, versionData in pairs(FurC.Faustina) do
-			for itemId, itemSource in pairs(versionData) do
-				recipeArray = parseFurnitureItem(FurC.GetItemLink(recipeId), true)
-				if nil ~= recipeArray then
-					recipeArray.version = versionNumber
-					recipeArray.origin = FURC_ROLLIS
-					addDatabaseEntry(itemId, recipeArray)
-				end
-			end
-		end
-	end
-
-	local function scanFestivalFiles()
-		for versionNumber, versionData in pairs(FurC.EventItems) do
-			for eventName, eventData in pairs(versionData) do
-				for eventItemSource, eventItemData in pairs(eventData) do
-					for itemId, _ in pairs(eventItemData) do
-						recipeArray             = {}
-						recipeArray.craftable 	= false
-						recipeArray.version 	= versionNumber
-						recipeArray.origin 		= FURC_FESTIVAL_DROP
-						addDatabaseEntry(itemId, recipeArray)
-					end
-				end
-			end
-		end
-	end
-
-	local function scanMiscItemFile()
-		for versionNumber, versionData in pairs(FurC.MiscItemSources) do
-			for origin, originData in pairs(versionData) do
-				for itemId, itemSource in pairs(originData) do
-					local itemLink = FurC.GetItemLink(itemId)
-					recipeArray = parseFurnitureItem(FurC.GetItemLink(itemId))
-					if nil ~= recipeArray then
-						recipeArray.version = versionNumber
-						recipeArray.origin  = origin
-						addDatabaseEntry(itemId, recipeArray)
-					else
-						p("scanMiscItemFile: Error when scanning <<1>> (<<2>>) -> <<3>>", itemLink, itemId, origin)
-					end
-				end
-			end
-		end
-	end
-
-	local function scanVendorFiles()
-
-		FurC.InitAchievementVendorList()
-		local recipeKey, recipeArray, itemSource
-
-		for versionNumber, versionData in pairs(FurC.AchievementVendors) do
-			for zoneName, zoneData in pairs(versionData) do
-				parseZoneData(zoneName, zoneData, versionNumber, FURC_VENDOR)
-			end
-		end
-
-		for versionNumber, vendorData in pairs(FurC.LuxuryFurnisher) do
-			for itemId, itemData in pairs(vendorData) do
-					 local recipeArray 			= {}
-
-					recipeArray.origin			= FURC_LUXURY
-					recipeArray.version			= versionNumber
-					addDatabaseEntry(itemId, recipeArray)
-			end
-		end
-
-		for versionNumber, versionData in pairs(FurC.PVP) do
-			for zoneName, zoneData in pairs(versionData) do
-				parseZoneData(zoneName, zoneData, versionNumber, FURC_PVP)
-			end
-		end
-	end
-
-	local function scanRumourRecipes()
-		for index, blueprintId in pairs(FurC.RumourRecipes) do
-			local blueprintLink = FurC.GetItemLink(blueprintId)
-			local itemLink = GetItemLinkRecipeResultItemLink(blueprintLink, LINK_STYLE_BRACKETS)
-			if #itemLink == 0 then itemLink = blueprintLink end
-			local itemId = getItemId(itemLink)
-			recipeArray = parseBlueprint(blueprintLink) or parseFurnitureItem(itemLink) or {}
-			if blueprintId ~= itemId then
-				recipeArray.blueprint = blueprintId
-			end
-			recipeArray.recipeListIndex, recipeArray.recipeIndex =  GetItemLinkGrantedRecipeIndices(blueprintLink)
-			recipeArray.origin = FURC_RUMOUR
-			recipeArray.verion = FURC_HOMESTEAD
-			addDatabaseEntry(itemId, recipeArray)
-		end
-	end
-	FurC.IsLoading(true)
-
-	task:Call(scanRollis)
-	:Then(scanRecipeFile)
-	:Then(scanVendorFiles)
-	:Then(scanRollis)
-	:Then(scanFestivalFiles)
-	:Then(scanMiscItemFile)
-	:Then(scanRumourRecipes)
-	:Then(
-	function()
-		if shouldScanCharacter then
-			scanCharacter()
-		else
-			startupMessage(GetString(SI_FURC_VERBOSE_STARTUP))
-		end
-	end)
-	:Then(FurC.UpdateGui)
-	startupMessage(GetString(SI_FURC_VERBOSE_DB_UPTODATE))
-
-end
-
-function FurC.ScanFromFiles(scanCharacterKnowledge)
-	return scanFromFiles(scanCharacterKnowledge)
-end
-
-local function getScanFromFiles()
-
-	if (FurC.settings.version < FurC.version) then
-		FurC.settings.version = FurC.version
-		return true
-	end
-
-	return FurC.settings.data == {}
-end
-
-local function getScanCharacter()
-	if nil == FurC.settings.accountCharacters[FurC.CharacterName] then
-		FurC.settings.accountCharacters[FurC.CharacterName] = false
-		return true
-	end
-end
-
-function FurC.ScanRecipes(shouldScanFiles, shouldScanCharacter)								-- returns database
-
-	shouldScanFiles = shouldScanFiles or getScanFromFiles()
-	shouldScanCharacter = (shouldScanCharacter or getScanCharacter())
-	if (shouldScanFiles) then
-		p(GetString(SI_FURC_VERBOSE_SCANNING_DATA_FILE))
-		scanFromFiles(shouldScanCharacter)
-	elseif (shouldScanCharacter) then
-		p(GetString(SI_FURC_VERBOSE_SCANNING_CHARS))
-		scanCharacter()
-	end
-end
-
-function FurC.GetItemDescription(recipeKey, recipeArray, stripColor)
-	recipeArray = recipeArray or FurC.Find(recipeKey, recipeArray)
-	if not recipeArray then return "" end
-	local origin = recipeArray.origin
-	if origin == FURC_CRAFTING or origin == FURC_WRIT_VENDOR then
-		return FurC.GetMats(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_ROLLIS then
-		return FurC.getRollisSource(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_LUXURY then
-		return FurC.getLuxurySource(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_GUILDSTORE then
-		return FURC_STRING_TRADINGHOUSE
-	elseif origin == FURC_VENDOR then
-		return FurC.getAchievementVendorSource(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_FESTIVAL_DROP then
-		return FurC.getEventDropSource(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_PVP then
-		return FurC.getPvpSource(recipeKey, recipeArray, stripColor)
-	elseif origin == FURC_RUMOUR then
-		return FurC.getRumourSource(recipeKey, recipeArray, stripColor)
-	else
-		itemSource = FurC.GetMiscItemSource(recipeKey, recipeArray, stripColor)
-	end
-	return itemSource or GetString(SI_FURC_ITEMSOURCE_EMPTY)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCDataParser.lua b/FurnitureCatalogue/FurCDataParser.lua
deleted file mode 100644
index 37a60de..0000000
--- a/FurnitureCatalogue/FurCDataParser.lua
+++ /dev/null
@@ -1,81 +0,0 @@
-local db		= FurnitureCatalogue.settings["data"]
-
-local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-
-function FurC.PrintCraftingStation(itemId, recipeArray)
-	local craftingType = FurC.GetCraftingSkillType(itemId, recipeArray)
-	if not craftingType or not GetCraftingSkillName(craftingType) then return "" end
-	return string.format(" (%s)", GetCraftingSkillName(craftingType))
-end
-
-local function prefillChatBox(output, refresh)
-
-	output = zo_strformat(output)
-	if nil == output or FURC_EMPTY_STRING == output then return end
-	local editControl = CHAT_SYSTEM.textEntry.editControl
-
-	if not refresh then
-		output = editControl:GetText() .. output
-	elseif CHAT_SYSTEM.textEntry.editControl:HasFocus() then
-		editControl:Clear()
-	end
-
-	-- trying to get rid of that double click error...
-	if IsProtectedFunction("StartChatInput") then
-		CallSecureProtected("StartChatInput", output)
-	else
-		StartChatInput(output)
-	end
-end
-
-function FurC.ToChat(output, refresh)
-	if type(output) == "number" then
-		output = FurC.GetItemLink(output)
-	end
-	prefillChatBox(output, refresh)
-end
-
-local function stripColor(aString)
-	if nil == aString then return "" end
-	return aString:gsub("|%l%l%d%d%d%d%d", ""):gsub("|%l%l%d%l%l%d%d", ""):gsub("|c25C31E", ""):gsub("|r", "")
-end
-
-local function getNameFromEntry(recipeArray)
-	if nil == recipeArray then return "" end
-	if nil == recipeArray.itemName and nil ~= recipeArray.itemId then
-		recipeArray.itemName = GetItemLinkName(recipeArray.itemId)
-	end
-	return recipeArray.itemName or ""
-end
-
-function FurC.PrintSource(itemLink, recipeArray)
-	if nil == recipeArray then recipeArray = FurC.Find(itemLink) end
-	if nil == recipeArray then return end
-
-	local source = FurC.GetItemDescription(FurC.GetItemId(itemLink), recipeArray, true)
-	local output = string.format("%s: %s", itemLink, source)
-	if recipeArray.achievement and recipeArray.achievement ~= "" then
-		output = string.format("%s, requires %s", output, recipeArray.achievement)
-	end
-
-	FurC.ToChat(output, true)
-end
-
-function FurC.FindByName(namePart)
-	local ret = {}
-	local itemName = ""
-	-- d(zo_strformat("Looking for <<1>>... \n", namePart))
-	for itemId, recipeArray in pairs(FurC.settings["data"]) do
-		-- d(zo_strformat("<<1>>: <<2>> (<<3>>)", recipeArray.itemId, getNameFromEntry(recipeArray), string.match(string.lower(getNameFromEntry(recipeArray)), string.lower(namePart))))
-		if nil ~= string.match(string.lower(getNameFromEntry(recipeArray)), string.lower(namePart)) then
-			table.insert(ret, recipeArray)
-		end
-	end
-	return ret
-end
-
-local function capitalise(str)
-	str = str:gsub("^(%l)(%w*)", function(a,b) return string.upper(a)..b end)
-	return str
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCDatabaseQuery.lua b/FurnitureCatalogue/FurCDatabaseQuery.lua
deleted file mode 100644
index 7a5c1e3..0000000
--- a/FurnitureCatalogue/FurCDatabaseQuery.lua
+++ /dev/null
@@ -1,194 +0,0 @@
-local FurC = FurC
-
-local vendorColor 	= "d68957"
-local goldColor 	= "e5da40"
-local apColor 		= "25C31E"
-local tvColor		= "5EA4FF"
-local voucherColor	= "82BCFF"
-local p 			= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-local function colorise(str, col, ret)
-	str = tostring(str)
-	if str:find("%d000$") then str = str:gsub("000$", "k") end
-	if ret then return str end
-	return string.format("|c%s%s|r", col, str)
-end
-
-local function getRollisSource(recipeKey, recipeArray)
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-	if not recipeArray then return end
-
-	local versionData = FurC.Rollis[recipeArray.version]
-
-	if nil ~= versionData and nil ~= versionData[recipeKey] then
-		local itemPrice = zo_strformat(GetString(SI_FURC_STRING_FOR_VOUCHERS), colorise(versionData[recipeKey], voucherColor))
-		return zo_strformat(GetString(SI_FURC_STRING_ROLLIS), itemPrice)
-	end
-
-	versionData = FurC.Faustina[recipeArray.version]
-	if nil ~= versionData and nil ~= versionData[recipeKey] then
-		local itemPrice = zo_strformat(GetString(SI_FURC_STRING_FOR_VOUCHERS), colorise(versionData[recipeKey], voucherColor))
-		return zo_strformat(GetString(SI_FURC_STRING_FAUSTINA), itemPrice)
-	end
-
-	return GetString(SI_FURC_STRING_VOUCHER_VENDOR)
-end
-FurC.getRollisSource = getRollisSource
-
-
-local function getLuxurySource(recipeKey, recipeArray, stripColor)
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-	if not recipeArray then return end
-	local versionData = FurC.LuxuryFurnisher[recipeArray.version]
-	if not versionData then return GetString(SI_FURC_STRING_FETCHER) end
-
-	local itemData = versionData[recipeKey]
-
-	if nil ~= itemData then
-		local weekendString = (nil == itemData.itemDate and "") or zo_strformat(GetString(SI_FURC_STRING_WEEKEND_AROUND), itemData.itemDate)
-		return zo_strformat(
-			GetString(SI_FURC_STRING_WASSOLDBY),
-			colorise(GetString(SI_FURC_STRING_ASSHOLE), vendorColor, stripColor),
-			colorise(GetString(SI_FURC_STRING_HC), vendorColor, stripColor),
-			colorise(itemData.itemPrice, goldColor, stripColor),
-			weekendString
-		)
-	end
-	return GetString(SI_FURC_STRING_FETCHER)
-end
-FurC.getLuxurySource = getLuxurySource
-
-local function getPvpSource(recipeKey, recipeArray, stripColor)
-
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-	if not recipeArray then return end
-	local versionData = FurC.PVP[recipeArray.version]
-	if not versionData then return "getPvpSource: nil" end
-
-	for vendorName, vendorData in pairs(versionData) do
-		for locationName, locationData in pairs(vendorData) do
-			if nil ~= locationData[recipeKey] then
-				return zo_strformat(
-					GetString(SI_FURC_STRING_VENDOR),
-					colorise(vendorName, 	vendorColor, stripColor),
-					colorise(locationName, 	vendorColor, stripColor),
-					colorise(locationData[recipeKey].itemPrice, 	apColor, stripColor),
-					GetString(SI_FURC_STRING_AP)
-				)
-			end
-		end
-	end
-
-	return "getPvpSource"
-
-end
-FurC.getPvpSource = getPvpSource
-
-local function getAchievementVendorSource(recipeKey, recipeArray, stripColor)
-
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-	if not recipeArray then return end
-	local versionData = FurC.AchievementVendors[recipeArray.version]
-	if not versionData then
-		return zo_strformat("getAchievementVendorSource: failed version lookup for ID <<1>> [<<2>>]", recipeKey, recipeArray.version)
-	end
-
-	local databaseEntry
-
-	for zoneName, zoneData in pairs(versionData) do
-		for vendorName, vendorData in pairs(zoneData) do
-			databaseEntry = vendorData[recipeKey]
-			if nil ~= databaseEntry then
-				return zo_strformat(
-					GetString(SI_FURC_STRING_VENDOR),
-					colorise(vendorName, 				vendorColor, stripColor),
-					colorise(zoneName, 					vendorColor, stripColor),
-					colorise(databaseEntry.itemPrice, 	goldColor, 	 stripColor),
-					""
-				)
-			end
-		end
-	end
-	return zo_strformat("getAchievementVendorSource, found version data but no item data for <<1>> ", recipeKey)
-end
-FurC.getAchievementVendorSource = getAchievementVendorSource
-
-local function getEventDropSource(recipeKey, recipeArray, stripColor)
-
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-	if not recipeArray then return end
-	local versionData = FurC.EventItems[recipeArray.version]
-	local itemPriceString = "getEventDropSource: couldn't find " .. tostring(recipeKey)
-	if not versionData then
-		return itemPriceString
-	end
-	for versionNumber, versionData in pairs(FurC.EventItems) do
-			for eventName, eventData in pairs(versionData) do
-				for eventItemSource, eventSourceData in pairs(eventData) do
-					if eventSourceData[recipeKey] then
-						itemPriceString = zo_strformat(
-							GetString(SI_FURC_FESTIVAL_DROP),
-							colorise(eventName, 			vendorColor, stripColor),
-							colorise(eventItemSource, 		vendorColor, stripColor)
-						)
-						local additionalsource = tostring(eventSourceData[recipeKey]) or ""
-						if #additionalsource > 4 then
-							itemPriceString = itemPriceString .. "\n" .. additionalsource
-						end
-						return itemPriceString
-					end
-				end
-			end
-		end
-
-	return itemPriceString
-end
-FurC.getEventDropSource = getEventDropSource
-
-function FurC.GetMiscItemSource(recipeKey, recipeArray)
-	if not recipeArray or not recipeArray.version or not recipeArray.origin then return end
-
-	if recipeArray.origin == FURC_RUMOUR then
-		return FurC.getRumourSource(recipeKey, recipeArray)
-	end
-
-	local versionFiles = FurC.MiscItemSources[recipeArray.version]
-	if not versionFiles then return end
-	local originData = versionFiles[recipeArray.origin]
-	if nil == originData then return end
-	return originData[recipeKey]
-end
-
-local function getRecipeSource(recipeKey, recipeArray)
-	if nil == recipeKey and nil == recipeArray then return end
-	if nil == FurC.RecipeSources then return end
-	recipeArray = recipeArray or FurC.Find(recipeKey)
-
-	recipeKey = recipeArray.blueprint or recipeKey
-
-	return (recipeArray.origin == FURC_RUMOUR and FurC.getRumourSource(recipeKey, recipeArray)) or FurC.RecipeSources[recipeKey]
-end
-FurC.getRecipeSource = getRecipeSource
-
-function FurC.getRumourSource(recipeKey, recipeArray)
-	return (recipeArray.blueprint and GetString(SI_FURC_RUMOUR_SOURCE_RECIPE)) or GetString(SI_FURC_RUMOUR_SOURCE_ITEM)
-end
-
-function FurC.GetCrafterList(itemLink, recipeArray)
-	if nil == recipeArray and nil == itemLink then return end
-	recipeArray = recipeArray or FurC.Find(itemLink)
-	if nil == recipeArray then
-		d("")
-		d(recipeArray)
-		zo_strformat("FurC.GetCrafterList called for a non-craftable")
-	end
-
-	if nil == recipeArray.characters or NonContiguousCount(recipeArray.characters) == 0 then
-		return GetString(SI_FURC_STRING_CANNOT_CRAFT)
-	end
-	local ret = GetString(SI_FURC_STRING_CRAFTABLE_BY)
-	for characterName, characterKnowledge in pairs(recipeArray.characters) do
-		ret = string.format("%s %s, ", ret, characterName)
-	end
-	return ret:sub(0, -3)
-end
diff --git a/FurnitureCatalogue/FurCEvents.lua b/FurnitureCatalogue/FurCEvents.lua
deleted file mode 100644
index 7dcc543..0000000
--- a/FurnitureCatalogue/FurCEvents.lua
+++ /dev/null
@@ -1,85 +0,0 @@
-local em	= EVENT_MANAGER
-local p 	= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-local function onRecipeLearned(eventCode, recipeListIndex, recipeIndex)
-	p(FURC_STRING_RECIPELEARNED, GetRecipeResultItemLink(recipeListIndex, recipeIndex, LINK_STYLE_BRACKETS), recipeListIndex, recipeIndex)
-	FurC.TryCreateRecipeEntry(recipeListIndex, recipeIndex)
-	FurC.UpdateGui()
-end
-
-local wm = WINDOW_MANAGER
-
-local function createIcon(control)
-	local icon = wm:CreateControlFromVirtual(control:GetName().."FurCIcon", control, "FurC_SlotIconKnownYes")
-	icon:SetAnchor(BOTTOMLEFT, control:GetNamedChild("Button"), BOTTOMLEFT, -15, -10)
-	icon:SetHidden(true)
-	control.icon = icon
-	return icon
-end
-
-local function getItemKnowledge(itemLink)
-	local recipeArray = FurC.Find(itemLink)
-	if FurC.GetUseInventoryIconsOnChar() then
-		return FurC.CanCraft(itemId, recipeArray)
-	end
-	return FurC.IsAccountKnown(itemId, recipeArray)
-
-end
-
-local function updateItemInInventory(control)
-	if 'listSlot' ~= control.slotControlType then return end
-	local icon = control.icon or createIcon(control)
-	local data = control.dataEntry.data
-
-	local bagId = data.bagId
-	local slotId = data.slotIndex
-	local itemLink = GetItemLink(bagId, slotId)
-
-	if not IsItemLinkFurnitureRecipe(itemLink) then
-		icon:SetHidden(true)
-		return
-	end
-	local known = getItemKnowledge(itemLink)
-
-	local hidden = known and FurC.GetHideKnownInventoryIcons() or (not FurC.GetUseInventoryIcons())
-	icon:SetHidden(hidden)
-
-	local templateName = "FurC_SlotIconKnown" .. ((known and "Yes") or "No")
-
-	WINDOW_MANAGER:ApplyTemplateToControl(icon, templateName)
-
-end
-
-function FurC.SetupInventoryRecipeIcons(calledRecursively)
-	if nil ~= ResearchAssistant then return end
-	local function isValidBag(bagId, inventory)
-		if bagId == BAG_WORN 				then return false end
-		if bagId == BAG_VIRTUAL 			then return false end
-		local listView = inventory.listView
-		if not listView 					then return false end
-		if not listView.dataTypes 			then return false end
-		if not listView.dataTypes[1] 		then return false end
-		return nil ~= listView.dataTypes[1].setupCallback
-	end
-
-	local inventories = PLAYER_INVENTORY.inventories
-	if not inventories and not calledRecursively then
-		return zo_callLater(function() FurC.SetupInventoryRecipeIcons(true) end, 1000)
-	end
-	-- ruthlessly stolen from Dryzler's Inventory, then tweaked
-	for bagId, inventory in pairs(inventories) do
-		if isValidBag(bagId, inventory) then
-
-			ZO_PreHook( inventory.listView.dataTypes[1], "setupCallback",
-				function(control, slot) updateItemInInventory(control) end
-			)
-
-		end
-	end
-end
-
-
-
-function FurC.RegisterEvents()
-	em:RegisterForEvent("FurnitureCatalogue", EVENT_RECIPE_LEARNED, onRecipeLearned)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCFilter.lua b/FurnitureCatalogue/FurCFilter.lua
deleted file mode 100644
index edbd444..0000000
--- a/FurnitureCatalogue/FurCFilter.lua
+++ /dev/null
@@ -1,180 +0,0 @@
-local p 						= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-local searchString 				= ""
-local dropdownChoiceVersion		= 1
-local dropdownTextVersion		= "All"
-local ddSource		= 1
-local dropdownTextSource		= "All"
-local dropdownChoiceCharacter	= 1
-local ddTextCharacter			= "Accountwide"
-local qualityFilter 			= {}
-local craftingTypeFilter 		= {}
-
-local hideBooks 				= false
-local hideRumours				= false
-local hideCrownStore			= false
-local mergeLuxuryAndSales		= false
-local filterAllOnTextSearch		= false
-
-local sourceIndices
-
-local recipeArray, itemId, itemLink, itemType, sItemType, itemName, recipeIndex, recipeListIndex
-
-function FurC.SetFilter(useDefaults, skipRefresh)
-	ClearTooltip(InformationTooltip)
-	sourceIndices 					= FurC.SourceIndices
-	searchString 					= FurC.GetSearchFilter()
-
-	if useDefaults then
-		dropdownChoiceVersion		= tonumber(FurC.GetDefaultDropdownChoice("Version"))
-		ddSource					= FurC.GetDefaultDropdownChoice("Source")
-		dropdownChoiceCharacter 	= FurC.GetDefaultDropdownChoice("Character")
-	else
-		dropdownChoiceVersion		= tonumber(FurC.GetDropdownChoice("Version"))
-		ddSource					= FurC.GetDropdownChoice("Source")
-		dropdownChoiceCharacter 	= FurC.GetDropdownChoice("Character")
-	end
-
-	-- we need to hold the text here, in case it's not "All"
-	ddTextCharacter				= FurC.GetDropdownChoiceTextual("Character")
-
-	qualityFilter 				= FurC.GetFilterQuality()
-	craftingTypeFilter			= FurC.GetFilterCraftingType()
-	hideBooks					= FurC.GetHideBooks()
-	hideRumours					= FurC.GetHideRumourRecipes()
-	mergeLuxuryAndSales 		= FurC.GetMergeLuxuryAndSales()
-	hideCrownStore 				= FurC.GetHideCrownStoreItems()
-
-    -- ignore filtered items when no dropdown filter is set and there's a text search?
-    filterAllOnTextSearch       = FurC.GetFilterAllOnText() and #searchString > 0 and
-                                    FURC_NONE == ddSource and
-                                    FURC_NONE == dropdownChoiceVersion and
-                                    FURC_NONE == dropdownChoiceCharacter
-
-	if not skipRefresh then
-		zo_callLater(FurC.UpdateLineVisibility, 200)
-	end
-end
-
-function FurC.InitFilters()
-	FurC.SetFilterCraftingType(0)
-	FurC.SetFilterQuality(0)
-	FurC.SetDropdownChoice("Source", FurC.GetDefaultDropdownChoiceText("Source"), FurC.GetDefaultDropdownChoice("Source"))
-	FurC.SetDropdownChoice("Character", FurC.GetDefaultDropdownChoiceText("Character"), FurC.GetDefaultDropdownChoice("Character"))
-	FurC.SetDropdownChoice("Version", FurC.GetDefaultDropdownChoiceText("Version"), FurC.GetDefaultDropdownChoice("Version"))
-end
-
-
-local function isRecipeArrayKnown()
-	if nil == recipeArray or nil == recipeArray.characters then return end
-	 if dropdownChoiceCharacter == 1 then
-		for name, value in pairs(recipeArray.characters) do
-			if (value) then return true end
-		end
-	 else
-		return recipeArray.characters[ddTextCharacter]
-	end
-end
-
--- Version: All, Homestead, Morrowind
-local function matchVersionDropdown()
-	return dropdownChoiceVersion == 1 or recipeArray.version == dropdownChoiceVersion
-end
-
-local function shouldBeHidden()
-	return (ddSource ~= FURC_RUMOUR and recipeArray.origin == FURC_RUMOUR and hideRumours) or
-	(ddSource ~= FURC_CROWN and recipeArray.origin == FURC_CROWN and hideCrownStore)
-end
-
--- Source: All, All (craftable), Craftable (known), craftable (unknown), purchaseable
-local function matchSourceDropdown()
-
-	-- "All", don't care
-	if FURC_NONE						== ddSource then  -- All
-		return true
-	elseif FURC_CRAFTING_KNOWN 			== ddSource then
-		return recipeArray.origin 		== FURC_CRAFTING and isRecipeArrayKnown(recipeArray)
-	elseif FURC_CRAFTING_UNKNOWN 		== ddSource then
-		return recipeArray.origin 		== FURC_CRAFTING and not isRecipeArrayKnown(recipeArray)
-	elseif FURC_FAVE 					== ddSource then
-		return recipeArray.favorite
-	elseif FURC_VENDOR 					== ddSource then
-		return (recipeArray.origin 		== FURC_VENDOR or (mergeLuxuryAndSales and recipeArray.origin == FURC_LUXURY))
-	elseif FURC_RUMOUR 					== ddSource then
-		return recipeArray.origin 		== FURC_RUMOUR
-	elseif FURC_WRIT_VENDOR 			== ddSource then
-		return recipeArray.origin 		== FURC_ROLLIS
-	elseif FURC_OTHER					== ddSource then
-		return (
-			recipeArray.origin == FURC_FESTIVAL_DROP or
-			recipeArray.origin == FURC_DROP 	     or
-			recipeArray.origin == FURC_FISHING 	     or
-			recipeArray.origin == FURC_JUSTICE 	     or
-			recipeArray.origin == FURC_GUILDSTORE
-		)
-	else return recipeArray.origin  == ddSource end
-
-	-- we're checking character knowledge
-	return 1 == dropdownChoiceCharacter or recipeArray.origin == FURC_CRAFTING
-
-end
-
-local function matchDropdownFilter()
-	return matchVersionDropdown() and matchSourceDropdown()
-end
-
-local function matchSearchString()
-	if #searchString == 0 then return true end
-    local caseSensitive = nil ~= string.match(searchString, "%u")
-    local itemName = GetItemLinkName(itemLink)
-    local matchme = (caseSensitive and itemName) or string.lower(itemName)
-    return string.match(matchme, searchString)
-end
-
-local function matchCraftingTypeFilter()
-	if not recipeArray.origin == FURC_CRAFTING then return false end
-	local filterType = FurC.GetCraftingSkillType(itemId, recipeArray)
-	return filterType and filterType > 0 and craftingTypeFilter[filterType]
-end
-local function matchQualityFilter()
-	return qualityFilter[GetItemLinkQuality(itemLink)]
-end
-
-local function filterBooks(itemId, recipeArray)
-	if not (hideBooks or filterAllOnTextSearch and FurC.GetFilterAllOnTextNoBooks()) then return false end
-	local versionData = FurC.Books[recipeArray.version]
-	if nil == versionData then return end
-	return nil ~= versionData[itemId]
-end
-
-function FurC.MatchFilter(currentItemId, currentRecipeArray)
-
-	itemId = currentItemId
-	itemLink = FurC.GetItemLink(itemId)
-	recipeArray = currentRecipeArray or FurC.Find(itemLink)
-	itemType, sItemType = GetItemLinkItemType(itemLink)
-
-    if  filterBooks(itemId, recipeArray)			                        then return false end
-
-
-    if recipeArray.origin == FURC_RUMOUR then
-        if filterAllOnTextSearch and not FurC.GetFilterAllOnTextNoRumour() then return false end
-        if (hideRumours and recipeArray.origin == FURC_RUMOUR) then return false end
-    end
-
-    if recipeArray.origin == FURC_CROWN then
-        if filterAllOnTextSearch and FurC.GetFilterAllOnTextNoCrown() then return false end
-        if hideCrownStore and ddSource ~= FURC_CROWN then return false end
-    end
-
-    if not (filterAllOnTextSearch or  matchDropdownFilter()) then return false end
-
-
-     if not matchSearchString                                                then return false end
-    if not matchSearchString() 												    then return false end
-	if not (FurC.settings.filterCraftingTypeAll or matchCraftingTypeFilter())	then return false end
-	if not (FurC.settings.filterQualityAll 		or matchQualityFilter())		then return false end
-
-	return true
-
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCGui.lua b/FurnitureCatalogue/FurCGui.lua
deleted file mode 100644
index 85ee73e..0000000
--- a/FurnitureCatalogue/FurCGui.lua
+++ /dev/null
@@ -1,481 +0,0 @@
-FurC.SlotTemplate		= "FurC_SlotTemplate"
-FurC.KnowledgeFilter 	= "All (Accountwide)"
-FurC.SearchString 		= ""
-FurC.ScrollSortUp 		= true
-local checkWasUpdated	= false
-local task 				= LibStub("LibAsync"):Create("FurnitureCatalogue_updateLineVisibility")
-local otherTask 		= LibStub("LibAsync"):Create("FurnitureCatalogue_ToggleGui")
-local async 			= LibStub("LibAsync"):Create("FurnitureCatalogue_forLoop")
-
-
-local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-local sortTable = FurC.SortTable
-
-local function sort(myTable)
-	local sortName, sortDirection = FurC.GetSortParams()
-	sortName = sortName or "itemName"
-	local sortUp = ((ZO_SORT_ORDER_UP and sortDirection == "up") or ZO_SORT_ORDER_DOWN)
-	return sortTable(myTable, sortName, sortUp)
-end
-
-local headerHeight = FurCGui_Header:GetHeight()
-
-function FurC.CalculateMaxLines()
-	FurCGui_ListHolder:SetHeight(FurCGui:GetHeight() - headerHeight)
-	FurCGui_ListHolder.maxLines = math.floor((FurCGui_ListHolder:GetHeight()) / FurCGui_ListHolder.lines[1]:GetHeight() )
-	return FurCGui_ListHolder.maxLines
-end
-
-local function updateLineVisibility()
-
-
-	local function fillLine(curLine, curData, lineIndex)
-		if nil == curLine then return end
-
-		local dataLines = FurCGui_ListHolder.dataLines
-		local maxLines = FurCGui_ListHolder.maxLines
-
-		local hidden = lineIndex > #dataLines or lineIndex > maxLines
-		curLine:SetHidden(hidden)
-		if nil == curData or curLine:IsHidden() then
-			curLine.itemLink = ""
-			curLine.itemId 	 = 0
-			curLine.icon:SetTexture(nil)
-			curLine.icon:SetAlpha(0)
-			curLine.text:SetText("")
-			curLine.mats:SetText("")
-		else
-			curLine.itemLink 	= curData.itemLink
-			curLine.itemId 	 	= curData.itemId
-			curLine.icon:SetTexture(GetItemLinkIcon(curData.itemLink))
-			curLine.icon:SetAlpha(1)
-			local text 			=  curData.itemLink:gsub("H1", "H0")
-			curLine.text:SetText(((curData.favorite and "* ") or "").. text)
-			local mats = FurC.GetItemDescription(curData.itemId, curData)
-			curLine.mats:SetText(mats)
-		end
-	end
-
-	local isEmpty = #FurCGui_ListHolder.dataLines == 0
-
-	FurCGui_ListHolder:SetHidden(	isEmpty)
-	FurCGui_Empty:SetHidden(		not	isEmpty)
-
-	if isEmpty then return end
-
-	FurC.CalculateMaxLines()
-
-	task:Call(function()
-		local maxLines = FurCGui_ListHolder.maxLines
-		local dataLines = FurCGui_ListHolder.dataLines
-
-		local offset =	FurCGui_ListHolder_Slider:GetValue()
-		if offset > #dataLines then offset = 0 end
-		FurCGui_ListHolder_Slider:SetValue(offset)
-
-		local curLine, curData
-
-		for i=1, FurCGui_ListHolder:GetNumChildren() do
-			curLine = FurCGui_ListHolder.lines[i]
-			curData = FurCGui_ListHolder.dataLines[offset + i]
-			fillLine(curLine, curData, i)
-		end
-		FurCGui_ListHolder_Slider:SetMinMax(0, #dataLines)
-
-	end)
-end
-FurC.UpdateLineVisibility =	updateLineVisibility
-
-function FurC.IsLoading(isBuffering)
-
-	FurCGui_Wait:SetHidden(not isBuffering)
-
-	local isEmpty = #FurCGui_ListHolder.dataLines == 0
-
-	FurCGui_ListHolder:SetHidden(isBuffering or isEmpty)
-	FurCGui_Empty:SetHidden(isBuffering or not isEmpty)
-
-end
-
--- fill the shown item list with items that match current filter(s)
-local function updateScrollDataLinesData()
-	local dataLines = {}
-	task:Call(function()
-		local index = 0
-
-		data = FurC.settings.data
-
-		local itemLink
-		 -- async:For(pairs(data)):Do( function(itemId, recipeArray)
-		for itemId, recipeArray in pairs(data) do
-			if FurC.MatchFilter(itemId, recipeArray) then
-				itemLink = FurC.GetItemLink(itemId)
-				if itemLink then
-					tempDataLine 			= ZO_DeepTableCopy({}, recipeArray)
-					tempDataLine.itemId		= itemId
-					tempDataLine.itemLink	= itemLink
-					tempDataLine.itemName	= GetItemLinkName(itemLink)
-					table.insert(dataLines, tempDataLine)
-				end
-			end
-		 end
-		 -- end)
-
-		end)
-	:Then(function()
-		dataLines = sort(dataLines)
-		FurCGui_ListHolder.dataLines = dataLines
-		FurC_RecipeCount:SetText(#dataLines)
-	end)
-
-end
-
-
-function FurC.UpdateGui(useDefaults)
-	if FurCGui:IsHidden() then return end
-
-	otherTask:Call(function()
-
-		FurC.IsLoading(true)
-		FurC.LastFilter = useDefaults
-		FurC.SetFilter(useDefaults, true)
-	end)
-	:Then(updateScrollDataLinesData)
-	:Then(function()  zo_callLater(function()
-
-		FurC.IsLoading(false)
-		updateLineVisibility()
-
-	end, 200) end)
-end
-
-function FurC.UpdateInventoryScroll()
-	local index = 0
-	FurCGui_ListHolder.dataOffset = FurCGui_ListHolder.dataOffset or 0
-	FurCGui_ListHolder.dataOffset = math.max(FurCGui_ListHolder.dataOffset, 0)
-
-	FurC.CalculateMaxLines()
-
-	local total = #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines
-	if total > 0 then
-		FurCGui_ListHolder_Slider:SetMinMax(0, total)
-	end
-
-	updateLineVisibility()
-end
-
-function FurC.SetLineHeight(applyTemplate)
-	local curLine
-	local size = FurC.GetFontSize()
-
-	local nameFont = string.format("$(%s)|$(KB_%s)|soft-shadow-thin", (FurC.GetTinyUi() and "MEDIUM_FONT") or "BOLD_FONT", size)
-	local matsFont = string.format("$(MEDIUM_FONT)|$(KB_%s)|soft-shadow-thin", size)
-
-	for i = 1, #FurCGui_ListHolder.lines do
-		curLine = FurCGui_ListHolder.lines[i]
-		if applyTemplate then
-			WINDOW_MANAGER:ApplyTemplateToControl(curLine, FurC.SlotTemplate)
-		end
-		curLine:GetNamedChild("Name"):SetFont(nameFont)
-		curLine:GetNamedChild("Mats"):SetFont(matsFont)
-		curLine:SetHeight( size + (FurC.GetTinyUi() and 8 or 20))
-	end
-	FurC.CalculateMaxLines()
-end
-
-function FurC.ApplyLineTemplate()
-
-	local function resizeDropdowns(controlSize)
-		local controlList = {
-			[1] = FurC_DropdownSource,
-			[2] = FurC_DropdownCharacter,
-			[3] = FurC_DropdownVersion
-		}
-		for _, control in pairs(controlList) do
-			control:SetWidth(controlSize)
-		end
-		FurC_Search:SetWidth(controlSize-19)
-	end
-	if FurC.GetTinyUi() then
-		FurC.SlotTemplate = "FurC_SlotTemplateTiny"
-		resizeDropdowns(230) -- first column width: 230
-		FurCGui_Header_SortBar_Quality:ClearAnchors()
-		FurCGui_Header_SortBar_Quality:SetAnchor(TOPLEFT, FurCGui_Header_SortBar_Name, TOPRIGHT, -82)
-	else
-		FurC.SlotTemplate = "FurC_SlotTemplate"
-		resizeDropdowns(300) -- first column width: 280
-		FurCGui_Header_SortBar_Quality:ClearAnchors()
-		FurCGui_Header_SortBar_Quality:SetAnchor(TOPLEFT, FurCGui_Header_SortBar_Name, TOPRIGHT, 0)
-	end
-
-	FurC.SetLineHeight(true)
-
-	local minWidth 	= 2*(FurC_DropdownCharacter:GetWidth()) + FurC_TypeFilter:GetWidth() + 40
-	local minHeight = 2*FurCGui_Header:GetHeight()
-	FurCGui:SetDimensionConstraints(minWidth, minHeight)
-
-	task:Call(function() updateLineVisibility() end)
-end
-
-local addedDropdownCharacterNames = {}
-
-local function createGui()
-
-	local function createInventoryScroll()
-		-- FurC.DebugOut("CreateInventoryScroll")
-
-		local function createLine(i, predecessor)
-
-			predecessor = predecessor or FurCGui_ListHolder
-
-			local line = WINDOW_MANAGER:CreateControlFromVirtual("FurC_ListItem_".. i, FurCGui_ListHolder, FurC.SlotTemplate)
-			line.icon 	= line:GetNamedChild("Button"):GetNamedChild("Icon")
-			line.text 	= line:GetNamedChild("Name")
-			line.mats 	= line:GetNamedChild("Mats")
-
-			line:SetHidden(false)
-			line:SetMouseEnabled(true)
-
-			if i == 1 then
-				line:SetAnchor(TOPLEFT, FurCGui_ListHolder, TOPLEFT, 0, 4)
-				line:SetAnchor(TOPRIGHT, FurCGui_ListHolder, TOPRIGHT, 0, 0)
-			else
-				line:SetAnchor(TOPLEFT, predecessor, BOTTOMLEFT, 	0, 0)
-				line:SetAnchor(TOPRIGHT, predecessor, BOTTOMRIGHT, 	0, 0)
-			end
-			return line
-		end
-
-		FurCGui_ListHolder.dataOffset = 0
-		FurCGui_ListHolder.maxLines = 60
-		FurCGui_ListHolder.dataLines = {}
-		FurCGui_ListHolder.lines = {}
-		FurCGui_ListHolder.NameSort = FurCGui_Header_SortBar:GetNamedChild("_Name")
-		FurCGui_ListHolder.NameSort.icon = FurCGui_ListHolder.NameSort:GetNamedChild("_Button")
-		FurCGui_ListHolder.QualitySort = FurCGui_Header_SortBar:GetNamedChild("_Quality")
-		FurCGui_ListHolder.QualitySort.icon = FurCGui_ListHolder.QualitySort:GetNamedChild("_Button")
-
-		--local width = 250 -- FurCGui_ListHolder:GetWidth()
-		local text = "       No Collected Data"
-
-		for i=1, FurCGui_ListHolder.maxLines do
-			FurCGui_ListHolder.lines[i] = createLine(i, predecessor)
-			predecessor = FurCGui_ListHolder.lines[i]
-		end
-
-		-- setup slider
-		FurCGui_ListHolder_Slider:SetMinMax(0, #FurCGui_ListHolder.dataLines - FurCGui_ListHolder.maxLines)
-
-		return FurCGui_ListHolder.lines
-	end
-
-	local function createQualityFilters()
-		local buttons = {}
-		local quality = 0
-		local function createQualityFilter(name, color, tooltip)
-			local parent 		= FurC_QualityFilter
-
-			local predecessor 	= buttons[#buttons] or parent
-			local controlType	= "FurC_QualityFilterButton"
-
-			local button 		= WINDOW_MANAGER:CreateControlFromVirtual(parent:GetName()..name, parent, controlType)
-			local ctrlName		= string.lower(name)
-			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_up.dds", 		ctrlName))
-			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_over.dds", 	ctrlName))
-			button:SetNormalTexture(	string.format("FurnitureCatalogue/textures/%s_down.dds", 	ctrlName))
-			button.quality 		= quality
-			button.tooltip 		= tooltip
-
-
-			local otherAnchor 		= ((predecessor == parent) and LEFT) or RIGHT
-			local xOffset		= ((predecessor == parent) and 0) or 6
-			button:SetAnchor(LEFT, predecessor, otherAnchor, xOffset)
-			quality = quality +1
-
-			return button
-
-		end
-
-
-		buttons[quality+1]	= createQualityFilter("All", 		nil, 					"All Items")
-
-		buttons[quality+1]	= createQualityFilter("White", 		ITEM_QUALITY_NORMAL, 	"White quality")
-		buttons[quality+1]	= createQualityFilter("Magic", 		ITEM_QUALITY_MAGIC, 	"Magic quality")
-		buttons[quality+1]	= createQualityFilter("Arcane", 	ITEM_QUALITY_ARCANE, 	"Superior quality")
-		buttons[quality+1]	= createQualityFilter("Artifact",	ITEM_QUALITY_ARTIFACT, 	"Epic quality")
-		buttons[quality+1]	= createQualityFilter("Legendary",  ITEM_QUALITY_LEGENDARY, "Legendary quality")
-
-		FurC.GuiElements.qualityButtons = buttons
-
-	end
-
-	local function createCraftingTypeFilters()
-		local buttons = {}
-
-		local function createCraftingTypeFilter(craftingType, textureName)
-			local parent 				= FurC_TypeFilter
-			local predecessor 			= buttons[#buttons] or parent
-
-			local name 					= parent:GetName() .. "Button" .. tostring(craftingType)
-
-			local button 				= WINDOW_MANAGER:CreateControlFromVirtual(name, parent, "FurC_CraftingTypeFilterButton")
-
-			button:SetNormalTexture(	string.format("%s%s", textureName, "_up.dds"))
-			button:SetMouseOverTexture(	string.format("%s%s", textureName, "_over.dds"))
-			button:SetPressedTexture(	string.format("%s%s", textureName,"_down.dds"))
-			button.craftingType 		= craftingType
-			button.tooltip 				= (craftingType > 0 and GetCraftingSkillName(craftingType)) or GetString("SI_ITEMFILTERTYPE", ITEMFILTERTYPE_ALL)
-
-			local otherAnchor 			= ((predecessor == parent) and TOPLEFT) or TOPRIGHT
-			button:SetAnchor(TOPLEFT, predecessor, otherAnchor, 0)
-
-			return button
-
-		end
-
-		buttons[CRAFTING_TYPE_INVALID]			= createCraftingTypeFilter(CRAFTING_TYPE_INVALID, 			"esoui/art/inventory/inventory_tabicon_all")
-		buttons[CRAFTING_TYPE_BLACKSMITHING]	= createCraftingTypeFilter(CRAFTING_TYPE_BLACKSMITHING, 	"esoui/art/inventory/inventory_tabicon_craftbag_blacksmithing")
-		buttons[CRAFTING_TYPE_CLOTHIER]			= createCraftingTypeFilter(CRAFTING_TYPE_CLOTHIER, 			"esoui/art/inventory/inventory_tabicon_craftbag_clothing")
-		buttons[CRAFTING_TYPE_ENCHANTING]		= createCraftingTypeFilter(CRAFTING_TYPE_ENCHANTING,		"esoui/art/inventory/inventory_tabicon_craftbag_enchanting")
-		buttons[CRAFTING_TYPE_ALCHEMY]			= createCraftingTypeFilter(CRAFTING_TYPE_ALCHEMY, 			"esoui/art/inventory/inventory_tabicon_craftbag_alchemy")
-		buttons[CRAFTING_TYPE_WOODWORKING]		= createCraftingTypeFilter(CRAFTING_TYPE_WOODWORKING, 		"esoui/art/inventory/inventory_tabicon_craftbag_woodworking")
-		buttons[CRAFTING_TYPE_PROVISIONING]		= createCraftingTypeFilter(CRAFTING_TYPE_PROVISIONING, 		"esoui/art/inventory/inventory_tabicon_craftbag_provisioning")
-
-		FurC.GuiElements.craftingTypeFilters 	= buttons
-
-	end
-
-	local function createInventoryDropdown(dropdownName)
-		local controlName 		= string.format("%s%s", "FurC_Dropdown", dropdownName)
-		local control 			= _G[controlName]
-		local dropdownData 		= FurnitureCatalogue.DropdownData
-		local validChoices 		= dropdownData[string.format("%s%s", "Choices", dropdownName)]
-		local choicesTooltips 	= dropdownData[string.format("%s%s", "Tooltips", dropdownName)]
-		local comboBox
-
-
-		control.comboBox = control.comboBox or ZO_ComboBox_ObjectFromContainer(control)
-		comboBox = control.comboBox
-
-		local function HideTooltip(control)
-			ClearTooltip(InformationTooltip)
-		end
-
-		-- ruthlessly stolen from LAM
-		local function SetupTooltips(comboBox, choicesTooltips)
-			local function ShowTooltip(control)
-				InitializeTooltip(InformationTooltip, control, TOPRIGHT, -10, 0, TOPLEFT)
-				SetTooltipText(InformationTooltip, control.tooltip)
-				InformationTooltipTopLevel:BringWindowToTop()
-			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]
-					if control.tooltip then
-						entry.onMouseEnter = control:GetHandler("OnMouseEnter")
-						entry.onMouseExit = control:GetHandler("OnMouseExit")
-						ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
-						ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
-					end
-
-				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
-				HideTooltip(self)
-				originalHide(self)
-			end
-		end
-
-		function OnItemSelect(control, choiceText, somethingElse)
-			local dropdownName = tostring(control.m_name):gsub("FurC_Dropdown", "")
-			FurC.SetDropdownChoice(dropdownName, choiceText)
-			HideTooltip(control)
-			PlaySound(SOUNDS.POSITIVE_CLICK)
-		end
-
-		comboBox:SetSortsItems(false)
-		local originalShow = comboBox.ShowDropdownInternal
-
-		if dropdownName == "Character" then
-			for _, characterName in ipairs(FurC.GetAccountCrafters()) do
-				addedDropdownCharacterNames[characterName] = true
-				table.insert(validChoices, characterName)
-				table.insert(dropdownData["Tooltips"..dropdownName], zo_strformat(GetString(SI_FURC_STRING_RECIPESFORCHAR), characterName))
-			end
-		end
-
-		for i = 1, #validChoices do
-			entry = comboBox:CreateItemEntry(validChoices[i], OnItemSelect)
-			comboBox:AddItem(entry)
-			if validChoices[i] == FurC.GetDropdownChoiceTextual(dropdownName) then
-				comboBox:SetSelectedItem(validChoices[i])
-			end
-		end
-
-		SetupTooltips(comboBox, dropdownData["Tooltips"..dropdownName])
-
-		return control
-	end
-
-	createInventoryScroll()
-	createQualityFilters()
-	createCraftingTypeFilters()
-	createInventoryDropdown("Source")
-	createInventoryDropdown("Version")
-	createInventoryDropdown("Character")
-	FurC.ChangeTemplateFromButton(FurC.GetTinyUi())
-	FurC.SetFontSize(FurC.GetFontSize())
-	FurC.LoadFrameInfo()
-	FurC.InitFilters()
-
-end
-
-function FurnitureCatalogue_Toggle()
-	SCENE_MANAGER:ToggleTopLevel(FurCGui)
-	if FurCGui:IsHidden() then return end
-	FurCGui_Empty:SetHidden(true)
-	zo_callLater(function() FurC.UpdateGui(FurC.GetResetDropdownChoice()) end, 500)
-end
-
-
-function FurC.InitGui()
-
-	local control = FurCGui
-	local settings = FurC.settings["gui"]
-	FurC.GuiElements = {}
-	if nil ~= control then
-		control:SetHeight(settings.height)
-		control:SetWidth(settings.width)
-	end
-
-	createGui()
-
-
-	local slider = FurCGui_ListHolder_Slider
-	slider:SetMinMax(1, #FurCGui_ListHolder.dataLines)
-
-	FurC.UpdateGui(FurC.GetResetDropdownChoice())
-
-	FurC_Label:GetNamedChild("_2"):SetText(GetString(SI_FURC_LABEL_ENTRIES))
-
-	SCENE_MANAGER:RegisterTopLevel(FurCGui, false)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCMenu.lua b/FurnitureCatalogue/FurCMenu.lua
deleted file mode 100644
index 2e0a530..0000000
--- a/FurnitureCatalogue/FurCMenu.lua
+++ /dev/null
@@ -1,409 +0,0 @@
-function FurC.CreateSettings(savedVars, defaults)
-
-	local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
-	local panelData = {
-		type = "panel",
-		name = FurC.name,
-		displayName = name,
-	 	author = FurC.author,
-		version = FurC.version,
-		registerForRefresh = true,
-		registerForDefaults = true,
-		slashCommand = "/furc",	}
-	LAM:RegisterAddonPanel("FurC_OptionsPanel", panelData)
-	local optionsData = { -- optionsData
-
-		-- first section
-		{ -- checkbox: Debug output
-			type = "checkbox",
-			name = GetString(SI_FURC_STRING_MENU_DEBUG),
-			tooltip = "",
-			getFunc = function() return FurC.GetEnableDebug() end,
-			setFunc = function(value) FurC.SetEnableDebug(value) end
-		},
-		{ -- button: Reset database
-			type = "button",
-			name 	= GetString(SI_FURC_STRING_MENU_RESET_DB_NAME),
-			tooltip = GetString(SI_FURC_STRING_MENU_RESET_DB_TT),
-			warning = GetString(SI_FURC_STRING_MENU_RESET_DB_WARNING),
-			func = function()
-				FurC.WipeDatabase()
-			end,
-		},
-		{ -- button: Reset database
-			type 	= "button",
-			name 	= GetString(SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME),
-			width	= "half",
-			tooltip = GetString(SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT),
-			func 	= function() FurC.RescanRumourRecipes() end,
-		},
-		{ -- button: Re-scan data
-			type 	= "button",
-			name	= GetString(SI_FURC_STRING_MENU_SCAN_FILES_NAME),
-			tooltip = GetString(SI_FURC_STRING_MENU_SCAN_FILES_TT),
-			width 	= "half",
-			func 	= function()
-				FurC.ScanRecipes(true, false)
-				FurC.UpdateGui()
-			end,
-		},
-		{ -- button: Re-scan data
-			type 	= "button",
-			name 	= GetString(SI_FURC_STRING_MENU_SCAN_CHAR_NAME),
-			tooltip = GetString(SI_FURC_STRING_MENU_SCAN_CHAR_TT),
-			width 	= "half",
-			func = function()
-				FurC.ScanRecipes(false, true)
-				FurC.UpdateGui()
-			end,
-		},
-		{ -- dropdown: delete character
-			type = "dropdown",
-			name = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_NAME),
-			tooltip = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_TT),
-			warning = GetString(SI_FURC_STRING_MENU_DELETE_CHAR_WARNING),
-			choices = FurC.GetAccountCharacters(),
-			getFunc = function() return end,
-			setFunc = function(value)
-				FurC.DeleteCharacter(value)
-			end,
-		},
-
-
-		-- =======================================================================================
-		-- header: Furniture Shopping List integration
-		-- =======================================================================================
-		{	-- header: Furniture Shopping List integration
-			type = "header",
-			name = "Furniture Shopping List",
-		},
-		{ -- checkbox: Enable
-			type 	= "checkbox",
-			name 	= GetString(SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST),
-			getFunc = function() return (FurC.GetEnableShoppingList()) end,
-			setFunc = function(value) FurC.SetEnableShoppingList(value) end
-		},
-
-
-		-- =======================================================================================
-		-- header: UI and performance
-		-- =======================================================================================
-		{	-- header: UI and performance
-			type = "header",
-			name = "Performance",
-		},
-
-		{ -- checkbox: Skip Initial Scan
-			type 	= "checkbox",
-			name 	= GetString(SI_FURC_STRING_MENU_SKIP_INITIALSCAN),
-			tooltip = GetString(SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT),
-			getFunc = function() return FurC.GetSkipInitialScan() end,
-			setFunc = function(value) FurC.SetSkipInitialScan(value) end
-		},
-		-- =======================================================================================
-		-- header: Inventory and bank
-		-- =======================================================================================
-		{	-- header: Inventory and bank
-			type = "submenu",
-			name = GetString(SI_FURC_STRING_MENU_HEADER_ICONS),
-			controls = {
-				{ -- checkbox: Add items to known/unknown recipes?
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_ADD_ITEMS_NAME),
-					tooltip = GetString(SI_FURC_STRING_MENU_ADD_ITEMS_TT),
-					getFunc = function() return FurC.GetUseInventoryIcons() end,
-					setFunc = function(value) FurC.SetUseInventoryIcons(value) end
-				},
-				{ -- checkbox: Only mark unknown recipes
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_IT_UNKNOWN_NAME),
-					getFunc = function() return FurC.GetHideKnownInventoryIcons() end,
-					setFunc = function(value) FurC.SetHideKnownInventoryIcons(value) end
-				},
-				{ -- checkbox: Add items to known/unknown recipes?
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_IT_THIS_ONLY),
-					tooltip = GetString(SI_FURC_STRING_MENU_IT_THIS_ONLY_TT),
-					getFunc = function() return FurC.GetUseInventoryIconsOnChar() end,
-					setFunc = function(value) FurC.SetUseInventoryIconsOnChar(value) end
-				},
-			},
-		},
-		-- =======================================================================================
-		-- header: UI and performance
-		-- =======================================================================================
-		{	-- header: UI and performance
-			type = "header",
-			name = "User Interface",
-		},
-		{ -- checkbox: use small interface?
-			type 	= "checkbox",
-			name 	= GetString(SI_FURC_STRING_MENU_USETINY),
-			tooltip = GetString(SI_FURC_STRING_MENU_USETINY_TT),
-			getFunc = function() return FurC.GetTinyUi() end,
-			setFunc = function(value) FurC.SetTinyUi(value) end
-		},
-		{ -- checkbox: use small interface?
-			type 	= "checkbox",
-			name 	= GetString(SI_FURC_STRING_MENU_STARTSILENT),
-			tooltip = GetString(SI_FURC_STRING_MENU_STARTSILENT_TT),
-			getFunc = function() return FurC.GetStartupSilently() end,
-			setFunc = function(value) FurC.SetStartupSilently(value) end
-		},
-		{ -- slider: font size
-			type 	= "slider",
-			name 	= GetString(SI_FURC_STRING_MENU_FONTSIZE),
-			tooltip = GetString(SI_FURC_STRING_MENU_FONTSIZE_TT),
-			min 	= 10,
-			max 	= 28,
-			getFunc = function() return FurC.GetFontSize() end,
-			setFunc = function(value) FurC.SetFontSize(value) end
-		},
-		{	type = "submenu",
-			name = GetString(SI_FURC_STRING_MENU_DEFAULT_DD),
-			controls = {
-				{ -- description: Default dropdown
-					type = "description",
-					name = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_USE),
-					text = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT),
-				},
-
-				{ -- checkbox: Persistent?
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_RESET),
-					tooltip = GetString(SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT),
-					getFunc = function() return FurC.GetResetDropdownChoice() end,
-					setFunc = function(value) FurC.SetResetDropdownChoice(value) end
-				},
-				{ -- dropdown: default source
-					type 	= "dropdown",
-					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE),
-					choices = FurC.GetChoicesSource(),
-					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Source") end,
-					setFunc = function(value) FurC.SetDefaultDropdownChoice("Source", value) end
-				},
-				{ -- dropdown: default character
-					type 	= "dropdown",
-					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_CHAR),
-					choices = FurnitureCatalogue.DropdownData.ChoicesCharacter,
-					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Character") end,
-					setFunc = function(value) FurC.SetDefaultDropdownChoice("Character", value) end
-				},
-				{ -- dropdown: default version
-					type = "dropdown",
-					name 	= GetString(SI_FURC_STRING_MENU_DEFAULT_DD_VERSION),
-					choices = FurnitureCatalogue.DropdownData.ChoicesVersion,
-					getFunc = function() return FurC.GetDefaultDropdownChoiceText("Version") end,
-					setFunc = function(value) FurC.SetDefaultDropdownChoice("Version", value) end
-				},
-			},
-		},
-
-
-		-- =======================================================================================
-		-- submenu: Catalogue filtering
-		-- =======================================================================================
-		{	type = "submenu",
-			name = GetString(SI_FURC_STRING_MENU_FILTERING),
-			controls = {
-                 {	type = "submenu",
-                    name = GetString(SI_FURC_STRING_MENU_HEADER_F_ALL_ON_TEXT),
-                    controls = {
-                        { -- description: Default dropdown
-                            type = "description",
-                            name = GetString(SI_FURC_STRING_MENU_F_ALL_ON_TEXT),
-                            text = GetString(SI_FURC_STRING_MENU_HEADER_F_ALL_DESC),
-                        },
-
-                        { -- checkbox: Filter everything when text searching without dropdown
-                            type 	= "checkbox",
-                            name 	= GetString(SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT),
-                            tooltip = GetString(SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT_TT),
-                            getFunc = function() return FurC.GetFilterAllOnText() end,
-                            setFunc = function(value) FurC.SetFilterAllOnText(value) end
-                        },
-                        { -- checkbox: Exclude books from these
-                            type 	= "checkbox",
-                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_BOOKS),
-                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_BOOKS_TT),
-                            getFunc = function() return FurC.GetFilterAllOnTextNoBooks() end,
-                            setFunc = function(value) FurC.SetFilterAllOnTextNoBooks(value) end,
-                            disabled = not FurC.GetFilterAllOnText()
-                        },
-                        { -- checkbox: Exclude crown store items from these
-                            type 	= "checkbox",
-                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_CROWN),
-                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_CROWN_TT),
-                            getFunc = function() return FurC.GetFilterAllOnTextNoCrown() end,
-                            setFunc = function(value) FurC.GetFilterAllOnTextNoCrown(value) end,
-                            disabled = not FurC.GetFilterAllOnText()
-                        },
-                        { -- checkbox: Exclude crown store items from these
-                            type 	= "checkbox",
-                            name 	= GetString(SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR),
-                            tooltip = GetString(SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR_TT),
-                            getFunc = function() return FurC.GetFilterAllOnTextNoRumour() end,
-                            setFunc = function(value) FurC.GetFilterAllOnTextNoRumour(value) end,
-                            disabled = not FurC.GetFilterAllOnText()
-                        },
-                    },
-                },
-
-
-				-- ===============================================================================
-				-- header: Mages guild books
-				-- ===============================================================================
-				{	-- header: Mages guild books
-					type = "header",
-					name = GetString(SI_FURC_STRING_MENU_FILTER_BOOKS),
-				},
-				{ -- checkbox: Hide Mages' guild books
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_FILTER_BOOKS_N),
-					tooltip = GetString(SI_FURC_STRING_MENU_FILTER_BOOKS_TT),
-					getFunc = function() return FurC.GetHideBooks() end,
-					setFunc = function(value) FurC.SetHideBooks(value) end
-				},
-
-				{	-- header: Luxury items
-					type 	= "header",
-					name 	= GetString(SI_FURC_STRING_MENU_LUXURY),
-				},
-				{ -- checkbox: Hide Mages' guild books
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_LUXURY_N),
-					tooltip = GetString(SI_FURC_STRING_MENU_LUXURY_TT),
-					warning = GetString(SI_FURC_STRING_MENU_LUXURY_WARN),
-					getFunc = function() return FurC.GetMergeLuxuryAndSales() end,
-					setFunc = function(value) FurC.SetMergeLuxuryAndSales(value) end
-				},
-
-
-				-- ===============================================================================
-				-- header: Rumour Recipes
-				-- ===============================================================================
-				{	-- header: rumour recipes
-					type 	= "header",
-					name 	= "Rumour Recipes",
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type 	= "description",
-					name 	= GetString(SI_FURC_STRING_MENU_RUMOUR),
-					text 	= GetString(SI_FURC_STRING_MENU_RUMOUR_DESC),
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_RUMOUR_N),
-					getFunc = function() return FurC.GetHideRumourRecipes() end,
-					setFunc = function(value) FurC.SetHideRumourRecipes(value) end
-				},
-				{	-- header: rumour recipes
-					type = "header",
-					name = "Crown store",
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type = "description",
-					name = GetString(SI_FURC_STRING_MENU_CROWN),
-					text = GetString(SI_FURC_STRING_MENU_CROWN_DESC),
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_CROWN_N),
-					getFunc = function() return FurC.GetHideCrownStoreItems() end,
-					setFunc = function(value) FurC.SetHideCrownStoreItems(value) end
-				},
-                --[[
-				{	-- header: rumour recipes
-					type = "header",
-					name = GetString(SI_FURC_STRING_MENU_HIDE_MENU),
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type = "description",
-					name = GetString(SI_FURC_STRING_MENU_HIDE_MENU),
-					text = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
-				},
-				{ -- checkbox: Hide rumour recipes menu entry
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR),
-					warning = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
-					getFunc = function() return FurC.GetHideRumourRecipesEntry() end,
-					setFunc = function(value) FurC.SetHideRumourRecipesEntry(value) end
-				},
-				{ -- checkbox: Hide doubtful recipes
-					type 	= "checkbox",
-					name 	= GetString(SI_FURC_STRING_MENU_HIDE_MENU_CROWN),
-					warning = GetString(SI_FURC_STRING_MENU_HIDE_MENU_TT),
-					getFunc = function() return FurC.GetHideCrownStoreEntry() end,
-					setFunc = function(value) FurC.SetHideCrownStoreEntry(value) end
-				},
-                ]]
-			},
-		},
-
-		-- =======================================================================================
-		-- header: Tooltip
-		-- =======================================================================================
-		{	-- header: Tooltip
-			type 	= "header",
-			name 	= "Tooltip",
-		},
-		{ -- checkbox: Disable
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP),
-			getFunc 	= function() return (not FurC.GetDisableTooltips()) end,
-			setFunc 	= function(value) FurC.SetDisableTooltips(not value) end
-		},
-		{ -- checkbox: Colorize tooltips for clarity?
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_COLOR),
-			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT),
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return FurC.GetColouredTooltips() end,
-			setFunc 	= function(value) FurC.SetColouredTooltips(value) end
-		},
-		{ -- checkbox: Hide 'known by' from tooltip
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN),
-			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT),
-			width		= "half",
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return (FurC.GetHideKnowledge()) end,
-			setFunc 	= function(value) FurC.SetHideKnowledge(value) end
-		},
-		{ -- checkbox: Hide 'known by' from tooltip
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN),
-			tooltip 	= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT),
-			width		= "half",
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return (FurC.GetHideUnknown()) end,
-			setFunc 	= function(value) FurC.SetHideUnknown(value) end
-		},
-		{ -- checkbox: Hide item source
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE),
-			tooltip 	= "",
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return (FurC.GetHideSource()) end,
-			setFunc 	= function(value) FurC.SetHideSource(value) end
-		},
-		{ -- checkbox: Hide item source
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION),
-			tooltip 	= "",
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return (FurC.GetHideCraftingStation()) end,
-			setFunc 	= function(value) FurC.SetHideCraftingStation(value) end
-		},
-		{ -- checkbox: Hide materials from tooltip
-			type 		= "checkbox",
-			name 		= GetString(SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL),
-			tooltip 	= "",
-			disabled 	= FurC.GetDisableTooltips(),
-			getFunc 	= function() return (FurC.GetHideMats()) end,
-			setFunc 	= function(value) FurC.SetHideMats(value) end
-		},
-	} -- optionsData end
-
-	LAM:RegisterOptionControls("FurC_OptionsPanel", optionsData)
-end
diff --git a/FurnitureCatalogue/FurCSettingsAdapter.lua b/FurnitureCatalogue/FurCSettingsAdapter.lua
deleted file mode 100644
index 7d52de0..0000000
--- a/FurnitureCatalogue/FurCSettingsAdapter.lua
+++ /dev/null
@@ -1,479 +0,0 @@
-local task 		= LibStub("LibAsync"):Create("FurnitureCatalogue_Settings")
-
-local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-function FurC.GetDontScanTradingHouse()
-	return FurC.settings["dontScanTradingHouse"]
-end
-function FurC.SetDontScanTradingHouse(value)
-	FurC.settings["dontScanTradingHouse"] = value
-end
-
-function FurC.GetEnableDebug()
-	return FurC.settings["enableDebug"]
-end
-function FurC.SetEnableDebug(value)
-	FurC.settings["enableDebug"] = value
-end
-function FurC.GetHideRumourRecipes()
-	return FurC.settings["hideDoubtfuls"]
-end
-function FurC.SetHideRumourRecipes(value)
-	FurC.settings["hideDoubtfuls"] = value
-	FurC.updateDropdownData()
-	FurC.UpdateGui()
-end
-function FurC.GetHideCrownStoreItems()
-	return FurC.settings["hideCrownstore"]
-end
-function FurC.SetHideCrownStoreItems(value)
-	FurC.settings["hideCrownstore"] = value
-	FurC.updateDropdownData()
-	FurC.UpdateGui()
-end
-function FurC.GetHideRumourRecipesEntry()
-	return FurC.settings["hideRumourEntry"]
-end
-function FurC.SetHideRumourRecipesEntry(value)
-	FurC.settings["hideRumourEntry"] = value
-	FurC.updateDropdownData()
-	FurC.UpdateGui()
-end
-function FurC.GetHideCrownStoreEntry()
-	return FurC.settings["hideCrownStoreEntry"]
-end
-function FurC.SetHideCrownStoreEntry(value)
-	FurC.settings["hideCrownStoreEntry"] = value
-	FurC.updateDropdownData()
-	FurC.UpdateGui()
-end
-
-
-function FurC.GetFilterAllOnText()
-	return FurC.settings["filterAllOnText"]
-end
-function FurC.SetFilterAllOnText(value)
-	FurC.settings["filterAllOnText"] = value
-	FurC.UpdateGui()
-end
-
-function FurC.GetFilterAllOnTextNoRumour()
-	return FurC.settings["filterAllOnTextNoRumour"]
-end
-function FurC.GetFilterAllOnTextNoRumour(value)
-	FurC.settings["filterAllOnTextNoRumour"] = value
-	FurC.UpdateGui()
-end
-
-function FurC.GetFilterAllOnTextNoBooks()
-	return FurC.settings["filterAllOnTextNoBooks"]
-end
-function FurC.GetFilterAllOnTextNoBooks(value)
-	FurC.settings["filterAllOnTextNoBooks"] = value
-	FurC.UpdateGui()
-end
-
-function FurC.GetFilterAllOnTextNoCrown()
-	return FurC.settings["filterAllOnTextNoCrown"]
-end
-function FurC.GetFilterAllOnTextNoCrown(value)
-	FurC.settings["filterAllOnTextNoCrown"] = value
-	FurC.UpdateGui()
-end
-
-
-
-function FurC.GetFontSize()
-	if FurC.settings["fontSize"] < 10 then
-		FurC.settings["fontSize"] = 10
-	end
-	return FurC.settings["fontSize"]
-end
-function FurC.SetFontSize(value)
-	if nil == value then value = FurC.GetFontSize() end
-	if value == 0 then value = 18 end
-	FurC.settings["fontSize"] = value
-
-	local size = tostring(value)
-
-
-	FurC.SetLineHeight()
-
-	task:Call(function()	FurC.UpdateGui() end)
-end
-
-
----------------------------
---------- Tooltip ---------
----------------------------
-function FurC.GetDisableTooltips()
-	return FurC.settings["disableTooltips"]
-end
-function FurC.SetDisableTooltips(value)
-	FurC.settings["disableTooltips"] = value
-end
-
-function FurC.GetColouredTooltips()
-	return FurC.settings["coloredTooltips"]
-end
-function FurC.SetColouredTooltips(value)
-	FurC.settings["coloredTooltips"] = value
-end
-
-function FurC.GetHideKnowledge()
-	return FurC.settings["hideKnowledge"]
-end
-function FurC.SetHideKnowledge(value)
-	FurC.settings["hideKnowledge"] = value
-end
-function FurC.GetHideUnknown()
-	return FurC.settings["hideUnknown"]
-end
-function FurC.SetHideUnknown(value)
-	FurC.settings["hideUnknown"] = value
-end
-
-function FurC.GetHideMats()
-	return FurC.settings["hideMats"]
-end
-function FurC.SetHideMats(value)
-	FurC.settings["hideMats"] = value
-end
-
-function FurC.GetHideSource()
-	return FurC.settings["hideSource"]
-end
-function FurC.SetHideSource(value)
-	FurC.settings["hideSource"] = value
-end
-
-function FurC.GetHideCraftingStation()
-	return FurC.settings["hideCraftingStation"]
-end
-function FurC.SetHideCraftingStation(value)
-	FurC.settings["hideCraftingStation"] = value
-end
-
-function FurC.GetEnableShoppingList()
-	return FurC.settings["enableShoppingList"]
-end
-function FurC.SetEnableShoppingList(value)
-	FurC.settings["enableShoppingList"] = value
-end
-
----------------------------
--------- /Tooltip ---------
----------------------------
-
----------------------------
---------- Filters ---------
----------------------------
-
-local function containsTrue(ary)
-	for key, value in pairs(ary) do
-		if value then return true end
-	end
-end
-
-function FurC.GetFilterQuality()
-	return FurC.settings.filterQuality
-end
-function FurC.SetFilterQuality(quality)
-
-	local controls = FurC.GuiElements.qualityButtons
-	local filterArray = FurC.settings.filterQuality
-
-	quality = quality or 0
-
-	if quality == 0 then
-		for key, value in pairs (filterArray) do
-			FurC.settings.filterQuality[key] = false
-		end
-	else
-		filterArray[quality] = not filterArray[quality]
-	end
-	FurC.settings.filterQualityAll = not containsTrue(filterArray)
-
-	for key, control in pairs (controls) do
-		control:SetState((filterArray[key-1] and BSTATE_PRESSED) or BSTATE_NORMAL)
-	end
-	FurC.GuiOnScroll(nil, 0)
-	FurC.SetFilter()
-	FurC.UpdateGui()
-end
-
-function FurC.GetFilterCraftingType()
-	return FurC.settings.filterCraftingType
-end
-function FurC.SetFilterCraftingType(craftingType)
-
-	local controls 		= 	FurC.GuiElements.craftingTypeFilters
-	local filterArray 	= 	FurC.settings.filterCraftingType
-
-	if craftingType == 0 then
-		for key, value in pairs (filterArray) do
-			filterArray[key] = false
-		end
-	else
-		filterArray[craftingType] = not filterArray[craftingType]
-	end
-
-	FurC.settings.filterCraftingTypeAll = not containsTrue(filterArray)
-
-	for key, control in pairs (controls) do
-		control:SetState((filterArray[key] and BSTATE_PRESSED) or BSTATE_NORMAL)
-	end
-
-	FurC.GuiOnScroll(FurCGui_ListHolder_Slider, 0)
-	FurC.SetFilter()
-	FurC.UpdateGui()
-end
-
-
-function FurC.GetSearchFilter()
-	if (not FurC.SearchFilter) or FurC.SearchFilter == "Filter by text search" then
-		FurC.SearchFilter = FurC_SearchBox:GetText() or ""
-	end
-
-	return FurC.SearchFilter or ""
-end
-
-function FurC.GuiSetSearchboxTextFrom(control)
-	-- call asynchronely to prevent lagging. Praise votan.
-	task:Call(function()
-		local text = control:GetText()
-        control:GetNamedChild("Text"):SetText((text == "" and "Filter by text search") or "")
-
-		FurC.SearchFilter = text
-
-		FurC.GuiOnSliderUpdate(FurCGui_ListHolder_Slider, 0)
-		FurC.UpdateGui()
-	end)
-end
-
-function FurC.GetHideBooks()
-	return FurC.settings["hideBooks"]
-end
-function FurC.SetHideBooks(value)
-	FurC.settings["hideBooks"] = value
-	FurC.UpdateGui()
-end
-function FurC.GetMergeLuxuryAndSales()
-	return FurC.settings["mergeLuxuryAndSales"]
-end
-function FurC.SetMergeLuxuryAndSales(value)
-	FurC.settings["mergeLuxuryAndSales"] = value
-	FurC.UpdateGui()
-end
-
-
----------------------------
---------- Dropdown --------
----------------------------
-FurC.DropdownChoices = {
-	["Source"] = nil,
-	["Version"] = nil,
-	["Character"] = nil,
-}
-function FurC.GetDropdownChoice(dropdownName)
-	return (FurC.DropdownChoices[dropdownName] or FurC.GetDefaultDropdownChoice(dropdownName))
-end
-function FurC.GetDropdownText(dropdownName)
-	local dropdown = FurC.DropdownData[dropdownName]
-	local key = FurC.GetDropdownChoice(dropdownName)
-	return dropdown[key]
-end
-local function getDropdownIndex(dropdownName, value)
-	local dropdown = FurC.DropdownData["Choices"..dropdownName]
-	for listKey, listValue in pairs(dropdown) do
-		if listValue == value then return listKey end
-	end
-	dropdown[#dropdown+1] = value
-	return #dropdown
-end
-
-
-local dropdownData = FurC.DropdownData
-
--- Source: All, All (craftable), Craftable (known), craftable (unknown), purchaseable
--- Character: Accountwide, crafter1, crafter2...
--- Version: All, Homestead, Morrowind
-function FurC.SetDropdownChoice(dropdownName, textValue, dropdownIndex)
-	textValue = textValue or FurC.GetDefaultDropdownChoice(dropdownName)
-	local dropdownIndex = dropdownIndex or getDropdownIndex(dropdownName, textValue) or 0
-
-	-- p("FurC.SetDropdownChoice(<<1>>, <<2>> (Index: <<3>>))", dropdownName, textValue, dropdownIndex)
-
-	-- if we're setting the dropdown menu "source" to "purchaseable", set "character" to "All"
-	FurC.DropdownChoices[dropdownName] = dropdownIndex
-
-	if dropdownName == "Source" then
-		if dropdownIndex > FURC_CRAFTING_UNKNOWN or dropdownIndex < FURC_CRAFTING then
-			FurC.DropdownChoices["Character"] = 1
-			FurC_DropdownCharacter:GetNamedChild("SelectedItemText"):SetText(FurnitureCatalogue.DropdownData.ChoicesCharacter[1])
-		end
-	end
-	-- if we're setting the characters array to something other than 1, we can't use source 1 or 5
-	if dropdownName == "Character" and (dropdownIndex > 1) then
-		if FurC.DropdownChoices["Source"] > FURC_CRAFTING_UNKNOWN or FurC.DropdownChoices["Source"] < FURC_CRAFTING then
-			local knownIndex = FURC_CRAFTING_KNOWN
-			FurC.DropdownChoices["Source"] = knownIndex
-			FurC_DropdownSource:GetNamedChild("SelectedItemText"):SetText(FurnitureCatalogue.DropdownData.ChoicesSource[knownIndex])
-		end
-	end
-
-	FurC.DropdownChoices[dropdownName] = dropdownIndex
-
-	zo_callLater(function() FurC.UpdateGui() end, 500)
-
-end
-
-function FurC.GetDefaultDropdownChoiceText(dropdownName)
-	return FurC.DropdownData["Choices"..dropdownName][FurC.GetDefaultDropdownChoice(dropdownName)]
-end
-
-function FurC.GetDefaultDropdownChoice(dropdownName)
-	return FurC.settings.dropdownDefaults[dropdownName]
-end
-function FurC.SetDefaultDropdownChoice(dropdownName, value)
-	local dropdownIndex = getDropdownIndex(dropdownName, value)
-	local dropdown = FurC.DropdownData["Choices"..dropdownName]
-	FurC.settings.dropdownDefaults[dropdownName] = dropdownIndex
-	-- FurC.UpdateDropdownChoice(dropdownName, value, dropdownIndex)
-	-- FurC.UpdateGui()
-end
-function FurC.GetResetDropdownChoice()
-	return FurC.settings["resetDropdownChoice"]
-end
-function FurC.SetResetDropdownChoice(value)
-	FurC.settings["resetDropdownChoice"] = value
-end
-
-function FurC.GetDropdownChoiceTextual(dropdownName)
-	local value = FurC.GetDropdownChoice(dropdownName)
-	local dropdown = FurC.DropdownData["Choices"..dropdownName]
-	return FurC.DropdownData["Choices"..dropdownName][value]
-end
-function FurC.GetDefaultDropdownChoiceTextual()
-	return FurC.DropdownData["Choices"..dropdownName][FurC.GetDefaultDropdownChoice(dropdownName)]
-end
-
-function FurC.GetAccountCrafters()
-	local ret = {}
-	for characterName, isCrafter in pairs(FurC.settings.accountCharacters) do
-		if isCrafter then table.insert(ret, characterName) end
-	end
-	return ret
-end
-function FurC.GetAccountCharacters()
-	local ret = {}
-	for characterName, isCrafter in pairs(FurC.settings.accountCharacters) do
-		table.insert(ret, characterName)
-	end
-	return ret
-end
-
-function FurC.GetSkipInitialScan()
-	return FurC.settings["skipInitialScan"]
-end
-function FurC.SetSkipInitialScan(value)
-	FurC.settings["skipInitialScan"] = value
-end
-
----------------------------
--------- /Dropdown --------
--------- /Filters  --------
----------------------------
-
-function FurC.GetUseInventoryIcons()
-	return FurC.settings["useInventoryIcons"]
-end
-function FurC.SetUseInventoryIcons(value)
-	FurC.settings["useInventoryIcons"] = value
-end
-
-function FurC.GetUseInventoryIconsOnChar()
-	return FurC.settings["useInventoryIconsOnChar"]
-end
-function FurC.SetUseInventoryIconsOnChar(value)
-	FurC.settings["useInventoryIconsOnChar"] = value
-end
-
-function FurC.GetHideKnownInventoryIcons()
-	return FurC.settings["hideKnownInventoryIcons"]
-end
-function FurC.SetHideKnownInventoryIcons(value)
-	FurC.settings["hideKnownInventoryIcons"] = value
-end
-
-function FurC.GetStartupSilently()
-	return FurC.settings["startupSilently"]
-end
-function FurC.SetStartupSilently(value)
-	FurC.settings["startupSilently"] = value;
-end
-
-function FurC.GetTinyUi()
-	return FurC.settings["useTinyUi"]
-end
-function FurC.SetTinyUi(value)
-	FurC.settings["useTinyUi"] 	= value
-	FurC.SlotTemplate 			= "FurC_SlotTemplate" .. ((value and "Tiny") or "")
-	FurC.ApplyLineTemplate()
-end
-
-
-function FurC.GetListOffset()
-	return FurC.ListOffset or 0
-end
-
-function FurC.SetListOffset(value)
-	FurC.ListOffset = value
-end
-
-
-
-function FurC.WipeDatabase()
-	d("|cFFFFFFresetting |r|c2266ffFurniture Catalogue |r|cFFFFFFdata...|r")
-	FurC.settings.data = {}
-	FurC.settings.accountCharacters = {}
-	FurC.settings.excelExport = {}
-	FurC.ScanRecipes(true, true)
-	-- d("FurnitureCatalogue: Scan complete")
-end
-
-function FurC.DeleteCharacter(characterName)
-
-	d("Now deleting recipe knowledge for " .. characterName)
-
-	for key, value in pairs(FurC.settings.accountCharacters) do
-		if value == characterName then
-			FurC.settings.accountCharacters[key] = false
-		end
-	end
-
-	for recipeKey, recipeArray in pairs(FurC.settings.data) do
-		if recipeArray.craftable then
-			recipeArray.characters[characterName] = nil
-		end
-	end
-
-	local guiDropdownEntries = FurC_Dropdown.comboBox.m_sortedItems
-	if nil == guiDropdownEntries then return end
-	for index, data in pairs(guiDropdownEntries) do
-		if data.name == characterName then
-			FurC_Dropdown.comboBox.m_sortedItems[index] = nil
-			return
-		end
-	end
-	d(zo_strformat("<<1>> deleted from |c2266ffFurniture Catalogue|r database. Entry will disappear from settings dropdown after the next reloadui.", characterName))
-
-end
-
-function FurC.GetCurrentCharacterName()
-	if nil == FurC.CharacterName then FurC.CharacterName = zo_strformat(GetUnitName('player')) end
-	return FurC.CharacterName
-end
-
-
-
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCTooltip.lua b/FurnitureCatalogue/FurCTooltip.lua
deleted file mode 100644
index ccba0c8..0000000
--- a/FurnitureCatalogue/FurCTooltip.lua
+++ /dev/null
@@ -1,112 +0,0 @@
-local async = LibStub("LibAsync")
-local task = async:Create("FurnitureCatalogue_Tooltip")
-
-local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
-local function tryColorize(text, datInteger)
-	if nil == text then text = datInteger end
-	if (not FurC.GetColouredTooltips()) or not text then return text end
-	return text:gsub("cannot craft", "|cFF0000cannot craft|r"):gsub("Can be crafted", "|c00FF00Can be crafted|r")
-end
-
-local function addTooltipData(control, itemLink)
-
-	if FurC.GetDisableTooltips() then return end
-	local itemId, recipeArray = nil
-	if nil == itemLink or FURC_EMPTY_STRING == itemLink then return end
-	local isRecipe = IsItemLinkFurnitureRecipe(itemLink)
-
-	itemLink = (isRecipe and GetItemLinkRecipeResultItemLink(itemLink)) or itemLink
-
-	itemId 		= FurC.GetItemId(itemLink)
-	recipeArray = FurC.Find(itemLink)
-
-	-- |H0:item:118206:5:1:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0|h|h
-
-	if not recipeArray then return end			-- Find does not return nil, empty table instead
-
-	local unknown 	= not FurC.CanCraft(itemId, recipeArray)
-	local stringTable = {}
-
-
-	local function add(t, arg)
-		if nil ~= arg then t[#t + 1] = arg end
-		return t
-	end
-
-	-- if craftable:
-	if isRecipe or recipeArray.origin == FURC_CRAFTING then
-		if unknown and not FurC.GetHideUnknown() or not FurC.GetHideKnowledge() then
-			local crafterList = FurC.GetCrafterList(itemLink, recipeArray)
-			if crafterList then
-				stringTable = add(stringTable, tryColorize(crafterList))
-			end
-		end
-		if not isRecipe and (not FurC.GetHideCraftingStation()) then
-			stringTable = add(stringTable, FurC.PrintCraftingStation(itemId, recipeArray))
-		end
-		if isRecipe then
-			stringTable = add(stringTable, FurC.getRecipeSource(itemId, recipeArray))
-		end
-		-- check if we should show mats
-		if not (FurC.GetHideMats() or isRecipe) then
-			stringTable = add(stringTable, FurC.GetMats(itemLink, recipeArray, true):gsub(", ", "\n"))
-		end
-	else
-		if not FurC.GetHideSource() then
-			stringTable = add(stringTable, FurC.GetItemDescription(itemId, recipeArray))
-		end
-		stringTable = add(stringTable, recipeArray.achievement)
-	end
-
-	if #stringTable == 0 then return end
-
-	control:AddVerticalPadding(8)
-	ZO_Tooltip_AddDivider(control)
-
-	for i = 1, #stringTable do
-		control:AddLine(zo_strformat("<<C:1>>", stringTable[i]))
-	end
-
-end
-
-local function TooltipHook(tooltipControl, method, linkFunc)
-	local origMethod = tooltipControl[method]
-
-	tooltipControl[method] = function(self, ...)
-		origMethod(self, ...)
-		addTooltipData(self, linkFunc(...))
-	end
-end
-
-local function ReturnItemLink(itemLink)
-	return FurC.GetItemLink(itemLink)
-end
-
-do
-	local identifier = FurC.name .. "Tooltips"
-	-- hook real late
-	local function HookToolTips()
-		EVENT_MANAGER:UnregisterForUpdate(identifier)
-		TooltipHook(ItemTooltip, 	"SetBagItem", 				GetItemLink)
-		TooltipHook(ItemTooltip, 	"SetTradeItem", 			GetTradeItemLink)
-		TooltipHook(ItemTooltip, 	"SetBuybackItem",			GetBuybackItemLink)
-		TooltipHook(ItemTooltip, 	"SetStoreItem", 			GetStoreItemLink)
-		TooltipHook(ItemTooltip, 	"SetAttachedMailItem", 		GetAttachedItemLink)
-		TooltipHook(ItemTooltip, 	"SetLootItem", 				GetLootItemLink)
-		TooltipHook(ItemTooltip, 	"SetTradingHouseItem", 		GetTradingHouseSearchResultItemLink)
-		TooltipHook(ItemTooltip, 	"SetTradingHouseListing", 	GetTradingHouseListingItemLink)
-		TooltipHook(ItemTooltip, 	"SetLink", 					ReturnItemLink)
-		TooltipHook(PopupTooltip, 	"SetLink", 					ReturnItemLink)
-	end
-	-- hook late
-	local function DeferHookToolTips()
-		EVENT_MANAGER:UnregisterForEvent(identifier, EVENT_PLAYER_ACTIVATED)
-		EVENT_MANAGER:RegisterForUpdate(identifier, 100, HookToolTips)
-	end
-	function FurC.CreateTooltips()
-		EVENT_MANAGER:RegisterForEvent(identifier, EVENT_PLAYER_ACTIVATED, DeferHookToolTips)
-	end
-
-
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurCUtil.lua b/FurnitureCatalogue/FurCUtil.lua
deleted file mode 100644
index dc09a2a..0000000
--- a/FurnitureCatalogue/FurCUtil.lua
+++ /dev/null
@@ -1,38 +0,0 @@
-local p 		= FurC.DebugOut -- debug function calling zo_strformat with up to 10 args
-
--- ruthlessly stolen from TextureIt
-function FurC.SortTable(tTable, sortKey, SortOrderUp)
-	local keys = {}
-	for k in pairs(tTable) do table.insert(keys, k) end
-	table.sort(keys, function(a, b)
-		if nil == tTable[a] or nil == tTable[b] then
-
-		elseif nil == tTable[a][sortKey] then
-			d(tTable[a])
-		elseif nil == tTable[b][sortKey] then
-			d(tTable[b])
-		else
-			if SortOrderUp then
-				return tTable[a][sortKey] > tTable[b][sortKey]
-			else
-				return tTable[a][sortKey] < tTable[b][sortKey]
-			end
-		end
-
-	end)
-
-	local ret = {}
-	local scannedLinks = {}
-	local itemLink, entry
-	for _, k in ipairs(keys) do
-		entry = tTable[k]
-		-- d(entry)
-		itemLink = entry["itemLink"]
-		ingredients = entry["ingredients"]
-		local index = scannedLinks[itemLink] or k
-
-		table.insert(ret, entry)
-	end
-
-	return ret
-end
diff --git a/FurnitureCatalogue/FurnitureCatalogue.txt b/FurnitureCatalogue/FurnitureCatalogue.txt
deleted file mode 100644
index 296655c..0000000
--- a/FurnitureCatalogue/FurnitureCatalogue.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-## Title: FurnitureCatalogue
-## Author: manavortex
-## Version: 2.2.13
-## APIVersion: 100022
-## SavedVariables: FurnitureCatalogue_Settings
-## OptionalDependsOn: pChat
-
-libs\LibStub\LibStub.lua
-libs\LibAsync\LibAsync.lua
-libs\LibCustomTitles\LibCustomTitles.lua
-libs\LibCustomMenu\LibCustomMenu.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
-
-locale\en.lua
-locale\$(language).lua
-
-xml\Bindings.xml
-xml\FurnitureCatalogue.xml
-
-startup.lua
-
-FurCSettingsAdapter.lua
-FurCMenu.lua
-FurCEvents.lua
-
-data\Morrowind\M_Recipes.lua
-data\Homestead\H_Recipes.lua
-data\Reach\HotR_Recipes.lua
-data\Recipes.lua
-data\RecipeSources.lua
-
-data\Homestead\H_AchievementVendors.lua
-data\Morrowind\M_AchievementVendors.lua
-data\Reach\HotR_AchievementVendors.lua
-data\AchievementVendors.lua
-
-data\LuxuryFurnisher.lua
-data\Homestead\H_LuxuryFurnisher.lua
-data\Morrowind\M_LuxuryFurnisher.lua
-data\Reach\HotR_LuxuryFurnisher.lua
-
-data\Homestead\H_Rollis.lua
-data\Reach\HotR_Rollis.lua
-data\Rollis.lua
-
-data\Homestead\H_EventItems.lua
-data\Morrowind\M_EventItems.lua
-data\EventItems.lua
-
-
-data\MiscItemSources.lua
-data\Homestead\H_Cyrodiil.lua
-
-data\RumourRecipes.lua
-
-FurCUtil.lua
-
-FurCDatabaseQuery.lua
-FurCData.lua
-FurCDataParser.lua
-FurCFilter.lua
-FurCGui.lua
-FurCContextMenu.lua
-FurCControlBridge.lua
-FurCTooltip.lua
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport.lua b/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport.lua
deleted file mode 100644
index 77d218f..0000000
--- a/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport.lua
+++ /dev/null
@@ -1,62 +0,0 @@
-FurnitureCatalogue_Export 		= {}
-FurCExport 						= FurnitureCatalogue_Export
-
-
-local defaults 					= {
-}
-
-
-local function getSortTable(tbl)
-	list = {}
-	for name,	value in pairs(tbl) do
-		list[#list+1] = name
-	end
-	table.sort(list)
-	return list
-end
-
-function FurCExport.Export()
-
-	local itemNames = {}
-	local itemName
-	for itemId, recipeArray in pairs(FurC.settings.data) do
-		if recipeArray.origin == FURC_CRAFTING then
-			itemNames[GetItemLinkName(FurC.GetItemLink(itemId))] = FurC.GetItemLink(itemId)
-		end
-	end
-
-	local tkeys = getSortTable(itemNames)
-	local exportKnown = {}
-	local exportUnknown = {}
-	for key, itemName in pairs(tkeys) do
-		local itemLink = itemNames[itemName]
-		local recipeArray = FurC.Find(itemLink)
-		local known = FurC.IsAccountKnown(itemLink, recipeArray)
-
-		local exportArray = (known and exportKnown) or exportUnknown
-		local mats = FurC.GetMats(itemLink, recipeArray, false, true)
-		local knowledge = (known and (FurC.GetCrafterList(itemLink, recipeArray) .. ": "):gsub("Can be crafted by ", "")) or ""
-		local exportString = zo_strformat("<<1>><<2>>", knowledge, mats)
-		exportArray[itemName] = exportString
-	end
-
-	FurCExport.settings.known 		= exportKnown
-	FurCExport.settings.unknown 	= exportUnknown
-	ReloadUI()
-
-end
-
-SLASH_COMMANDS["/furcexport"] = function() FurCExport.Export() end
-
-
--- initialization stuff
-function FurCExport_Initialize(eventCode, addOnName)
-	if (addOnName ~= "FurnitureCatalogue_Export") then return end
-
-	FurCExport.settings 	= ZO_SavedVars:NewAccountWide("FurnitureCatalogue_Export", nil, 0, defaults)
-	FurCExport.makeSettings()
-	EVENT_MANAGER:UnregisterForEvent("FurnitureCatalogue_Export", EVENT_ADD_ON_LOADED)
-end
-
-
-EVENT_MANAGER:RegisterForEvent("FurnitureCatalogue_Export", EVENT_ADD_ON_LOADED, FurCExport_Initialize)
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport_Menu.lua b/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport_Menu.lua
deleted file mode 100644
index f20166d..0000000
--- a/FurnitureCatalogue/FurnitureCatalogue_Export/FurCDataExport_Menu.lua
+++ /dev/null
@@ -1,41 +0,0 @@
-function FurCExport.makeSettings()
-
-	local settings = FurCExport.settings
-
-	local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
-	local panelData = {
-		type = "panel",
-		name = "FurnitureCatalogue_Export",
-		displayName = "FurnitureCatalogue Export",
-	 	author = "manavortex",
-		version = "1.0.0",
-		registerForRefresh = true,
-		registerForDefaults = true,
-	}
-
-	LAM:RegisterAddonPanel("FurnitureCatalogueExport_OptionsPanel", panelData)
-	local optionsData = { -- optionsData
-
-
-		{ -- description
-			type = "description",
-			name = "FurnitureCatalogue Export",
-			text = (
-				"After an UI reload, FurnitureCatalogue's database can be found in your \n" ..
-				"SavedVariables folder inside  FurnitureCatalogue_Export.lua \n"
-			),
-		},
-		{ -- button: Reset database
-			type = "button",
-			name = "Export data",
-			warning = "This will reload the UI",
-			func = function()
-				FurCExport.Export()
-			end,
-		},
-	}
-
-
-	LAM:RegisterOptionControls("FurnitureCatalogueExport_OptionsPanel", optionsData)
-
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt b/FurnitureCatalogue/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
deleted file mode 100644
index 68d8b0a..0000000
--- a/FurnitureCatalogue/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-## Title: FurnitureCatalogue_Export
-## Author: manavortex
-## Version: 1.0.1
-## APIVersion: 100022
-## SavedVariables: FurnitureCatalogue_Export
-## DependsOn: FurnitureCatalogue
-
-FurCDataExport.lua
-FurCDataExport_Menu.lua
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/AchievementVendors.lua b/FurnitureCatalogue/data/AchievementVendors.lua
deleted file mode 100644
index ef51dbd..0000000
--- a/FurnitureCatalogue/data/AchievementVendors.lua
+++ /dev/null
@@ -1,177 +0,0 @@
-FurC.AchievementVendors[FURC_DRAGONS] = {
-	["the Undaunted Enclaves"] = {
-		["Undaunted Quartermaster"] = {
-			[134908] = { -- Blackmarrow Banner
-				itemPrice 	= 15000,
-				achievement = 1975, -- Scalecaller Peak Vanquisher
-			},
-			[134907] = {
-				itemPrice 	= 50000,
-				achievement = 1959, -- Fang Lair Vanquisher
-			},
-		},
-	},
-}
-
-local bookList = {
-	[134553] = { -- The Truth in Sequence, Volume 1
-		itemPrice = 2000,
-	},
-	[134554] = { -- The Truth in Sequence, Volume 2
-		itemPrice = 2000,
-	},
-	[134555] = { -- The Truth in Sequence, Volume 3
-		itemPrice = 2000,
-	},
-	[134556] = { -- The Truth in Sequence, Volume 4
-		itemPrice = 2000,
-	},
-	[134557] = { -- The Truth in Sequence, Volume 5
-		itemPrice = 2000,
-	},
-	[134558] = { -- The Truth in Sequence, Volume 6
-		itemPrice = 2000,
-	},
-	[134559] = { -- The Truth in Sequence, Volume 7
-		itemPrice = 2000,
-	},
-	[134560] = { -- The Truth in Sequence, Volume 8
-		itemPrice = 2000,
-	},
-	[134561] = { -- The Truth in Sequence, Volume 9
-		itemPrice = 2000,
-	},
-	[134562] = { -- The Truth in Sequence, Volume 10
-		itemPrice = 2000,
-	},
-}
-FurC.Books[FURC_CLOCKWORK   ] = bookList
-FurC.AchievementVendors[FURC_CLOCKWORK] = {
-
-
-	["The Brass Citadel, Market"] = {
-		["Razoufa"] = {
-			[134285] = { -- Active Fabrication Tank
-				itemPrice 	= 75000,
-				achievement = 2049, -- Hero of Clockwork City
-			},
-			[134286] = { -- Clockwork Stylus
-				itemPrice = 3000,
-				achievement = 2068, -- CC Adventurer
-			},
-			[134289] = { -- Energetic Anima Core
-				itemPrice = 15000,
-				achievement = 2072, -- Brass Fortress Quarter Master
-			},
-			[134284] = { -- Mysterious Clockwork Sphere
-				itemPrice = 35000,
-				achievement = 2018, -- CC Master explorer
-			},
-			[134288] = { -- Skeleton Key Replica
-				itemPrice = 7500,
-				achievement = 2064, -- The Burden Of Knowledge
-			},
-			[134283] = { -- The motionless Guardian
-				itemPrice = 12000,
-				achievement = 2067, -- Honorary Blackfeather
-			},
-			[134547] = { -- The Truth in Sequence
-				itemPrice = 20000,
-				achievement = 2069, -- Grand Adventurer
-			},
-		},
-		["Mulvise Valyn"] = {
-			[134304] = { -- Boulder, Basalt Slap
-				itemPrice = 1000,
-			},
-			[134292] = { -- Boulder, Metallic Rubble
-				itemPrice = 500,
-			},
-			[134293] = { -- Boulder, Metallic Shard
-				itemPrice = 500,
-			},
-			[134305] = { -- Clockwork Junk Heap, Small
-				itemPrice = 1000,
-			},
-			[134303] = { -- Rock, Basalt Slab
-				itemPrice = 500,
-			},
-			[134296] = { -- Rocks, Sintered Cluster
-				itemPrice = 1000,
-			},
-			[134294] = { -- Rocks, Sintered Column
-				itemPrice = 1000,
-			},
-			[134295] = { -- Rocks, Sintered Pile
-				itemPrice = 1000,
-			},
-			[134297] = { -- Scavenged Grating, Narrow
-				itemPrice = 500,
-			},
-			[134298] = { -- Scavenged Grating, Wide
-				itemPrice = 500,
-			},
-			[134301] = { -- Scavenged Plate, Ornate
-				itemPrice = 500,
-			},
-			[134299] = { -- Scavenged Plate, Plain
-				itemPrice = 500,
-			},
-			[134300] = { -- Scavenged Plate, Wide
-				itemPrice = 500,
-			},
-			[134302] = { -- Scavenged Support, Straight
-				itemPrice = 500,
-			},
-		},
-	},
-
-	["any Alliance Capital"] = {
-		[GetString(FURC_AV_HER)] = {
-			[134291] = { -- New Life Bonfire
-				itemPrice = 10000,
-				achievement = 1671,
-			},
-			[134290] = { -- New Life Celebrant's Standard
-				itemPrice = 2500,
-				achievement = 1674,
-			}
-		},
-	},
-}
-
-
-
-function tableMerge(t1, t2)
-	if nil == t2 and nil == t1 then
-		return {}
-	elseif nil == t2 then
-		return t1
-	elseif nil == t1 then
-		return t2
-	end
-
-    for k,v in pairs(t2) do
-		t1[k] = v
-    end
-    return t1
-end
-
-
--- global function, needs to live here, YES MANA
-function FurC.InitAchievementVendorList()
-
-	FurC.SetupHomesteadItems()
-	FurC.SetupMorrowindItems()
-	FurC.SetupReachItems()
-
-	-- local generatedTable, listTable
-
-	-- FurC.ReachHornData.AchievementVendors["the Mages' guild"]["the Mystic as part of a collection"] = bookList
-
-	-- listTable = FurC.ReachHornData.AchievementVendors["any Alliance Capital"]["Heralda Garscroft"]
-	-- listTable = tableMerge(listTable, achievementVendor)
-
-
-
-end
diff --git a/FurnitureCatalogue/data/EventItems.lua b/FurnitureCatalogue/data/EventItems.lua
deleted file mode 100644
index e4480e5..0000000
--- a/FurnitureCatalogue/data/EventItems.lua
+++ /dev/null
@@ -1,67 +0,0 @@
-FurC.Books = FurC.Books or {}
-FurC.Books[FURC_MORROWIND] = {
-    [126157] = {},
-    [126158] = {},
-    [126159] = {},
-    [126160] = {},
-    [126161] = {},
-    [126162] = {},
-    [126163] = {},
-    [126164] = {},
-}
-
-FurC.EventItems[FURC_DRAGONS] = {
-    ["Jester Festival"] = {
-		["Jester Boxes"] = {
-			[134680] = true, 	-- Jester Box
-		}
-	}
-
-}
-FurC.EventItems[FURC_MORROWIND] = {
-	["Midyear Mayhem"] = {
-		["Boon Box"] = {
-			[126157] = true,	-- Song of Pelinal, #1
-			[126158] = true,	-- Song of Pelinal, #2
-			[126159] = true,	-- Song of Pelinal, #3
-			[126160] = true,	-- Song of Pelinal, #4
-			[126161] = true,	-- Song of Pelinal, #5
-			[126162] = true,	-- Song of Pelinal, #6
-			[126163] = true,	-- Song of Pelinal, #7
-			[126164] = true,	-- Song of Pelinal, #8
-			[118053] = true, 	-- Common Campfire, Outdoor
-		},
-	},
-}
-FurC.EventItems[FURC_REACH] = {
-
-	["Witches' Festival"] = {
-		["Plunder Skull"] = {
-			[130326] = true, 	-- Witches Brazier, Primitive Log",
-			[130337] = true, 	-- Witches Corpse, Wrapped",
-			[130336] = true, 	-- Witches Remains, Hagraven",
-			[130325] = true, 	-- Witches Totem, Emphatic Warning",
-			[130334] = true, 	-- Witches Totem, Antler Charms",
-			[130327] = true, 	-- Witches Totem, Wooden Rack",
-			[130328] = true, 	-- Witches Skull, Horned Ram",
-			[130332] = true, 	-- Witches Totem, Bone Charms",
-			[130340] = true, 	-- Witches Totem, Gnarled Vines and Skull",
-			[130339] = true, 	-- Witches Totem, Twisted Vines and Skull
-			[130338] = true, 	-- Witches Bones, Offering",
-			[131434] = true, 	-- Witch's Festival, Cursed Totem,
-			[132154] = true, 	-- Witch's Totem, Bog",
-			[130302] = GetString(SI_FURC_WW), 	-- Shrub, Burnt Brush"
-			[130298] = GetString(SI_FURC_WW),	-- Branch, Curved Laurel
-			[130296] = GetString(SI_FURC_WW),	-- Branch, Sturdy Laurel
-			[130295] = GetString(SI_FURC_WW),	-- Branch, Sturdy Burnt
-			[130293] = GetString(SI_FURC_WW),	-- Branch, Forked Burnt
-			[130293] = GetString(SI_FURC_WW),	-- Branch, Curved Burnt
-			[130301] = GetString(SI_FURC_WW),	-- Saplings, Burnt Sparse
-			[130299] = GetString(SI_FURC_WW),	-- Saplings, Burnt Cluster
-			[130300] = GetString(SI_FURC_WW),	-- Saplings, Burnt Tall
-			[130297] = GetString(SI_FURC_WW),	-- Branch, Forked Laurel
-
-
-		}
-	}
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Homestead/H_AchievementVendors.lua b/FurnitureCatalogue/data/Homestead/H_AchievementVendors.lua
deleted file mode 100644
index b6e5f43..0000000
--- a/FurnitureCatalogue/data/Homestead/H_AchievementVendors.lua
+++ /dev/null
@@ -1,2578 +0,0 @@
-FurC.AchievementVendors = FurC.AchievementVendors or {}
-FurC.Books	= FurC.Books or {}
-
-function tableMerge(t1, t2)
-	if nil == t2 and nil == t1 then
-		return {}
-	elseif nil == t2 then
-		return t1
-	elseif nil == t1 then
-		return t2
-	end
-
-    for k,v in pairs(t2) do
-		t1[k] = v
-    end
-    return t1
-end
-
-local jesterVendor = {
-	-- tree, Jester's Large
-	[120994]	= {
-		itemPrice 		= 15000,
-		achievement  	= 1723,
-	},
-	-- tree, Jester's Small
-	[118529]	= {
-		itemPrice 		= 5000,
-		achievement  	= 1723,
-	},
-	-- Banner of Mayhem
-	[126720]	= {
-		itemPrice 		= 5000,
-		achievement  	= 1883,
-	},
-	-- Corpse of Mayhem, Argonian
-	[126721]	= {
-		itemPrice 		= 15000,
-		achievement  	= 1888,
-	},
-	-- Corpse of Mayhem, Khajiit
-	[126722]	= {
-		itemPrice 		= 15000,
-		achievement  	= 1888,
-	},
-	-- Corpse of Mayhem, Orc
-	[126723]	= {
-		itemPrice 		= 15000,
-		achievement  	= 1888,
-	},
-	-- Probably-Not-Punch-Bowl of Mayhem
-	[126724]	= {
-		itemPrice 		= 30000,
-		achievement  	= 1892,
-	},
-	-- Stamdard of Mayhem
-	[126719]	= {
-		itemPrice 		= 2500,
-		achievement  	= 1883,
-	},
-	[131433] = { -- Witches Festival, Plunder Skulls
-		itemPrice 	= 10000,
-		-- achievement = 2049,
-	},
-}
-
-local capitalVendor = {
-	[119987] = {		-- Coldharbour Urn
-		itemPrice 	= 5000,
-	},
-	[120037] = {		-- Decorative Skyshard
-		itemPrice 	= 25000,
-		achievement  	= 1009,
-	},
-	[120001] = {		-- Decorative Treasure Chest
-		itemPrice 	= 10000,
-		achievement  	= "",
-	},
-	[119994] = {		-- Depleted Sigil Stone
-		itemPrice 	= 5000,
-		achievement  	= "",
-	},
-	[120066] = {		-- Display Craft Bag
-		itemPrice 	= 5000,
-		achievement  	= "",
-	},
-	[120043] = {		-- Fishing Vessel
-		itemPrice 	= 100000,
-		achievement  	= "",
-	},
-	[120056] = {		-- Hanging Map of Tamriel
-		itemPrice 	= 10000,
-		achievement  	= "",
-	},
-	[119993] = {		-- Lantern of Anguish
-		itemPrice 	= 5000,
-		achievement  	= "",
-	},
-	[120039] = {		-- Primal Altar to Hircine
-		itemPrice 	= 50000,
-		achievement  	= 1009,
-	},
-	[119989] = {		-- Replica Black Soulgem
-		itemPrice 	= 2500,
-		achievement  	= "",
-	},
-	[119988] = {		-- Replica Soul Gem
-		itemPrice 	= 500,
-		achievement  	= "",
-	},
-	[119995] = {		-- Silent Sentinel
-		itemPrice 	= 20000,
-		achievement  	= "",
-	},
-	[119990] = {		-- Soul Gem Case
-		itemPrice 	= 4000,
-		achievement  	= "",
-	},
-	[119992] = {		-- Soul Gem Crate
-		itemPrice 	= 5000,
-		achievement  	= "",
-	},
-	[119996] = {		-- Soul Gem Stand
-		itemPrice 	= 4000,
-		achievement  	= "",
-	},
-	[119991] = {		-- Spare Flesh Atronach Parts
-
-		itemPrice 	= 10000,
-		achievement  	= "",
-	},
-	[119873] = {		-- Tamrith Coffin
-		itemPrice 	= 20000,
-		achievement  	= 1010,
-	},
-	[119872] = {		-- Tamrith Coffin Lid
-		itemPrice 	= 5000,
-		achievement  	= 1010,
-	},
-	[120064] = {		-- DC shield
-		itemPrice 	= 10000,
-		achievement  	= 61,
-	},
-	[120063] = {		-- AD shield
-		itemPrice 	= 10000,
-		achievement  	= 618,
-	},
-	[120065] = {		-- EP shield
-		itemPrice 	= 10000,
-		achievement  	= 617,
-	},
-}
-
-local furnishingVendor = {
-		[120998] = {	-- Block,Wood Cutting
-			itemPrice 	= 100,
-		},
-		[117994] = {	-- Rough Block,Stone Slab
-			itemPrice 	= 100,
-		},
-		[117971] = {	-- Rough Clothesline,Post
-			itemPrice 	= 100,
-		},
-		[117980] = {	-- Rough Firewood,Fireplace
-			itemPrice 	= 100,
-		},
-		[117982] = {	-- Rough Firewood,Stack
-			itemPrice 	= 100,
-		},
-		[117977] = {	-- Rough Stool,Round
-			itemPrice 	= 100,
-		},
-		[117990] = {	-- Tea Table,Carved
-			itemPrice 	= 250,
-		},
-
-}
-
-local morrowindStones = {
-	[120563] = {	-- Stone,Jagged Grey
-		itemPrice 	= 100 ,
-	},
-	[120570] = {	-- Stone,Slanted Grey
-		itemPrice 	= 100 ,
-	},
-	[120571] = {	-- Pebbles,Stacked Grey
-		itemPrice 	= 100,
-	},
-	[120564] = {	-- Pebbles,Stacked Weathered
-		itemPrice 	= 100 ,
-	},
-	[120572] = {	-- Rocks,Jagged Set
-		itemPrice 	= 100,
-	},
-}
-
-local structures = {
-	[117984] = {		-- Rough Block, Dark Stone
-		itemPrice 	= 100,
-	},
-	[117983] = {		-- Rough Block, Light Stone
-		itemPrice 	= 100,
-	},
-	[117995] = {		-- Rough Block, Stone Brick
-		itemPrice 	= 100,
-	},
-	[117993] = {		-- Rough Block, Stone Chunk
-		itemPrice 	= 100,
-	},
-	[117992] = {		-- Rough Block, Stone Section
-		itemPrice 	= 100,
-	},
-	[117994] = {		-- Rough Block, Stone Slab
-		itemPrice 	= 100,
-	},
-
-	[117961] = {		-- Rough Block, Woodcutter's
-		itemPrice 	= 100,
-	},
-
-	[117987] = {		-- Rough Plank, Long
-		itemPrice 	= 100,
-	},
-	[117961] = {		-- Rough Planks, Narrow
-		itemPrice 	= 100,
-	},
-	[117988] = {		-- Rough Planks, Platform
-		itemPrice 	= 100,
-	},
-	[117989] = {		-- Rough Plank, Wide
-		itemPrice 	= 100,
-	},
-	[117973] = {		-- Rough Crate, Dry
-		itemPrice 	= 100,
-	},
-
-}
-
-local boxes = {
-	[120998] = {	-- Block,Wood Cutting
-				itemPrice 	= 100,
-	},
-	[117959] = {		-- Rough Container, Shipping
-		itemPrice 	= 100,
-	},
-
-	[117959] = {		-- Rough Box, Slatted
-		itemPrice 	= 100,
-	},
-	[117931] = {		-- Rough Crate Lid
-		itemPrice 	= 100,
-	},
-	[117957] = {		-- Rough Crate, Cracked
-		itemPrice 	= 100,
-	},
-	[117958] = {		-- Rough Crate, Empty
-		itemPrice 	= 100,
-	},
-	[117930] = {		-- Rough Crate, Open
-		itemPrice 	= 100,
-	},
-	[117953] = {		-- Rough Crate, Sealed
-		itemPrice 	= 100,
-	},
-	[117928] = {		-- Rough Crate, Sturdy
-		itemPrice 	= 100,
-	},
-}
-
-local laundry = {
-		[117968] = {		-- Rough Clothesline, Full
-			itemPrice 	= 100,
-		},
-		[117970] = {		-- Rough Clothesline, Half
-			itemPrice 	= 100,
-		},
-		[117969] = {		-- Rough Clothesline, Long
-			itemPrice 	= 100,
-		},
-		[117972] = {		-- Rough Clothesline, Short
-			itemPrice 	= 100,
-		},
-		[117971] = {		-- Rough Clothesline, Post
-			itemPrice 	= 100,
-		},
-		[117966] = {		-- Rough Tarp, Oversized
-			itemPrice 	= 100,
-		},
-		[117967] = {		-- Rough Tarp, Standard
-			itemPrice 	= 100,
-		},
-}
-
-local fishing_trip = {
-
-		[117965] = {		-- Rough Campfire, Doused
-			itemPrice 	= 100,
-		},
-		[117978] = {		-- Rough Rod, Fishing
-			itemPrice 	= 100,
-		},
-		[117979] = {		-- Rough Spear, Fishing
-			itemPrice 	= 100,
-		},
-		[117977] = {		-- Rough Stool, Fishing
-			itemPrice 	= 100,
-		},
-
-
-}
-
-local bookList = {
-	[120197] = { -- 16 accords of madness, vol vi
-		itemPrice = 500,
-	},
-	[120121] = { -- The Glenmoril Wyrd
-		itemPrice = 500,
-	},
-	[120112] = { -- Legend of the fallen drotto
-		itemPrice = 500,
-	},
-	[120115] = { -- The Posting of the hunt
-		itemPrice = 500,
-	},
-	[120117] = { -- The Viridian Sentinel
-		itemPrice = 500,
-	},
-	[120120] = { -- Ancient Scrolls of the Dwemer IV
-		itemPrice = 500,
-	},
-	[120181] = { -- Antecedent of Dwemer Law
-		itemPrice = 500,
-	},
-	[120116] = { -- Aspects of Lord Hircine
-		itemPrice = 500,
-	},
-	[120114] = { -- Bangkorai, Shield of High Rock
-		itemPrice = 500,
-	},
-	[120104] = { -- Bloodfiends of Rivenspire
-		itemPrice = 500,
-	},
-	[120132] = { -- Circus of Cheerful Slaughter
-		itemPrice = 5000,
-	},
-	[120186] = { -- Dwemer Inquiries, Vol I
-		itemPrice = 500,
-	},
-	[120187] = { -- Dwemer Inquiries, Vol II
-		itemPrice = 500,
-	},
-	[120188] = { -- Dwemer Inquiries, Vol III
-		itemPrice = 500,
-	},
-	[120106] = { -- House-Folk of Silverhoof
-		itemPrice = 500,
-	},
-	[120111] = { -- House Ravenwatch Proclamation
-		itemPrice = 500,
-	},
-	[120108] = { -- House Tamrith - A recent history
-		itemPrice = 500,
-	},
-	[120113] = { -- Living with Lycantrophy
-		itemPrice = 500,
-	},
-	[120194] = { -- Myths of Sheogorath, Vol 1
-		itemPrice = 500,
-	},
-	[120110] = { -- Myths of Sheogorath, Vol 2
-		itemPrice = 500,
-	},
-	[120195] = { -- Myths of Sheogorath, Vol 2
-		itemPrice = 500,
-	},
-	[120236] = { -- Proper Life: Three CHants
-		itemPrice = 500,
-	},
-	[120133] = { -- Robier's Vegetable Garden
-		itemPrice = 5000,
-	},
-	[120109] = { -- Shornhelm, city of the north
-		itemPrice = 500,
-	},
-	[120102] = { -- The Barrows of Westmark Moor
-		itemPrice = 500,
-	},
-	[120232] = { -- The Cantatas of Vivec
-		itemPrice = 500,
-	},
-	[120190] = { -- The Homilies of Blessed Almalexia
-		itemPrice = 500,
-	},
-	[120191] = { -- The Legendary Scourge
-		itemPrice = 500,
-	},
-	[120192] = { -- The LUsty Argonian Maid 1
-		itemPrice = 500,
-	},
-	[120193] = { -- The LUsty Argonian Maid 2
-		itemPrice = 500,
-	},
-	[120199] = { -- Wabbajack
-		itemPrice = 500,
-	},
-	[120235] = { -- Ode to the Tundrastriders
-		itemPrice = 500,
-	},
-	[120237] = { -- Song of the Askelde men
-		itemPrice = 500,
-	},
-	[120230] = { -- Battle of Glenumbra Moors
-		itemPrice = 500,
-	},
-	[120231] = { -- Book of Dawn and Dusk
-		itemPrice = 500,
-	},
-	[120196] = { -- Warrior's Charge
-		itemPrice = 500,
-	},
-	[120082] = {
-		itemPrice = 500,
-	},
-	[120083] = {
-		itemPrice = 500,
-	},
-	[120084] = {
-		itemPrice = 500,
-	},
-	[120085] = {
-		itemPrice = 500,
-	},
-	[120086] = {
-		itemPrice = 500,
-	},
-	[120087] = {
-		itemPrice = 500,
-	},
-	[120088] = {
-		itemPrice = 500,
-	},
-	[120089] = {
-		itemPrice = 500,
-	},
-	[120090] = {
-		itemPrice = 500,
-	},
-	[120091] = {
-		itemPrice = 500,
-	},
-	[120092] = {
-		itemPrice = 500,
-	},
-	[120093] = {
-		itemPrice = 500,
-	},
-	[120094] = {
-		itemPrice = 500,
-	},
-	[120095] = {
-		itemPrice = 500,
-	},
-	[120096] = {
-		itemPrice = 500,
-	},
-	[120097] = {
-		itemPrice = 500,
-	},
-	[120098] = {
-		itemPrice = 500,
-	},
-	[120099] = {
-		itemPrice = 500,
-	},
-	[120100] = {
-		itemPrice = 500,
-	},
-	[120101] = {
-		itemPrice = 500,
-	},
-	[120103] = {
-		itemPrice = 500,
-	},
-	[120105] = {
-		itemPrice = 500,
-	},
-	[120107] = {
-		itemPrice = 500,
-	},
-	[120118] = {
-		itemPrice = 500,
-	},
-	[120119] = {
-		itemPrice = 500,
-	},
-	[120122] = {
-		itemPrice = 500,
-	},
-	[120123] = {
-		itemPrice = 500,
-	},
-	[120124] = {
-		itemPrice = 500,
-	},
-	[120125] = {
-		itemPrice = 500,
-	},
-	[120126] = {
-		itemPrice = 500,
-	},
-	[120127] = {
-		itemPrice = 500,
-	},
-	[120128] = {
-		itemPrice = 500,
-	},
-	[120129] = {
-		itemPrice = 500,
-	},
-	[120130] = {
-		itemPrice = 500,
-	},
-	[120131] = {
-		itemPrice = 500,
-	},
-	[120134] = {
-		itemPrice = 500,
-	},
-	[120135] = {
-		itemPrice = 500,
-	},
-	[120136] = {
-		itemPrice = 500,
-	},
-	[120137] = {
-		itemPrice = 500,
-	},
-	[120138] = {
-		itemPrice = 500,
-	},
-	[120139] = {
-		itemPrice = 500,
-	},
-	[120140] = {
-		itemPrice = 500,
-	},
-	[120141] = {
-		itemPrice = 500,
-	},
-	[120142] = {
-		itemPrice = 500,
-	},
-	[120143] = {
-		itemPrice = 500,
-	},
-	[120144] = {
-		itemPrice = 500,
-	},
-	[120145] = {
-		itemPrice = 500,
-	},
-	[120146] = {
-		itemPrice = 500,
-	},
-	[120147] = {
-		itemPrice = 500,
-	},
-	[120148] = {
-		itemPrice = 500,
-	},
-	[120149] = {
-		itemPrice = 500,
-	},
-	[120150] = {
-		itemPrice = 500,
-	},
-	[120151] = {
-		itemPrice = 500,
-	},
-	[120152] = {
-		itemPrice = 500,
-	},
-	[120153] = {
-		itemPrice = 500,
-	},
-	[120154] = {
-		itemPrice = 500,
-	},
-	[120155] = {
-		itemPrice = 500,
-	},
-	[120156] = {
-		itemPrice = 500,
-	},
-	[120157] = {
-		itemPrice = 500,
-	},
-	[120158] = {
-		itemPrice = 500,
-	},
-	[120159] = {
-		itemPrice = 500,
-	},
-	[120160] = {
-		itemPrice = 500,
-	},
-	[120161] = {
-		itemPrice = 500,
-	},
-	[120162] = {
-		itemPrice = 500,
-	},
-	[120163] = {
-		itemPrice = 500,
-	},
-	[120164] = {
-		itemPrice = 500,
-	},
-	[120165] = {
-		itemPrice = 500,
-	},
-	[120166] = {
-		itemPrice = 500,
-	},
-	[120167] = {
-		itemPrice = 500,
-	},
-	[120168] = {
-		itemPrice = 500,
-	},
-	[120169] = {
-		itemPrice = 500,
-	},
-	[120170] = {
-		itemPrice = 500,
-	},
-	[120171] = {
-		itemPrice = 500,
-	},
-	[120172] = {
-		itemPrice = 500,
-	},
-	[120173] = {
-		itemPrice = 500,
-	},
-	[120174] = {
-		itemPrice = 500,
-	},
-	[120175] = {
-		itemPrice = 500,
-	},
-	[120176] = {
-		itemPrice = 500,
-	},
-	[120177] = {
-		itemPrice = 500,
-	},
-	[120178] = {
-		itemPrice = 500,
-	},
-	[120179] = {
-		itemPrice = 500,
-	},
-	[120180] = {
-		itemPrice = 500,
-	},
-	[120182] = {
-		itemPrice = 500,
-	},
-	[120183] = {
-		itemPrice = 500,
-	},
-	[120184] = {
-		itemPrice = 500,
-	},
-	[120185] = {
-		itemPrice = 500,
-	},
-	[120189] = {
-		itemPrice = 500,
-	},
-	[120197] = {
-		itemPrice = 500,
-	},
-	[120198] = {
-		itemPrice = 500,
-	},
-	[120200] = {
-		itemPrice = 500,
-	},
-	[120201] = {
-		itemPrice = 500,
-	},
-	[120202] = {
-		itemPrice = 500,
-	},
-	[120203] = {
-		itemPrice = 500,
-	},
-	[120204] = {
-		itemPrice = 500,
-	},
-	[120205] = {
-		itemPrice = 500,
-	},
-	[120206] = {
-		itemPrice = 500,
-	},
-	[120207] = {
-		itemPrice = 500,
-	},
-	[120208] = {
-		itemPrice = 500,
-	},
-	[120209] = {
-		itemPrice = 500,
-	},
-	[120210] = {
-		itemPrice = 500,
-	},
-	[120211] = {
-		itemPrice = 500,
-	},
-	[120212] = {
-		itemPrice = 500,
-	},
-	[120213] = {
-		itemPrice = 500,
-	},
-	[120214] = {
-		itemPrice = 500,
-	},
-	[120215] = {
-		itemPrice = 500,
-	},
-	[120216] = {
-		itemPrice = 500,
-	},
-	[120217] = {
-		itemPrice = 500,
-	},
-	[120218] = {
-		itemPrice = 500,
-	},
-	[120219] = {
-		itemPrice = 500,
-	},
-	[120220] = {
-		itemPrice = 500,
-	},
-	[120221] = {
-		itemPrice = 500,
-	},
-	[120222] = {
-		itemPrice = 500,
-	},
-	[120223] = {
-		itemPrice = 500,
-	},
-	[120224] = {
-		itemPrice = 500,
-	},
-	[120225] = {
-		itemPrice = 500,
-	},
-	[120226] = {
-		itemPrice = 500,
-	},
-	[120227] = {
-		itemPrice = 500,
-	},
-	[120228] = {
-		itemPrice = 500,
-	},
-	[120229] = {
-		itemPrice = 500,
-	},
-	[120231] = {
-		itemPrice = 500,
-	},
-	[120233] = {
-		itemPrice = 500,
-	},
-	[120234] = {
-		itemPrice = 500,
-	},
-	[120238] = {
-		itemPrice = 500,
-	},
-	[120239] = {
-		itemPrice = 500,
-	},
-	[120240] = {
-		itemPrice = 500,
-	},
-	[120241] = {
-		itemPrice = 500,
-	},
-	[120242] = {
-		itemPrice = 500,
-	},
-	[120243] = {
-		itemPrice = 500,
-	},
-	[120244] = {
-		itemPrice = 500,
-	},
-	[120245] = {
-		itemPrice = 500,
-	},
-	[120246] = {
-		itemPrice = 500,
-	},
-	[120247] = {
-		itemPrice = 500,
-	},
-	[120248] = {
-		itemPrice = 500,
-	},
-	[120249] = {
-		itemPrice = 500,
-	},
-	[120250] = {
-		itemPrice = 500,
-	},
-	[120251] = {
-		itemPrice = 500,
-	},
-	[120252] = {
-		itemPrice = 500,
-	},
-	[120253] = {
-		itemPrice = 500,
-	},
-	[120254] = {
-		itemPrice = 500,
-	},
-	[120255] = {
-		itemPrice = 500,
-	},
-	[120256] = {
-		itemPrice = 500,
-	},
-	[120257] = {
-		itemPrice = 500,
-	},
-	[120258] = {
-		itemPrice = 500,
-	},
-	[120259] = {
-		itemPrice = 500,
-	},
-	[120260] = {
-		itemPrice = 500,
-	},
-	[120261] = {
-		itemPrice = 500,
-	},
-	[120262] = {
-		itemPrice = 500,
-	},
-	[120263] = {
-		itemPrice = 500,
-	},
-	[120264] = {
-		itemPrice = 500,
-	},
-	[120265] = {
-		itemPrice = 500,
-	},
-	[120266] = {
-		itemPrice = 500,
-	},
-	[120267] = {
-		itemPrice = 500,
-	},
-	[120268] = {
-		itemPrice = 500,
-	},
-	[120269] = {
-		itemPrice = 500,
-	},
-	[120270] = {
-		itemPrice = 500,
-	},
-	[120271] = {
-		itemPrice = 500,
-	},
-	[120272] = {
-		itemPrice = 500,
-	},
-	[120273] = {
-		itemPrice = 500,
-	},
-	[120274] = {
-		itemPrice = 500,
-	},
-	[120275] = {
-		itemPrice = 500,
-	},
-	[120276] = {
-		itemPrice = 500,
-	},
-	[120277] = {
-		itemPrice = 500,
-	},
-	[120278] = {
-		itemPrice = 500,
-	},
-	[120279] = {
-		itemPrice = 500,
-	},
-	[120280] = {
-		itemPrice = 500,
-	},
-	[120281] = {
-		itemPrice = 500,
-	},
-	[120282] = {
-		itemPrice = 500,
-	},
-	[120283] = {
-		itemPrice = 500,
-	},
-	[120284] = {
-		itemPrice = 500,
-	},
-	[120285] = {
-		itemPrice = 500,
-	},
-	[120286] = {
-		itemPrice = 500,
-	},
-	[120287] = {
-		itemPrice = 500,
-	},
-	[120288] = {
-		itemPrice = 500,
-	},
-	[120289] = {
-		itemPrice = 500,
-	},
-	[120290] = {
-		itemPrice = 500,
-	},
-	[120291] = {
-		itemPrice = 500,
-	},
-	[120292] = {
-		itemPrice = 500,
-	},
-	[120293] = {
-		itemPrice = 500,
-	},
-	[120294] = {
-		itemPrice = 500,
-	},
-	[120295] = {
-		itemPrice = 500,
-	},
-	[120296] = {
-		itemPrice = 500,
-	},
-	[120297] = {
-		itemPrice = 500,
-	},
-	[120298] = {
-		itemPrice = 500,
-	},
-	[120299] = {
-		itemPrice = 500,
-	},
-	[120300] = {
-		itemPrice = 500,
-	},
-	[120301] = {
-		itemPrice = 500,
-	},
-	[120302] = {
-		itemPrice = 500,
-	},
-	[120303] = {
-		itemPrice = 500,
-	},
-	[120304] = {
-		itemPrice = 500,
-	},
-	[120305] = {
-		itemPrice = 500,
-	},
-	[120306] = {
-		itemPrice = 500,
-	},
-	[120307] = {
-		itemPrice = 500,
-	},
-	[120308] = {
-		itemPrice = 500,
-	},
-	[120309] = {
-		itemPrice = 500,
-	},
-	[120310] = {
-		itemPrice = 500,
-	},
-	[120311] = {
-		itemPrice = 500,
-	},
-	[120312] = {
-		itemPrice = 500,
-	},
-	[120313] = {
-		itemPrice = 500,
-	},
-	[120314] = {
-		itemPrice = 500,
-	},
-	[120315] = {
-		itemPrice = 500,
-	},
-	[120316] = {
-		itemPrice = 500,
-	},
-	[120317] = {
-		itemPrice = 500,
-	},
-	[120318] = {
-		itemPrice = 500,
-	},
-	[120319] = {
-		itemPrice = 500,
-	},
-	[120320] = {
-		itemPrice = 500,
-	},
-	[120321] = {
-		itemPrice = 500,
-	},
-	[120322] = {
-		itemPrice = 500,
-	},
-	[120323] = {
-		itemPrice = 500,
-	},
-	[120324] = {
-		itemPrice = 500,
-	},
-	[120325] = {
-		itemPrice = 500,
-	},
-	[120326] = {
-		itemPrice = 500,
-	},
-	[120327] = {
-		itemPrice = 500,
-	},
-	[120328] = {
-		itemPrice = 500,
-	},
-	[120329] = {
-		itemPrice = 500,
-	},
-	[120330] = {
-		itemPrice = 500,
-	},
-	[120331] = {
-		itemPrice = 500,
-	},
-	[120332] = {
-		itemPrice = 500,
-	},
-	[120333] = {
-		itemPrice = 500,
-	},
-	[120334] = {
-		itemPrice = 500,
-	},
-	[120335] = {
-		itemPrice = 500,
-	},
-	[120336] = {
-		itemPrice = 500,
-	},
-	[120337] = {
-		itemPrice = 500,
-	},
-	[120338] = {
-		itemPrice = 500,
-	},
-	[120339] = {
-		itemPrice = 500,
-	},
-	[120340] = {
-		itemPrice = 500,
-	},
-	[120341] = {
-		itemPrice = 500,
-	},
-	[120342] = {
-		itemPrice = 500,
-	},
-	[120343] = {
-		itemPrice = 500,
-	},
-	[120344] = {
-		itemPrice = 500,
-	},
-	[120345] = {
-		itemPrice = 500,
-	},
-	[120346] = {
-		itemPrice = 500,
-	},
-	[120347] = {
-		itemPrice = 500,
-	},
-	[120348] = {
-		itemPrice = 500,
-	},
-	[120349] = {
-		itemPrice = 500,
-	},
-	[120350] = {
-		itemPrice = 500,
-	},
-	[120351] = {
-		itemPrice = 500,
-	},
-	[120352] = {
-		itemPrice = 500,
-	},
-	[120353] = {
-		itemPrice = 500,
-	},
-	[120354] = {
-		itemPrice = 500,
-	},
-	[120355] = {
-		itemPrice = 500,
-	},
-	[120356] = {
-		itemPrice = 500,
-	},
-	[120357] = {
-		itemPrice = 500,
-	},
-	[120358] = {
-		itemPrice = 500,
-	},
-	[120359] = {
-		itemPrice = 500,
-	},
-	[120360] = {
-		itemPrice = 500,
-	},
-	[120361] = {
-		itemPrice = 500,
-	},
-	[120362] = {
-		itemPrice = 500,
-	},
-	[120363] = {
-		itemPrice = 500,
-	},
-	[120364] = {
-		itemPrice = 500,
-	},
-	[120365] = {
-		itemPrice = 500,
-	},
-	[120366] = {
-		itemPrice = 500,
-	},
-	[120367] = {
-		itemPrice = 500,
-	},
-	[120368] = {
-		itemPrice = 500,
-	},
-	[120369] = {
-		itemPrice = 500,
-	},
-	[120370] = {
-		itemPrice = 500,
-	},
-	[120371] = {
-		itemPrice = 500,
-	},
-	[120372] = {
-		itemPrice = 500,
-	},
-	[120373] = {
-		itemPrice = 500,
-	},
-	[120374] = {
-		itemPrice = 500,
-	},
-	[120375] = {
-		itemPrice = 500,
-	},
-	[120376] = {
-		itemPrice = 500,
-	},
-	[120406] = {
-		itemPrice = 500,
-	},
-	[120407] = {
-		itemPrice = 500,
-	},
-}
-
-FurC.Books[FURC_HOMESTEAD] = bookList
---[[
-			[""] = {		--
-				itemPrice 	= 100,
-			},
-]]
-
-local miscVendor = tableMerge(tableMerge(tableMerge(structures, boxes), laundry), fishing_trip)
-
-
-FurC.AchievementVendors[FURC_HOMESTEAD] = {
-
-	["any Alliance Capital"] = {
-		[GetString(FURC_AV_NAR)] = capitalVendor,
-		[GetString(FURC_AV_HER)] = jesterVendor,
-	},
-	-- location name
-	["Mournhold Bank"] = {
-		-- vendor name
-		[GetString(FURC_AV_LTS)]	  = {
-			[119908] = {	-- Swamp Anemone
-				itemPrice 	= 15000,
-			},
-			[119914] = {	-- Touch of Plague
-				itemPrice 	= 500,
-			},
-			[119913] = {	-- Tribunal Altar
-				itemPrice 	= 25000,
-			},
-			[119911] = {	-- Tribunal Rug
-				itemPrice 	= 5000,
-			},
-			[119910] = {	-- Veloth's Reliquary
-				itemPrice 	= 50000,
-			},
-		},
-		[GetString(FURC_AV_FRO)] = {
-			[120567] = {	-- Bush,Vibrant Barberry
-				itemPrice 	= 250,
-			},
-			[120566] = {	-- Fern Plant,Healthy Green
-				itemPrice 	= 100,
-			},
-			[120574] = {	-- Mushroom,Huge Chanterelle
-				itemPrice 	= 250,
-			},
-			[120568] = {	-- Mushroom,Tall Chanterelle
-				itemPrice 	= 250,
-			},
-		},
-
-	},
-	["Dhalmora, Bal Foyen"] = {
-
-		[GetString(FURC_AV_FRO)] = {
-			[120502] = {	-- Flower, Grandmother Hibiscus
-				itemPrice 	= 1000,
-			},
-			[120621] = {	-- Plant, Red Aloe
-				itemPrice 	= 250,
-			},
-			[120620] = {	-- Plant, Red Aloe Succulent
-				itemPrice 	= 250,
-			},
-			[120618] = {	-- Tree, Gnarled Ashflower
-				itemPrice 	= 5000,
-			},
-			[120619] = {	-- Tree, Twisted Ashflower
-				itemPrice 	= 7500,
-			},
-			[120622] = {	-- Vines, Clustered Ivy
-				itemPrice 	= 600,
-			},
-
-		},
-		[GetString(FURC_AV_LTS)]	  = {
-			[120956] = {	-- Atmoran Eagle Totem Medallion
-				itemPrice 	= 3000,
-			},
-			[120954] = {	-- Atmoran Snake Totem Medallion
-				itemPrice 	= 3000,
-			},
-			[120955] = {	-- Atmoran Whale Totem Medallion
-				itemPrice 	= 3000,
-			},
-		},
-
-	},
-	["Stonefalls, Ebonheart"] = {
-
-		[GetString(FURC_AV_FRO)] = {
-			[120502] = {	-- Flower, Grandmother Hibiscus
-				itemPrice 	= 1000,
-			},
-			[121028] = {	-- Hedge, Dense Low Wall
-				itemPrice 	= 1300,
-			},
-
-			[121284] = {	-- Dark Elf Column Lantern
-				itemPrice 	= 250,
-			},
-
-			[120621] = {	-- Plant, Red Aloe
-				itemPrice 	= 250,
-			},[120620] = {	-- Plant, Red Aloe Succulent
-				itemPrice 	= 250,
-			},
-			[120618] = {	-- Tree, Gnarled Ashflower
-				itemPrice 	= 5000,
-			},
-			[120619] = {	-- Tree, Twisted Ashflower
-				itemPrice 	= 7500,
-			},
-			[120622] = {	-- Vines, Clustered Ivy
-				itemPrice 	= 600,
-			},
-			[120680] = {	-- Topiary, Fragile Cypress
-				itemPrice 	= 2500,
-			},
-			[120681] = {	-- Topiary, Pruned Cypress
-				itemPrice 	= 1100,
-			},
-			[120677] = {	-- Tree, Autumn Cherry Blossom
-				itemPrice 	= 15000,
-			},
-		},
-
-		[GetString(FURC_AV_LTS)]	  = {
-			[119890] = {	-- Blood Fountain
-				itemPrice 	= 100000,
-			},
-			[119889] = {	-- Daedric Sconce
-				itemPrice 	= 5000,
-			},
-			[119888] = {	-- Lacquered Kwama Egg
-				itemPrice 	= 1000,
-			},
-			[119892] = {	-- Remnant of Balreth
-				itemPrice 	= 15000,
-			},
-			[119887] = {	-- Serien's Stand
-				itemPrice 	= 10000,
-			},
-		},
-
-	},
-	["Eastmarch, Fort Amol"] = {
-
-		[GetString(FURC_AV_FRO)] = miscVendor,
-
-
-		[GetString(FURC_AV_LTS)]	  = {
-			[119905] = {	-- Dragon Shrine Altar
-				itemPrice 	= 20000,
-			},
-			[119901] = {	-- Lob's Challenge Horn
-				itemPrice 	= 1000,
-			},
-			[119904] = {	-- Standing Slab
-				itemPrice 	= 1000,
-			},
-			[119906] = {	-- Throne of the Skald King
-				itemPrice 	= 50000,
-			},
-			[119907] = {	-- Visage of the Skald
-				itemPrice 	= 25000,
-			},
-		},
-
-	},
-	["Shadowfen, Alten Corimont"] = {
-
-		[GetString(FURC_AV_FRO)] = {
-			[120502] = {	-- Flower, Grandmother Hibiscus
-				itemPrice 	= 1000,
-			},
-			[120630] = {	-- Pebble, Stacked Lichen
-				itemPrice 	= 100,
-			},
-			[120632] = {	-- Pebble, Stacked Mossy
-				itemPrice 	= 100,
-			},
-			[120637] = {	-- Plant, Dry Spike
-				itemPrice 	= 100,
-			},
-			[120627] = {	-- Rocks, Stacked Angular
-				itemPrice 	= 100,
-			},
-			[120628] = {	-- Rocks, Slanted Mossy
-				itemPrice 	= 100,
-			},
-			[120629] = {	-- Rocks, Smooth Mossy
-				itemPrice 	= 100,
-			},
-			[120634] = {	-- Tree, Towering Swamp Palm
-				itemPrice 	= 250,
-			},
-			[120636] = {	-- Tree, Mud Palm
-				itemPrice 	= 250,
-			},
-
-		},
-
-		[GetString(FURC_AV_LTS)]	  = {
-			[119897] = {	-- Argonian Egg
-				itemPrice 	= 2500,
-			},
-			[119893] = {	-- Mimic Hist Tree
-				itemPrice 	= 20000,
-			},
-			[119900] = {	-- Oblivion Stone
-				itemPrice 	= 5000,
-			},
-			[119898] = {	-- Replica Mnemic Egg
-				itemPrice 	= 100000,
-			},
-			[119899] = {	-- Replica Stone Nest
-				itemPrice 	= 10000,
-			},
-		},
-
-	},
-	["Riften, Market, Armorer"] = {
-
-		[GetString(FURC_AV_FRO)] = {
-			[120502] = {	-- Flower, Grandmother Hibiscus
-				itemPrice 	= 1000,
-			},
-			[120492] = {	-- Boulder, Flat , Weathered
-				itemPrice 	= 100,
-			},
-			[120496] = {	-- Fern, dead
-				itemPrice 	= 100,
-			},
-			[120494] = {	-- Pebble, Stacked, Weathered
-				itemPrice 	= 100,
-			},
-			[120493] = {	-- Rock, Slanted, Tan
-				itemPrice 	= 100,
-			},
-			[120495] = {	-- Sapling, Budding Red
-				itemPrice 	= 100,
-			},
-			[120500] = {	-- Sapling, Tender Autumn
-				itemPrice 	= 100,
-			},
-			[120499] = {	-- Sapling, Tender Harvest
-				itemPrice 	= 250,
-			},
-		},
-
-		[GetString(FURC_AV_LTS)]	  = {
-			[119915] = {	-- Ancient Cultist Totem
-				itemPrice 	= 5000,
-			},
-			[119918] = {	-- Statue of the Wolf
-				itemPrice 	= 7500,
-			},
-			[119922] = {	-- Torn Worm Cult Banner
-				itemPrice 	= 10000,
-			},
-			[119920] = {	-- Totem of the Reach
-				itemPrice 	= 40000,
-			},
-			[119916] = {	-- Ysgramor Statue
-				itemPrice 	= 20000,
-			},
-		},
-	},
-
-
-	["Alik'r, Kozanzet, Sweetwater Inn"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119879]	= { 		-- Kneeling Ansei Statue
-				itemPrice 	= 15000,
-			},
-			[119877]	= { 		-- Reconstructed Necromantic Focus
-				itemPrice 	= 5000,
-			},
-			[119880]	= { 		-- Replica Of Shattered Ansei Sword
-				itemPrice 	= 35000,
-			},
-			[119878]	= { 		-- Standing Ansei Statue
-				itemPrice 	= 15000,
-			},
-			[119876]	= { 		-- Tu'whacca's Braizer
-				itemPrice 	= 5000,
-			},
-		},
-		[GetString(FURC_AV_ROH)] = miscVendor,
-	},
-	["Bangkorai, Evermore"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119885] = {		-- ceremonial Redguard vessel
-				itemPrice 	= 3000,
-			},
-			[119882] = {		-- Damaged Knight of St. Pelin statue
-				itemPrice 	= 5000,
-			},
-			[119883] = {		-- Evermore Mourning Banner
-				itemPrice 	= 4000,
-			},
-			[119881] = {		-- Glenmoril Wyrd Stone
-				itemPrice 	= 5000,
-			},
-			[119884] = {		-- Ragged Imperial Banner
-				itemPrice 	= 4000,
-			},
-
-		},
-		[GetString(FURC_AV_ROH)] = {
-			[120449] = {		-- Bush, Desert Scrub
-				itemPrice 	= 100,
-			},
-			[120457] = {		-- Pebble, smooth desert
-				itemPrice 	= 100,
-			},
-			[120461] = {		-- Cactus, Desert Wine
-				itemPrice 	= 500,
-			},
-			[120452] = {		-- Pebble, smooth grey
-				itemPrice 	= 100,
-			},
-			[120460] = {		-- Plant, green water
-				itemPrice 	= 100,
-			},
-			[120450] = {		-- plant, squat Yucca
-				itemPrice 	= 100,
-			},
-			[120462] = {		-- Plant, tall flowering Yucca
-				itemPrice 	= 100,
-			},
-			[120440] = {		-- Rocks, Scattered, Weatherd
-				itemPrice 	= 100,
-			},
-			[120454] = {		-- Rocks, Stacked Desert
-				itemPrice 	= 100,
-			},
-			[120438] = {		-- Rocks, Stacked Weathered
-				itemPrice 	= 100,
-			},
-			[120441] = {		-- Sapling, Short Highland
-				itemPrice 	= 100,
-			},
-			[120443] = {		-- Sapling, Strong Highland
-				itemPrice 	= 100,
-			},
-			[120443] = {		-- Sapling, Tall Highland
-				itemPrice 	= 100,
-			},
-			[120442] = {		-- Sapling, Squat Highland
-				itemPrice 	= 100,
-			},
-			[120459] = {		-- Shrub, Browncrub
-				itemPrice 	= 100,
-			},
-			[120458] = {		-- Shrub, Speckled Forest
-				itemPrice 	= 250,
-			},
-			[120446] = {		-- Small Juniper Tree
-				itemPrice 	= 100,
-			},
-			[120451] = {		-- Stones, Smooth Gray
-				itemPrice 	= 100,
-			},
-			[120455] = {		-- Stone, stacked desert
-				itemPrice 	= 100,
-			},
-			[120439] = {		-- Stone, tapered weathered
-				itemPrice 	= 100,
-			},
-			[120445] = {		-- Sturdy Juniper Tree
-				itemPrice 	= 100,
-			},
-			[120453] = {		-- Tree, hardened Juniper
-				itemPrice 	= 100,
-			},
-			[120448] = {		-- Tree, old Juniper
-				itemPrice 	= 100,
-			},
-
-		},
-	},
-	["Bethnikh, near tavern"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119984] = {		-- Pirate Banner
-				itemPrice 	= 10000,
-			},
-		},
-		[GetString(FURC_AV_ROH)] = miscVendor,
-	},
-	["Glenumbra, Daggerfall, The Rosy Lion"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119855] = {		-- Wyrstone
-				itemPrice 	= 2500,
-			},
-			[119856] = {		-- Torn Lion Guard Banner
-				itemPrice 	= 5000,
-			},
-			[119862] = {		-- Hagraven Totem
-				itemPrice 	= 5000,
-			},
-			[119857] = {		-- Breton Gravewatcher Statue
-				itemPrice 	= 25000,
-			},
-			[119858] = {		-- Bloodthorn Vines, small
-				itemPrice 	= 5000,
-			},
-		},
-		[GetString(FURC_AV_ROH)] = {
-			[121011] = {		-- Trees, young autumn birch
-				itemPrice 	= 100,
-			},
-			[120713] = {		-- Trees, Towering Autumn Birch
-				itemPrice 	= 250,
-			},
-			[120720] = {		-- Shrubs, Small Berry
-				itemPrice 	= 100,
-			},
-			[120718] = {		-- Shrub, Dense Forest
-				itemPrice 	= 100,
-			},
-			[120717] = {		-- Shrub, Autumn Forest
-				itemPrice 	= 100,
-			},
-			[120711] = {		-- Sapling, Young Birch
-				itemPrice 	= 250,
-			},
-			[120716] = {		-- Sapling, Autumn Cluster
-				itemPrice 	= 100,
-			},
-			[120708] = {		-- Rocks, Craggy set
-				itemPrice 	= 100,
-			},
-			[120527] = {		-- Fern Plant, Green Curly
-				itemPrice 	= 100,
-			},
-			[120707] = {		-- Boulder, Mossy Weathered
-				itemPrice 	= 100,
-			},
-			[120705] = {		-- Boulder, Mossy Grey
-				itemPrice 	= 100,
-			},
-			[120706] = {		-- Boulder, Giant Mossy
-				itemPrice 	= 100,
-			},
-
-		},
-	},
-	["Rivenspire, Shornhelm, Dead Wolf Inn"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119871] = {		-- Wagon of DETH
-				itemPrice 	= 25000,
-			},
-			[120951] = {		-- Hope of Rivenspire
-				itemPrice 	= 5000,
-			},
-			[119875] = {		-- Gargoyle Statue
-				itemPrice 	= 50000,
-			},
-			[120040] = {		-- Crimson-Stained Bowl
-				itemPrice 	= 2500,
-			},
-			[119870] = {		-- Constellation: The Tower
-				itemPrice 	= 10000,
-			},
-			[119869] = {		-- Constellation: The Shadow
-				itemPrice 	= 10000,
-			},
-			[119868] = {		-- Constellation: The Ritual
-				itemPrice 	= 10000,
-			},
-		},
-		[GetString(FURC_AV_ROH)] = {
-			[120578] = {		-- Sapling, Young Aspen
-				itemPrice 	= 100,
-			},
-			[120576] = {		-- Sapling ,Fragile Aspen
-				itemPrice 	= 100,
-			},
-			[120579] = {		-- Flower, Stout Hibiscus
-				itemPrice 	= 250,
-			},
-			[120580] = {		-- Flower, Healthy Hibiscus
-				itemPrice 	= 250,
-			},
-		},
-	},
-	["Stormhaven, Wayrest, Merchant district"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119865] = {		-- Wayrest Guillotine
-				itemPrice 	= 75000,
-			},
-			[119867] = {		-- Vaermina Statue
-				itemPrice 	= 75000,
-			},
-			[119864] = {		-- Spirit Warden Azura Statue
-				itemPrice 	= 75000,
-			},
-			[119866] = {		-- Replica Dreamshard
-				itemPrice 	= 2000,
-			},
-			[119863] = {		-- Knights of the Flame Banner
-				itemPrice 	= 10000,
-			},
-		},
-		[GetString(FURC_AV_ROH)] = {
-
-			[120582] = {		-- Tree, Yellowing Oak
-				itemPrice 	= 20000,
-			},
-			[120442] = {		-- Sapling, Squat Highland
-				itemPrice 	= 100,
-			},
-			[120444] = {		-- Sapling, Tall Highland
-				itemPrice 	= 100,
-			},
-			[120443] = {		-- Sapling, strong Highland
-				itemPrice 	= 100,
-			},
-		}
-	},
-
-	["Skywatch, Auridon"]	= {
-		[GetString(FURC_AV_ATH)] = {
-			[119823] = {		-- Tanzelwil Culanda Stone
-				itemPrice 	= 5000,
-			},
-			[119824] = {		-- Veiled Crystal
-				itemPrice 	= 5000,
-			},
-			[119825] = {		-- Mehrunes Dagon Brazier
-				itemPrice 	= 10000,
-			},
-			[119826] = {		-- High Elf Throne
-				itemPrice 	= 25000,
-			},
-			[119827] = {		-- Ancient High Elf Statue
-				itemPrice 	= 35000,
-			},
-		},
-		[GetString(FURC_AV_MAL)] = {
-			[120663] = {		-- Saplings, Healthy Forest
-				itemPrice 	= 100,
-			},
-			[120662] = {		-- Saplings, Squat Forest
-				itemPrice 	= 100,
-			},
-			[120661] = {		-- Saplings, Young Forest
-				itemPrice 	= 100,
-			},
-
-		},
-	},
-	["Greenshade, Marbruk"] = {
-		[GetString(FURC_AV_MAL)] = {
-			[120597] = { 		-- Fern Plant, Vibrant
-				itemPrice 	= 100,
-			},
-			[120599] = { 		-- Fern, Healthy Green
-				itemPrice 	= 100,
-			},
-			[120595] = { 		-- Fern, Lush
-				itemPrice 	= 100,
-			},
-			[120600] = { 		-- Fern, Young, Healthy
-				itemPrice 	= 100,
-			},
-			[120598] = { 		-- Plants, Low weeds
-				itemPrice 	= 100,
-			},
-			[120588] = { 		-- Rock, Slanted Algae
-				itemPrice 	= 100,
-			},
-			[120590] = { 		-- Rocks, Smooth Set
-				itemPrice 	= 100,
-			},
-			[120592] = { 		-- Saplings, Highland Cluster
-				itemPrice 	= 100,
-			},
-			[120593] = { 		-- Saplings, Twin Highland
-				itemPrice 	= 100,
-			},
-			[120589] = { 		-- Stone, Slanted Weathered
-				itemPrice 	= 100,
-			},
-			[120591] = { 		-- Tree, Vibrant Privet
-				itemPrice 	= 250,
-			},
-			[120587] = { 		-- Boulder, Flat Grey
-				itemPrice 	= 250,
-			},
-			[120586] = { 		-- Boulder, Moss Covered
-				itemPrice 	= 250,
-			},
-
-		},
-
-
-		[GetString(FURC_AV_ATH)] = {
-			[119839] = { 		-- Fires of the WIlderking
-				itemPrice 	= 4000,
-			},
-			[119841] = { 		-- Hectahame Arboretum Relic
-				itemPrice 	= 10000,
-			},
-			[120991] = { 		-- Rise of the Silvenaar
-				itemPrice 	= 5000,
-			},
-			[119840] = { 		-- Sea Elf Banner
-				itemPrice 	= 10000,
-			},
-			[119842] = { 		--
-				itemPrice 	= 7500,
-			},
-		},
-
-	},
-	["Khenarthi's Roost, Mistral"] = {
-			[GetString(FURC_AV_MAL)] = miscVendor,
-			[GetString(FURC_AV_ATH)] = {
-				[119986] = {		-- Maomer Totem
-					itemPrice 	= 10000,
-				},
-			},
-	},
-	["Malabal Tor, Vulkwaesten, tavern"] = {
-			[GetString(FURC_AV_MAL)] = {
-				[120529] = {		-- Fern Cluster, Healthy
-					itemPrice 	= 100,
-				},
-				[120531] = {		-- Fern Fronts, Healthy Green
-					itemPrice 	= 100,
-				},
-				[120530] = {		-- Fern Fronds, Sunburst
-					itemPrice 	= 100,
-				},
-				[120527] = {		-- Fern Plant, Green Curly
-					itemPrice 	= 100,
-				},
-				[120528] = {		-- Fern Plant, Sturdy Mature
-					itemPrice 	= 100,
-				},
-				[120640] = {		-- Fern, Budding Forest
-					itemPrice 	= 100,
-				},
-				[120641] = {		-- Fern, Low Red
-					itemPrice 	= 100,
-				},
-				[120642] = {		-- Mushrooms, Brown Gilled
-					itemPrice 	= 100,
-				},
-				[120534] = {		-- Mushroom, Bruising Webcap
-					itemPrice 	= 250,
-				},
-				[120532] = {		-- Mushrooms, Poison Pax Cluster
-					itemPrice 	= 100,
-				},
-				[120533] = {		-- Mushrooms, Poison Pax Group
-					itemPrice 	= 100,
-				},
-				[120638] = {		-- Rock, Slanted Weathered
-					itemPrice 	= 100,
-				},
-				[120523] = {		-- Rocks, Mossy Cluster
-					itemPrice 	= 100,
-				},
-				[120524] = {		-- Rocks, Mossy Set
-					itemPrice 	= 100,
-				},
-				[120639] = {		-- Stones, Smooth Mossy
-					itemPrice 	= 100,
-				},
-				[120525] = {		-- Tree, Mossy Swamp
-					itemPrice 	= 100,
-				},
-				[120643] = {		-- Vines, Curtain Ivy
-					itemPrice 	= 750,
-				},
-				[120645] = {		-- Vines, Draped Ivy
-					itemPrice 	= 750,
-				},
-				[120644] = {		-- Vines, Lush Ivy
-					itemPrice 	= 600,
-				},
-			},
-			[GetString(FURC_AV_ATH)] = {
-				[119847] = {		-- Handfast
-					itemPrice 	= 25000,
-				},
-				[119846] = {		-- Handfast Pedestal
-					itemPrice 	= 5000,
-				},
-				[119845] = {		-- Wood Elf Union Trellis
-					itemPrice 	= 15000,
-				},
-				[119843] = {		-- Wood Orc Dream Catcher
-					itemPrice 	= 4000,
-				},
-				[119844] = {		-- Wood Orc Malacath Banner
-					itemPrice 	= 10000,
-				},
-			},
-	},
-	["Grahtwood, Redfur Trading Post"] = {
-			[GetString(FURC_AV_MAL)] = {
-				[120725] = {		-- Boulder, Mossy Crag
-					itemPrice 	= 100,
-				},
-				[121285] = {		-- Tree, Ancient Banyan
-					itemPrice 	= 25000,
-				},
-				[121286] = {		-- Tree, Giant Cypress
-					itemPrice 	= 5000,
-				},
-				[121287] = {		-- Tree, Towering Cypress
-					itemPrice 	= 5000,
-				},
-				[120742] = {		-- Tree, Twisted Banyan
-					itemPrice 	= 25000,
-				},
-				[119578] = {		-- Tree, Towering Palm Cluster
-					itemPrice 	= 100,
-				},
-				[120741] = {		-- Tree, Towering Wax Palm
-					itemPrice 	= 250,
-				},
-				[121288] = {		-- Tree, Mossy Murkmire Cluster
-					itemPrice 	= 250,
-				},
-				[117975] = {		-- Rough Hay Bed, Sloppy
-					itemPrice 	= 100,
-				},
-			},
-			[GetString(FURC_AV_ATH)] = {
-				[119834] = {		-- Aulus's Captive Audience
-					itemPrice 	= 10000,
-				},
-				[119836] = {		-- Guardian Mane
-					itemPrice 	= 10000,
-				},
-				[119837] = {		-- Orrery Control Pillar Replica
-					itemPrice 	= 10000,
-				},
-				[119835] = {		-- Ukaezai's Ward
-					itemPrice 	= 10000,
-				},
-				[119838] = {		-- Valenwood Brazier
-					itemPrice 	= 4000,
-				},
-			},
-	},
-
-	["Reaper's March, Rawl'Kha, Market"] = {
-			[GetString(FURC_AV_MAL)] = {
-
-				[120558] = {		-- Sapling, Eucalyptus Shrub
-					itemPrice 	= 100,
-				},
-				[120511] = {		-- Bush, Mountain Scrub
-					itemPrice 	= 100,
-				},
-				[120690] = {		-- Fern Plant, Hardy
-					itemPrice 	= 100,
-				},
-				[120510] = {		-- Fern Plant, Sturdy Towering
-					itemPrice 	= 100,
-				},
-				[120512] = {		-- Fern, Fragile
-					itemPrice 	= 100,
-				},
-				[120521] = {		-- Fern, Withering
-					itemPrice 	= 100,
-				},
-				[120691] = {		-- Fern, Young Sunburnt
-					itemPrice 	= 100,
-				},
-				[120561] = {		-- Plant, Jungle Leaf
-					itemPrice 	= 100,
-				},
-				[120697] = {		-- Plant, Leafy Sprouts
-					itemPrice 	= 100,
-				},
-				[120560] = {		-- Plant, Squat Jungle Leaf
-					itemPrice 	= 100,
-				},
-				[120562] = {		-- Plant, Towering Jungle Leaf
-					itemPrice 	= 100,
-				},
-				[120699] = {		-- Platform, Weathered Dock
-					itemPrice 	= 250,
-				},
-				[120700] = {		-- Post, Barnacle Covered
-					itemPrice 	= 100,
-				},
-				[120515] = {		-- Shrub, Lanky Highland
-					itemPrice 	= 100,
-				},
-				[120522] = {		-- Shrub, Tender Privet
-					itemPrice 	= 100,
-				},
-				[121282] = {		-- Tree, Ancient Jungle
-					itemPrice 	= 5000,
-				},
-				[121283] = {		-- Tree, Healthy Jungle
-					itemPrice 	= 250,
-				},
-				[120519] = {		-- Tree, Healthy Privet
-					itemPrice 	= 250,
-				},
-				[120687] = {		-- Tree, Sturdy Shade
-					itemPrice 	= 250,
-				},
-
-
-			},
-			[GetString(FURC_AV_ATH)] = {
-				[120703] = {		-- Khajiiti Column, Spiked
-					itemPrice 	= 4000,
-				},
-				[119848] = {		-- Colovian Projection Crystal
-					itemPrice 	= 5000,
-				},
-				[119853] = {		-- Full Moons Tile
-					itemPrice 	= 5000,
-				},
-				[119850] = {		-- Khajiiti Shrine Guardian Statue
-					itemPrice 	= 20000,
-				},
-				[119849] = {		-- Moonmont Lunar Altar
-					itemPrice 	= 15000,
-				},
-				[119854] = {		-- New Moon Tile
-					itemPrice 	= 5000,
-				},
-				[119852] = {		-- Waning Moons Tile
-					itemPrice 	= 5000,
-				},
-				[119851] = {		-- Waxing Moons Wall Tile
-					itemPrice 	= 5000,
-				},
-			},
-	},
-	["Craglorn, Belkarth Woodworking store"] = {
-		[GetString(FURC_AV_LOT)] = {
-			[119933] = {		-- Craglorn Brazier
-				itemPrice 	= 5000,
-			},
-			[119934] = {		-- Craglorn Sconce
-				itemPrice 	= 5000,
-			},
-			[119931] = {		-- Craglorn Tapestrie
-				itemPrice 	= 35000,
-			},
-			[119925] = {		-- Nirncrux Bowl
-				itemPrice 	= 4000,
-			},
-			[119935] = {		-- Observatory Banner
-				itemPrice 	= 25000,
-			},
-			[119923] = {		-- Serpent Stone
-				itemPrice 	= 5000,
-			},
-			[119929] = {		-- Snake Prayer Tile
-				itemPrice 	= 5000,
-			},
-			[119930] = {		-- Totem of the Serpent
-				itemPrice 	= 10000,
-			},
-
-		},
-		[GetString(FURC_AV_KRR)] = {
-			[120964] = {		-- Boulder, Craggy Heap
-				itemPrice 	= 100,
-			},
-			[120545] = {		-- Tree, Sturdy Summer
-				itemPrice 	= 250,
-			},
-			[120963] = {		-- Boulder, Jagged Crag
-				itemPrice 	= 100,
-			},
-			[120552] = {		-- Bush, Flowering Scrub
-				itemPrice 	= 250,
-			},
-			[120555] = {		-- Flowers, Healthy Goldenrod
-				itemPrice 	= 250,
-			},
-			[120551] = {		-- Plant, Healthy Sage
-				itemPrice 	= 100,
-			},
-			[120977] = {		-- Plant, Strong Sage
-				itemPrice 	= 100,
-			},
-			[120966] = {		-- Rock, Craggy Rubble
-				itemPrice 	= 100,
-			},
-			[120539] = {		-- Rock, Jagged Craggy
-				itemPrice 	= 100,
-			},
-			[120969] = {		-- Sapling, Crabapple
-				itemPrice 	= 100,
-			},
-			[120972] = {		-- Sapling, Desert
-				itemPrice 	= 100,
-			},
-			[120548] = {		-- Sapling, Leaning Ash
-				itemPrice 	= 100,
-			},
-			[120973] = {		-- Sapling, Mountain
-				itemPrice 	= 100,
-			},
-			[120983] = {		-- Sapling, Mountain
-				itemPrice 	= 100,
-			},
-			[120971] = {		-- Sapling, Tall Scrub
-				itemPrice 	= 100,
-			},
-			[120982] = {		-- Sapling, Twisted
-				itemPrice 	= 100,
-			},
-			[120553] = {		-- Sapling, Young Scrub
-				itemPrice 	= 100,
-			},
-			[120976] = {		-- Sapling, Juniper Cluster
-				itemPrice 	= 100,
-			},
-			[120981] = {		-- Sapling, Desert Scrub
-				itemPrice 	= 100,
-			},
-			[120967] = {		-- Stone, Angled Grey
-				itemPrice 	= 100,
-			},
-			[120975] = {		-- Tree, Angled Ash
-				itemPrice 	= 100,
-			},
-			[120543] = {		-- Tree, Blooming Crabapple
-				itemPrice 	= 6000,
-			},
-			[120549] = {		-- Tree, Large Twisted Ash
-				itemPrice 	= 250,
-			},
-			[120547] = {		-- Tree, Leaning Ash
-				itemPrice 	= 250,
-			},
-			[120970] = {		-- Tree, Sturdy Crabapple
-				itemPrice 	= 13000,
-			},
-			[120974] = {		-- Tree, Sturdy Summer
-				itemPrice 	= 250,
-			},
-			[120550] = {		-- Tree, Twisted
-				itemPrice 	= 100,
-			},
-
-		},
-	},
-
-	["Coldharbour, Hollow City, Cicero's General Good"] = {
-
-		[GetString(FURC_AV_LOT)] = {
-			[119828] = {		-- Ayleid Throne
-				itemPrice 	= 50000,
-			},
-			[119830] = {		-- Coldharbour Chandelier
-				itemPrice 	= 25000,
-			},
-			[119831] = {		-- Cowering Statue
-				itemPrice 	= 10000,
-			},
-			[119832] = {		-- Light of Meridia
-				itemPrice 	= 10000,
-			},
-			[119833] = {		-- Molag Bal Banner
-				itemPrice 	= 20000,
-			},
-			[119829] = {		-- Shackle Control Stone
-				itemPrice 	= 25000,
-			},
-		},
-		[GetString(FURC_AV_KRR)] = boxes,
-	},
-
-	["Gold Coast, Kvatch"] = {
-		[GetString(FURC_AV_ATH)] = {
-			[119947] = {		-- Banner of the Kvatch Guard
-				itemPrice 	= 15000,
-			},
-			[119697] = {	-- Blade of Woe, Replica
-				itemPrice 	= 25000,
-			},
-			[119941] = {		-- Brotherhood Poison Vial
-				itemPrice 	= 2500,
-			},
-			[119945] = {		-- Dark Brotherhood Banner
-				itemPrice 	= 10000,
-			},
-			[119953] = {		-- Dark Ledger
-				itemPrice 	= 50000,
-			},
-			[119937] = {		-- Gold Coast Estate Keg
-				itemPrice 	= 500000,
-			},
-			[120950] = {		-- Hanging Hourglass
-				itemPrice 	= 15000,
-			},
-			[119939] = {		-- Hourglass Rug
-				itemPrice 	= 10000,
-			},
-			[119951] = {		-- Litany of Blood
-				itemPrice 	= 25000,
-			},
-			[119944] = {		-- Order of the Hour banner
-				itemPrice 	= 5000,
-			},
-			[119950] = {		-- Preserved Sweetrolls
-				itemPrice 	= 500,
-			},
-			[119940] = {		-- Sanctuary Sconce
-				itemPrice 	= 10000,
-			},
-			[119948] = {		-- Statue of the Mother
-				itemPrice 	= 100000,
-			},
-		},
-		[GetString(FURC_AV_FRO)] = structures,
-	},
-
-	["Hew's Bane"] = {
-		[GetString(FURC_AV_LTS)] = {
-			[119965] = {		-- Abah's Landing Banner
-				itemPrice 	= 10000,
-			},
-			[119961] = {		-- An Adoring Fan
-				itemPrice 	= 2500,
-			},
-			[119969] = {		-- Banner of TAneth
-				itemPrice 	= 10000,
-			},
-			[119968] = {		-- Distracting Harpy Egg
-				itemPrice 	= 1500,
-			},
-			[120989] = {		-- Hanging Wedding Lantern
-				itemPrice 	= 3000,
-			},
-			[119974] = {		-- Hiding Place
-				itemPrice 	= 1000,
-			},
-			[119974] = {		-- Iron Wheel Banner
-				itemPrice 	= 15000,
-			},
-			[119960] = {		-- Jar of Green Dye
-				itemPrice 	= 500,
-			},
-			[120990] = {		-- Large Covered Well
-				itemPrice 	= 15000,
-			},
-			[120952] = {		-- Opulent Dowry Chest
-				itemPrice 	= 50000,
-			},
-			[119955] = {		-- Pale Garden Flowers
-				itemPrice 	= 500,
-			},
-			[119954] = {		-- Reliquary Skull
-				itemPrice 	= 25000,
-			},
-			[119954] = {		-- Statue of Shadows
-				itemPrice 	= 25000,
-			},
-			[119967] = {		-- Vibrant Garden Flowers
-				itemPrice 	= 500,
-			},
-			[119963] = {		-- Yokudan Puzzle Column
-				itemPrice 	= 5000,
-			},
-		},
-		["Rohiza"] = structures,
-	},
-
-	["Orsinium"] = {
-
-		[GetString(FURC_AV_LOT)] = {
-			[119979] = {		-- Fur Throne
-				itemPrice 	= 25000,
-			},
-			[119976] = {		-- Orc Adventuring Backpack
-				itemPrice 	= 500,
-			},
-			[119978] = {		-- Orcish Battle Totem
-				itemPrice 	= 7500,
-			},
-			[119980] = {		-- Orcish Totem
-				itemPrice 	= 10000,
-			},
-			[119977] = {		-- Orcish War Totem
-				itemPrice 	= 5000,
-			},
-			[119975] = {		-- Orsinium Cart
-				itemPrice 	= 10000,
-			},
-			[119981] = {		-- Throne of the Orc King
-				itemPrice 	= 50000,
-			},
-		},
-
-		[GetString(FURC_AV_MAL)] = {
-			[117955] = {		-- Box, Slatted
-				itemPrice 	= 100,
-			},
-			[117964] = {		-- Rough Fire, doused
-				itemPrice 	= 100,
-			},
-			[117985] = {		-- Rough Bread, Morsel
-				itemPrice 	= 100,
-			},
-			[117981] = {		-- Rough Firewood, Smoldering
-				itemPrice 	= 100,
-			},
-			[117976] = {		-- Rough Hay Bed, Sloppy
-				itemPrice 	= 100,
-			},
-			[117976] = {		-- Rough Hay Bed, Covered
-				itemPrice 	= 100,
-			},
-			[117974] = {		-- Rough Hay Bed, Tidy
-				itemPrice 	= 100,
-			},
-			[117986] = {		-- Rough Plank, Long
-				itemPrice 	= 100,
-			},
-
-		},
-
-	},
-
-	["any city"] = {
-		[FURC_AV_ENC] = {
-			[120050] = { -- Enchanter's Sign
-				itemPrice 	= 5000,
-			},
-			[120051] = { -- Enchanting Gem
-				itemPrice 	= 5000,
-				achievement = 1317,
-			},
-		},
-		[GetString(FURC_AV_ALC)] = {
-			[120044] = { -- Alchemy sign
-				itemPrice 	= 10000,
-				achievement = 1031,
-			},
-			[120058] = { -- Harvester's Herbs
-				itemPrice 	= 1000,
-			},
-			[120045] = { -- Poison Satchel
-				itemPrice 	= 5000,
-				achievement = 1464
-			},
-		},
-		[GetString(FURC_AV_COO)] = {
-			[120053] = { -- Chef's Cleaver
-				itemPrice 	= 2500,
-				achievement = 1028,
-			},
-			[120052] = { -- Provisioner's Sign
-				itemPrice 	= 5000,
-				achievement = 1035,
-			},
-		},
-		[GetString(FURC_AV_CLO)] = {
-			[120048] = { -- clothier's sign
-				itemPrice 	= 5000,
-				achievement = 1033,
-			},
-			[120060] = { -- Harvester's Critter Trap
-				itemPrice 	= 5000,
-				achievement = 68,
-			},
-			[120061] = { -- Harvester's Garden Shrub
-				itemPrice 	= 10000,
-				achievement = 68,
-			},
-		},
-		[GetString(FURC_AV_CAR)] = {
-			[120057] = { -- Harvester's Woodpile
-				itemPrice 	= 1000,
-				achievement = 68,
-			},
-			[120054] = { -- Woodworker's Sign
-				itemPrice 	= 5000,
-				achievement = 1036,
-			},
-		},
-		[GetString(FURC_AV_BSM)] = {
-
-			[120046] = { -- Blacksmith's Sign
-				itemPrice 	= 5000,
-				achievement = 1032,
-			},
-			[120059] = { -- Harvester's Ore
-				itemPrice 	= 1000,
-				achievement = 68,
-			},
-			[120062] = { -- Smith's Bellow
-				itemPrice 	= 10000,
-				achievement = 1022,
-			},
-		},
-		[GetString(FURC_AV_OUT)] = {
-			[120028] = { -- Death Marker
-				itemPrice 	= 5000,
-			},
-			[120033] = { -- Decorative Safebox
-				itemPrice 	= 5000,
-				achievement = 1200, -- Safebox Cracker
-			},
-			[120032] = { -- Decorative Thieves Trove
-				itemPrice 	= 5000,
-				achievement = "", -- No Stash Left Behind
-			},
-			[120957] = { -- Faded fence banner
-				itemPrice 	= 10000,
-				achievement = "Ledgerdmain Rank 20",
-			},
-			[120027] = { -- Mass Tombstone
-				itemPrice 	= 10000,
-			},
-			[120026] = { -- Mountain of Loot
-				itemPrice 	= 10000,
-				achievement = "", -- Black Market Mogul
-			},
-			[120029] = { -- Noble Pocket Lint
-				itemPrice 	= 1000,
-				achievement = 1192,-- Sneak Thief Extraordinaire
-			},
-			[120023] = { -- Outlaw Banner
-				itemPrice 	= 5000,
-				achievement = "Ledgerdmain Rank 20",
-			},
-			[120025] = { -- Pile of Coins
-				itemPrice 	= 2500,
-				achievement = 1196, -- Felonious Recompense
-			},
-			[120030] = { -- Pocket Change
-				itemPrice 	= 500,
-			},
-			[120031] = { -- Replica Key, Blank
-				itemPrice 	= 1000,
-				achievement = 1208, -- Master Burglar
-			},
-			[120993] = { -- Scales of Felonious Recompense
-				itemPrice 	= 5000,
-				achievement = 1196, -- Felonious Recompense
-			},
-		},
-
-	},
-
-	["the Mages' guild"] = {
-		["the Mystic as part of a collection"] = {},
-		["the Mystic"] = {
-			[120003] = { -- cheese cutter
-				itemPrice 	= 5000,
-			},
-			[120011] = { -- Mages' Guild Banner
-				itemPrice 	= 10000,
-			},
-		}
-
-	},
-	["the Fighters' guild"] = {
-		["Hall Steward"] = {
-			[120019] = { --Broken Chain
-				itemPrice 	= 50000,
-			},
-			[119999] = { -- Daedric Chest
-				itemPrice 	= 10000,
-			},
-			[120948] = { -- Dark Anchor Pinion
-				itemPrice 	= 100000,
-			},
-			[120019] = { -- Fighters' Guild Banner
-				itemPrice 	= 10000,
-			},
-		},
-	},
-	["the Undaunted Enclaves"] = {
-		["Undaunted Quartermaster"] = {
-			[120036] = { -- Undaunted Banner
-				itemPrice 	= 15000,
-			},
-			[120035] = { -- Undaunted Chest
-				itemPrice 	= 5000,
-			},
-			[120034] = { -- Undaunted Mug
-				itemPrice 	= 1000,
-			},
-		},
-	},
-}
-
-function FurC.SetupHomesteadItems()
-	local generatedTable, listTable
-
-	FurC.AchievementVendors[FURC_HOMESTEAD]["the Mages' guild"]["the Mystic as part of a collection"] = bookList
-
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Dhalmora, Bal Foyen"][GetString(FURC_AV_FRO)]
-	addTable = tableMerge(furnishingVendor, morrowindStones)
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Mournhold Bank"][GetString(FURC_AV_FRO)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Stonefalls, Ebonheart"][GetString(FURC_AV_FRO)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Shadowfen, Alten Corimont"][GetString(FURC_AV_FRO)]
-	addTable = furnishingVendor
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Riften, Market, Armorer"][GetString(FURC_AV_FRO)]
-	addTable = furnishingVendor
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Bangkorai, Evermore"][GetString(FURC_AV_ROH)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Stormhaven, Wayrest, Merchant district"][GetString(FURC_AV_ROH)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Greenshade, Marbruk"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Malabal Tor, Vulkwaesten, tavern"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, addTable)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Reaper's March, Rawl'Kha, Market"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, structures)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Grahtwood, Redfur Trading Post"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, furnishingVendor)
-	listTable = tableMerge(listTable, miscVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Craglorn, Belkarth Woodworking store"][GetString(FURC_AV_KRR)]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Coldharbour, Hollow City, Cicero's General Good"][GetString(FURC_AV_KRR)]
-	listTable = tableMerge(listTable, structures)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Gold Coast, Kvatch"][GetString(FURC_AV_FRO)]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Hew's Bane"]["Rohiza"]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Orsinium"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Glenumbra, Daggerfall, The Rosy Lion"]["Rohiza"]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Rivenspire, Shornhelm, Dead Wolf Inn"]["Rohiza"]
-	listTable = tableMerge(listTable, furnishingVendor)
-
-	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Orsinium"][GetString(FURC_AV_MAL)]
-	listTable = tableMerge(listTable, structures)
-
-
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Homestead/H_Cyrodiil.lua b/FurnitureCatalogue/data/Homestead/H_Cyrodiil.lua
deleted file mode 100644
index 2936b10..0000000
--- a/FurnitureCatalogue/data/Homestead/H_Cyrodiil.lua
+++ /dev/null
@@ -1,130 +0,0 @@
-FurC.PVP = FurC.PVP or {}
-FURC_CYRO = "Cyrodiil"
-FURC_IC = "Imperial City"
-FURC_ITEMSOURCE_VENDOR = "Furnishing vendor"
-FurC.PVP[FURC_HOMESTEAD] = {
-	[FURC_ITEMSOURCE_VENDOR] = {
-		[FURC_CYRO] = {
-			[119656] = {	-- Pennant, Small
-				itemPrice 	= 200,
-				achievement = 92,	-- Volunteer
-			},
-			[119656] = {	-- Wall Banner, Small
-				itemPrice 	= 400,
-				achievement = 93,	-- Recruit
-			},
-			[119635] = {	-- Wall Banner, Medium
-				itemPrice 	= 600,
-				achievement = 94,	-- Tyro
-			},
-			[119636] = {	-- Camp Banner
-				itemPrice 	= 1000,
-				achievement = 95,	-- Legionary
-			},
-			[119675] = {	-- Defaced Covenant Flag
-				itemPrice 	= 2000,
-				achievement = 110,
-			},
-			[119629] = {	-- Defaced Dominion Flag
-				itemPrice 	= 2000,
-				achievement = 110,
-			},
-			[119637] = {	-- Wall Banner, Large
-				itemPrice 	= 3000,
-				achievement = 96,	-- Veteran
-			},
-			[119638] = {	-- Point Capture Flag
-				itemPrice 	= 4000,
-				achievement = 97,	-- Corporal
-			},
-			[119639] = {	-- Spare figurehead
-				itemPrice 	= 5000,
-				achievement = 98, -- Sergeant
-			},
-			[119655] = {	-- Keep Pennant
-				itemPrice 	= 8000,
-				achievement = 113, -- Grand Warlord
-			},
-			[119617] = {	-- Flaming Oil
-				itemPrice 	= 10000,
-				achievement = 104,	-- Tribune
-			},
-			[119642] = {	-- Scattershot Catapult
-				itemPrice 	= 15000,
-				achievement = 100,	-- Captain
-			},
-			[120002] = {	-- Dueling Banner
-				itemPrice 	= 20000,
-				achievement = 1689,
-			},
-			[119641] = {	-- Ballista
-				itemPrice 	= 20000,
-				achievement = 99,
-			},
-			[119644] = {	-- Battering ram
-				itemPrice 	= 25000,
-				achievement = 102,
-			},
-			[119646] = {	-- Oil Catapult
-				itemPrice 	= 25000,
-				achievement = 104,
-			},
-			[119653] = {	-- Cold fire ballista
-				itemPrice 	= 30000,
-				achievement = 111,
-			},
-			[119645] = {	-- Fire Ballista
-				itemPrice 	= 30000,
-				achievement = 103, -- Colonel
-			},
-			[119649] = {	-- Lightning Ballista
-				itemPrice 	= 30000,
-				achievement = 107,
-			},
-			[119650] = {	-- Meatbag Catapult
-				itemPrice 	= 30000,
-				achievement = 107,
-			},
-			[119643] = {	-- Stone Trebuchet
-				itemPrice 	= 40000,
-				achievement = 108,
-			},
-			[119647] = {	-- Fire
-				itemPrice 	= 45000,
-				achievement = 105,
-			},
-			[119654] = {	-- Cold Fire
-				itemPrice 	= 50000,
-				achievement = 112,
-			},
-			[119648] = {	-- Forward Camp
-				itemPrice 	= 50000,
-				achievement = 106,
-			},
-			[119651] = {	-- Iceball Treb
-				itemPrice 	= 50000,
-				achievement = 109,
-			},
-			[120079] = {	-- Transitus shrine
-				itemPrice 	= 100000,
-				achievement = 114,
-			},
-			[120075] = {	-- Elder Scroll
-				itemPrice 	= 200000,
-				achievement = 935,
-			},
-			[120038] = {	-- Throne
-				itemPrice 	= 250000,
-				achievement = 935,
-			},
-		},
-		["Imperial City"] = {
-			[119983] = {	-- Imperial Banner
-				itemPrice 	= 15000,
-			},
-			[119982] = {	-- Molag Bal Brazier
-				itemPrice 	= 25000,
-			},
-		}
-	}
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Homestead/H_EventItems.lua b/FurnitureCatalogue/data/Homestead/H_EventItems.lua
deleted file mode 100644
index 2ad6289..0000000
--- a/FurnitureCatalogue/data/Homestead/H_EventItems.lua
+++ /dev/null
@@ -1,10 +0,0 @@
-FurC.EventItems = FurC.EventItems or {}
-FurC.EventItems[FURC_HOMESTEAD] = {
-	["Jester Festival"] = {
-		["Jester Boxes"] = {
-			[120995] = true, 	-- Banner, Jester's Standard
-			[134680] = true, 	-- Banner, Jester's Standard
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Homestead/H_LuxuryFurnisher.lua b/FurnitureCatalogue/data/Homestead/H_LuxuryFurnisher.lua
deleted file mode 100644
index 817a2e1..0000000
--- a/FurnitureCatalogue/data/Homestead/H_LuxuryFurnisher.lua
+++ /dev/null
@@ -1,67 +0,0 @@
-FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
-
-FurC.LuxuryFurnisher[FURC_HOMESTEAD] = {
-
-	[120821] = {	-- Sigil Stendarr
-		itemPrice 	= 15000,
-		itemDate	= "2017-04-28",
-	},
-
-	[120824] = {	-- Body Cage
-		itemPrice 	= 5000,
-		itemDate	= "2017-05-12",
-	},
-	[120829] = {	-- Torture Rack
-		itemPrice 	= 5000,
-		itemDate	= "2017-05-12",
-	},
-	[120828] = {	-- Torture Wheel
-		itemPrice 	= 100000,
-		itemDate	= "2017-05-12",
-	},
-
-
-	[120803] = {	-- Hews Bane Bed, Royal
-		itemPrice 	= 20000,
-		itemDate	= "2018-02-24",
-	},
-	[121266] = {	-- Hews Bane Lantern
-		itemPrice 	= 5000,
-		itemDate	= "2018-02-24",
-	},
-	[121267] = {	-- Hews Bane Merchants Basket
-		itemPrice 	= 2500,
-		itemDate	= "2018-02-24",
-	},
-
-	[120802] = {	-- Shrine of Mara, Decorative
-		itemPrice 	= 50000,
-		itemDate	= "2018-02-17",
-	},
-	[120799] = {	-- Wedding Blossoms, Peach
-		itemPrice 	= 2500,
-		itemDate	= "2018-02-17",
-	},
-	[120893] = {	-- Wedding Gazebo
-		itemPrice 	= 50000,
-		itemDate	= "2018-02-17",
-	},
-
-	[120798] = {	-- Wedding Blossoms, Blue
-		itemPrice 	= 2500,
-		itemDate	= "2018-02-10",
-	},
-	[120800] = {	-- Wedding Curtain
-		itemPrice 	= 7500,
-		itemDate	= "2018-02-10",
-	},
-	[120801] = {	-- Wedding Lantern
-		itemPrice 	= 5000,
-		itemDate	= "2018-02-10",
-	},
-	[120797] = {	-- Wedding Flower Trellis
-		itemPrice 	= 10000,
-		itemDate	= "2018-02-10",
-	},
-
-}
diff --git a/FurnitureCatalogue/data/Homestead/H_Recipes.lua b/FurnitureCatalogue/data/Homestead/H_Recipes.lua
deleted file mode 100644
index f29a41b..0000000
--- a/FurnitureCatalogue/data/Homestead/H_Recipes.lua
+++ /dev/null
@@ -1,1077 +0,0 @@
-FurC.Recipes = FurC.Recipes or {}
-
-FurC.Recipes[FURC_HOMESTEAD] = {
-
-	115721, -- Argonian Chimney Stack
-	115722, -- Argonian Rack, Sturdy
-	115723, -- Argonian Shelves, Half
-	115724, -- Argonian Shelves, Full
-	115725, -- Argonian Snakes on a Rope
-	115726, -- Argonian Dried Leaves
-	115727, -- Argonian Lattice, Rough
-	115728, -- Argonian Tarp, Woven
-	115729, -- Argonian Tarp, Sturdy
-	115730, -- Argonian Counter, Long
-	115731, -- Argonian Pole, Split
-	115732, -- Argonian Stool, Roped
-	115733, -- Argonian Chair, Rough
-	115734, -- Argonian Table, Rough
-	115735, -- Argonian Cup, Tall
-	115736, -- Argonian Cup, Short
-	115737, -- Argonian Bowl, Wooden
-	115738, -- Argonian Baskets, Double
-	115739, -- Argonian Basket, Serving
-	115740, -- Argonian Mug, Tooth
-	115741, -- Argonian Ramekin, Hardened
-	115742, -- Argonian Pan, Frying
-	115743, -- Argonian Banner, Hanging
-	115744, -- Argonian Post, Sturdy
-	115745, -- Argonian Post, Rough
-	115746, -- Argonian Mat, Tidy Reed
-	115747, -- Argonian Mat, Rolled Reed
-	115748, -- Argonian Mat, Reed
-	115749, -- Argonian Tent, Reed
-	115750, -- Argonian Canopy, Reed
-	115751, -- Argonian Basket, Closed
-	115752, -- Argonian Bin, Woven
-	115753, -- Argonian Totem, Painted Skull
-	115754, -- Argonian Rack, Drying
-	115755, -- Argonian Totem, Frilled Skull
-	115756, -- Argonian Cage, Rat
-	115757, -- Argonian Cage, Bird
-	115758, -- Argonian Wind Chimes
-	115759, -- Argonian Bar, Woven Corner
-	115760, -- Argonian Snakes in a Basket
-	115761, -- Argonian Bed, Woven
-	115762, -- Argonian Bench", Woven
-	115763, -- Argonian Chair, Woven
-	115764, -- Argonian Trunk, Sturdy
-	115765, -- Argonian Bookshelf, Woven
-	115766, -- Argonian Dresser, Sturdy
-	115767, -- Argonian Shelf, Woven
-	115768, -- Argonian Bookcase, Sturdy
-	115769, -- Argonian Stool, Woven
-	115770, -- Argonian Table, Formal
-	115771, -- Argonian End Table, Woven
-	115772, -- Argonian Bowl, Serving
-	115773, -- Argonian Cup, Bordered
-	115774, -- Argonian Basket, Woven
-	115775, -- Argonian Bowl, Bordered
-	115776, -- Argonian Ramekin, Bordered
-	115777, -- Argonian Urn, Clawfoot
-	115778, -- Argonian Tray, Woven
-	115779, -- Argonian Curtain, Woven
-	115780, -- Argonian Curtains, Woven
-	115781, -- Argonian Medallion, Stone
-	115782, -- Argonian Scaleskin, Pale
-	115783, -- Argonian Scaleskin, Striped
-	115784, -- Argonian Scaleskin, Faded
-	115785, -- Argonian Lamppost
-	115787, -- Argonian Canopy, Frilled
-	115788, -- Argonian Canopy, Skull
-	115789, -- Argonian Canopy, Scaled
-	115790, -- Argonian Trunk, Painted
-	115791, -- Argonian Chest, Carved
-	115792, -- Argonian Skull, Crocodile
-	115793, -- Argonian Totem of the Snake
-	115794, -- Argonian Skull, Lizard
-	115795, -- Argonian Bone Chimes
-	115796, -- Argonian Hamper, Woven
-	115799, -- Argonian Table, Horn
-	115800, -- Argonian Curtain of Smoke
-	115801, -- Argonian Curtain of the Nest
-	115802, -- Argonian Drum, Ceremonial
-	115803, -- Argonian Bowl, Ritual
-	115804, -- Argonian Jug, Ritual
-	115805, -- Argonian Pot, Ritual
-	115806, -- Argonian Pestle, Bone
-	115807, -- Argonian Seat of Authority
-	115808, -- Argonian Seat of Honor
-	115809, -- Argonian Mortar and Pestle, Bone
-	115810, -- Argonian Mortar, Bone
-	115811, -- Argonian Pedestal, Altar
-	115812, -- Argonian Censer
-	115813, -- Argonian Relic, Small Serpent
-	115814, -- Argonian Relic, Serpent
-	115815, -- Argonian Seat of Comfort
-	115816, -- Argonian Divider, Stretched
-	115817, -- Argonian Bedroll, Woven
-	115818, -- Argonian Banners, Frilled
-	115819, -- Argonian Banner, Half Hands
-	115820, -- Argonian Post, Frilled
-	115821, -- Argonian Lanterns, String
-	115822, -- Argonian Lanterns, Strand
-	115823, -- Argonian Light, Stick
-	115824, -- Argonian Lamp, Mud
-	115825, -- Argonian Brazier, Mud
-	115826, -- Argonian Lights, Branch
-	115827, -- Argonian Bark, Painted
-	115828, -- Argonian Relic, Basin
-	115829, -- Argonian Totem of Skulls
-	115830, -- Argonian Gravestick
-	115831, -- Argonian Tree of Lights
-	115832, -- Argonian Tile, Inscribed
-	115833, -- Wood Elf Stool, Leather
-	115834, -- Wood Elf Counter, Long Leather
-	115835, -- Wood Elf Shelf, Tiered
-	115836, -- Wood Elf Table, Leather
-	115837, -- Wood Elf Bar, Sturdy
-	115838, -- Wood Elf Bar, Long
-	115839, -- Wood Elf Bar, Drying
-	115840, -- Wood Elf Bar, Short
-	115841, -- Wood Elf Rack, Brace
-	115842, -- Wood Elf Divider, Stretched
-	115843, -- Wood Elf Divider, Narrow
-	115844, -- Wood Elf Vase, Swirled
-	115845, -- Wood Elf Urn, Scratched
-	115846, -- Wood Elf Urn, Deer
-	115847, -- Wood Elf Cup, Ceramic
-	115848, -- Wood Elf Cup, Chipped
-	115849, -- Wood Elf Cup, Striped
-	115850, -- Wood Elf Pedestal, Engraved
-	115851, -- Wood Elf Basin, Stone
-	115852, -- Wood Elf Awning, Leather
-	115853, -- Wood Elf Canopy, Leather
-	115854, -- Wood Elf Bedding, Scattered
-	115855, -- Wood Elf Grinding Stone
-	115856, -- Wood Elf Hide, Heavy
-	115857, -- Wood Elf Wall Hide, Pierced
-	115858, -- Wood Elf Wall Hide, Fur
-	115859, -- Wood Elf Wall Hide, Spotted
-	115860, -- Wood Elf Cauldron, Stone
-	115861, -- Wood Elf Tent, Sturdy
-	115862, -- Wood Elf Chair, Leather
-	115863, -- Wood Elf Bookcase, Leather
-	115864, -- Wood Elf Table, Formal
-	115865, -- Wood Elf Barrel, Ceramic
-	115866, -- Wood Elf Cask, Ceramic
-	115867, -- Wood Elf Bladder, Fermenting
-	115868, -- Wood Elf Cauldron, Ceramic
-	115869, -- Wood Elf Hammock, Single
-	115870, -- Wood Elf Hammock, Double
-	115871, -- Wood Elf Rack, Single
-	115872, -- Wood Elf Rack, Double
-	115873, -- Wood Elf Divider, Relaxed
-	115874, -- Wood Elf Divider, Taut
-	115875, -- Wood Elf Vessel, Tiered Ceramic
-	115876, -- Wood Elf Vessel, Tiered Painted
-	115877, -- Wood Elf Pitcher, Painted
-	115878, -- Wood Elf Pitcher, Marked
-	115879, -- Wood Elf Vase, Painted
-	115880, -- Wood Elf Vase, Chipped
-	115881, -- Wood Elf Pitcher, Chipped
-	115882, -- Wood Elf Pitcher, Ceramic
-	115883, -- Wood Elf Bowl, Striped
-	115884, -- Wood Elf Canopy, Braced
-	115885, -- Wood Elf Bedding, Layered
-	115886, -- Wood Elf Censer, Hanging
-	115887, -- Wood Elf Tent, Frame
-	115888, -- Wood Elf Rack, Meat
-	115889, -- Wood Elf Totem, Framed
-	115890, -- Wood Elf Totem, Skull
-	115891, -- Wood Elf Trough", Slop
-	115892, -- Wood Elf Bin, Blue Feathers
-	115893, -- Wood Elf Bin, Feathers
-	115894, -- Wood Elf Cask, Painted
-	121371, -- Wood Elf Hearth, Forest
-	121309, -- High Elf Medal, Winged
-	115895, -- Wood Elf Fish Dish
-	115896, -- Wood Elf Tapestry, Painted
-	115897, -- Wood Elf Tapestry, Deer
-	115898, -- Wood Elf Tapestry, Vine
-	115899, -- Wood Elf Canopy, Spine
-	115900, -- Wood Elf Bedding, Padded
-	115901, -- Wood Elf Skull and Bones
-	115902, -- Wood Elf Bone Chimes
-	115903, -- Wood Elf Rack, Dried Fish
-	115904, -- Wood Elf Rack, Dried Meat
-	115906, -- Breton Stall, Merchant
-	115907, -- Breton Cart, Wheelbarrow
-	115908, -- Breton Bed, Bunk
-	115909, -- Breton Bed, Single
-	115910, -- Breton Pew, Windowed
-	115911, -- Breton Bench", Plain
-	115912, -- Breton Nightstand, Open
-	115913, -- Breton Bookcase, Tall
-	115914, -- Breton Chair, Slatted
-	115915, -- Breton Chair, Windowed
-	115916, -- Breton Shelves, Double
-	115917, -- Breton Rack, Barrel
-	115918, -- Breton Dresser, Open
-	115919, -- Breton Desk
-	115920, -- Breton Table, Dining
-	115921, -- Breton Trestle, Sturdy
-	115922, -- Breton Table, Kitchen
-	115923, -- Breton Shelf, Long
-	115924, -- Breton Pitcher, Ceramic
-	115925, -- Breton Carpet, Bordered
-	115926, -- Breton Carpet, Square
-	115927, -- Breton Amphora, Ceramic
-	115928, -- Breton Vase, Ceramic
-	115929, -- Breton Lightpost, Single
-	115930, -- Breton Sconce, Sturdy Torch
-	115931, -- Breton Street Post, Stone
-	115932, -- Breton Sconce, Torch
-	115933, -- Breton Street Post, Plain
-	115934, -- Breton Bed, Four-poster
-	115935, -- Breton Bed, Full
-	115936, -- Breton Pew, Knotwork
-	115937, -- Breton Bench", Knotwork
-	115938, -- Breton Bookcase, Knotwork
-	115939, -- Breton Chair, Rocking
-	115940, -- Breton Chest, Knotwork
-	115941, -- Breton Hutch", Knotwork
-	115942, -- Breton Cupboard, Knotwork
-	115943, -- Breton Chest of Drawers
-	115944, -- Breton Counter, Long Cabinet
-	115945, -- Breton Shelf, Barrel Rack
-	115946, -- Breton Stool, Plain
-	115947, -- Breton Desk, Knotwork
-	115948, -- Breton Table, Round
-	115949, -- Breton Table, Square
-	115950, -- Breton Shelf, Scrolled
-	115951, -- Breton Rack, Wine
-	115952, -- Breton Carpet, Full
-	115953, -- Breton Rug, Starburst
-	115954, -- Breton Carpet, Dark
-	115955, -- Breton Pottery, Lid
-	115956, -- Breton Urn, Glazed
-	115957, -- Breton Amphora, Glazed
-	115959, -- Breton Vase, Glazed
-	115961, -- Breton Streetlight, Arched Stone
-	115962, -- Breton Streetlight, Paired Stone
-	115963, -- Breton Cart, Covered Open
-	115964, -- Breton Stall, Vending
-	115965, -- Breton Lightpost, Arched
-	115966, -- Breton Streetlight, Paired
-	115967, -- Breton Figure, Stone
-	115968, -- Breton Chandelier, Wrought Iron
-	115969, -- Breton Curtains, Window
-	115970, -- Breton Bed, Canopy
-	115971, -- Breton Sideboard, Knotwork
-	115972, -- Breton Chair, Padded
-	115973, -- Breton Armchair, Padded
-	115974, -- Breton Cabinet, Knotwork
-	115975, -- Breton Curio, Knotwork
-	115976, -- Breton Drapes, Grand
-	115977, -- Breton Coffer, Knotwork
-	115978, -- Breton Cradle, Infant
-	115979, -- Breton Dresser, Knotwork
-	115980, -- Breton Counter, Corner
-	115981, -- Breton Counter, Cabinet
-	115982, -- Breton Mirror, Knotwork
-	115983, -- Breton Nightstand, Knotwork
-	115984, -- Breton Divider, Folded Knotwork
-	115985, -- Breton Divider, Curved Knotwork
-	115986, -- Breton Stool, Padded
-	115987, -- Breton Desk, Scholar's
-	115988, -- Breton Table, Formal
-	115989, -- Breton Trestle, Formal
-	115990, -- Breton Rug, Bordered
-	115991, -- Breton Runner, Bordered
-	115992, -- Breton Carpet, Bordered
-	115993, -- Breton Medallion, Lion
-	115994, -- Breton Tablecloth", Blue
-	115995, -- Breton Lamp, Oil
-	115996, -- Breton Tablecloth", Striped
-	115997, -- Breton Footlocker, Knotwork
-	115998, -- Breton Armoire, Knotwork
-	115999, -- Breton Cart, Palanquin
-	116000, -- Breton Tapestry, Vines
-	116001, -- Breton Tapestry, Boughs
-	116002, -- Breton Urn Lid, Striated
-	116003, -- Breton Urn, Striated
-	116004, -- Breton Lamp, Hanging
-	116005, -- Breton Streetlight, Full Stone
-	116006, -- Breton Vase, Delicate
-	116007, -- Breton Streetlight, Full
-	116008, -- Breton Sconce, Floor
-	116009, -- Breton Sconce, Grand
-	116010, -- Breton Candelabra, Formal
-	116011, -- Breton Sconce, Wall
-	116012, -- Dark Elf Cart, Merchant
-	116013, -- Dark Elf Rack, Barrel
-	116014, -- Dark Elf Armchair, Angled
-	116015, -- Dark Elf Chest of Drawers
-	116016, -- Dark Elf Bed, Single
-	116017, -- Dark Elf Table, Formal
-	116018, -- Dark Elf Shelf, Wall
-	116019, -- Dark Elf Urn, Banded
-	116020, -- Dark Elf Basin, Ringed
-	116021, -- Dark Elf Runner, Bordered
-	116022, -- Dark Elf Carpet, Mottled
-	116023, -- Dark Elf Carpet, Patterned
-	116024, -- Dark Elf Tapestry, Emblazoned
-	116025, -- Dark Elf Candle, Claw Base
-	116026, -- Dark Elf Lantern, Oil
-	116027, -- Dark Elf Streetpost, Banner
-	116028, -- Dark Elf Streetpost, Banners
-	116029, -- Dark Elf Wagon, Merchant
-	116030, -- Dark Elf Caravan, Cargo
-	116031, -- Dark Elf Dresser, Angled
-	116032, -- Dark Elf Bookcase, Sectioned
-	116033, -- Dark Elf Chair, Angled
-	116034, -- Dark Elf Counter, Bar
-	116035, -- Dark Elf Wardrobe, Scaled
-	116036, -- Dark Elf Desk, Angled
-	116037, -- Dark Elf Bed, Full
-	116038, -- Dark Elf Pillow, Body
-	116039, -- Dark Elf Stool, Angled
-	116040, -- Dark Elf Table, Tea
-	116041, -- Dark Elf Trestle, Scaled
-	116042, -- Dark Elf Wine Rack, Sturdy
-	116043, -- Dark Elf Shelf, Barrel
-	116044, -- Dark Elf Pot, Scaled
-	116045, -- Dark Elf Decanter, Glass
-	116046, -- Dark Elf Cruet, Glass
-	116047, -- Dark Elf Flags, Hanging
-	116048, -- Dark Elf Cauldron, Banded
-	116049, -- Dark Elf Carpet, Mossy
-	116050, -- Dark Elf Carpet, Fungal
-	116051, -- Dark Elf Rug, Fungal
-	116052, -- Dark Elf Hook, Wall
-	116053, -- Dark Elf Lantern, Caged
-	116054, -- Dark Elf Lantern, Hanging
-	116055, -- Dark Elf Streetlamp, Stone
-	116056, -- Dark Elf Streetlamps, Stone
-	116057, -- Dark Elf Sofa, Angled
-	116058, -- Dark Elf Bed, Canopy
-	116059, -- Dark Elf Counter, Corner
-	116060, -- Dark Elf Counter, Block
-	116061, -- Dark Elf Nightstand, Angled
-	116062, -- Dark Elf Pillow, Cushion
-	116063, -- Dark Elf Pillow, Roll
-	116064, -- Dark Elf Divider, Folded
-	116065, -- Dark Elf End Table, Angled
-	116066, -- Dark Elf Trunk, Buckled
-	116067, -- Dark Elf Wardrobe, Angled
-	116068, -- Dark Elf Kettle Cooker
-	116069, -- Dark Elf Pot, Banded
-	116070, -- Dark Elf Carpet, Ashen
-	116071, -- Dark Elf Rug, Mossy
-	116072, -- Dark Elf Rug, Striated
-	116073, -- Dark Elf Medallion, Tribunal
-	116074, -- Dark Elf Censer, Hanging
-	116075, -- Dark Elf Thurible, Caged
-	116077, -- Dark Elf Cauldron, Ringed
-	116078, -- Dark Elf Lantern, Ashen
-	116079, -- Dark Elf Candelabra, Angled
-	116080, -- Dark Elf Candle, Votive Tray
-	116081, -- Khajiit Firepit, Brick
-	116082, -- Khajiit Loft, Reed
-	116083, -- Khajiit Dresser, Faded
-	116084, -- Khajiit Stool, Crescent
-	116085, -- Khajiit End Table, Faded
-	116086, -- Khajiit Drapes, Tattered
-	116087, -- Khajiit Bottle, Amber
-	116088, -- Khajiit Flask, Amber
-	116089, -- Khajiit Carpet, Crescent Moons
-	116090, -- Khajiit Vase, Amber
-	116091, -- Khajiit Banner, Moons
-	116092, -- Khajiit Banner, Crescents
-	116093, -- Khajiit Candle, Clawfoot
-	116094, -- Khajiit Frame, Arched
-	116095, -- Khajiit Banner, Claw
-	116096, -- Khajiit Bed, Fur
-	116097, -- Khajiit Bedding, Padded
-	116098, -- Khajiit Signpost, Fortified
-	116099, -- Khajiit Bed, Faded
-	116100, -- Khajiit Bench", Padded
-	116101, -- Khajiit Bookshelf, Arched
-	116102, -- Khajiit Trunk, Arched
-	116103, -- Khajiit Counter, Faded
-	116104, -- Khajiit Nightstand, Gilded
-	116105, -- Khajiit Table, Formal
-	116106, -- Khajiit Jug, Amber
-	116107, -- Khajiit Pitcher, Amber
-	116108, -- Khajiit Carpet, Sun
-	116109, -- Khajiit Cushion, Long
-	116110, -- Khajiit Cushion, Single
-	116111, -- Khajiit Carafe, Amber
-	116112, -- Khajiit Decanter, Amber
-	116113, -- Khajiit Banner, Hooked
-	116114, -- Khajiit Brazier, Claw
-	116115, -- Khajiit Basin, Claw
-	116116, -- Khajiit Lantern, Hanging
-	116117, -- Khajiit Tent, Mercantile
-	116118, -- Khajiit Tent, Storage
-	116119, -- Khajiit Wagon, Reed
-	116120, -- Khajiit Curtains, Moons
-	116121, -- Khajiit Barstool, Clawfoot
-	116122, -- Khajiit Barstool, Padded
-	116123, -- Khajiit Skooma Bubbler
-	116124, -- Khajiit Tent, Vacation
-	116125, -- Khajiit Bed, Canopy
-	116126, -- Khajiit Couch", Padded
-	116127, -- Khajiit Bookcase, Arched
-	116128, -- Khajiit Footlocker, Arched
-	116129, -- Khajiit Counter, Long Cabinet
-	116130, -- Khajiit Desk, Faded
-	116131, -- Khajiit Divider, Folding
-	116132, -- Khajiit Table, Round
-	116133, -- Khajiit Wardrobe, Arched
-	116134, -- Khajiit Rug, Moons
-	116135, -- Khajiit Drapes, Grand
-	116136, -- Khajiit Pillow, Crescents
-	116137, -- Khajiit Vial, Amber
-	116138, -- Khajiit Urn, Amber
-	116139, -- Khajiit Vessel, Amber
-	116140, -- Khajiit Candles, Clawfoot
-	116141, -- Khajiit Sofa, Padded
-	116142, -- Khajiit Pillow, Roll
-	116143, -- Khajiit Rug, Sun
-	116144, -- Khajiit Brazier, Hanging
-	116145, -- Khajiit Sconce, Spiked
-	116146, -- Khajiit Candle-Filled Lamp
-	116147, -- Nord Cart, Hay
-	116148, -- Nord Trunk, Heavy
-	116149, -- Nord Hutch", Rough
-	116150, -- Nord Dresser, Rough
-	116151, -- Nord Nightstand, Rough
-	116152, -- Nord Lantern, Cage
-	116153, -- Nord Pot, Ceramic
-	116154, -- Nord Urn, Ceramic
-	116155, -- Nord Bed, Single
-	116156, -- Nord Bench", Braced
-	116157, -- Nord Stool, Rough
-	116158, -- Nord Table, Kitchen
-	116159, -- Nord Shelf, Wall
-	116160, -- Nord Shelf, Braced
-	116161, -- Nord Pot, Covered
-	116162, -- Nord Pot, Stew
-	116163, -- Nord Candle, Tealight
-	116164, -- Nord Candleholder, Cup
-	116165, -- Nord Torch", Triple
-	116166, -- Nord Cart, Cargo
-	116167, -- Nord Trunk, Faded
-	116168, -- Nord Cauldron, Glazed
-	116169, -- Nord Pot, Chunky Stew
-	116170, -- Nord Amphora, Glazed
-	116171, -- Nord Vase, Bent
-	116172, -- Nord Bed, Sleigh
-	116173, -- Nord Bench", Plank
-	116174, -- Nord Bookshelf, Alcove
-	116175, -- Nord Chair, Braced
-	116176, -- Nord Counter, Long
-	116177, -- Nord Dresser, Braced
-	116178, -- Nord Stool, Braced
-	116179, -- Nord Table, Dining
-	116180, -- Nord Table, Round
-	116181, -- Nord Table, Braced
-	116182, -- Nord Trestle, Braced
-	116183, -- Nord Footlocker, Braced
-	116184, -- Nord Armoire, Lattice
-	116185, -- Nord Rack, Wine
-	116186, -- Nord Crockpot, Carrot Soup
-	116187, -- Nord Crockpot, Covered
-	116188, -- Nord Tapestry, Dragon
-	116189, -- Nord Lantern, Hanging
-	116190, -- Nord Drinking Horn, Empty
-	116191, -- Nord Cart, Covered
-	116192, -- Nord Chest, Latched
-	116193, -- Nord Urn, Braided
-	116194, -- Nord Bed, Canopy
-	116195, -- Nord Bookcase, Alcove
-	116196, -- Nord Chair, Lattice
-	116197, -- Nord Counter, Corner
-	116198, -- Nord Counter, Cabinet
-	116199, -- Nord Desk, Tied
-	116200, -- Nord Nightstand, Braced
-	116201, -- Nord Divider, Folding
-	116202, -- Nord Table, Great
-	116203, -- Nord Table, Formal
-	116204, -- Nord Table, Game
-	116205, -- Nord Trestle, Tied
-	116206, -- Nord Rug, Bearskin
-	116207, -- Nord Banner, Knotwork
-	116208, -- Nord Tapestry, Ship
-	116209, -- Nord Candle, Antler
-	116210, -- Nord Chandelier, Antler
-	116211, -- Nord Streetlamps, Stone
-	116212, -- Nord Lamppost, Stone
-	116213, -- Nord Brazier, Hanging
-	116216, -- Nord Trunk, Buckled
-	118916, -- High Elf Wagon, Covered
-	118917, -- High Elf Bed, Winged Double
-	118918, -- High Elf Bench", Covered
-	118919, -- High Elf Bookshelf, Winged
-	118920, -- High Elf Armoire, Winged
-	118921, -- High Elf Bookcase, Winged
-	118922, -- High Elf Dresser, Corner
-	118923, -- High Elf Chair, Regal Verdant
-	118924, -- High Elf Chair, Regal Winged
-	118925, -- High Elf Trunk, Jeweled
-	118926, -- High Elf Counter, Block
-	118927, -- High Elf Cabinet, Corner
-	118928, -- High Elf Desk, Regal Winged
-	118929, -- High Elf Dresser, Winged
-	118930, -- High Elf Divider, Delicate
-	118931, -- High Elf Divider, Carved
-	118932, -- High Elf Table, Tea
-	118933, -- High Elf Stool, Covered
-	118934, -- High Elf End Table, Winged
-	118935, -- High Elf Table, Winged Formal
-	118936, -- High Elf Table, Winged Kitchen
-	118937, -- High Elf Trestle, Winged
-	118938, -- High Elf Bowl, Serving
-	118939, -- High Elf Pot, Hanging
-	118940, -- High Elf Basin, Standing
-	118941, -- High Elf Platter, Winged
-	118942, -- High Elf Carpet, Eagle
-	118943, -- High Elf Tapestry, Eagle
-	118944, -- High Elf Vase, Winged
-	118945, -- High Elf Decanter, Glass
-	118946, -- High Elf Goblet, Winged
-	118947, -- High Elf Goblet, Glass
-	118948, -- High Elf Brazier, Winged
-	118949, -- High Elf Chandelier, Winged
-	118950, -- High Elf Candle, Winged
-	118951, -- High Elf Lamppost, Stone
-	118952, -- High Elf Candelabra, Winged
-	118953, -- High Elf Crest, Winged
-	118954, -- High Elf Streetlight, Stone
-	118955, -- Breton Cart, Covered Closed
-	118956, -- High Elf Wagon, Sturdy
-	118957, -- High Elf Bed, Winged
-	118958, -- High Elf Bed, Verdant
-	118959, -- High Elf Chest of Drawers
-	118960, -- High Elf Bookcase, Verdant
-	118961, -- High Elf Chair, Verdant
-	118962, -- High Elf Chair, Winged
-	118963, -- High Elf Bar, Overhanging
-	118964, -- High Elf Desk, Verdant
-	118965, -- High Elf Dresser, Verdant
-	118966, -- High Elf End Table, Verdant
-	118967, -- High Elf Table, Verdant Formal
-	118968, -- High Elf Table, Verdant Kitchen
-	118969, -- High Elf Trestle, Verdant
-	118970, -- High Elf Trunk, Winged
-	118971, -- High Elf Wine Rack, Folding
-	118972, -- High Elf Platter, Gilded
-	118973, -- High Elf Carpet, Water-Themed
-	118974, -- High Elf Carpet, Tree-Themed
-	118975, -- High Elf Tapestry, Water-Themed
-	118976, -- High Elf Tapestry, Tree-Themed
-	118977, -- High Elf Carafe, Gilded
-	118978, -- High Elf Vase, Gilded
-	118979, -- High Elf Bottle, Winged
-	118980, -- High Elf Flute, Wine
-	118981, -- High Elf Basin, Winged
-	118982, -- High Elf Lamppost, Spiked
-	118983, -- High Elf Lamp, Oil
-	118984, -- High Elf Bed, Bunk
-	118985, -- High Elf Bed, Single
-	118986, -- High Elf Bench", Curved
-	118987, -- High Elf Bookshelf, Verdant
-	118988, -- High Elf Counter, Long Cabinet
-	118989, -- High Elf Desk, Sturdy
-	118990, -- High Elf Dresser, Sturdy
-	118991, -- High Elf Stool, Curved
-	118992, -- High Elf End Table, Sturdy
-	118993, -- High Elf Table, Sturdy Formal
-	118994, -- High Elf Table, Sturdy Kitchen
-	118995, -- High Elf Trestle, Sturdy
-	118996, -- High Elf Shelf, Short
-	118997, -- High Elf Shelf, Long
-	118998, -- High Elf Basin, Gilded
-	118999, -- High Elf Cup, Gilded
-	119000, -- High Elf Flask, Gilded
-	119001, -- High Elf Plate, Dinner
-	119002, -- High Elf Carpet, Rustic
-	119003, -- High Elf Tapestry, Rustic
-	119004, -- High Elf Candleholder, Sturdy
-	119005, -- Orcish Tent, Shingled
-	119006, -- Orcish Platform, Block
-	119007, -- Orcish Counter, Island Stall
-	119008, -- Orcish Wash Tub
-	119009, -- Orcish Bedding, Stone
-	119010, -- Orcish Bedding, Fur
-	119011, -- Orcish Table, Block
-	119012, -- Orcish Table, Braced Formal
-	119013, -- Orcish Table, Braced Kitchen
-	119014, -- Orcish Trunk, Braced
-	119015, -- Orcish Bench", Cabled
-	119016, -- Orcish Shelves, Braced
-	119017, -- Orcish Bar, Long Block
-	119018, -- Orcish Counter, Block
-	119019, -- Orcish Bar, Side
-	119020, -- Orcish Shelf, Long
-	119021, -- Orcish Shelf, Short
-	119022, -- Orcish Stool, Cabled
-	119023, -- Orcish Bowl, Rugged
-	119024, -- Orcish Mug, Rugged
-	119025, -- Orcish Canister, Rugged
-	119026, -- Orcish Cask, Rugged
-	119027, -- Orcish Carpet, Fringed
-	119028, -- Orcish Brazier, Smoldering
-	119029, -- Orcish Lantern, Hooded
-	119030, -- Orcish Banner, Faded
-	119031, -- Orcish Banner, Worn
-	119032, -- Breton Chamberstick, Short
-	119033, -- Breton Chamberstick, Tall
-	119034, -- Orcish Canopy, Shingled
-	119035, -- Orcish Shelter, Shingled
-	119036, -- Orcish Platform, Stage
-	119037, -- Orcish Sack, Grain
-	119038, -- Orcish Sack, Flour
-	119039, -- Orcish Sack, Bean
-	119040, -- Orcish Bucket, Cistern
-	119041, -- Orcish Curtain, Folding
-	119042, -- Orcish Curtain, Curved
-	119043, -- Orcish Armchair, Peaked
-	119044, -- Orcish Pew, Peaked
-	119045, -- Orcish Bedding, Peaked
-	119046, -- Orcish Bookshelf, Engraved
-	119047, -- Orcish Bunkbed, Leather
-	119048, -- Orcish Chair, Peaked
-	119049, -- Orcish Trunk, Heavy
-	119050, -- Orcish Desk, Engraved
-	119051, -- Orcish Bar, Long Branded Block
-	119052, -- Orcish Counter, Branded
-	119053, -- Orcish Cabinet, Branded
-	119054, -- Orcish Dresser, Open
-	119055, -- Orcish Nightstand, Open
-	119056, -- Orcish Table, Engraved
-	119057, -- Orcish Trestle, Engraved
-	119058, -- Orcish Table, Kitchen
-	119059, -- Orcish Table, Formal
-	119060, -- Orcish Footlocker, Buckled
-	119061, -- Orcish Bowl, Stone
-	119062, -- Orcish Goblet, Stone
-	119063, -- Orcish Plate, Stone
-	119064, -- Orcish Saucer, Stone
-	119065, -- Orcish Vessel, Sealed Ceramic
-	119066, -- Orcish Urn, Ceramic
-	119067, -- Orcish Lantern, Hanging
-	119068, -- Orcish Brazier, Pedestal
-	119069, -- Orcish Chandelier, Practical
-	119070, -- Orcish Sconce, Caged
-	119071, -- Orcish Banner, Hammer Fist
-	119072, -- Orcish Strongbox, Buckled
-	119073, -- Orcish Trunk, Buckled
-	119074, -- Orcish Chest, Buckled
-	119075, -- Orcish Chair, Peaked
-	119076, -- Orcish Throne, Stone
-	119077, -- Orcish Throne, Engraved
-	119078, -- Orcish Capsule, Sealed
-	119079, -- Orcish Armoire, Peaked
-	119080, -- Orcish Bed, Peaked
-	119081, -- Orcish Bookcase, Peaked
-	119082, -- Orcish Bookshelf, Peaked
-	119083, -- Orcish Sideboard, Engraved
-	119084, -- Orcish Cabinet, Engraved
-	119085, -- Orcish Hutch", Engraved
-	119086, -- Orcish Coffer, Bolted
-	119087, -- Orcish Cupboards, Peaked
-	119088, -- Orcish Dresser, Engraved
-	119089, -- Orcish Cabinet, Bedside
-	119090, -- Orcish Counter, Corner
-	119091, -- Orcish Hutch", Storage
-	119092, -- Orcish Shelves, Storage
-	119093, -- Orcish Nightstand, Engraved
-	119094, -- Orcish Divider, Folded
-	119095, -- Orcish Divider, Curved
-	119096, -- Orcish Table, Game
-	119097, -- Orcish Table, Grand
-	119098, -- Orcish Throne, Peaked
-	119099, -- Orcish Stein, Horn
-	119100, -- Orcish Mug, Horn
-	119101, -- Orcish Knife, Kitchen
-	119102, -- Orcish Backpack
-	119103, -- Orcish Bowl, Buffed
-	119104, -- Orcish Platter, Serving
-	119105, -- Orcish Urn, Sealed
-	119106, -- Orcish Tapestry, Axe
-	119107, -- Orcish Tapestry, Heroes
-	119108, -- Orcish Tapestry, Sword
-	119109, -- Orcish Vessel, Sealed
-	119110, -- Orcish Cauldron, Sealed
-	119111, -- Orcish Candleholder, Horn
-	119112, -- Orcish Candlestick, Horn
-	119113, -- Orcish Candle Sconce, Horn
-	119114, -- Orcish Brazier, Bordered
-	119115, -- Orcish Brazier, Hanging
-	119116, -- Orcish Brazier, Tabletop
-	119117, -- Orcish Brazier, Floor
-	119118, -- Orcish Sconce, Bordered
-	119119, -- Orcish Sconce, Scrolled
-	119120, -- Orcish Cradle, Peaked
-	121306, -- Orcish Figurine, Strength
-	119121, -- Orcish Mirror, Peaked
-	119122, -- Orcish Tapestry, War
-	119123, -- Orcish Chandelier, Spiked
-	119124, -- Redguard Carriage, Practical
-	119125, -- Redguard Cart, Practical
-	119126, -- Redguard Wagon, Merchant
-	119127, -- Redguard Cart, Work
-	119128, -- Redguard Bin, Roped
-	119129, -- Redguard Bin, Sealed
-	119130, -- Redguard Pot, Sealed
-	119131, -- Redguard Pot, Capped
-	119132, -- Redguard Desk, Florid
-	119133, -- Redguard Rack, Barrel
-	119134, -- Redguard Bar, Long Cabinet
-	119135, -- Redguard Trunk, Heavy
-	119136, -- Redguard Bed, Wide
-	119137, -- Redguard Bed, Full
-	119138, -- Redguard Couch", Bolted
-	119139, -- Redguard Bench", Slatted
-	119140, -- Redguard Armchair, Slatted
-	119141, -- Redguard Chair, Backless
-	119142, -- Redguard Chair, Slatted
-	119143, -- Redguard Desk, Sturdy
-	119144, -- Redguard Nightstand, Sturdy
-	119145, -- Redguard Table, Sturdy
-	119146, -- Redguard Stool, Sturdy
-	119147, -- Redguard Stool, Block
-	119148, -- Redguard Shelf, Sturdy
-	119149, -- Redguard Pot, Hanging Brushed
-	119150, -- Redguard Kabobs, Wax
-	119151, -- Redguard Vessel, Lacquered
-	119152, -- Redguard Urn, Lacquered
-	119153, -- Redguard Pot, Ceramic
-	119154, -- Redguard Curtain, Smoky
-	119155, -- Redguard Curtain, Desert Rose
-	119156, -- Redguard Banner, Post
-	119157, -- Redguard Candlestick, Practical
-	119158, -- Redguard Candleholder, Practical
-	119159, -- Redguard Candelabra, Practical
-	119160, -- Redguard Well, Covered
-	119161, -- Redguard Cup, Empty
-	119162, -- Redguard Cup, Full
-	119163, -- Redguard Caravan, Practical
-	119164, -- Redguard Carriage, Merchant
-	119165, -- Redguard Vase, Lacquered
-	119166, -- Redguard Pot, Lacquered
-	119167, -- Redguard Amphora, Polished
-	119168, -- Redguard Cask, Sealed
-	119169, -- Redguard Keg, Hefty
-	119170, -- Redguard Couch", Padded
-	119171, -- Redguard Cabinet, Inlaid
-	119172, -- Redguard Armchair, Cushioned
-	119173, -- Redguard Cupboard, Lattice
-	119174, -- Redguard Vanity, Florid
-	119175, -- Redguard Counter, Corner
-	119176, -- Redguard Counter, Cabinet
-	119177, -- Redguard Shelf, Barrel
-	119178, -- Redguard Nightstand, Florid
-	119179, -- Redguard Divider, Florid
-	119180, -- Redguard Sofa, Desert Flame
-	119181, -- Redguard Tuffet, Flames
-	119182, -- Redguard Stool, Padded
-	119183, -- Redguard Bed, Wide Grand
-	119184, -- Redguard Bed, Full Arched
-	119185, -- Redguard Bowl, Hanging Star
-	119186, -- Redguard Urn, Star
-	119187, -- Redguard Footlocker, Braced
-	119188, -- Redguard Table, Grand Oasis
-	119189, -- Redguard Table, Oasis
-	119190, -- Redguard End Table, Oasis
-	119191, -- Redguard Trunk, Bolted
-	119192, -- Redguard Wine Rack, Sturdy
-	119193, -- Redguard Shelf, Arched
-	119194, -- Redguard Wardrobe, Inlaid
-	119195, -- Redguard Kabobs, Plate
-	119196, -- Redguard Runner, Sun
-	119197, -- Redguard Mat, Sunset
-	119198, -- Redguard Carpet, Dunes
-	119199, -- Redguard Tapestry, Lattice
-	119200, -- Redguard Satchel, Heavy
-	119201, -- Redguard Goblet, Empty
-	119202, -- Redguard Goblet, Full
-	119203, -- Redguard Spittoon, Gilded
-	119204, -- Redguard Cauldron, Clawfoot
-	119205, -- Redguard Sconce, Polished
-	119206, -- Redguard Mug, Empty
-	119207, -- Redguard Mug, Full
-	119208, -- Redguard Tankard, Empty
-	119209, -- Redguard Tankard, Full
-	119210, -- Redguard Streetlamp, Single
-	119211, -- Redguard Streetlamps, Paired
-	119212, -- Redguard Streetlamps, Triple
-	119213, -- Redguard Brazier, Robust
-	119214, -- Redguard Candlestick, Polished
-	119215, -- Redguard Candleholder, Polished
-	119216, -- Redguard Well, Arched
-	119217, -- Redguard Bowl, Gilded
-	119218, -- Redguard Censer, Hanging Bell
-	119219, -- Redguard Censer, Hanging Horn
-	119220, -- Redguard Basket, Closed
-	119221, -- Redguard Mat, Meditation
-	119222, -- Redguard Mat, Desert Sun
-	119223, -- Redguard Mat, Sunrise
-	119224, -- Redguard Awning, Desert Flame
-	119225, -- Redguard Tent, Scaled Flames
-	119226, -- Redguard Canopy, Dawn
-	119228, -- Redguard Caravan, Cargo
-	119229, -- Redguard Caravan, Merchant
-	119230, -- Redguard Brazier, Garish
-	119231, -- Redguard Urn, Mural
-	119232, -- Redguard Pillow, Sunset
-	119233, -- Redguard Pillow, Oasis
-	119234, -- Redguard Pillow, Florid Oasis
-	119235, -- Redguard Pillow Roll, Oasis
-	119236, -- Redguard Throw Pillow, Oasis
-	119238, -- Redguard Bed, Wide Canopy
-	119239, -- Redguard Couch", Slatted
-	119240, -- Redguard Bench", Padded
-	119241, -- Redguard Wardrobe, Braced
-	119242, -- Redguard Bookcase, Arched
-	119243, -- Redguard Wardrobe, Sturdy
-	119244, -- Redguard Bookcase, Piled
-	119245, -- Redguard Bookcase, Full
-	119246, -- Redguard Armchair, Starry
-	119247, -- Redguard Chair, Starry
-	119248, -- Redguard Desk, Bolted
-	119249, -- Redguard Vanity, Bolted
-	119250, -- Redguard Nightstand, Bolted
-	119251, -- Redguard Pot, Hanging Garish
-	119252, -- Redguard Table, Formal
-	119253, -- Redguard Table, Game
-	119254, -- Redguard Divider, Lattice
-	119255, -- Redguard Stool, Starry
-	119256, -- Redguard Footstool, Starry
-	119257, -- Redguard Cupboard, Sturdy
-	119258, -- Redguard Shelf, Bolted
-	119259, -- Redguard Wine Rack, Inlaid
-	119260, -- Redguard Bench", Arc
-	119261, -- Redguard Pot, Mosaic
-	119262, -- Redguard Pot, Hanging Mosaic
-	119263, -- Redguard Slices, Wax
-	119264, -- Redguard Runner, Oasis
-	119265, -- Redguard Mat, Desert
-	119266, -- Redguard Carpet, Mirage
-	119267, -- Redguard Tapestry, Oasis
-	119268, -- Redguard Chalice, Empty
-	119269, -- Redguard Chalice, Full
-	119270, -- Redguard Hourglass of Desert Sands
-	119271, -- Redguard Jar, Oasis
-	119272, -- Redguard Vase, Baroque
-	119273, -- Redguard Bottle, Delicate
-	119274, -- Redguard Jar, Baroque
-	119275, -- Redguard Decanter, Delicate
-	119276, -- Redguard Lantern, Delicate
-	119277, -- Redguard Streetlamps, Full
-	119278, -- Redguard Candelabra, Twisted
-	119279, -- Redguard Candelabra, Polished
-	119280, -- Redguard Chandelier, Polished
-	119281, -- Redguard Chandelier, Polished Grated
-	119282, -- Redguard Awning, Oasis
-	119283, -- Redguard Tent, Starry
-	119284, -- Redguard Firepit, Stone
-	119285, -- Redguard Counter, Block Island
-	119286, -- Redguard Counter, Bar Island
-	119287, -- Redguard Counter, Grill
-	119288, -- Redguard Brazier, Enchanted
-	119290, -- Redguard Canopy, Stars
-	119291, -- Redguard Pillow, Lattice Flames
-	119292, -- Redguard Pillow, Florid Flames
-	119293, -- Redguard Pillow, Florid Sunset
-	119295, -- Redguard Table, Inlaid
-	119296, -- Redguard Table, Grand Inlaid
-	119297, -- Redguard End Table, Tea
-	119298, -- Redguard Pillow Roll, Desert Flame
-	119299, -- Redguard Throw Pillow, Desert Flame
-	119300, -- Redguard Tuffet, Oasis
-	119301, -- Redguard End Table, Inlaid
-	119302, -- Redguard Decanter, Glass
-	119303, -- Redguard Bottle, Stained Glass
-	119304, -- Redguard Vial, Stained Glass
-	119305, -- Redguard Carpet, Oasis
-	119306, -- Redguard Mat, Mirage
-	119307, -- Redguard Mat, Starburst
-	119308, -- Redguard Lantern, Cannister
-	119309, -- Redguard Lamp, Caged
-	119310, -- Redguard Lantern, Caged
-	119311, -- Redguard Lantern, Caged Stand
-	119312, -- Redguard Tapestry, Starry
-	121373, -- Redguard Censer, Hanging Bulb
-	119314, -- Rough Stretcher, Military
-	119317, -- Rough Crate, Reinforced
-	119325, -- Rough Bag, Burlap
-	119328, -- Rough Hatchet, Practical
-	119330, -- Rough Knife, Butcher
-	119331, -- Rough Bowl, Common
-	119338, -- Rough Platform, Stage
-	119342, -- Rough Crate, Bolted
-	119344, -- Rough Box, Boarded
-	119348, -- Rough Container, Cargo
-	119350, -- Rough Bedroll, Basic
-	119351, -- Lettuce, Display
-	119352, -- Pumpkin, Display
-	119353, -- Winter Squash", Display
-	119354, -- Beet String, Display
-	119355, -- Garlic String, Display
-	119356, -- Beets, Display
-	119357, -- Common Counter, Island Stall
-	119358, -- Common Barrel, Sealed
-	119359, -- Common Basket, Closed
-	119360, -- Common Basket, Lid
-	119361, -- Common Basket, Open
-	119362, -- Common Basket, Tall
-	119363, -- Common Bucket, Basic
-	119364, -- Common Bucket, Rope
-	119365, -- Common Cargo, Covered
-	119366, -- Common Crate, Sealed
-	119367, -- Common Washtub, Empty
-	119368, -- Footstool, Block
-	119369, -- Common Trough
-	119370, -- Common Wheelbarrow, Flat
-	119371, -- Common Wheelbarrow, Barrel
-	119372, -- Common Wheelbarrow, Sided
-	119373, -- Apple, Display
-	119374, -- Common Pack, Backpack
-	119375, -- Common Pack, Satchel
-	119376, -- Banana, Wax
-	119377, -- Common Bowl of Soup, Display
-	119378, -- Carrots, Wax
-	119379, -- Common Cleaver, Cooking
-	119380, -- Common Pot, Cooking
-	119381, -- Grapes, Wax
-	119382, -- Common Inkwell, Practical
-	119383, -- Common Plate, Simple
-	119384, -- Common Plate, Setting
-	119385, -- Sugar Pumpkin, Wax
-	119386, -- Radish", Wax
-	119387, -- Bowl, Serving
-	119388, -- Common Bowl of Stew, Display
-	119389, -- Common Platter, Serving
-	119390, -- Common Skillet, Practical
-	119391, -- Common Candle, Set
-	119392, -- Common Candles, Pair
-	119393, -- Common Candle, Lasting
-	119394, -- Common Bookrest, Practical
-	119395, -- Common Post, Flag Pole
-	119396, -- Common Lantern, Hanging
-	119397, -- Common Lantern, Stationary
-	119399, -- Common Post, Sign Holder
-	119400, -- Hammer, Forge
-	119401, -- Tongs, Forge
-	119402, -- Potato, Wax
-	119403, -- Common Table, Slanted
-	119404, -- Common Cage, Hunting
-	119405, -- Common Trap, Hunting
-	119406, -- Common Cargo, Sealed
-	119407, -- Common Cargo, Reinforced
-	119408, -- Simple Blue Banner
-	119413, -- Cauldron of Soup
-	119416, -- Cauldron of Stew
-	119418, -- Cauldron, Covered
-	119420, -- Cart, Sided
-	119421, -- Coffin, Lid
-	119422, -- Coffin, Case
-	119423, -- Keg
-	119424, -- Cleaver, Butcher's
-	119425, -- Hearty Bread
-	119426, -- Bread, Plain
-	119427, -- Cheese Wedge
-	119428, -- Common Bowl, Serving
-	119429, -- Ham, Display
-	119432, -- Hourglass, Common
-	119438, -- Baked Potato, Display
-	119439, -- Pot Pie, Display
-	119440, -- Pie Dish", Empty
-	119443, -- Drumstick
-	119444, -- Candle, Group
-	119445, -- Lantern, Stationary
-	119446, -- Lantern, Hanging
-	119447, -- Candles, Lasting
-	119448, -- Minecart, Empty
-	119449, -- Minecart, Push
-	119450, -- Knife, Carving
-	119451, -- Kennel, Locked
-	119462, -- Plums, Bunch
-	119463, -- Tangerines, Bunch
-	119464, -- Peaches, Bunch
-	119465, -- Oranges, Bunch
-	119467, -- Cured Meat
-	119468, -- Cured Meats
-	119469, -- Cured Meat Chunks
-	119470, -- Cured Meat Chunk
-	119471, -- Cured Meat Pile
-	119472, -- Cured Meat Hock
-	119476, -- Grilling Rack
-	119477, -- Basket of Apples
-	119478, -- Basket of Apples, Full
-	119479, -- Basket of Lettuce
-	119480, -- Basket of Gourds
-	119481, -- Basket of Corn
-	119482, -- Basket of Tomatoes
-	119483, -- Gibbet, Single
-	119484, -- Bottle, Elixir
-	119485, -- Bottle, Liquor
-	119486, -- Vial, Delicate
-	119487, -- Pie Dish", Display
-	119488, -- Bottle, Wine
-	119489, -- Candle Set, Ritual
-	119490, -- Horn, Ritual
-	119491, -- Cured Meat Shank
-	119518, -- Cage, Wild Animal
-	119520, -- Cage, Covered
-	119524, -- Stockade
-	119525, -- Bread, Braided
-	119526, -- Goblet, Wine
-	119527, -- Bread, Round
-	119529, -- Bread Loaves, Round
-	119532, -- Bread, Hearty Loaves
-	119533, -- Box of Plums
-	119539, -- Sweetroll
-	119540, -- Desk, Engraved
-	119541, -- Fish", Small
-	119542, -- Fish", Medium
-	119543, -- Fish", Large
-	119592, -- Target Skeleton, Humanoid
-
-
-	-- Rollis's recipes
-	121200, -- Cabinet, Poisonmaker's
-	121166, -- Podium, Skinning
-	121168, -- Tools, Case
-	121199, -- Mortar and Pestle
-	121214, -- Orcish Skull Goblet, Full
-	121163, -- Apparatus, Boiler
-	121197, -- Bottle, Poison Elixir
-	121164, -- Case of Vials
-	121209, -- Orcish Tapestry, Spear
-	121207, -- Orcish Table with Fur
-	121207, -- Orcish Table with Fur
-	121315, -- Target Skeleton, Robust Humanoid
-	119592, -- Target Skeleton, Humanoid
-
-	121311, -- Breton Throne
-	121120, -- Chair, Carved
-	121308, -- High Elf Banner, Gilded
-
-	121546, -- Argonian Box, Woven
-	121374, -- Redguard Censer, Hanging Disc
-	121108, -- Simple Brown Banner
-	121310, -- High Elf Sconce, Winged
-	121307, -- Orcish Brazier, Pillar
-
-	-- 116214, -- Nord Banner, Bear
-	-- 115786, -- Argonian Skiff, Common Reed
-
-
-	121207, -- Orcish Table with Fur
-	121203, -- Khajiit Brazier, Enchanted
-	121201, -- Sack of Beans
-
-
-	121111, -- Simple Red Banner
-	121110, -- Simple Purple Banner
-	121109, -- Simple Gray Banner
-	121372, -- Noble Standing Cauldron
-
-	121101, -- Sack of Millet,
-	121100, -- Common Stewpot, Hanging
-	121091, -- Stool, Carved
-	121059, -- Rough Cup, Empty
-
-	121313, -- Wood Elf Throne, Vine
-	121104, -- Common Quill, Feather
-
-	121305, -- Redguard Chandelier, Dark
-	121304, -- Redguard Chandelier, Grated
-	121366, -- Orcish Tapestry, Hunt
-	121365, -- High Elf Tapestry, Gilded
-}
diff --git a/FurnitureCatalogue/data/Homestead/H_Rollis.lua b/FurnitureCatalogue/data/Homestead/H_Rollis.lua
deleted file mode 100644
index 3a6f647..0000000
--- a/FurnitureCatalogue/data/Homestead/H_Rollis.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-FurC.Rollis 		= FurC.Rollis or {}
-FurC.Rollis_Recipes = FurC.Rollis_Recipes or {}
-
-
-FurC.Rollis[FURC_HOMESTEAD] = {
-	-- Alchemy station
-	[118328] = 35,
-	-- Blacksmithing station
-	[119781] = 35,
-	-- Clothing station
-	[119707] = 35,
-	-- Dye Station
-	[118329] = 35,
-	-- Enchanting station
-	[118330] = 35,
-	-- Provisioning station
-	[118327] = 35,
-	-- Woodworking station
-	[119744] = 35,
-
-	-- Attunable Blacksmithing station
-	[119594] = 250,
-	-- Attunable Clothing station
-	[119821] = 250,
-	-- Attunable Woodworking station
-	[119822] = 250,
-}
-
-FurC.Rollis_Recipes[FURC_HOMESTEAD] = {
-	 121207,	-- Target Skeleton
-	 121315,	-- Robust Target Skeleton
-	 126582,	-- Target Centurion
-	 126583,	-- Robust Target Centurion
-}
-
diff --git a/FurnitureCatalogue/data/LuxuryFurnisher.lua b/FurnitureCatalogue/data/LuxuryFurnisher.lua
deleted file mode 100644
index 2aa8c74..0000000
--- a/FurnitureCatalogue/data/LuxuryFurnisher.lua
+++ /dev/null
@@ -1,417 +0,0 @@
-FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
-FurC.LuxuryFurnisher[FURC_DRAGONS] = {
-
-	[134833] = {	-- Gibbet, Hanging Hooked
-		itemPrice 	= 75000,
-		itemDate	= "2018-04-21",
-	},
-
-	[120826] = {	-- Iron Cross
-		itemPrice 	= 10000,
-		itemDate	= "2017-04-21",
-	},
-	[120825] = {	-- Iron Cross, Large
-		itemPrice 	= 25000,
-		itemDate	= "2017-04-21",
-	},
-	[120827] = {	-- Iron Maiden, Chained
-		itemPrice 	= 20000,
-		itemDate	= "2017-04-21",
-	},
-
-
-
-	[134832] = {	-- Basin of the Divines
-		itemPrice 	= 35000,
-		itemDate	= "2018-04-14",
-	},
-    [120823] = {	-- Sigil Stand
-		itemPrice 	= 15000,
-		itemDate	= "2018-04-14",
-	},
-    [120819] = {	-- Sigil, Kynareth
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-14",
-	},
-    [120820] = {	-- Sigil, Mara
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-14",
-	},
-    [120821] = {	-- Sigil, Stendarr
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-14",
-	},
-    [120822] = {	-- Sigil, Zenithar
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-14",
-	},
-
-
-    [120823] = {	-- Sigil Stand
-		itemPrice 	= 15000,
-		itemDate	= "2018-04-07",
-	},
-	[120815] = {	-- Sigil, Akatosh
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-07",
-	},
-	[120816] = {	-- Sigil, Arkay
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-07",
-	},
-	[120817] = {	-- Sigil, Dibella
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-07",
-	},
-	[120818] = {	-- Sigil, Julianos
-		itemPrice 	= 20000,
-		itemDate	= "2018-04-07",
-	},
-	[134831] = {	-- Altar of the Divines
-		itemPrice 	= 50000,
-		itemDate	= "2018-04-07",
-	},
-
-	[134830] = {	-- Flowers, Blue Starbloom
-		itemPrice 	= 15000,
-		itemDate	= "2018-03-31",
-	},
-	[120888] = {	-- Bat Bloom
-		itemPrice 	= 10000,
-		itemDate	= "2018-03-31",
-	},
-	[120887] = {	-- Fan Bush
-		itemPrice 	= 1000,
-		itemDate	= "2018-03-31",
-	},
-	[120889] = {	-- Glow Bush, Purple
-		itemPrice 	= 20000,
-		itemDate	= "2018-03-31",
-	},
-	-- April, 7-9
-	[120885] = {	-- Alik'r Cactus
-		itemPrice 	= 2000,
-		itemDate	= "2018-03-24",
-	},
-	[120884] = {	-- Buckthorn
-		itemPrice 	= 4000,
-		itemDate	= "2018-03-24",
-	},
-	[120883] = {	-- Voidflower
-		itemPrice 	= 5000,
-		itemDate	= "2018-03-24",
-	},
-	[134829] = {	-- Fern, Woody Slough
-		itemPrice 	= 3000,
-		itemDate	= "2018-03-24",
-	},
-	[120886] = {	-- White Hosta
-		itemPrice 	= 3000,
-		itemDate	= "2018-03-24",
-	},
-	[134828] = {	-- Antler Coral, Branched Spiree
-		itemPrice 	= 100000,
-		itemDate	= "2018-03-17",
-	},
-	[120847] = {	-- Dock Winch
-		itemPrice 	= 4000,
-		itemDate	= "2018-03-17",
-	},
-	[120849] = {	-- Anchor
-		itemPrice 	= 10000,
-		itemDate	= "2018-03-17",
-	},
-	[120848] = {	-- Fishing Pole Rack
-		itemPrice 	= 2500,
-		itemDate	= "2018-03-17",
-	},
-	[121269] = {	-- Ocean Antler Coral
-		itemPrice 	= 7500,
-		itemDate	= "2018-03-31",
-	},
-	[121268] = {	-- Fisher's Catch of the Day Rack
-		itemPrice 	= 5000,
-		itemDate	= "2018-03-10",
-	},
-	[120850] = { -- Harbor Floats
-		itemPrice 	= 5000,
-		itemDate	= "2018-03-10",
-	},
-	[120846] = { -- Dock Rope Wheel
-		itemPrice 	= 3000,
-		itemDate	= "2018-03-10",
-	},
-	[134827] = { -- Mooring Line, Coiled
-		itemPrice 	= 7500,
-		itemDate	= "2018-03-10",
-	},
-	[134826] = { -- Mooring Line, Tidy
-		itemPrice 	= 5000,
-		itemDate	= "2018-03-10",
-	},
-	[120806] = {	-- Hew'S Bane Candlestick
-		itemPrice 	= 2500,
-		itemDate	= "2018-03-03",
-	},
-	[120805] = {	-- Hew's Bane Rug
-		itemPrice 	= 5000,
-		itemDate	= "2018-03-03",
-	},
-	[120807] = {	-- Hew's Bane Well
-		itemPrice 	= 10000,
-		itemDate	= "2018-03-03",
-	},
-	[134825] = {	-- Redguard Tent, Squared Silk
-		itemPrice 	= 100000,
-		itemDate	= "2018-03-03",
-	},
-	[117876] = {	-- Wedding Curtain, Wide
-		itemPrice 	= 7500,
-		itemDate	= "2018-02-10",
-	},
-	[134469] = { -- Ayleid Constellation Stele, the Mage
-		itemPrice	= 20000,
-		itemDate	= "2018-02-30",
-	},
-	[134470] = { -- Ayleid Constellation Stele, Thief
-		itemPrice	= 20000,
-		itemDate	= "2018-02-30",
-	},
-	[134471] = { -- Ayleid Constellation Stele, Warrior
-		itemPrice	= 20000,
-		itemDate	= "2018-02-30",
-	},
-	[117875] = {	-- Wedding Gazebo, Bare
-		itemPrice 	= 35000,
-		itemDate	= "2018-02-17",
-	},
-	[134824] = {	-- Redguard Tent, Rounded Silk
-		itemPrice 	= 100000,
-		itemDate	= "2018-02-24",
-	},
-}
-FurC.LuxuryFurnisher[FURC_CLOCKWORK] = {
-	[134466] = { -- Ayleid Sconce, Empty
-		itemPrice	= 4000,
-		itemDate	= "2018-01-27",
-	},
-	[134467] = { -- Culanda Stone ,Glowing
-		itemPrice	= 5000,
-		itemDate	= "2018-01-27",
-	},
-	[134465] = { -- Varla Stone ,Glowing
-		itemPrice	= 5000,
-		itemDate	= "2018-01-27",
-	},
-	[134463] = { -- Riekling Brazier, Ceremonial
-		itemPrice	= 4000,
-		itemDate	= "2018-01-19",
-	},
-	[134462] = { -- Riekling Grinding Stone
-		itemPrice	= 450,
-		itemDate	= "2018-01-19",
-	},
-	[134461] = { -- Riekling Tanning Rack, Stretched
-		itemPrice	= 450,
-		itemDate	= "2018-01-19",
-	},
-	[134457] = {	-- Riekling Bedding, Icy Straw
-		itemPrice 	= 2500,
-		itemDate	= "2018-01-12",
-	},
-	[134458] = {	-- Riekling Pelt, Boar
-		itemPrice 	= 4000,
-		itemDate	= "2018-01-12",
-	},
-	[134459] = {	-- Riekling Pit, Ash and Bone
-		itemPrice 	= 7500,
-		itemDate	= "2018-01-12",
-	},
-	[134453] = {	-- Ancient Orcish Counterweight
-		itemPrice 	= 20000,
-		itemDate	= "2018-01-05",
-	},
-	[134450] = {	-- Seal of Clan Morkul, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2018-01-05",
-	},
-	[134451] = {	-- Seal of Clan Shatul, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2018-01-05",
-	},
-	[134452] = {	-- Seal of Clan Tumnosh, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2018-01-05",
-	},
-	-- Dec. 30thst
-	[134442] = {	-- Seal of Clan Bagrakh, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2017-12-29",
-	},
-	[134443] = {	-- Seal of Clan Fharun, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2017-12-29",
-	},
-	[134444] = {	-- Seal of Clan Igrun, Stone
-		itemPrice 	= 4000,
-		itemDate	= "2017-12-29",
-	},
-	[134446] = {	-- Ancient Orcish Sarcophagus Lid
-		itemPrice 	= 10000,
-		itemDate	= "2017-12-29",
-	},
-	[134445] = {	-- Ancient Orcish Sarcophagus, Peaked
-		itemPrice 	= 14000,
-		itemDate	= "2017-12-29",
-	},
-	-- Dec. 23rd
-	[134439] = {	-- Clockwork Alchemy Flask
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-22",
-	},
-	[134438] = {	-- Clockwork Alchemy Rack, Tubes
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-22",
-	},
-	[134440] = {	-- Clockwork Alchemy Titration Stand
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-22",
-	},
-	-- Dec. 16th
-	[134435] = {	-- Clockwork Loom, Sturdy
-		itemPrice 	= 20000,
-		itemDate	= "2017-12-15",
-	},
-	[134434] = {	-- Quality Fabric, Stacked
-		itemPrice 	= 450,
-		itemDate	= "2017-12-15",
-	},
-	[134436] = {	-- Spool, Blue Thread
-		itemPrice 	= 450,
-		itemDate	= "2017-12-15",
-	},
-	-- Dec. 8th
-	[134432] = {	-- Banker's Sign, Small
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-08",
-	},
-	[134431] = {	-- Merchant's Sign, Small
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-08",
-	},
-	[134433] = {	-- Stablemaster's Sign, Small
-		itemPrice 	= 3000,
-		itemDate	= "2017-12-08",
-	},
-	-- Dec. 1st
-	[134428] = {	-- Banker's Sign, Large
-		itemPrice 	= 12000,
-		itemDate	= "2017-12-01",
-	},
-	[134429] = {	-- Merchant's Sign, Large
-		itemPrice 	= 12000,
-		itemDate	= "2017-12-01",
-	},
-	[134430] = {	-- Stablemaster's Sign, Large
-		itemPrice 	= 12000,
-		itemDate	= "2017-12-01",
-	},
-	-- Nov. 25th
-	[134424] = {	-- Clockwork Gear Display, Bell Jar
-		itemPrice 	= 2500,
-		itemDate	= "2017-11-24",
-	},
-	[134423] = {	-- Clockwork Gear Display, Tall Jar
-		itemPrice 	= 3000,
-		itemDate	= "2017-11-24",
-	},
-	[134426] = {	-- Clockwork Globe, Stand
-		itemPrice 	= 4000,
-		itemDate	= "2017-11-24",
-	},
-	[134425] = {	-- Clockwork Orrery, Compact
-		itemPrice 	= 20000,
-		itemDate	= "2017-11-24",
-	},
-	-- Nov. 18th
-	[134419] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-24",
-	},
-	[134420] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-24",
-	},
-	[134421] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-24",
-	},
-	[134418] = {	-- Clockwork Telescope, Surveyor's
-		itemPrice = 15000,
-		itemDate	= "2017-11-24",
-	},
-	-- Nov. 18th
-	[134419] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-17",
-	},
-	[134420] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-17",
-	},
-	[134421] = {	-- Clockwork Calibration Guide
-		itemPrice = 50000,
-		itemDate	= "2017-11-17",
-	},
-	[134418] = {	-- Clockwork Telescope, Surveyor's
-		itemPrice = 15000,
-		itemDate	= "2017-11-17",
-	},
-	-- Nov. 11th
-	[118285] = {	-- Carcass, Fresh Pheasant
-		itemPrice = 7500,
-		itemDate	= "2017-11-10",
-	},
-	[118292] = {	-- Elk Head, Wall Mount
-		itemPrice = 20000,
-		itemDate	= "2017-11-10",
-	},
-	[116506] = {	-- Orcish Grand Table with Skins
-		itemPrice = 50000,
-		itemDate	= "2017-11-10",
-	},
-	[118243] = {	-- Tapestry, Echatere Pelt
-		itemPrice = 25000,
-		itemDate	= "2017-11-10",
-	},
-	-- Nov. 4th
-	[118286] = {	-- Carcass, Grey Hare
-		itemPrice = 5000,
-		itemDate	= "2017-11-03",
-	},
-	[118281] = {	-- Carcass, Hanging Geese
-		itemPrice = 7000,
-		itemDate	= "2017-11-03",
-	},
-	[118279] = {	-- Deer Head, Wall Mount
-		itemPrice = 15000,
-		itemDate	= "2017-11-03",
-	},
-	[118298] = {	-- Wolf Head, Wall Mount
-		itemPrice = 20000,
-		itemDate	= "2017-11-03",
-	},
-	-- Oct 28th
-	[132143] = {	-- Reach Sapling, Briarheart
-		itemPrice = 50000,
-		itemDate	= "2017-10-27",
-	},
-	[132158] = {	-- Witch's Remains, Offering
-		itemPrice = 50000,
-		itemDate	= "2017-10-27",
-	},
-	[132157] = {	-- Witch's Remains, Sacrificial
-		itemPrice = 50000,
-		itemDate	= "2017-10-27",
-	},
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/MiscItemSources.lua b/FurnitureCatalogue/data/MiscItemSources.lua
deleted file mode 100644
index 2726693..0000000
--- a/FurnitureCatalogue/data/MiscItemSources.lua
+++ /dev/null
@@ -1,296 +0,0 @@
--- use constants because it's a huge performance gain due to how LUA handles strings... at least unless siri lied :P
-
-local FURC_CANBEPICKED_WW		= GetString(SI_FURC_CANBEPICKED) .. " from woodworkers"
-local FURC_CANBEPICKED_ASS 	    = GetString(SI_FURC_CANBEPICKED) .. " from outlaws and assassins"
-local FURC_CANBEPICKED_GUARD	= GetString(SI_FURC_CANBEPICKED) .. " from guards"
-
-
-local FURC_CANBESTOLENINCC 		= GetString(SI_FURC_CANBESTOLEN) .. " in Clockwork City"
-local FURC_CANBESTOLEN_SCHOLARS = GetString(SI_FURC_CANBESTOLEN) .. " from scholars"
-local FURC_CANBESTOLEN_NERDS	= FURC_CANBESTOLEN_SCHOLARS      .. " and mages"
-local FURC_CANBESTOLEN_RELIG	= GetString(SI_FURC_CANBESTOLEN) .. " from priests and pilgrims"
-local FURC_CANBESTOLEN_THIEF	= GetString(SI_FURC_CANBESTOLEN) .. " from thieves"
-local FURC_CANBESTOLEN_WW	    = GetString(SI_FURC_CANBESTOLEN) .. " from woodworkers"
-
-
-local FURC_CANBESTOLEN_WROTHGAR	= GetString(SI_FURC_CANBESTOLEN) .. " in Wrothgar"
-
-local FURC_AUTOMATON_CC			= GetString(SI_FURC_AUTOMATON) .. " in Clockwork City"
-local FURC_AUTOMATON_VV			= GetString(SI_FURC_AUTOMATON) .. " on Vvardenfell"
-
-local FURC_HARVEST_CHARBOR		= GetString(SI_FURC_HARVEST) .. " in Coldharbour"
-
-local FURC_SCAMBOX_F_ATRO		= zo_strformat("<<1>> (<<2>>)",
-                                                GetString(SI_FURC_SCAMBOX), GetString(SI_FURC_FLAME_ATRONACH))
-
-local FURC_DB_POISON			= zo_strformat("<<1>> <<2>>", GetString(SI_FURC_DB), GetString(SI_FURC_DB_POISON))
-local FURC_DB_SNEAKY			= zo_strformat("<<1>> <<2>>", GetString(SI_FURC_DB), GetString(SI_FURC_DB_STEALTH))
-
-local function getCrownStorePriceString(price)
-    return string.format("%s (%u)", GetString(SI_FURC_CROWNSTORESOURCE), price)
-end
-
-local function getScamboxString(scamboxVersion)
-    return string.format("%s (%s)", GetString(SI_FURC_SCAMBOX), GetString(scamboxVersion))
-end
-
-
-FurC.MiscItemSources 	= {
-
-	[FURC_DRAGONS] = { -- Reach
-		[FURC_DROP] = {
-            [134909] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Puspocket Group
-            [134910] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Puspocket Cluster
-            [134911] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Puspocket Sporecap
-            [134912] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Large Puspocket
-            [134913] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Tall Puspocket
-            [134914] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Large Puspocket Cluster
-        },
-
-		[FURC_JUSTICE] 	= {},
-		[FURC_CROWN] 	= {
-			[134970] = getCrownStorePriceString(100), 	-- Mushrooms, Glowing Sprawl
-			[134947] = getCrownStorePriceString(100), 	-- Mushrooms, Glowing Field
-			[134948] = getCrownStorePriceString(400),	-- Mushrooms, Glowing Cluster
-			[134971] = getCrownStorePriceString(400),	-- Candles, Votive Group
-			[134872] = getCrownStorePriceString(400),	-- Ancient Nord Brazier, Dragon Crest
-			[134863] = getCrownStorePriceString(400),	-- Ancient Nord Sconce, Dragon Crest
-			[134972] = getCrownStorePriceString(400),	-- Brotherhood Brazier, Wrought Iron
-			[134849] = getCrownStorePriceString(400),	-- Monarch Butterfly Flock
-			[134848] = getCrownStorePriceString(400),	-- Blue Butterfly Flock
-			[94100]  = getCrownStorePriceString(50),	-- Imperial BookCase, Swirled
-			[130211]  = getCrownStorePriceString(50),	-- Books, Ordered Row
-			[130210]  = getCrownStorePriceString(50),	-- Books, Scattered Row
-		}
-	},
-	[FURC_CLOCKWORK] = { -- Reach
-		[FURC_DROP] = {
-			[134407] = FURC_AUTOMATON_CC,			-- Factotum Torso, Obsolete
-			[134404] = FURC_AUTOMATON_CC,			-- Factotum Knee, Obsolete
-			[134408] = FURC_AUTOMATON_CC,			-- Factotum Elbow, Obsolete
-			[134405] = FURC_AUTOMATON_CC,			-- Factotum Arm, Obsolete
-			[134409] = FURC_AUTOMATON_CC,			-- Factotum Head, Obsolete
-			[134406] = FURC_AUTOMATON_CC,			-- Factotum Body, Obsolete
-
-		},
-		[FURC_JUSTICE] 	= {
-			[134410] = FURC_CANBESTOLENINCC, 		    -- Clockwork Crank, Miniature
-			[134411] = FURC_CANBESTOLENINCC, 		    -- Clockwork Gear Shaft, Miniature
-			[134412] = FURC_CANBESTOLENINCC, 		    -- Clockwork Piston, Miniature
-			[134413] = FURC_CANBESTOLENINCC, 		    -- Clockwork Magnifier, Handheld
-			[134414] = FURC_CANBESTOLENINCC, 		    -- Clockwork Micrometer, Handheld
-			[134415] = FURC_CANBESTOLENINCC, 		    -- Clockwork Dial Calipers, Handheld
-			[134416] = FURC_CANBESTOLENINCC, 		    -- Clockwork Slide Calipers, Handheld
-			[134402] = GetString(SI_FURC_CANBESTOLEN), 	-- Spool, Empty
-			[134400] = GetString(SI_FURC_CANBESTOLEN), 	-- Soft Leather, Stacked
-			[134401] = GetString(SI_FURC_CANBESTOLEN), 	-- Soft Leather, Folded
-			[134417] = GetString(SI_FURC_CANBESTOLEN), 	-- Calipers, Handheld
-			[134399] = GetString(SI_FURC_CANBESTOLEN), 	-- Quality Fabric, Folded
-			[117939] = FURC_CANBESTOLEN_WW, 		    -- Rough Axe, Practical
-		},
-		[FURC_CROWN] 	= {
-			[134266] = getCrownStorePriceString(80), 	-- Daedric Books, Stacked
-			[134265] = getCrownStorePriceString(80), 	-- Daedric Books, Piled
-
-		}
-	},
-
-	[FURC_REACH] = { -- Reach
-		[FURC_JUSTICE] 	= {
-			[130191] = GetString(SI_FURC_CANBESTOLEN), 			-- Shivering Cheese
-			[118206] = FURC_CANBESTOLEN_THIEF, 		            -- Gaming dice
-		},
-		[FURC_CROWN] 	= {
-			[131423] = getCrownStorePriceString(750),
-		},
-		[FURC_DROP] 	= {
-			-- Coldharbour items
-			[130284] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Seedlings
-			[131422] = FURC_HARVEST_CHARBOR, 		-- Flower Patch, Glowstalks
-			[130283] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Sprout
-			[130285] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Young
-			[131420] = FURC_HARVEST_CHARBOR, 		-- Shrub, Glowing Thistle
-			[130281] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Towering
-			[130282] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Strong
-
-			[130067] = GetString(SI_FURC_DAEDRA_SOURCE), 			-- Daedric Chain Segment
-		},
-
-	},
-	[FURC_MORROWIND]	= { -- Morrowind
-		[FURC_DROP] 	= {
-
-			-- Dwemer parts
-			[126660] = FURC_AUTOMATON_VV, 			-- Dwemer Gear, Tiered
-			[126659] = FURC_AUTOMATON_VV, 			-- Dwemer Gear, Flat
-
-			-- lootable in tombs
-			[126754] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Seeker
-			[126705] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Wisdom
-			[126704] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Majesty
-			[126706] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Knowledge
-			[126701] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Nerevar
-			[126764] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Prowess
-			[126702] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Reverance
-			[126700] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Honor
-			[126703] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Mourning
-			[126572] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Mysteries
-
-			[126773] = GetString(SI_FURC_TOMBS), 					-- Velothi Caisson, Crypt
-			[126753] = GetString(SI_FURC_TOMBS),					-- Velothi Cerecloth, Austere
-			[126758] = GetString(SI_FURC_TOMBS),					-- Velothi Mat, Prayer
-			[126757] = GetString(SI_FURC_TOMBS),
-
-
-			[126462] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Volcanic
-			[126463] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Forest
-			[126464] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Valley
-
-            [126465] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Volcanic
-			[126466] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Forest
-			[126467] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Valley
-
-            [126468] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Volcanic
-            [126469] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Forest
-            [126470] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Valley
-
-
-			[126592] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Volcano
-			[126593] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tryptich, Volcano
-			[126594] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Classic Volcano
-			[126595] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Modest Volcano
-			[126596] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tapestry, Volcano
-			[126597] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Oversized Volcano
-
-            [126598] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Waterfall
-            [126599] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tryptich, Geyser
-			[126600] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tapestry, Geyser
-			[126601] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Oversized Geyser
-			[126602] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Classic Geyser
-			[126603] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Modest Geyser
-			[126604] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Geyser
-
-
-			-- Ashlander dailies
-			[126119] = GetString(SI_FURC_DAILY_ASHLANDERS), 		-- Crimson Shard of Moonshadow
-			[126393] = GetString(SI_FURC_DAILY_ASHLANDERS), 		-- Crimson Shard of Moonshadow
-
-			-- drops from plants
-			[125631] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
-			[125647] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
-			[131420] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
-			[125553] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage Stalks
-			[125551] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage
-			[125552] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage Patch
-			[125543] = GetString(SI_FURC_PLANTS), 					-- Fern, Ashen
-			[125633] = GetString(SI_FURC_PLANTS), 					-- Plants, Hanging Pitcher Pair
-
-            [130280] = GetString(SI_FURC_WW), 					    -- Sapling, Petrified Ashen
-
-
-            [126592] = GetString(SI_FURC_PLANTS), 					-- Plants, Hanging Pitcher Pair
-
-		},
-		[FURC_CROWN] 	= {
-		},
-		[FURC_JUSTICE] 	= {
-			[126481] = FURC_CANBESTOLEN_RELIG, 		-- Indoril Incense, Burning
-		},
-	},
-	[FURC_HOMESTEAD]	= {
-		[FURC_JUSTICE] 	= {
-				-- stealing
-			[118489] = FURC_CANBESTOLEN_SCHOLARS, 	        -- Papers, Stack
-			[118528] = GetString(SI_FURC_CANBESTOLEN), 		-- Signed Contract
-			[118890] = GetString(SI_FURC_CANBESTOLEN), 		-- Skull, Human
-			[118487] = FURC_CANBESTOLEN_SCHOLARS, 	        -- Letter, Personal
-			[120008] = FURC_CANBESTOLEN_NERDS, 		        -- Lesser Soul Gem, Empty
-			[120005] = FURC_CANBESTOLEN_NERDS, 		        -- Medium Soul Gem, Empty
-
-			-- Bounty Sheets
-			[118711] = FURC_CANBEPICKED_GUARD, 				-- Argonian Male
-			[118709] = FURC_CANBEPICKED_GUARD, 				-- Breton Male
-			[118712] = FURC_CANBEPICKED_GUARD, 				-- Breton Woman
-			[118715] = FURC_CANBEPICKED_GUARD, 				-- Colovian Man
-			[118710] = FURC_CANBEPICKED_GUARD, 				-- High Elf Male
-			[118714] = FURC_CANBEPICKED_GUARD, 				-- Imperial Man
-			[118713] = FURC_CANBEPICKED_GUARD, 				-- Khajiiti Male
-			[118716] = FURC_CANBEPICKED_GUARD, 				-- Orc Female
-			[118717] = FURC_CANBEPICKED_GUARD, 				-- Orc Male
-
-            [116512] = FURC_CANBESTOLEN_WROTHGAR,		    -- Orcish Carpet Blood
-
-
-		},
-		[FURC_FISHING] 	= {
-			-- fishing
-			[118902] = GetString(SI_FURC_CANBEFISHED), 		-- Coral, Sun
-			[118903] = GetString(SI_FURC_CANBEFISHED), 		-- Coral, Crown
-			[118896] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Sandcake
-			[118901] = GetString(SI_FURC_CANBEFISHED), 		-- Sea sponge
-			[118338] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Bass
-			[118339] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Salmon
-			[118337] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Trout
-			[120753] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Green Pile
-			[120755] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Lush Pile
-			[120754] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Small Pile
-			[118897] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Pink Scallop
-			[118898] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, White Scallop
-			[118899] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Starfish
-			[118900] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Noble Starfish
-
-		},
-		[FURC_DROP]		= {
-			[121058] = FURC_DB_SNEAKY, 						-- Candles of Silence
-
-			[119936] = FURC_DB_POISON, 						-- Poisoned Blood
-			[119938] = FURC_DB_POISON, 						-- Light and Shadow
-			[119952] = FURC_DB_POISON, 						-- Sacrificial Heart
-
-            -- Paintings
-			[118216] = GetString(SI_FURC_CHESTS), 		        -- Painting of Spring, Sturdy
-			[118217] = GetString(SI_FURC_CHESTS), 		        -- Painting of Pasture, Sturdy
-			[118218] = GetString(SI_FURC_CHESTS), 		        -- Painting of Creek, Sturdy
-			[118219] = GetString(SI_FURC_CHESTS), 		        -- Painting of Lakes, Sturdy
-			[118220] = GetString(SI_FURC_CHESTS), 		        -- Painting of Crags, Sturdy
-			[118221] = GetString(SI_FURC_CHESTS), 		        -- Painting of Summer, Sturdy
-			[118222] = GetString(SI_FURC_CHESTS), 		        -- Painting of Jungle, Sturdy
-			[118223] = GetString(SI_FURC_CHESTS), 		        -- Painting of Palms, Sturdy
-			[190912] = GetString(SI_FURC_CHESTS), 		        -- Painting of Lake, Sturdy
-
-        },
-		[FURC_CROWN]	= {
-			[118096] = getCrownStorePriceString(10), 			-- Bread, Plain
-			[118098] = getCrownStorePriceString(10), 			-- Common Bowl, Serving
-			[118061] = getCrownStorePriceString(15), 			-- Chicken Dinner, Display
-			[118062] = getCrownStorePriceString(15), 			-- Chicken Meal, Display
-			[118056] = getCrownStorePriceString(15), 			-- Common Stewpot, Hanging
-			[118121] = getCrownStorePriceString(15), 			-- Knife, Carving
-			[118066] = getCrownStorePriceString(15), 			-- Steak Dinner
-
-			[118057] = getCrownStorePriceString(20), 				-- Sack of Beans
-			[118060] = getCrownStorePriceString(20), 				-- Sack of Grain
-			[118059] = getCrownStorePriceString(20), 				-- Sack of Millet,
-			[118058] = getCrownStorePriceString(20), 				-- Sack of Rice
-
-			[134473] = getScamboxString(SI_FURC_FLAME_ATRONACH),    -- Malacath Banner
-
-
-
-			[118064] = getCrownStorePriceString(45), 			-- Common Barrel, Dry
-			[118065] = getCrownStorePriceString(45), 			-- Common Cargo Crate, Dry
-			[118064] = getCrownStorePriceString(45), 			-- Common Barrel, Dry
-
-			[118054] = getCrownStorePriceString(80), 			-- Common Firepit, Outdoor
-			[118055] = getCrownStorePriceString(80), 			-- Common Firepit, Piled
-			[118126] = getCrownStorePriceString(95), 			-- Plaque, Standard
-
-			[118068] = getCrownStorePriceString(120), 			-- Simple Brown Banner
-			[118069] = getCrownStorePriceString(120), 			-- Simple Gray Banner
-			[118071] = getCrownStorePriceString(120), 			-- Simple Red Banner
-			[118070] = getCrownStorePriceString(120), 			-- Simple Purple Banner
-
-			[115698] = getCrownStorePriceString(1100), 		-- Khajiit Statue, Guardian
-		}
-	},
-}
diff --git a/FurnitureCatalogue/data/Morrowind/M_AchievementVendors.lua b/FurnitureCatalogue/data/Morrowind/M_AchievementVendors.lua
deleted file mode 100644
index 2839f0f..0000000
--- a/FurnitureCatalogue/data/Morrowind/M_AchievementVendors.lua
+++ /dev/null
@@ -1,375 +0,0 @@
-
---[[
-			[""] = {		--
-				itemPrice 		= 100,
-			},
-]]
-function tableMerge(t1, t2)
-	if nil == t2 and nil == t1 then
-		return {}
-	elseif nil == t2 then
-		return t1
-	elseif nil == t1 then
-		return t2
-	end
-
-    for k,v in pairs(t2) do
-		t1[k] = v
-    end
-    return t1
-end
-
-local bookList = {
-	-- [120197] = { -- 16 accords of madness, vol vi
-		-- itemPrice = 500,
-	-- },
-}
-
-local boxes = {}
-local b2 = {
-	[120998] = {	-- Block,Wood Cutting
-		itemPrice 		= 100,
-	},
-	[117959] = {		-- Rough Container, Shipping
-		itemPrice 		= 100,
-	},
-	[117959] = {		-- Rough Box, Slatted
-		itemPrice 		= 100,
-	},
-	[117931] = {		-- Rough Crate Lid
-		itemPrice 		= 100,
-	},
-	[117957] = {		-- Rough Crate, Cracked
-		itemPrice 		= 100,
-	},
-	[117958] = {		-- Rough Crate, Empty
-		itemPrice 		= 100,
-	},
-	[117930] = {		-- Rough Crate, Open
-		itemPrice 		= 100,
-	},
-	[117953] = {		-- Rough Crate, Sealed
-		itemPrice 		= 100,
-	},
-	[117928] = {		-- Rough Crate, Sturdy
-		itemPrice 		= 100,
-	},
-}
-FurC.Books[FURC_MORROWIND] = bookList
-
-FurC.AchievementVendors[FURC_MORROWIND] = {
-	["Vivec City, Saint Delyn Inn"] = {
-		["Drops-No-Glass"] = {
-			[126638] = { -- Ashlander Altar, Anticipations
-				itemPrice 		= 50000,
-				achievement 	= 1825, -- Clanfriend
-			},
-			[126640] = { -- Ashlander Fence, Totems
-				itemPrice 		= 10000,
-				achievement 	= 1881, -- Ashlander Relic Preserver
-			},
-			[126613] = { -- Ashlander Throne
-				itemPrice 		= 100000,
-				achievement 	= 1849, -- Voices of the Failed Incarnates
-			},
-			[126639] = { -- Ashlander Yurt, Netch-Hide
-				itemPrice 		= 75000,
-				achievement 	= 1880,  -- Ashlands Stalker
-			},
-			[126623] = { -- Banner of House Dres
-				itemPrice 		= 10000,
-				achievement 	= 1867,  -- Morrowind Grand Adventurer
-			},
-			[126621] = { -- Banner of House Hlaalu
-				itemPrice 		= 10000,
-				achievement 	= 1867,  -- Morrowind Grand Adventurer
-			},
-			[126620] = { -- Banner of House Redoran
-				itemPrice 		= 10000,
-				achievement 	= 1867,  -- Morrowind Grand Adventurer
-			},
-			[126622] = { -- Banner of House Telvanni
-				itemPrice 		= 10000,
-				achievement 	= 1867,  -- Morrowind Grand Adventurer
-			},
-			[126628] = { -- Banner, Morag Tong
-				itemPrice 		= 25000,
-				achievement 	= 1870,  -- Naryu's Confidant
-			},
-			[126615] = { -- Blessing Stone
-				itemPrice 		= 10000,
-				achievement 	= 1850,  -- Bearer of the Blessed Staff
-			},
-			[126614] = { -- Blessing Stone Device
-				itemPrice 		= 20000,
-				achievement 	= 1850,  -- Bearer of the Blessed Staff
-			},
-			[126618] = { -- Dwarven Brazier, Eternal
-				itemPrice 		= 50000,
-				achievement 	= 1854,  -- N'chow conqueror
-			},
-			[126632] = { -- Glass Crystal, Plume
-				itemPrice 		= 15000,
-				achievement 	= 1874,  -- Pilgrim Protector
-			},
-			[126631] = { -- Glass Crystal, Radiance
-				itemPrice 		= 15000,
-				achievement 	= 1874,  -- Pilgrim Protector
-			},
-			[126633] = { -- Glass Crystals, Bed
-				itemPrice 		= 20000,
-				achievement 	= 1874,  -- Pilgrim Protector
-			},
-			[126629] = { -- Kwama Queen Egg
-				itemPrice 		= 15000,
-				achievement 	= 1872,  -- Kwama Miner
-			},
-			[126630] = { -- Replica Stone of Ashalmwia
-				itemPrice 		= 75000,
-				achievement 	= 1873,  -- Dratha Quest
-			},
-			[126635] = { -- Sacred Guar Skull
-				itemPrice 		= 15000,
-				achievement 	= 1876,  -- Ald'Ruhn Annalist
-			},
-			[126642] = { -- Silt Strider Shell, Hollow
-				itemPrice 		= 10000,
-				achievement 	= 1826,  -- Strider Carawaner
-			},
-			[126617] = { -- Statue of Vivec the Champion
-				itemPrice 		= 150000,
-				achievement 	= 1852,  -- Champion of Vivec
-			},
-			[126636] = { -- Statue, Cowering Ebony
-				itemPrice 		= 50000,
-				achievement 	= 1877,  -- Ebony Enforcer
-			},
-			[126637] = { -- Statue, Terrified Ebony
-				itemPrice 		= 50000,
-				achievement 	= 1877,  -- Ebony Enforcer
-			},
-			[126616] = { -- Statuette of Clavicus Vile, Masked
-				itemPrice 		= 100000,
-				achievement 	= 1851,  -- Hand of a Living God
-			},
-			[126627] = { -- Tapestry, Morag Tong
-				itemPrice 		= 35000,
-				achievement 	= 1870,  -- Naryu's Confidant
-			},
-			[126634] = { -- Tapestry, St. Veloth
-				itemPrice 		= 20000,
-
-				achievement 	= 1875,  -- Narsis's Apprentice
-			},
-			[126626] = { -- Telvanni Device
-				itemPrice 		= 50000,
-				achievement 	= 1869,  -- Telvanni quest
-			},
-			[126792] = { -- Temple Doctrine: the 36
-				itemPrice 		= 130000,
-				achievement 	= 1824,  -- Tribunal Preacher
-			},
-			[126619] = { -- Totem of the Sixth House
-				itemPrice 		= 100000,
-				achievement 	= 1856,  -- Forgotten Wastes Vanquisher
-			},
-			[126625] = { -- Tribunal Shrine in Fountain
-				itemPrice 		= 50000,
-				achievement 	= 1868,  -- Savior of Morrowind
-			},
-			[126641] = { -- Triptych of the Triune
-				itemPrice 		= 20000,
-				achievement 	= 1827,  -- The Pilgrim's Path
-			},
-		},
-		["Uzipa"] = {
-			[120998] = { -- Block, Wood Cutting
-				itemPrice 		= 100,
-			},
-			[125481] = { -- Boulder, Volcanic Column
-				itemPrice 		= 500,
-			},
-			[125483] = { -- Boulder, Volcanic Plug
-				itemPrice 		= 500,
-			},
-			[125587] = { -- Mushroom ,Funnel Caps
-				itemPrice 		= 15000,
-			},
-			[125588] = { -- Mushroom, Lanky Erupted Stinkcap
-				itemPrice 		= 750,
-			},
-			[125593] = { -- Mushroom, Netch Shield Platform
-				itemPrice 		= 25000,
-			},
-			[125594] = { -- Mushroom, Netch Shield Tower
-				itemPrice 		= 20000,
-			},
-			[125599] = { --
-				itemPrice 		= 750,
-			},
-			[125602] = { --
-				itemPrice 		= 750,
-			},
-			[125601] = { --
-				itemPrice 		= 750,
-			},
-			[125604] = { --
-				itemPrice 		= 750,
-			},
-			[125612] = { -- Mushrooms, Funnel Cap Cluster
-				itemPrice 		= 22500,
-			},
-			[125614] = { -- Mushrooms, Netch Hide Shade
-				itemPrice 		= 750,
-			},
-			[125638] = { -- Rock, Volcanic Chunk
-				itemPrice 		= 100,
-			},
-			[125639] = { -- Rock, Volcanic Slab
-				itemPrice 		= 100,
-			},
-			[125641] = { -- Sapling, Forked Ashland
-				itemPrice 		= 250,
-			},
-			[125642] = { -- Sapling, Lanky Ash Laurel
-				itemPrice 		= 250,
-			},
-			[125643] = { -- Sapling, Sturdy Ash Laurel
-				itemPrice 		= 250,
-			},
-			[125644] = { -- Sapling, Tall Ashland
-				itemPrice 		= 250,
-			},
-			[125645] = { -- Saplings, Ashland
-				itemPrice 		= 250,
-			},
-			[125673] = { -- Tree, Lanky Poplar
-				itemPrice 		= 500,
-			},
-			[125678] = { -- Tree, Sturdy Poplar
-				itemPrice 		= 500,
-			},
-			[125679] = { -- Tree, Poplar Cluster
-				itemPrice 		= 500,
-			},
-			[125677] = { -- Tree, Rooted Ashland
-				itemPrice 		= 40000,
-			},
-			[125676] = { -- Tree, Rooted Cedar
-				itemPrice 		= 50000,
-			},
-
-		},
-	},
-	["Vivec City, Gladiator's Quarters"] = {
-		["Brelda Ofemalen"] = {
-			[126649]	= { -- Banner of the Fire Drakes
-				itemPrice 		= 50000,
-				achievement 	= 1909, -- Crowd Favorite
-			},
-			[126712]	= { -- Banner of the PD
-				itemPrice 		= 50000,
-				achievement 	= 1909, -- Crowd Favorite
-			},
-			[126650]	= { -- Banner of the SL
-				itemPrice 		= 50000,
-				achievement 	= 1909, -- Crowd Favorite
-			},
-			[126646]	= { -- Standard of the FD
-				itemPrice 		= 25000,
-				achievement 	= 1907, -- Grand Standard-Guardian
-			},
-			[126648]	= { -- Standard of the PD
-				itemPrice 		= 25000,
-				achievement 	= 1907, -- Grand Standard-Guardian
-			},
-			[126647]	= { -- Standard of the SL
-				itemPrice 		= 25000,
-				achievement 	= 1907, -- Grand Standard-Guardian
-			},
-
-			[126713]	= { -- Tapestry of the FD
-				itemPrice 		= 100000,
-				achievement 	= 1910, -- Conquering Hero
-			},
-			[126715]	= { -- Tapestry of the PD
-				itemPrice 		= 100000,
-				achievement 	= 1910, -- Conquering Hero
-			},
-			[126714]	= { -- Tapestry of the SL
-				itemPrice 		= 100000,
-
-				achievement 	= 1910, -- Conquering Hero
-			},
-		},
-		["Llivas Driler"] = {
-			[126716]	= { -- Brazier of the FD
-				itemPrice 		= 50000,
-				achievement 	= 1913, -- Grand Champion
-			},
-			[126718]	= { -- Chained Skull of the PD
-				itemPrice 		= 100000,
-				achievement 	= 1913, -- Grand Champion
-			},
-			[126717]	= { -- Weathervane of the SL
-				itemPrice 		= 125000,
-				achievement 	= 1913, -- Grand Champion
-			},
-			[126643]	= { -- Crown of the SL
-				itemPrice 		= 75000,
-				achievement 	= 1901, -- Grand Relic Guardian
-			},
-			[126644]	= { -- FD's Skull
-				itemPrice 		= 150000,
-				achievement 	= 1901, -- Grand Relic Guardian
-			},
-			[126645]	= { -- Skull of the PD
-				itemPrice 		= 100000,
-				achievement 	= 1901, -- Grand Relic Guardian
-			},
-		},
-	},
-	["any Alliance Capital"] = {
-		[GetString(FURC_AV_HER)] = {
-			[126720]	= { -- Banner of Mayhem
-				itemPrice 		= 5000,
-				achievement 	= 1883, -- Mayhem Connaiseour
-			},
-			[126721]	= { -- Corpse of Mayhem, Argonian
-				itemPrice 		= 15000,
-				achievement 	= 1888, -- Wrath of the Whitestrake
-			},
-			[126722]	= { -- Corpse of Mayhem,Khajiit
-				itemPrice 		= 15000,
-				achievement 	= 1888, -- Wrath of the Whitestrake
-			},
-			[126723]	= { -- Corpse of Mayhem, Orc
-				itemPrice 		= 15000,
-				achievement 	= 1888, -- Wrath of the Whitestrake
-			},
-			[126724]	= { -- Propbably-Not-Punch Bowl of Mayhem
-				itemPrice 		= 30000,
-				achievement 	= 1892, -- Star-made Knight
-			},
-			[126719]	= { -- Standard of Mayhem
-				itemPrice 		= 2500,
-				achievement 	= 1883, -- Mayhem Connaiseour
-			},
-		},
-	},
-	["the Mages' guild"] = {
-		["the Mystic as part of a collection"] = bookList,
-	},
- }
-
-
--- global function, needs to live here, YES MANA
-function FurC.SetupMorrowindItems()
-
-	-- FurC.AchievementVendors[FURC_MORROWIND]["the Mages' guild"]["the Mystic as part of a collection"] = bookList
-	local listTable
-	listTable = FurC.AchievementVendors[FURC_MORROWIND]["Vivec City, Saint Delyn Inn"]["Uzipa"]
-	listTable = tableMerge(listTable, boxes)
-
-
-end
diff --git a/FurnitureCatalogue/data/Morrowind/M_EventItems.lua b/FurnitureCatalogue/data/Morrowind/M_EventItems.lua
deleted file mode 100644
index a2368d6..0000000
--- a/FurnitureCatalogue/data/Morrowind/M_EventItems.lua
+++ /dev/null
@@ -1,16 +0,0 @@
-local t = {
-	[126157] = {},	-- Song of Pelinal, #1
-	[126158] = {},	-- Song of Pelinal, #2
-	[126159] = {},	-- Song of Pelinal, #3
-	[126160] = {},	-- Song of Pelinal, #4
-	[126161] = {},	-- Song of Pelinal, #5
-	[126162] = {},	-- Song of Pelinal, #6
-	[126163] = {},	-- Song of Pelinal, #7
-	[126164] = {},	-- Song of Pelinal, #8
-}
-
-FurC.EventItems[FURC_MORROWIND] = FurC.EventItems[FURC_MORROWIND] or {}
-FurC.EventItems[FURC_MORROWIND]["Midyear Mayhem"] = {}
-FurC.EventItems[FURC_MORROWIND]["Midyear Mayhem"]["Boon Box"] = t
-
-FurC.Books[FURC_MORROWIND] = t
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Morrowind/M_LuxuryFurnisher.lua b/FurnitureCatalogue/data/Morrowind/M_LuxuryFurnisher.lua
deleted file mode 100644
index 20e3a8d..0000000
--- a/FurnitureCatalogue/data/Morrowind/M_LuxuryFurnisher.lua
+++ /dev/null
@@ -1,184 +0,0 @@
-FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
-
-FurC.LuxuryFurnisher[FURC_MORROWIND] = {
-
-	-- August 5+6
-	[126573] = { -- Velothi Candle, Mourning
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-11",
-	},
-	[126574] = { -- Velothi Cerecloth, Prayer
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-11",
-	},
-	[126575] = { -- Velothi Shroud, Mourning
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-11",
-	},
-	[126576] = { -- Velothi Seat, Meditation
-		itemPrice 	= 10834,
-		itemDate	= "2017-08-11",
-	},
-
-	-- August 5+6
-	[126611] = { -- Vvardenfell Anemone, Sprout
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-04",
-	},
-	[126612] = { -- Vvardenfell Anemone, Strong
-		itemPrice 	= 27084,
-		itemDate	= "2017-08-04",
-	},
-	[126610] = { -- Vvardenfell Coral Plant,
-		itemPrice 	= 10834,
-		itemDate	= "2017-08-04",
-	},
-	[126591] = { -- Vvardenfell Coral Plant, Young
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-04",
-	},
-
-	--July 29 + 30
-	[126587] = {	-- Vvardenfell Glowstalk, Sprout
-		itemPrice 	= 2500,
-		itemDate	= "2017-07-28",
-	},
-	[126585] = {	-- Vvardenfell Glowstalk, Strong
-		itemPrice 	= 10834,
-		itemDate	= "2017-07-28",
-	},
-	[126580] = {	-- Vvardenfell Glowstalk, Towering
-		itemPrice 	= 16250,
-		itemDate	= "2017-07-28",
-	},
-	[126586] = {	-- Vvardenfell Glowstalk, Young
-		itemPrice 	= 5417,
-		itemDate	= "2017-07-28",
-	},
-
-	-- July 22 - July 23
-	[126571] = {	-- Daedric Chandelier, Spiked
-		itemPrice 	= 8125,
-		itemDate	= "2017-07-21",
-	},
-	[126569] = {	-- Daedric Chest, Sealed
-		itemPrice 	= 8125,
-		itemDate	= "2017-07-21",
-	},
-	[126570] = {	-- Daedric Throne, Skulls
-		itemPrice 	= 0,
-		itemDate	= "2017-07-21",
-	},
-
-	-- July 15 - July 16
-	[126567] = {	-- Daedric Brazier, Ritual
-		itemPrice 	= 10834,
-		itemDate	= "2017-07-14",
-	},
-	[126565] = {	-- Daedric Platform, Sarcophagus
-		itemPrice 	= 8125,
-		itemDate	= "2017-07-14",
-	},
-	[126566] = {	-- Daedric Sarcophagus, Sealed
-		itemPrice 	= 27084,
-		itemDate	= "2017-07-14",
-	},
-
-
-	-- July 8 - July 9
-	[126562] = {	-- Dwarven Crystal Mechanism
-		itemPrice 	= 53571,
-		itemDate	= "2017-07-07",
-	},
-	[126563] = {	-- Dwarven Orrery, Reference
-		itemPrice 	= 27084,
-		itemDate	= "2017-07-07",
-	},
-	[126559] = {	-- Dwarven Schematics, technical
-		itemPrice 	= 8125,
-		itemDate	= "2017-07-07",
-	},
-
-
-	-- July 1st - 2nd
-	[126560] = {	-- Dwarven fountain, forged
-		itemPrice 	= 53571,
-		itemDate	= "2017-06-30",
-	},
-	[126564] = {	-- Dwarven Clock, Deactivated
-		itemPrice 	= 16250,
-		itemDate	= "2017-06-30",
-	},
-	[126561] = {	-- Dwarven Pillar, Forged
-		itemPrice 	= 10834,
-		itemDate	= "2017-06-30",
-	},
-
-
-	-- June, 23 - 26
-	[121270] = {	-- Brotherhood Banner, Large
-		itemPrice 	= 27084,
-		itemDate	= "2017-06-23",
-	},
-	[120836] = {	-- Brotherhood Candelabra, Floor
-		itemPrice 	= 8125,
-		itemDate	= "2017-06-23",
-	},
-	[120839] = {	-- Brotherhood Ledger, Stand
-		itemPrice 	= 4000,
-		itemDate	= "2017-06-23",
-	},
-	[120838] = {	-- Brotherhood Plaque, Wolf
-		itemPrice 	= 27084,
-		itemDate	= "2017-06-23",
-	},
-
-	-- June, 16
-
-	[120837] = {	-- Brotherhood Window, Stained Glass
-		itemPrice 	= 107143,
-		itemDate	= "2017-06-16",
-	},
-
-	[121271] = {	-- Brotherhood Tapestry
-		itemPrice 	= 10834,
-		itemDate	= "2017-06-16",
-	},
-
-	[120835] = {	-- Brotherhood Candelabra, Table
-		itemPrice 	= 2500,
-		itemDate	= "2017-06-16",
-	},
-
-	-- June, 9-11
-	[120808] = {	-- Statue Base, Circular
-		itemPrice 	= 10000,
-		itemDate	= "2017-06-09",
-	},
-	[120811] = {	-- Statue, Justice
-		itemPrice 	= 25000,
-		itemDate	= "2017-06-09",
-	},
-	[120814] = {	-- Statue, Order
-		itemPrice 	= 25000,
-		itemDate	= "2017-06-09",
-	},
-	[120813] = {	-- Statue, Truth
-		itemPrice 	= 25000,
-		itemDate	= "2017-06-09",
-	},
-
-	-- June, 3-5
-	[120809] = {	-- Statue Base, Square
-		itemPrice 	= 10000,
-		itemDate	= "2017-06-02",
-	},
-	[120810] = {	-- Statue, Faith
-		itemPrice 	= 25000,
-		itemDate	= "2017-06-02",
-	},
-	[120812] = {	-- Statue, Light
-		itemPrice 	= 25000,
-		itemDate	= "2017-06-02",
-	},
-}
diff --git a/FurnitureCatalogue/data/Morrowind/M_Recipes.lua b/FurnitureCatalogue/data/Morrowind/M_Recipes.lua
deleted file mode 100644
index 25e7b4f..0000000
--- a/FurnitureCatalogue/data/Morrowind/M_Recipes.lua
+++ /dev/null
@@ -1,323 +0,0 @@
-FurC.Recipes = FurC.Recipes or {}
-
-FurC.Recipes[FURC_MORROWIND] = {
-
-	126966, -- Redoran Trestle, Corridor
-	126881, -- Dwarven Jar, Sealed
-	126865, -- Dwarven Engine, Turbine
-	126899, -- Dwarven Sconce, Framework
-	121545, -- Redguard Cannister, Gilded
-	121099, -- Common Firepit, Outdoor
-	127084, -- Indoril Candelabra, Shrine
-	127015, -- Hlaalu Censer, Mesh
-	127092, -- Hlaalu Lantern, Classic Vellum
-	126869, -- Dwarven Table, Workbench
-	126877, -- Dwarven Candlestick, Laboratory
-	121175, -- Geese, Hanging
-	127067, -- Dres Jar, Stoneflower
-	127075, -- Indoril Brazier, Cauldron
-	126941, -- Hlaalu Wardrobe, Formal
-	126925, -- Redoran Bed, Canopy
-	126903, -- Redoran Urn, Pale Marble
-	127019, -- Indoril Incense Cup, Silver
-	127027, -- Indoril Rug, Almalexia
-	126907, -- Hlaalu Settee, Polished
-	126978, -- Telvanni Bed, Organic
-	121061, -- Common Firepit, Piled
-	126860, -- Dwarven Engine, Boiler
-	121156, -- Papers, Stack
-	127080, -- Indoril Candelabra, Shrine Chamber
-	121192, -- Wolf Head, Wall Mount
-	126847, -- Indoril Streetlight, Full Stone
-	126991, -- Indoril Bellows, Practical
-	126834, -- Daedric Candles, Group
-	121183, -- Haj Mota Shell, Wall Mount
-	121187, -- Echatere, Wall Mount
-	126890, -- Dwarven Basin, Forged
-	127059, -- Hlaalu Banner, Floral
-	126963, -- Indoril Footlocker, Fortified
-	127023, -- Redoran Plate, Meal
-	126582, -- Target Centurion, Dwarf-Brass
-	121206, -- Orcish Desk with Furs
-	126954, -- Hlaalu Rack, Barrel
-	127051, -- Redoran Mantle Cloth, Crimson Cover
-	126937, -- Redoran Stool, Sanded
-	121210, -- Orcish Throne, Skull
-	127038, -- Indoril Runner, Sotha Sil
-	126916, -- Dres Sideboard, Display
-	121198, -- Shelf, Poison
-	126898, -- Dwarven Sconce, Barred
-	126894, -- Dwarven Chandelier, Framework
-	126866, -- Dwarven Pew, Refined
-	121305, -- Redguard Chandelier, Dark
-	127068, -- Redoran Fork, Wooden
-	127072, -- Indoril Banner, Sotha Sil
-	126983, -- Telvanni Nightstand, Organic
-	126878, -- Dwarven Goblet, Forged
-	126886, -- Dwarven Valve, Disconnected
-	127048, -- Hlaalu Box, Trinket
-	126870, -- Dwarven Table, Assembly
-	126846, -- Indoril Streetlight, Stone
-	127104, -- Hlaalu Boxes, Compact
-	126910, -- Hlaalu Stool, Mossy Cushion
-	126837, -- Daedric Urn, Ashen
-	126862, -- Dwarven Pipeline Cap, Sealed
-	126942, -- Hlaalu Bookcase, Orderly
-	121217, -- Redguard Lamp, Oil
-	121213, -- Orcish Skull Goblet, Empty
-	126902, -- Redoran Amphora, Sealed Marble
-	126958, -- Hlaalu Nightstand, Formal
-	127026, -- Indoril Runner, Almalexia
-	127018, -- Redoran Incense Holder, Ceramic Pan
-	121193, -- Bottle, Beaker
-	126861, -- Dwarven Boiler, Central
-	126874, -- Dwarven Candles, Plate
-	126854, -- Dwarven Pipe, Elbow
-	126891, -- Dwarven Chandelier, Caged
-	126919, -- Hlaalu Table, Formal Turtle
-	127035, -- Dres Carpet, Chains
-	127009, -- Redoran Cup, Mazte
-	126841, -- Daedric Brazier, Standing
-	126975, -- Hlaalu Shelf, Long
-	126887, -- Dwarven Vase, Forged
-	126962, -- Indoril Chest, Fortified
-	127022, -- Redoran Plate, Floral
-	126850, -- Dwarven Engine, Fan
-	127056, -- Dres Tapestry, Vines
-	126938, -- Redoran Armchair, Fungal Cushion
-	121161, -- Ram Horns, Mounted
-	126951, -- Redoran End Table, sanded
-	121369, -- Redguard Bed, Full Lattice
-	126955, -- Hlaalu Cabinet, Clerk
-	126988, -- Telvanni Stool, Organic
-	126923, -- Redoran Bed, Single Pillow
-	126915, -- Dres Trestle, Corridor
-	121216, -- Redguard Divider, Gilded
-	126897, -- Dwarven Sconce, Powered
-	126893, -- Dwarven Chandelier, Braced
-	121313, -- Wood Elf Throne, Vine
-	126968, -- Redoran Table, Kitchen
-	126913, -- Hlaalu Armchair, Polished
-	127090, -- Indoril Lantern, Hanging
-	127103, -- Hlaalu Hanger, Mounted
-	127099, -- Telvanni Arched Light, Organic Azure
-	126863, -- Dwarven Pipeline Cap, Sealed
-	127073, -- Indoril Banner, Vivec
-	126840, -- Daedric Brazier, Table
-	127082, -- Indoril Sconce, Shrine
-	127013, -- Redoran Incense Holder, Curved
-	126871, -- Dwarven Table, Refined
-	126867, -- Dwarven Bench, Forged
-	126845, -- Indoril Lightpost, Stone
-	126947, -- Hlaalu Sideboard, Scholar's
-	126875, -- Dwarven Candles, Cup
-	127078, -- Indoril Candle, Temple
-	121177, -- Horn, Display, Huge
-	121185, -- Durzog Head, Wall Mount
-	127004, -- Dres Cup, Empty Greef
-	121212, -- Orcish Effigy, Bear
-	127102, -- Tribunal Tablet of Almalexia
-	127101, -- Velothi Brazier, Temple
-	126888, -- Dwarven Pot, Sealed
-	127100, -- Telvanni Sconce, Organic Azure
-	127061, -- Indoril Tapestry, Vivec
-	121171, -- Rug, Bearskin
-	127097, -- Telvanni Candelabra, Organic
-	127096, -- Telvanni Lamp, Organic Azure
-	127094, -- Hlaalu Lantern, Stationary
-	127093, -- Hlaalu Lantern, Modest Vellum
-	127089, -- Hlaalu Streetlight, Vellum
-	127088, -- Hlaalu Sconce, Vellum
-	127087, -- Indoril Streetlight, Brick
-	127012, -- Indoril Platter, Floral
-	126905, -- Hlaalu Cannister, Sealed Azurite
-	126946, -- Hlaalu Cabinet of drawers, Clerk
-	121097, -- Plaque, Bordered Deer Antlers
-	127086, -- Indoril Chandelier, Knotwork
-	127085, -- Indoril Candelabra, Temple
-	127083, -- Dres Candles, Meditation
-	127081, -- Indoril Sconce, Temple
-	121190, -- Mantikora Head, Wall Mount
-	127077, -- Indoril Brazier, Pedestal
-	127076, -- Indoril Brazier, Kettle
-	127071, -- Indoril Banner, Almalexia
-	127070, -- Redoran Spoon, Wooden
-	127069, -- Redoran Knife, Wooden
-	127065, -- Hlaalu Vase, Gilded
-	127064, -- Hlaalu Jar, Garden Moss
-	127063, -- Redoran Urn, Imprinted Clay
-	126976, -- Indoril Shelf, Long
-	127008, -- Redoran Cup, Empty
-	127062, -- Dres Teapot, Ceramic
-	127060, -- Indoril Tapestry, Sotha Sil
-	127058, -- Hlaalu Tapestry, Floral
-	127057, -- Indoril Tapestry, Almalexia
-	127055, -- Telvanni Table Runner, Bordered Azure
-	127054, -- Redoran Table Runner, Gilded Ochre
-	121194, -- Bottle, Poison
-	126989, -- Telvanni Table, Organic Game
-	127052, -- Telvanni Table Runner, Gilded Azure
-	127050, -- Redoran Steamer, Iron
-	127040, -- Indoril Carpet, Sotha Sil
-	127049, -- Indoril Box, Trinket
-	127047, -- Hlaalu Cannister, Trinket
-	127032, -- Dres Carpet, Fertile Peat
-	127046, -- Indoril Cannister, Trinket
-	127045, -- Indoril Carpet, Grand Vivec
-	127044, -- Indoril Carpet, Vivec
-	127043, -- Indoril Rug, Vivec
-	127042, -- Indoril Runner, Vivec
-	127039, -- Indoril Rug, Sotha Sil
-	127034, -- Redoran Carpet, Volcanic Sands
-	127031, -- Hlaalu Carpet, Garden Moss
-	127030, -- Redoran Carpet, Volcanic Ash
-	127029, -- Indoril Carpet, Grand Almalexia
-	127028, -- Indoril Carpet, Almalexia
-	127025, -- Dres Pot, Sauce
-	127024, -- Redoran Tray, Floral
-	127021, -- Hlaalu Towels, Folded
-	127020, -- Redoran Incense Pot, Beastly
-	127017, -- Dres Censer, Chains
-	127014, -- Redoran Incense Holder, Mesh
-	127010, -- Dres Cup, Empty Mazte
-	127007, -- Dres Cup, Sujamma
-	127006, -- Dres Cup, Empty Sujamma
-	127005, -- Dres Cup, Greef
-	127003, -- Ashlander Cup, Mazte
-	127002, -- Ashlander Cup, Empty
-	127001, -- Dres Cannister, Portable
-	127000, -- Dres Cauldron, Floral Banded
-	126999, -- Ashlander Platter, Bread and Cheese
-	126996, -- Dres Bowl, Empty
-	126995, -- Redoran Bowl, Saltrice Mash
-	126997, -- Dres Bowl, Saltrice Mash
-	126993, -- Dres Bowl, Dinner
-	126992, -- Dres Bowl, Serving
-	127053, -- Redoran Mantle Cloth, Crimson Coverle
-	126987, -- Telvanni Shelves, Organic t
-	126836, -- Daedric Bench, Ashen
-	126952, -- Hlaalu End Table, Formal Turtle
-	126984, -- Telvanni Desk, Organic
-	121304, -- Redguard Chandelier, Grated
-	126982, -- Telvanni Sofa, Organic
-	126981, -- Telvanni Throne, Organic
-	126980, -- Telvanni Armchair, Organic
-	126979, -- Telvanni Chair, Organic
-	126977, -- Hlaalu Dresser, Scroll Rack
-	126974, -- Indoril Shelf, Block
-	126973, -- Dres Shelf, Block
-	126971, -- Hlaalu Footlocker, Secure
-	126972, -- Hlaalu Chest, Secure
-	126970, -- Redoran Table, Formal Turtle
-	126969, -- Redoran Table, Formal Floral
-	126967, -- Redoran Sideboard, Display
-	126965, -- Indoril Cassone, Sealed
-	126964, -- Indoril Vault, Sealed
-	126961, -- Dres Divider, Honeycomb
-	126959, -- Dres Divider, Screen
-	126956, -- Hlaalu Mirror, Standing
-	127036, -- Dres Runner, Chains
-	126950, -- Indoril End Table, Rounded
-	126949, -- Hlaalu Sideboard, Scribe's
-	126946, -- Hlaalu Cabinet of Drawers, Clerk
-	126945, -- Hlaalu Sideboard, Low Cabinet
-	126943, -- Hlaalu Cupboard, Formal
-	126939, -- Redoran Armchair, Sanded
-	126936, -- Redoran Stool, Fungal Cushion
-	126935, -- Hlaalu Dresser, Open
-	126934, -- Hlaalu Cabinet, Open
-	126933, -- Hlaalu Cupboard, Open
-	126932, -- Hlaalu Bookcase, Empty
-	126931, -- Redoran Bench, Sanded
-	126930, -- Redoran Bench, Fungal Cushion
-	126929, -- Redoran Settee, Sanded
-	126928, -- Redoran Settee, Fungal Cushion
-	126927, -- Redoran Bed, Single
-	126926, -- Hlaalu Bed, Single
-	126924, -- Redoran Bed, Double Pillow
-	126922, -- Hlaalu Bed, Canopy
-	126921, -- Hlaalu Bed, Double Pillow
-	126920, -- Hlaalu Bed, Single Pillow
-	126918, -- Hlaalu Table, Formal Floral
-	126917, -- Dres Table, Kitchen
-	126914, -- Hlaalu Chair, Polished
-	126857, -- Dwarven Pipeline, Junction
-	126911, -- Hlaalu Stool, Polished
-	126909, -- Hlaalu Bench, Polished
-	126906, -- Hlaalu Settee, Mossy Cushion
-	126904, -- Redoran Urn, Dusky Marble
-	126901, -- Hlaalu Amphora, Sealed Orichalcum
-	126900, -- Hlaalu Jar, Sealed Malachite
-	126873, -- Dwarven Bowl, Forged Serving
-	126895, -- Dwarven Lantern, Oil
-	126885, -- Dwarven Cannister, Sealed
-	121191, -- Mantikora Horns, Wall Mount
-	126883, -- Dwarven Platform, Steps
-	126882, -- Dwarven Plate, Forged
-	126880, -- Dwarven Amphora, Sealed
-	126879, -- Dwarven Jug, Sealed
-	121106, -- Common Cargo Crate, Dry
-	121215, -- Redguard Canopy, Dusk
-	126896, -- Dwarven Lamppost, Powered
-	126859, -- Dwarven Pipeline, Column
-	126858, -- Dwarven Pipeline, Full Column
-	126912, -- Hlaalu Armchair, Mossy Cushion
-	126855, -- Dwarven Pipe, Corner
-	126853, -- Dwarven Pipe, Full Column
-	126851, -- Dwarven Pipe, Quarter Column
-	126849, -- Dwarven Pipe Cap, Bolted
-	126842, -- Daedric Chandelier, Ritual
-	126838, -- Daedric Base, Ashen
-	126985, -- Telvanni End Table, Organic
-	126835, -- Daedric Candles, Ritual Set
-	121102, -- Chicken Dinner, Display
-	126583, -- Target Centurion, Robust Refabricated
-	126884, -- Dwarven Vessel, Sealed
-	121189, -- Haj Mota Head, Wall Mount
-	121188, -- Echatere Horns, Wall Mount
-	121184, -- Antlers, Wall Mount
-	127091, -- Hlaalu Lantern, Oversized Vellum
-	121174, -- Sack of Grain
-	127098, -- Telvanni Lantern, Organic Azure
-	126839, -- Daedric Platform, Ashen
-	127074, -- Indoril Brazier, Knotwork
-	121107, -- Steak Dinner
-	126876, -- Dwarven Candlestick, Orrery
-	121105, -- Common Barrel, Dry
-	121103, -- Chicken Meal, Display
-	126944, -- Hlaalu Desk, Scholar's
-	121098, -- Common Campfire, Outdoor
-	127066, -- Redoran Jar, Jazbay
-	126872, -- Dwarven Bowl, Forged
-	126908, -- Hlaalu Bench, Mossy Cushion
-	126868, -- Dwarven Bookcase, Full
-	121366, -- Orcish Tapestry, Hunt
-	126892, -- Dwarven Chandelier, Barred
-	126948, -- Hlaalu Dresser, Scroll Drawers
-	126864, -- Dwarven Engine, Switch
-	126844, -- Daedric Pedestal, Ritual
-	121157, -- Sack of Rice
-	126960, -- Dres Divider, Chains
-	127079, -- Indoril Candelabra, Temple Chamber
-	121178, -- Horn, Display, Cracked
-	127095, -- Hlaalu Lamp, Portable
-	126940, -- Redoran Chair, Sanded
-	126889, -- Dwarven Urn, Sealed
-	126856, -- Dwarven Pipeline, Elbow
-	127041, -- Indoril Carpet, Grand Sotha Sil
-	126848, -- Dwarven Altar, Stairs
-	127016, -- Dres Incense Stand, Chains
-	127011, -- Dres Cup, Mazte
-	127033, -- Hlaalu Mat, Welcoming
-	126998, -- Ashlander Platter, Ceramic
-	126986, -- Telvanni Bookcase, Organic
-	126994, -- Redoran Bowl, Empty
-	126990, -- Telvanni Table, Organic Grand
-	126953, -- Hlaalu End Table, Formal Scales
-	121211, -- Orcish Effigy, Mammoth
-	126852, -- Dwarven Pipe, Half Column
-	121205, -- Nord Drinking Horn, Display
-	126957, -- Hlaalu Nightstand, Scholar's
-	127037, -- Dres Rug, Chains
-
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Reach/HotR_AchievementVendors.lua b/FurnitureCatalogue/data/Reach/HotR_AchievementVendors.lua
deleted file mode 100644
index 5c9d5c9..0000000
--- a/FurnitureCatalogue/data/Reach/HotR_AchievementVendors.lua
+++ /dev/null
@@ -1,255 +0,0 @@
-FurC.AchievementVendors[FURC_REACH] = {
-	["Coldharbour, Cicero's General Goods"] = {
-		[GetString(FURC_AV_KRR)] = {
-			[130273] = { -- Boulder, Coldharbour Fan
-				itemPrice 	= 5000,
-			},
-			[130274] = { -- Boulder, Coldharbour Shard
-				itemPrice 	= 5000,
-			},
-			[130275] = { -- Boulder, Coldharbour Spikes
-				itemPrice 	= 5000,
-			},
-			[130276] = { -- Boulder, Coldharbour Spikes
-				itemPrice 	= 250,
-			},
-			[131421] = { -- Sapling, Withered Thicket
-				itemPrice 	= 250,
-			},
-			[130279] = { -- Tree, Petrified AShen
-				itemPrice 	= 2500,
-			},
-			[130278] = { -- Tree, Strong Withered
-				itemPrice 	= 5000,
-			},
-			[130277] = { -- Tree, Towering Withered
-				itemPrice 	= 5000,
-			},
-		}
-	},
-	 ["Glenumbra, Daggerfall, The Rosy Lion"] = {
-		[GetString(FURC_AV_ROH)] = {
-
-			[120706] = {		-- Boulder, Giant Mossy
-				itemPrice 	= 100,
-			},
-			[130309] = {		-- Boulder, Swampy Growth
-				itemPrice 	= 250,
-			},
-			[132221] = {		-- Lily Pads, Swamp Cluster
-				itemPrice 	= 5000,
-			},
-			[130287] = {		-- Log, Fallen Laurel
-				itemPrice 	= 250,
-			},
-			[130288] = {		-- Log, Fallen Pine
-				itemPrice 	= 250,
-			},
-			[130286] = {		-- Log, Rotten Log
-				itemPrice 	= 250,
-			},
-			[130307] = {		-- Rocks, Swampy Slan
-				itemPrice 	= 250,
-			},
-			[130304] = {		-- Saplings, Marsh Cluster
-				itemPrice 	= 250,
-			},
-			[130303] = {		-- Shrug, Swamp Sprig
-				itemPrice 	= 250,
-			},
-			[130289] = {		-- Stump, Mossy Cypress
-				itemPrice 	= 250,
-			},
-			[130290] = {		-- Stump, Rotten Hollow
-				itemPrice 	= 250,
-			},
-			[130315] = {		-- Tree, Ancient Rotten
-				itemPrice 	= 7500,
-			},
-			[130310] = {		-- Tree, Dead Marsh
-				itemPrice 	= 7500,
-			},
-			[130312] = {		-- Tree, Dead Pine
-				itemPrice 	= 2500,
-			},
-			[130311] = {		-- Tree, Dead Swamp
-				itemPrice 	= 5000,
-			},
-			[130313] = {		-- Tree, Gnarled Marsh
-				itemPrice 	= 5000,
-			},
-			[130314] = {		-- Tree, Withering Marsh
-				itemPrice 	= 2500,
-			},
-
-		},
-	},
-	["the Undaunted Enclaves"] = {
-		["Undaunted Quartermaster"] = {
-			[131428] = { -- Horn of the Reachclans
-				itemPrice 	= 50000,
-			},
-			[131429] = { -- Vine, Bloodroot Wiggler
-				itemPrice 	= 5000,
-			},
-			[131432] = { -- Vine, Bloodroot Stem
-				itemPrice 	= 5000,
-			},
-			[131430] = { -- Vine, Bloodroot Mangler
-				itemPrice 	= 5000,
-			},
-			[131431] = { -- Vine, Bloodroot Grasper
-				itemPrice 	= 5000,
-			},
-
-		},
-	},
-	["Eastmarch"] = {
-		[GetString(FURC_AV_FRO)] = {
-			[132215] = { -- Boulder, Granite Cap
-				itemPrice 	= 1000,
-			},
-			[132213] = { -- Boulder, Granite Chunk
-				itemPrice 	= 1000,
-			},
-			[132214] = { -- Boulder, Granite Slab
-				itemPrice 	= 1000,
-			},
-			[132217] = { -- Rock, Granite Chunk
-				itemPrice 	= 5000,
-			},
-			[132209] = { -- Sapling, Foothills Pine
-				itemPrice 	= 250,
-			},
-			[132212] = { -- Shrub, Mountain Thistle
-				itemPrice 	= 250,
-			},
-			[132220] = { -- Stones, Granite Cluster
-				itemPrice 	= 250,
-			},
-			[132219] = { -- Stones, Granite Group
-				itemPrice 	= 250,
-			},
-			[132218] = { -- Stones, Granite Pair
-				itemPrice 	= 250,
-			},
-			[132210] = { -- Tree, Ancient Cedar
-				itemPrice 	= 2500,
-			},
-			[132207] = { -- Tree, Ancient Mountain Pine
-				itemPrice 	= 1000,
-			},
-			[132208] = { -- Tree, Foothills Pine
-				itemPrice 	= 1000,
-			},
-			[132205] = { -- Tree, Hardy Cedar
-				itemPrice 	= 250,
-			},
-			[132206] = { -- Tree, Towering Mountain Pine
-				itemPrice 	= 1000,
-			},
-
-		},
-	},
-	["Auridon, Skywatch"] = {
-		[GetString(FURC_AV_MAL)] = {
-			[120652] = { -- Boulder, Flat Lichen
-				itemPrice 	= 100,
-			},
-			[120651] = { -- Boulder, Grey Saddle
-				itemPrice 	= 100,
-			},
-			[120648] = { -- Boulder, Lichen Covered
-				itemPrice 	= 100,
-			},
-
-			[120672] = { -- Hedge, Green Short
-				itemPrice 	= 1000,
-			},
-			[120673] = { -- Hedge, Long Horseshoe
-				itemPrice 	= 2500,
-			},
-			[120671] = { -- Hedge, Small Horseshoe
-				itemPrice 	= 1250,
-			},
-			[120674] = { -- Hedge, Tall Green
-				itemPrice 	= 1250,
-			},
-			[121005] = { -- Hedge, Wall Arc
-				itemPrice 	= 3000,
-			},
-
-			[120653] = { -- Rock, Slanted Lichen
-				itemPrice 	= 100,
-			},
-			[120655] = { -- Stone, Slanted Lichen
-				itemPrice 	= 100,
-			},
-			[120654] = { -- Stone, Slanted Rough
-				itemPrice 	= 100,
-			},
-			[120656] = { -- Stones, Gray Mossy
-				itemPrice 	= 100,
-			},
-			[120675] = { -- Topiary, Manicured Evergreen
-				itemPrice 	= 2000,
-			},
-			[120676] = { -- Topiary, Pruned Evergreen
-				itemPrice 	= 1000,
-			},
-
-			[120670] = { -- Tree, Sturdy Jungle
-				itemPrice 	= 250,
-			},
-			[120664] = { -- Tree, Tiered Light Cherry
-				itemPrice 	= 15000,
-			},
-			[120665] = { -- Tree, Tiered Pink Cherry
-				itemPrice 	= 15000,
-			},
-			[120666] = { -- Tree, Tiered White Cherry
-				itemPrice 	= 25000,
-			},
-			[120657] = { -- Tree, twisted Pink cherry
-				itemPrice 	= 15000,
-			},
-			[120667] = { -- Tree, twisted white cherry
-				itemPrice 	= 12000,
-			},
-			[120659] = { -- Trees, Crooked Swamp
-				itemPrice 	= 100,
-			},
-			[120668] = {		-- Tree, Squat Pink Cherry
-				itemPrice 	= 10000,
-			},
-			[120669] = {		-- Tree, Squat White Cherry
-				itemPrice 	= 10000,
-			},
-
-		},
-
-	}
-
-}
-function tableMerge(t1, t2)
-	if nil == t2 and nil == t1 then
-		return {}
-	elseif nil == t2 then
-		return t1
-	elseif nil == t1 then
-		return t2
-	end
-
-    for k,v in pairs(t2) do
-		t1[k] = v
-    end
-    return t1
-end
-
-
--- global function, needs to live here, YES MANA
-function FurC.SetupReachItems()
-
-
-
-end
diff --git a/FurnitureCatalogue/data/Reach/HotR_LuxuryFurnisher.lua b/FurnitureCatalogue/data/Reach/HotR_LuxuryFurnisher.lua
deleted file mode 100644
index b87d31f..0000000
--- a/FurnitureCatalogue/data/Reach/HotR_LuxuryFurnisher.lua
+++ /dev/null
@@ -1,166 +0,0 @@
-FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
-
-FurC.LuxuryFurnisher[FURC_REACH] = {
-
-	-- Oct. 21
-	[132155] = { -- Witch's Torch, Wretched
-		itemPrice 	= 5000,
-		itemDate	= "2017-10-20",
-	},
-	[132154] = { -- Witch's Totem, Bog
-		itemPrice 	= 50000,
-		itemDate	= "2017-10-20",
-	},
-	[132153] = { -- Witch's Tree, Captive
-		itemPrice 	= 35000,
-		itemDate	= "2017-10-20",
-	},
-
-	-- Oct. 14
-	[119977] = { -- Orcish War Totem
-		itemPrice 	= 5000,
-		itemDate	= "2017-10-13",
-	},
-	[119978] = { -- Orcish Battle Totem
-		itemPrice 	= 7500,
-		itemDate	= "2017-10-13",
-	},
-	[119980] = { -- Orchish Totem
-		itemPrice 	= 10000,
-		itemDate	= "2017-10-13",
-	},
-
-	-- Oct. 7
-	[132145] = { -- Orsinium Tent, Chief’s
-		itemPrice 	= 5000,
-		itemDate	= "2017-10-06",
-	},
-	[132146] = { -- Orsinium Relief, Malacath
-		itemPrice 	= 25000,
-		itemDate	= "2017-10-06",
-	},
-	[132148] = { -- Orsinium Statue, Head
-		itemPrice 	= 25000,
-		itemDate	= "2017-10-06",
-	},
-	[132147] = { -- Orsinium Statue, Honor’s Rest
-		itemPrice 	= 25000,
-		itemDate	= "2017-10-06",
-	},
-
-	-- Sept. 30
-	[132144] = { -- Reach Briarheart, Blood Red
-		itemPrice 	= 15000,
-		itemDate	= "2017-09-29",
-	},
-	[132141] = { -- Reach Skull, Mammoth
-		itemPrice 	= 50000,
-		itemDate	= "2017-09-29",
-	},
-	[132142] = { -- Reach Tent, Camp
-		itemPrice 	= 2500,
-		itemDate	= "2017-09-29",
-	},
-
-
-	-- Sept. 23rd
-	[131435] = { -- Reach Bowl, Nirncrux
-		itemPrice 	= 5000,
-		itemDate	= "2017-09-22",
-	},
-	[131438] = { -- Reach Grinder, Nirncrux
-		itemPrice 	= 50000,
-		itemDate	= "2017-09-22",
-	},
-	[131436] = { -- Reach Vine, Bloodroot Sprout
-		itemPrice 	= 15000,
-		itemDate	= "2017-09-22",
-	},
-	[131437] = { -- Reach Vine, Bloodroot Tendril
-		itemPrice 	= 20000,
-		itemDate	= "2017-09-22",
-	},
-
-	-- Craglorn items
-	[120844] = { -- Craglorn Brazier, Ornate
-		itemPrice 	= 15000,
-		itemDate	= "2017-09-15, 2017-04-28",
-	},
-	[120843] = { -- Craglorn Skull, Carved
-		itemPrice 	= 35000,
-		itemDate	= "2017-09-15, 2017-04-28",
-	},
-	[120845] = { -- Craglorn Sword Sconce
-		itemPrice 	= 5000,
-		itemDate	= "2017-09-15, 2017-04-28",
-	},
-
-
-	[120842] = { -- Craglorn Chair, Serpent
-		itemPrice 	= 2500,
-		itemDate	= "2017-09-08, 2017-04-21",
-	},
-	[120841] = { -- Craglorn Urn, Standing
-		itemPrice 	= 7500,
-		itemDate	= "2017-09-08, 2017-04-21",
-	},
-	[120840] = { -- Craglorn Coffer, Ornate
-		itemPrice 	= 5000,
-		itemDate	= "2017-09-08, 2017-04-21",
-	},
-
-
-	-- Sept. 2nd + 3rd
-	[120832] = { -- Blue Crystal Spire
-		itemPrice 	= 12000,
-		itemDate	= "2017-09-01",
-	},
-	[120834] = { -- Blue Flame Brazier
-		itemPrice 	= 5000,
-		itemDate	= "2017-09-01",
-	},
-	[121272] = { -- Great Soul Gem
-		itemPrice 	= 20000,
-		itemDate	= "2017-09-01",
-	},
-
-
-	-- Aug 26+27
-	[120831] = { -- Blue Crystal Cluster
-		itemPrice 	= 10834,
-		itemDate	= "2017-08-25",
-	},
-	[120833] = { -- Blue Crystal Fragments
-		itemPrice 	= 8125,
-		itemDate	= "2017-08-25",
-	},
-	[120830] = { -- Blue Flame Candles
-		itemPrice 	= 2500,
-		itemDate	= "2017-08-25",
-	},
-	[121273] = { -- Soul Gem, Grand
-		itemPrice 	= 5417,
-		itemDate	= "2017-08-25",
-	},
-
-	-- August 19-20
-	[126579] = { -- Velothi Altar, Sacrificial
-		itemPrice 	= 10834,
-		itemDate	= "2017-08-18",
-	},
-	[126576] = { -- Velothi Kneeler, Prayer
-		itemPrice 	= 3000,
-		itemDate	= "2017-08-18",
-	},
-
-	[126577] = { -- Velothi Podium of Recitation
-		itemPrice 	= 37500,
-		itemDate	= "2017-08-18",
-	},
-
-	[126578] = { -- Velothi Burial Urn
-		itemPrice 	= 10834,
-		itemDate	= "2017-08-18",
-	},
-
-}
diff --git a/FurnitureCatalogue/data/Reach/HotR_Recipes.lua b/FurnitureCatalogue/data/Reach/HotR_Recipes.lua
deleted file mode 100644
index 181ac32..0000000
--- a/FurnitureCatalogue/data/Reach/HotR_Recipes.lua
+++ /dev/null
@@ -1,49 +0,0 @@
-FurC.Recipes = FurC.Recipes or {}
-FurC.Recipes[FURC_REACH] = {
-	132179,
-	132168,
-	132178,
-	132176,
-	132177,
-	132188,
-	132180,
-	132169,
-	132195,
-	132194,
-	132186,
-	132170,
-	132192,
-	132167,
-	132193,
-	132191,
-	132182,
-	132190,
-	132183,
-	132181,
-	132189,
-	132196,
-	132187,
-	132184,
-	132175,
-	132185,
-	132173,
-	132174,
-	132172,
-	132171,
-
-
-	-- witches festival ayleid stuff
-	132342, -- Ayleid Table, Carved
-	132343, -- Ayleid Bench, Carved
-	132344, -- Ayleid Brazier, Welkynd Holder
-	132187, -- Ayleid Bookcase, Cluttered
-	132188, -- Ayleid Bookshelf, Cluttered
-	132189, -- Ayleid Brazier, Fiery
-
-	-- witches festival
-	132167,	-- Praxis, Hagraven Cauldron, Rough Stone
-	132196, -- Pattern: Witches Corpse, Wrapped",
-	132173, -- Blueprint: Witches Brazier, Primitive Log",
-	132179, -- Blueprint: Witches Totem, Antler Charms",
-
-}
diff --git a/FurnitureCatalogue/data/Reach/HotR_Rollis.lua b/FurnitureCatalogue/data/Reach/HotR_Rollis.lua
deleted file mode 100644
index 5f1caaa..0000000
--- a/FurnitureCatalogue/data/Reach/HotR_Rollis.lua
+++ /dev/null
@@ -1,10 +0,0 @@
-FurC.Rollis_Recipes = FurC.Rollis_Recipes or {}
-
-FurC.Rollis_Recipes[FURC_REACH] = {
-	[132195] = true, -- Telvanni Candelabra, Masterwork
-	[132194] = true, -- Mammoth Cheese, Mastercrafted
-	[132191] = true, -- Dwarven Gyroscope
-	[132190] = true, -- Mages Apparatus, Master
-	[132192] = true, -- Dres Sewing Kit
-	[132193] = true, -- Hlaalu Bathtub, Masterwork
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/RecipeSources.lua b/FurnitureCatalogue/data/RecipeSources.lua
deleted file mode 100644
index bf3039a..0000000
--- a/FurnitureCatalogue/data/RecipeSources.lua
+++ /dev/null
@@ -1,3 +0,0 @@
-FurC.RecipeSources = {
-
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Recipes.lua b/FurnitureCatalogue/data/Recipes.lua
deleted file mode 100644
index cfacaf5..0000000
--- a/FurnitureCatalogue/data/Recipes.lua
+++ /dev/null
@@ -1,80 +0,0 @@
-FurC.Recipes = FurC.Recipes or {}
-FurC.Recipes[FURC_DRAGONS] = {
-	127101, -- Velothi Brazier, Temple - talked to a Russian who sold it
-	127102, -- Praxis: Tribunal Tablet of Almalexia, comfirmed by Almariel
-	134999, -- Praxis: Table, Blackmarrow Slab, drops in Fang Lair
-	127054,	-- Pattern: Redoran Table Runner, Gilded Ochre
-	134998,	-- Pattern: Jester's Pavillon, Open
-
-}
-FurC.Recipes[FURC_CLOCKWORK] = {
-	134527, -- Design: Clockwork Meal, Dish
-	134512, -- Diagram: Clockwork Table, Octagonal
-	134478, -- Formula: Fabricant Saplings, Electrum
-	134531, -- Diagram: Clockwork Sequence Plaque, Single
-	134543, -- Diagram: Clockwork Wall Machinery, Arched
-	134479, -- Formula: Fabricant Tree, Electrum
-	134486, -- Diagram: Clockwork Barrel, Sealed
-	134505, -- Diagram: Clockwork Drafting Table, Flat
-	134509, -- Diagram: Clockwork Cabinet, Sequence Plaque Storag
-	134500, -- Diagram: Clockwork Furnace, Socketed
-	134484, -- Formula: Fabricant Shrub, Gold
-	134496, -- Praxis: Clockwork Switch, Sturdy
-	134490, -- Diagram: Clockwork Crate, Wide
-	134476, -- Formula: Fabricant Tree, Gnarled Cypress
-	134504, -- Diagram: Clockwork Drafting Table, Raised
-	132188, -- Praxis: Ayleid Bookshelf, Cluttered
-	134477, -- Formula: Fabricant Trees, Clustered Maple
-	134518, -- Diagram: Clockwork Coffer, Robust
-	134515, -- Diagram: Clockwork Wardrobe, Precision Engineered
-	134526, -- Design: Clockwork Meal, Plate
-	134513, -- Diagram: Clockwork Nightstand, Octagonal
-	134546, -- Design: Clockwork Paste Dispenser, Empty
-	134492, -- Diagram: Clockwork Crate, Large Open
-	134487, -- Diagram: Clockwork Barrel, Wide
-	134493, -- Formula: Clockwork Lamppost, Gas
-	134485, -- Formula: Fabricant Shrub, Copper
-	134506, -- Diagram: Clockwork Sequence Spool, Single
-	134525, -- Diagram: Clockwork Mug, Reinforced
-	134582, -- Diagram: Clockwork Shelf, Wall
-	134545, -- Praxis: Clockwork Charging Station, Factotum
-	134508, -- Diagram: Clockwork Lectern, Empty
-	134520, -- Design: Clockwork Cup, Recycled Water
-	134488, -- Diagram: Clockwork Keg, Sturdy
-	134540, -- Praxis: Clockwork Illuminator, Compact
-	134516, -- Design: Clockwork Bowl, Large Nutriment Paste
-	134538, -- Praxis: Clockwork Illuminator, Capsule Tower
-	134517, -- Design: Clockwork Bowl, Nutriment Paste
-	134537, -- Praxis: Clockwork Illuminator, Powered Capsule
-	134536, -- Praxis: Clockwork Illuminator, Solitary Capsule
-	134497, -- Diagram: Clockwork Vent, Octagonal Fan
-	134535, -- Praxis: Clockwork Illuminator, Personal Desk
-	134534, -- Diagram: Clockwork Surveyor's Tripod, Calibrated
-	134483, -- Formula: Fabricant Shrubs, Beryl
-	134533, -- Diagram: Clockwork Flask Stand, Tall
-	134494, -- Diagram: Clockwork Pump, Vertical
-	134489, -- Diagram: Clockwork Crate, Square
-	134532, -- Diagram: Clockwork Flask Stand, Short
-	134530, -- Diagram: Clockwork Sequence Plaques, Unfolded
-	134491, -- Diagram: Clockwork Crate, Large Closed
-	134529, -- Diagram: Clockwork Sequence Plaques, Folded
-	134528, -- Diagram: Clockwork Scales, Precision Calibrated
-	134524, -- Praxis: Clockwork Mortar and Pestle, Sintered
-	134523, -- Praxis: Clockwork Measuring Cup, Sintered
-	134522, -- Design: Clockwork Goblet, Recycled Water
-	134511, -- Diagram: Clockwork Table, Beveled
-	134521, -- Diagram: Clockwork Goblet, Empty
-	134544, -- Praxis: Clockwork Charging Station, Animo Core
-	134519, -- Diagram: Clockwork Cup, Empty
-	134502, -- Diagram: Clockwork Chair, Practical
-	134514, -- Diagram: Clockwork Table, Grand
-	134510, -- Diagram: Clockwork Stool, Practical
-	134539, -- Praxis: Clockwork Illuminator, Compact Stand
-	134507, -- Diagram: Clockwork Sequence Spool, Triple
-	134482, -- Formula: Fabricant Tree, Cobalt Spruce
-	134481, -- Formula: Fabricant Tree, Miniature Cherry Blossom
-	134503, -- Diagram: Clockwork Chair, Reinforced
-	134501, -- Diagram: Clockwork Somnolostation
-	134480, -- Formula: Fabricant Tree, Vibrant Cherry Blossom
-	134498, -- Praxis: Clockwork Control Panel, Single
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/Rollis.lua b/FurnitureCatalogue/data/Rollis.lua
deleted file mode 100644
index d946a5d..0000000
--- a/FurnitureCatalogue/data/Rollis.lua
+++ /dev/null
@@ -1,42 +0,0 @@
-FurC.Rollis_Recipes = FurC.Rollis_Recipes 		or {}
-FurC.FaustinaRecipes	= FurC.FaustinaRecipes 	or {}
-FurC.Faustina			= FurC.Faustina 		or {}
-
-
-FurC.Rollis_Recipes[FURC_CLOCKWORK] = {
-	[133576] = 50,
-}
-
-FurC.FaustinaRecipes[FURC_DRAGONS] = {
-	 121200,	-- Cabinet, Poisonmaker's
-	 121166,	-- Heirloom Podium, Skinning
-	 121168,	-- Tools, Case
-	 121214,	-- Mortar + Pestle
-	 121163,	-- Orcish Skull Goblet, Full
-	 121163,	-- Apparatus, Boiler
-	 121165,	-- Apparatus, Gem Caliper
-	 121197,	-- Bottle, Poison Elixir
-	 121164,	-- Case of Vials
-	 121209,	-- Orcish Tapestry, Spear
-	 132194,	-- Mammoth Cheese
-	 132191,	-- Dwarven Gyroscope, Masterwork
-	 132190,	-- Mages' Apparatus, Master
-	 132192,	-- Dres Sewing Kit
-	 132193,	-- Hlaalu Bathtub
-	 132195,	-- Telvanni Candelabra
-	 121166,	-- Podium, Skinning
-}
-FurC.Faustina[FURC_DRAGONS] = {
-	[134675] = 1500,
-}
-
-FurC.Rollis[FURC_DRAGONS] = {
-	134983,
-	134984,
-	134985,
-	134986,
-	134987,
-}
-FurC.Rollis_Recipes[FURC_DRAGONS] = {
-	[133576] = 50,
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/data/RumourRecipes.lua b/FurnitureCatalogue/data/RumourRecipes.lua
deleted file mode 100644
index 765f9c7..0000000
--- a/FurnitureCatalogue/data/RumourRecipes.lua
+++ /dev/null
@@ -1,60 +0,0 @@
-FurC.RumourRecipes = {
-	118290, -- Antlers, Wall Mount
-	118299, -- Bottle, Beaker
-	118300, -- Bottle, Poison
-
-	118291, -- Durzog Head, Wall Mount
-	118294, -- Echatere Horns, Wall Mount
-	118293, -- Echatere, Wall Mount
-	118295, -- Haj Mota Head, Wall Mount
-	118289, -- Haj Mota Shell, Wall Mount
-	118284, -- Horn, Display, Cracked
-	118283, -- Horn, Display, Huge
-
-	118296, -- Mantikora Head, Wall Mount
-	118297, -- Mantikora Horns, Wall Mount
-	118242, -- Rug, Bearskin
-
-	121207, -- Recipe: Orcish Table with Fur_S_
-	121210, -- Recipe: Orcish Throne, Skull
-	121212, -- Recipe: Orcish Effigy, Bear
-	121213, -- Recipe: Orcish Skull Goblet, Empty
-
-	116473, -- Orcish Effigy, Mammoth
-	116474, -- Orcish Effigy, Bear
-	116433, -- Orcish Table with Fur_S
-
-	118065, -- Common Cargo Crate, Dry
-	118054, -- Common Firepit, Outdoor
-	118055, -- Common Firepit, Piled
-
-	118000, -- Garlic String, Display
-
-	118119, -- Minecart, Empty
-	118120, -- Minecart, Push
-	117991, -- Stool, Carved
-	118278, -- Plaque, Bordered Deer Antlers
-	132199, -- Telvanni Tower, Miniature
-	-- 132197, -- Death Skeleton, Shrouded
-	121198, -- Shelf, Poison
-	118304, -- Shelf, Poison
-
-	119441, -- Steak, Display
-	119442, -- Teapot, Common
-
-	119454, -- Plaque, Large
-	119455, -- Plaque, Standard
-
-	119466, -- Podium, Engraved
-
-	119437, -- Pie, Display
-
-	121161, -- Ram Horns, Mounted
-	121216, -- Redguard Divider, Gilded
-
-	118118, -- Candles, Lasting
-	115395, -- Nord Drinking Horn, Display
-	121203, -- Khajiit Brazier, Enchanted
-
-
-}
\ No newline at end of file
diff --git a/FurnitureCatalogue/libs/LibAddonMenu-2.0/LICENSE b/FurnitureCatalogue/libs/LibAddonMenu-2.0/LICENSE
deleted file mode 100644
index f69cbd4..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
deleted file mode 100644
index 3c4ab31..0000000
--- a/FurnitureCatalogue/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+++ /dev/null
@@ -1,1226 +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", 25
-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",
-    },
-    it = { -- provided by JohnnyKing
-        PANEL_NAME = "Addon",
-        VERSION = "Versione: <<X:1>>",
-        WEBSITE = "Visita il Sitoweb",
-        RELOAD_UI_WARNING = "Cambiare questa impostazione richiede un Ricarica UI al fine che faccia effetto.",
-        RELOAD_DIALOG_TITLE = "Ricarica UI richiesto",
-        RELOAD_DIALOG_TEXT = "Alcune modifiche richiedono un Ricarica UI al fine che facciano effetto. Sei sicuro di voler ricaricare ora o di voler annullare le modifiche?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Ricarica",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Annulla",
-    },
-    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",
-        RELOAD_UI_WARNING = "Для применения этой настройки необходима перезагрузка интерфейса.",
-        RELOAD_DIALOG_TITLE = "Необходима перезагрузка интерфейса",
-        RELOAD_DIALOG_TEXT = "Для применения некоторых изменений необходима перезагрузка интерфейса. Перезагрузить интерфейс сейчас или отменить изменения?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Перезагрузить",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Отменить изменения",
-    },
-    es = { -- provided by Morganlefai, checked by Kwisatz
-        PANEL_NAME = "Configuración",
-        VERSION = "Versión: <<X:1>>",
-        WEBSITE = "Visita la página web",
-        RELOAD_UI_WARNING = "Cambiar este ajuste recargará la interfaz del usuario.",
-        RELOAD_DIALOG_TITLE = "Requiere recargar la interfaz",
-        RELOAD_DIALOG_TEXT = "Algunos cambios requieren recargar la interfaz para poder aplicarse. Quieres aplicar los cambios y recargar la interfaz?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Recargar",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Cancelar",
-    },
-    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",
-    },
-    pl = { -- provided by EmiruTegryfon
-        PANEL_NAME = "Dodatki",
-        VERSION = "Wersja: <<X:1>>",
-        WEBSITE = "Odwiedź stronę",
-        RELOAD_UI_WARNING = "Zmiany będą widoczne po ponownym załadowaniu UI.",
-        RELOAD_DIALOG_TITLE = "Wymagane przeładowanie UI",
-        RELOAD_DIALOG_TEXT = "Niektóre zmiany wymagają ponownego załadowania UI. Czy chcesz teraz ponownie załadować, czy porzucić zmiany?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Przeładuj",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Porzuć",
-    },
-}
-
-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.uniformControlHeight or 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
-    local selectionIsFinal = false
-
-    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.pendingAddonPanel or data.panel == lam.currentAddonPanel then
-                if not selectionIsFinal then
-                    selectedData = data
-                end
-                if data.panel == lam.pendingAddonPanel then
-                    lam.pendingAddonPanel = nil
-                    selectionIsFinal = true
-                end
-            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)
-            lam.pendingAddonPanel = addonData.panel
-            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, GetStringFromValue(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(GetStringFromValue(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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/button.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/button.lua
deleted file mode 100644
index 82b5032..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/checkbox.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/checkbox.lua
deleted file mode 100644
index 6696dd7..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/colorpicker.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/colorpicker.lua
deleted file mode 100644
index a57aab0..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/custom.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/custom.lua
deleted file mode 100644
index 40a7c42..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/description.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/description.lua
deleted file mode 100644
index da207a0..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/divider.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/divider.lua
deleted file mode 100644
index 8089539..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/dropdown.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/dropdown.lua
deleted file mode 100644
index 70e23bb..0000000
--- a/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/dropdown.lua
+++ /dev/null
@@ -1,387 +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)
-    scrollable = true, -- boolean or number, if set the dropdown will feature a scroll bar if there are a large amount of choices and limit the visible lines to the specified number or 10 if true is used (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 = 18
-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")
-        if not control.scrollHelper then -- only do this for non-scrollable
-            SetupTooltips(control.dropdown, choicesTooltips)
-        end
-    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
-        if choicesTooltips and control.scrollHelper then
-            entry.tooltip = choicesTooltips[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
-
-local DEFAULT_VISIBLE_ROWS = 10
-local SCROLLABLE_ENTRY_TEMPLATE_HEIGHT = 25 -- same as in zo_combobox.lua
-local CONTENT_PADDING = 24
-local SCROLLBAR_PADDING = 16
-local PADDING = GetMenuPadding() / 2 -- half the amount looks closer to the regular dropdown
-local ROUNDING_MARGIN = 0.01 -- needed to avoid rare issue with too many anchors processed
-local ScrollableDropdownHelper = ZO_Object:Subclass()
-
-function ScrollableDropdownHelper:New(...)
-    local object = ZO_Object.New(self)
-    object:Initialize(...)
-    return object
-end
-
-function ScrollableDropdownHelper:Initialize(parent, control, visibleRows)
-    local combobox = control.combobox
-    local dropdown = control.dropdown
-    self.parent = parent
-    self.control = control
-    self.combobox = combobox
-    self.dropdown = dropdown
-    self.visibleRows = visibleRows
-
-    -- clear anchors so we can adjust the width dynamically
-    dropdown.m_dropdown:ClearAnchors()
-    dropdown.m_dropdown:SetAnchor(TOPLEFT, combobox, BOTTOMLEFT)
-
-    -- handle dropdown or settingsmenu opening/closing
-    local function onShow() self:OnShow() end
-    local function onHide() self:OnHide() end
-    local function doHide() self:DoHide() end
-
-    ZO_PreHook(dropdown, "ShowDropdownOnMouseUp", onShow)
-    ZO_PreHook(dropdown, "HideDropdownInternal", onHide)
-    combobox:SetHandler("OnEffectivelyHidden", onHide)
-    parent:SetHandler("OnEffectivelyHidden", doHide)
-
-    -- dont fade entries near the edges
-    local scrollList = dropdown.m_scroll
-    scrollList.selectionTemplate = nil
-    scrollList.highlightTemplate = nil
-    ZO_ScrollList_EnableSelection(scrollList, "ZO_SelectionHighlight")
-    ZO_ScrollList_EnableHighlight(scrollList, "ZO_SelectionHighlight")
-    ZO_Scroll_SetUseFadeGradient(scrollList, false)
-
-    -- adjust scroll content anchor to mimic menu padding
-    local scroll = dropdown.m_dropdown:GetNamedChild("Scroll")
-    local anchor1 = {scroll:GetAnchor(0)}
-    local anchor2 = {scroll:GetAnchor(1)}
-    scroll:ClearAnchors()
-    scroll:SetAnchor(anchor1[2], anchor1[3], anchor1[4], anchor1[5] + PADDING, anchor1[6] + PADDING)
-    scroll:SetAnchor(anchor2[2], anchor2[3], anchor2[4], anchor2[5] - PADDING, anchor2[6] - PADDING)
-    ZO_ScrollList_Commit(scrollList)
-
-    -- hook mouse enter/exit
-    local function onMouseEnter(control) self:OnMouseEnter(control) end
-    local function onMouseExit(control) self:OnMouseExit(control) end
-
-    -- adjust row setup to mimic the highlight padding
-    local dataType1 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
-    local dataType2 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 2)
-    local oSetup = dataType1.setupCallback -- both types have the same setup function
-    local function SetupEntry(control, data, list)
-        oSetup(control, data, list)
-        control.m_label:SetAnchor(LEFT, nil, nil, 2)
-        -- no need to store old ones since we have full ownership of our dropdown controls
-        if not control.hookedMouseHandlers then --only do it once per control
-            control.hookedMouseHandlers = true
-            ZO_PreHookHandler(control, "OnMouseEnter", onMouseEnter)
-            ZO_PreHookHandler(control, "OnMouseExit", onMouseExit)
-            -- we could also just replace the handlers
-            --control:SetHandler("OnMouseEnter", onMouseEnter)
-            --control:SetHandler("OnMouseExit", onMouseExit)
-        end
-    end
-    dataType1.setupCallback = SetupEntry
-    dataType2.setupCallback = SetupEntry
-
-    -- adjust dimensions based on entries
-    local scrollContent = scroll:GetNamedChild("Contents")
-    ZO_PreHook(dropdown, "AddMenuItems", function()
-        local width = PADDING * 2 + zo_max(self:GetMaxWidth(), combobox:GetWidth())
-        local numItems = #dropdown.m_sortedItems
-        local anchorOffset = 0
-        if(numItems > self.visibleRows) then
-            width = width + CONTENT_PADDING + SCROLLBAR_PADDING
-            anchorOffset = -SCROLLBAR_PADDING
-            numItems = self.visibleRows
-        end
-        scrollContent:SetAnchor(BOTTOMRIGHT, nil, nil, anchorOffset)
-        local height = PADDING * 2 + numItems * (SCROLLABLE_ENTRY_TEMPLATE_HEIGHT + dropdown.m_spacing) - dropdown.m_spacing + ROUNDING_MARGIN
-        dropdown.m_dropdown:SetWidth(width)
-        dropdown.m_dropdown:SetHeight(height)
-    end)
-end
-
-function ScrollableDropdownHelper:OnShow()
-    local dropdown = self.dropdown
-    if dropdown.m_lastParent ~= ZO_Menus then
-        dropdown.m_lastParent = dropdown.m_dropdown:GetParent()
-        dropdown.m_dropdown:SetParent(ZO_Menus)
-        ZO_Menus:BringWindowToTop()
-    end
-end
-
-function ScrollableDropdownHelper:OnHide()
-    local dropdown = self.dropdown
-    if dropdown.m_lastParent then
-        dropdown.m_dropdown:SetParent(dropdown.m_lastParent)
-        dropdown.m_lastParent = nil
-    end
-end
-
-function ScrollableDropdownHelper:DoHide()
-    local dropdown = self.dropdown
-    if dropdown:IsDropdownVisible() then
-        dropdown:HideDropdown()
-    end
-end
-
-function ScrollableDropdownHelper:GetMaxWidth()
-    local dropdown = self.dropdown
-    local dataType = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
-
-    local dummy = dataType.pool:AcquireObject()
-    dataType.setupCallback(dummy, {
-        m_owner = dropdown,
-        name = "Dummy"
-    }, dropdown)
-
-    local maxWidth = 0
-    local label = dummy.m_label
-    local entries = dropdown.m_sortedItems
-    local numItems = #entries
-    for index = 1, numItems do
-        label:SetText(entries[index].name)
-        local width = label:GetTextWidth()
-        if (width > maxWidth) then
-            maxWidth = width
-        end
-    end
-
-    dataType.pool:ReleaseObject(dummy.key)
-    return maxWidth
-end
-
-function ScrollableDropdownHelper:OnMouseEnter(control)
-    -- call original code if we replace instead of hook the handler
-        --ZO_ScrollableComboBox_Entry_OnMouseEnter(control)
-    -- show tooltip
-    if control.m_data.tooltip then
-        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
-        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.m_data.tooltip))
-        InformationTooltipTopLevel:BringWindowToTop()
-    end
-end
-function ScrollableDropdownHelper:OnMouseExit(control)
-    -- call original code if we replace instead of hook the handler
-        --ZO_ScrollableComboBox_Entry_OnMouseExit(control)
-    -- hide tooltip
-    if control.m_data.tooltip then
-        ClearTooltip(InformationTooltip)
-    end
-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, dropdownData.scrollable and "ZO_ScrollableComboBox" or "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
-
-    if dropdownData.scrollable then
-        local visibleRows = type(dropdownData.scrollable) == "number" and dropdownData.scrollable or DEFAULT_VISIBLE_ROWS
-        control.scrollHelper = ScrollableDropdownHelper:New(parent, control, visibleRows)
-    end
-
-    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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/editbox.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/editbox.lua
deleted file mode 100644
index d6baf11..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/header.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/header.lua
deleted file mode 100644
index eadff38..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/iconpicker.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/iconpicker.lua
deleted file mode 100644
index 65c7782..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/panel.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/panel.lua
deleted file mode 100644
index 1404686..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/slider.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/slider.lua
deleted file mode 100644
index bd721c5..0000000
--- a/FurnitureCatalogue/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, 16)
-        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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/submenu.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/submenu.lua
deleted file mode 100644
index 1766a1f..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/texture.lua b/FurnitureCatalogue/libs/LibAddonMenu-2.0/controls/texture.lua
deleted file mode 100644
index 29dda7c..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibAsync/LibAsync.lua b/FurnitureCatalogue/libs/LibAsync/LibAsync.lua
deleted file mode 100644
index d5dab4b..0000000
--- a/FurnitureCatalogue/libs/LibAsync/LibAsync.lua
+++ /dev/null
@@ -1,332 +0,0 @@
-local MAJOR, MINOR = "LibAsync", 1.3
-local async, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not async then return end -- the same or newer version of this lib is already loaded into memory
-
-if async.Unload then
-	async:Unload()
-end
-
-local em = GetEventManager()
-local remove, min = table.remove, math.min
-
-local function RemoveCall(job, callstackIndex)
-	remove(job.callstack, callstackIndex)
-	job.lastCallIndex = min(job.lastCallIndex, #job.callstack)
-end
-
-local current, call
-local function safeCall() return call(current) end
-
-local function DoCallback(job, callstackIndex)
-	local success, shouldContinue = pcall(safeCall)
-	if success then
-		-- If the call returns true, the call wants to be called again
-		if not shouldContinue then RemoveCall(job, callstackIndex) end
-	else
-		-- shouldContinue is the value returned by error or assert
-		job.Error = shouldContinue
-		RemoveCall(job, callstackIndex)
-
-		call = job.OnError
-		if call then
-			pcall(safeCall)
-		else
-			job:Suspend()
-			error(job)
-		end
-	end
-end
-
-local jobs = async.jobs or { }
-async.jobs = jobs
--- async.registered = { }
-
-local function DoJob(job)
-	current = job
-	local index = #job.callstack
-	call = job.callstack[index]
-	if call then
-		DoCallback(job, index)
-	else
-		assert(index == 0, "No call on non-empty stack?!")
-		jobs[job] = nil
-		call = job.finally
-		if call then pcall(safeCall) end
-	end
-	current, call = nil, nil
-end
-
--- time we can spend until the next frame must be shown
-local frameTimeTarget = 13
--- we allow a function to use 25% of the frame time before it gets critical
-local spendTimeDef = frameTimeTarget * 0.75
-local spendTime = spendTimeDef
-
-local debug = false
-
-local GetFrameTimeMilliseconds, GetGameTimeMilliseconds = GetFrameTimeMilliseconds, GetGameTimeMilliseconds
-local identifier = "ASYNCTASKS_JOBS"
-local job = nil
-local function Scheduler()
-	local start = GetFrameTimeMilliseconds()
-	local runTime = start
-	if (GetGameTimeMilliseconds() - start) > spendTime then
-		spendTime = 750 / GetFramerate()
-		if debug then
-			df("initial gap: %ims. skip. new threshold: %ims", GetGameTimeMilliseconds() - start, spendTime)
-		end
-		return
-	end
-	if debug then
-		df("initial gap: %ims", GetGameTimeMilliseconds() - start)
-	end
-	while (GetGameTimeMilliseconds() - start) <= spendTime do
-		job = next(jobs, job) or next(jobs)
-		if job then
-			runTime = GetGameTimeMilliseconds()
-			DoJob(job)
-		else
-			-- Finished
-			em:UnregisterForUpdate(identifier)
-			spendTime = spendTimeDef
-			return
-		end
-	end
-	spendTime = spendTimeDef
-	if debug and job then
-		local now = GetGameTimeMilliseconds()
-		local freezeTime = now - start
-		if freezeTime >= 16 then
-			runTime = now - runTime
-			df("%s freeze. used %ims, resulting frametime %ims.", job.name, runTime, freezeTime)
-		end
-	end
-end
-
-function async:GetDebug()
-	return debug
-end
-
-function async:SetDebug(enabled)
-	debug = enabled
-end
-
--- Class task
-
-local task = async.task or ZO_Object:Subclass()
-async.task = task
-
--- Called from async:Create()
-function task:New(name)
-	local instance = ZO_Object.New(self)
-	instance.name = name or tostring(instance)
-	instance:Initialize()
-	return instance
-end
-
-function task:Initialize()
-	self.callstack = { }
-	self.lastCallIndex = 0
-	-- async.registered[#async.registered + 1] = self
-end
-
--- Resume the execution context.
-function task:Resume()
-	jobs[self] = true
-	em:RegisterForUpdate(identifier, 0, Scheduler)
-	return self
-end
-
--- Suspend the execution context and allow to resume anytime later.
-function task:Suspend()
-	jobs[self] = nil
-	return self
-end
-
--- Interupt and fully stop the execution context. Can be called from outside to stop everything.
-function task:Cancel()
-	if jobs[self] then
-		ZO_ClearNumericallyIndexedTable(self.callstack)
-		self.lastCallIndex = 0
-		if not self.finally then
-			jobs[self] = nil
-			-- else run job with empty callstack to run finalizer
-		end
-	end
-	return self
-end
-
-do
-	-- Run the given FuncOfTask in your task context execution.
-	function task:Call(funcOfTask)
-		self.lastCallIndex = #self.callstack + 1
-		self.callstack[self.lastCallIndex] = funcOfTask
-		return self:Resume()
-	end
-
-	local insert = table.insert
-	-- Continue your task context execution with the given FuncOfTask after the previous as finished.
-	function task:Then(funcOfTask)
-		assert(self.lastCallIndex > 0 and self.lastCallIndex <= #self.callstack, "cap!")
-		insert(self.callstack, self.lastCallIndex, funcOfTask)
-		return self
-	end
-end
-
--- Start an interruptible for-loop.
-function task:For(p1, p2, p3)
-	-- If called as a normal job, false will prevent it is kept in callstack doing an endless loop
-	self.callstack[#self.callstack + 1] = function() return false, p1, p2, p3 end
-	return self
-end
-
-do
-	local function ForConditionAlreadyFalse() end
-	local function ContinueForward(index, endIndex) return index <= endIndex end
-	local function ContinueBackward(index, endIndex) return index >= endIndex end
-
-	local function asyncForWithStep(self, func, index, endIndex, step)
-		step = step or 1
-		if step == 0 then error("step is zero") end
-
-		local ShouldContinue
-		if step > 0 then
-			if index > endIndex then return ForConditionAlreadyFalse end
-			ShouldContinue = ContinueForward
-		else
-			if index < endIndex then return ForConditionAlreadyFalse end
-			ShouldContinue = ContinueBackward
-		end
-		return function()
-			if func(index) ~= async.BREAK then
-				index = index + step
-				return ShouldContinue(index, endIndex)
-			end
-		end
-	end
-
-	local function asyncForPairs(self, func, iter, list, key)
-		return function()
-			local value
-			key, value = iter(list, key)
-			return key and func(key, value) ~= async.BREAK
-		end
-	end
-
-	-- Execute the async-for with the given step-function. The parameters of the step-function are those you would use in your for body.
-	function task:Do(func)
-		local callstackIndex = #self.callstack
-		local shouldBeFalse, p1, p2, p3 = self.callstack[callstackIndex]()
-		assert(shouldBeFalse == false and p1, "Do without For")
-		remove(self.callstack, callstackIndex)
-
-		local DoLoop = type(p1) == "number" and
-		asyncForWithStep(self, func, p1, p2, p3) or
-		asyncForPairs(self, func, p1, p2, p3)
-
-		if current or #self.callstack == 0 then return self:Call(DoLoop) else return self:Then(DoLoop) end
-	end
-end
-
--- Suspend the execution of your task context for the given delay in milliseconds and then call the given FuncOfTask to continue.
-function task:Delay(delay, funcOfTask)
-	self:StopTimer()
-	if delay < 10 then return self:Call(funcOfTask) end
-	self:Suspend()
-	em:RegisterForUpdate(self.name, delay, function()
-		em:UnregisterForUpdate(self.name)
-		self:Call(funcOfTask)
-	end )
-	return self
-end
-
--- Stop the delay created by task:Delay or task:Interval.
-function task:StopTimer()
-	em:UnregisterForUpdate(self.name)
-	return self
-end
-
--- Set a FuncOfTask as a final handler. If you call Called if something went wrong in your context.
-function task:Finally(funcOfTask)
-	self.finally = funcOfTask
-	return self
-end
-
--- Set a FuncOfTask as an error handler. Called if something went wrong in your context.
-function task:OnError(funcOfTask)
-	self.onError = funcOfTask
-	return self
-end
-
-do
-	-- Thanks to: https://de.wikipedia.org/wiki/Quicksort
-
-	local function simpleCompare(a, b) return a < b end
-	local function sort(task, array, compare)
-		local function quicksort(left, right)
-			if left >= right then return end
-
-			-- partition
-			local i, j, pivot = left, right - 1, array[right]
-
-			task:Call( function()
-				while i < right and compare(array[i], pivot) do i = i + 1 end
-				while j > left and not compare(array[j], pivot) do j = j - 1 end
-				if i < j then
-					array[i], array[j] = array[j], array[i]
-					-- repeatly call this function until i >= j
-					return true
-				end
-			end ):Then( function()
-				if compare(pivot, array[i]) then array[i], array[right] = array[right], array[i] end
-				quicksort(left, i - 1)
-				quicksort(i + 1, right)
-			end )
-		end
-		quicksort(1, #array)
-	end
-
-	-- This sort function works like table.sort(). The compare function is optional.
-	function task:Sort(array, compare)
-		local sortJob = function(task) sort(task, array, compare or simpleCompare) end
-		if current or #self.callstack == 0 then return self:Call(sortJob) else return self:Then(sortJob) end
-	end
-end
-
--- Class async
-
--- Get the current context, if you are within a FuncOfTask or nil.
-function async:GetCurrent()
-	return current
-end
-
--- Create an interruptible task context.
-function async:Create(name)
-	return task:New(name)
-end
-
-do
-	local Default = task:New("*Default Task*")
-	function Default:Cancel() error("Not allowed on default task. Use your_lib_var:Create(optional_name) for an interruptible task context.") end
-	Default.Finally = Default.Cancel
-	Default.OnError = Default.Cancel
-
-	-- Start a non-interruptible task or start a nested call in the current context.
-	function async:Call(funcOfTask)
-		-- if async:Call is called from within a task callback (the moment where GetCurrent() is not nil) use it for nested calls
-		return(async:GetCurrent() or Default):Call(funcOfTask)
-	end
-	-- Start a non-interruptible for-loop or start a nested for-loop in the current context.
-	function async:For(p1, p2, p3)
-		return(self:GetCurrent() or Default):For(p1, p2, p3)
-	end
-
-	-- Start a non-interruptible sort or start a nested sort in the current context.
-	function async:Sort(array, compare)
-		return(self:GetCurrent() or Default):Sort(array, compare)
-	end
-end
-
--- async.BREAK is the new 'break' for breaking loops. As Lua would not allowed the keyword 'break' in that context.
--- To break a for-loop, return async.BREAK
-async.BREAK = true
diff --git a/FurnitureCatalogue/libs/LibCustomMenu/LibCustomMenu.lua b/FurnitureCatalogue/libs/LibCustomMenu/LibCustomMenu.lua
deleted file mode 100644
index 2164065..0000000
--- a/FurnitureCatalogue/libs/LibCustomMenu/LibCustomMenu.lua
+++ /dev/null
@@ -1,646 +0,0 @@
--- authors: votan, sirinsidiator
--- thanks to: baertram & circonian
-
--- Register with LibStub
-local MAJOR, MINOR = "LibCustomMenu", 6.4
-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
-
----- Hook points for context menu -----
-
-local function HookContextMenu()
-	local category, registry, inventorySlot, slotActions, entered
-	local function Reset()
-		category, registry, inventorySlot, slotActions = 0, nil, nil, nil
-	end
-	local function RemoveMouseOverKeybinds()
-		if entered then
-			entered = false
-			lib.keybindRegistry:FireCallbacks("Exit")
-		end
-		Reset()
-	end
-	local function addCategory()
-		category = category + 1
-		registry:FireCallbacks(category, inventorySlot, slotActions)
-	end
-	local function AddSlots(...)
-		Reset()
-		inventorySlot, slotActions = ...
-		if slotActions.m_contextMenuMode then
-			registry = lib.contextMenuRegistry
-		else
-			entered = true
-			registry = lib.keybindRegistry
-		end
-	end
-	local function InsertToMenu()
-		if category < 4 and inventorySlot then
-			addCategory()
-		end
-	end
-	local function AppendToMenu()
-		if registry then
-			if inventorySlot then
-				while category <= 6 do addCategory() end
-			end
-			Reset()
-		end
-	end
-	Reset()
-
-	ZO_PreHook("ZO_InventorySlot_RemoveMouseOverKeybinds", RemoveMouseOverKeybinds)
-	ZO_PreHook("ZO_InventorySlot_OnMouseExit", RemoveMouseOverKeybinds)
-	ZO_PreHook("ZO_InventorySlot_DiscoverSlotActionsFromActionList", AddSlots)
-	ZO_PreHook(ZO_InventorySlotActions, "AddSlotAction", InsertToMenu)
-	ZO_PreHook(ZO_InventorySlotActions, "Show", AppendToMenu)
-	ZO_PreHook(ZO_InventorySlotActions, "GetPrimaryActionName", AppendToMenu)
-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
-
-function lib:RegisterContextMenu(func, category, ...)
-	category = zo_clamp(category or self.CATEGORY_LATE, self.CATEGORY_EARLY, self.CATEGORY_LATE)
-	self.contextMenuRegistry:RegisterCallback(category, func, ...)
-end
-
-function lib:RegisterKeyStripEnter(func, category, ...)
-	category = zo_clamp(category or self.CATEGORY_LATE, self.CATEGORY_EARLY, self.CATEGORY_LATE)
-	self.keybindRegistry:RegisterCallback(category, func, ...)
-end
-
-function lib:RegisterKeyStripExit(func, ...)
-	self.keybindRegistry:RegisterCallback("Exit", func, ...)
-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()
-	HookContextMenu()
-end
-
-lib.contextMenuRegistry = lib.contextMenuRegistry or ZO_CallbackObject:New()
-lib.keybindRegistry = lib.keybindRegistry or ZO_CallbackObject:New()
-
-lib.CATEGORY_EARLY = 1
-lib.CATEGORY_PRIMARY = 2
-lib.CATEGORY_SECONDARY = 3
-lib.CATEGORY_TERTIARY = 4
-lib.CATEGORY_QUATERNARY = 5
-lib.CATEGORY_LATE = 6
-
-EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
-EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_ADD_ON_LOADED, OnAddonLoaded)
diff --git a/FurnitureCatalogue/libs/LibCustomMenu/Unlicense.rtf b/FurnitureCatalogue/libs/LibCustomMenu/Unlicense.rtf
deleted file mode 100644
index 68a49da..0000000
--- a/FurnitureCatalogue/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/FurnitureCatalogue/libs/LibCustomTitles/LibCustomTitles.lua b/FurnitureCatalogue/libs/LibCustomTitles/LibCustomTitles.lua
deleted file mode 100644
index 441c396..0000000
--- a/FurnitureCatalogue/libs/LibCustomTitles/LibCustomTitles.lua
+++ /dev/null
@@ -1,563 +0,0 @@
---[[
-Author: Ayantir
-Filename: LibCustomTitles.lua
-Version: 20
-]]--
-
---[[
-
-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", 20
-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 (v12 changes)
-			["Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-			["Sugar-Paws Underfoot"] = {
-				ov = true,
-				en = "Favorite Apprentice",
-				fr = "Apprenti préféré",
-				de = "Lieblingslehrling",
-			},
-			["Ravani Indoril"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-			["Telvanni Ravani Varo"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-		},
-
-		["@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",
-			},
-			["Nathyn Varo"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-		},
-
-		["@Manorin"] = { -- EU v10 (v12 fix)
-			["Foryn Telvanni"] = {
-				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-				en = "Hero",
-				fr = "Héros",
-				de = "Helt",
-			},
-			["Serjo Vivicah Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
-				en = "Archmagister",
-				fr = "Archimage",
-				de = "Erzmagister",
-			},
-		},
-
-		["@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",
-			},
-		},
-
-		["@Haunted1994"] = { -- v12
-			["Jah'rakal"] = {
-				ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
-				en = "Troll Warlord",
-				fr = "Troll Warlord",
-				de = "Troll Warlord",
-			},
-		},
-
-		["@Vortexman11"] = { -- v12
-			["Ålaunus"] = {
-				ov = true,
-				en = "The Silent",
-				fr = "Le Discret",
-				de = "Die Stille",
-			},
-		},
-
-		["@Domardal"] = { -- v12
-			ov = true,
-			en = "Coco",
-			fr = "Coco",
-			de = "Coco",
-		},
-
-		["@RaddyBK"] = { -- v12
-			["Radolfus"] = {
-				ov = {en = "Major", fr = "Major", de = "Major"},
-				en = "The Elder Dragon",
-				fr = "Le Vieux Dragon",
-				de = "The Elder Dragon",
-			},
-			["RADOLFUS II"] = {
-				ov = {en = "Executioner", fr = "Exécuteur", de = "Henker"},
-				en = "The Elder Dragon",
-				fr = "Le Vieux Dragon",
-				de = "The Elder Dragon",
-			},
-		},
-
-		["@Dolgubon"] = { -- v12
-			["Relthion"] = {
-				ov = true,
-				en = "Undying",
-				fr = "L'immortel",
-				de = "Undying",
-			},
-		},
-
-		["@Sethize"] = { -- EU v12
-			["Nelvan Telvanni"] = {
-				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meister der Zauberei"},
-				en = "Master",
-				fr = "Maître",
-				de = "Meister",
-			},
-		},
-
-		["@ScattyThePirate"] = { -- EU v13
-			["Teldryn Dreth"] = {
-				ov = true,
-				en = "Warden",
-				fr = "Sentinelle",
-				de = "Aufseher",
-			},
-			["Ralyn Telvanni"] = {
-				ov = true,
-				en = "Spellwright",
-				fr = "Tisseur de Sorts",
-				--de = "Meister",
-			},
-			["Shabar-Jo"] = {
-				ov = true,
-				en = "Tisseur de Sorts",
-				fr = "Spellwright",
-				--de = "Meister",
-			},
-			["Shurkul gro-Kharzog"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "The Monster",
-				fr = "La Bête",
-				de = "Das Monster",
-			},
-			["Azuk gro-Shakh"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "Windsinger",
-				fr = "Ténor des tempêtes",
-				--de = "Das Monster",
-			},
-			["Xal-Shei"] = {
-				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
-				en = "Swamp Knight",
-				fr = "Chevalier des Marais",
-				--de = "Das Monster",
-			},
-		},
-
-		["@ScattyTheWizard"] = { -- v13
-			["Marukh-do"] = {
-				ov = true,
-				en = "Privateer",
-				fr = "Corsaire",
-				--de = "Meister",
-			},
-		},
-
-		["@Karstyll"] = { -- v13
-			ov = true,
-			en = "Forsaken",
-			fr = "L'oublié",
-			de = "Die Verlassene",
-		},
-
-		["@Methuselah86"] = { -- v13
-			ov = true,
-			en = "Wabbajack Warrior",
-			fr = "Guerrier de Wabbajack",
-			--de = "Die Verlassene",
-		},
-
-		["@DaedricAdept"] = { -- v14
-			ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
-			en = "Hand of Almalexia",
-			fr = "Main d'Almalexia",
-			--de = "Die Verlassene",
-		},
-
-		["@Cloudless"] = { -- v14
-			ov = true,
-			en = "Order of Doctrine",
-			fr = "Ordre de la Doctrine",
-			--de = "Die Verlassene",
-		},
-
-		["@Atomkern"] = { -- v13
-			ov = true,
-			en = "The Refrigerator",
-			fr = "Le glacé",
-			--de = "Die Verlassene",
-		},
-
-		["@Orizonta"] = { -- v13
-			ov = true,
-			en = "Manslayer",
-			fr = "Assassin",
-			--de = "Die Verlassene",
-		},
-
-		["@laksikus"] = { -- v13
-			ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
-			en = "Sexy Zogger",
-			fr = "Zog-Zog",
-			--de = "Die Verlassene",
-		},
-
-		["@flyty"] = { -- v13
-			ov = true,
-			en = "Always Drunk",
-			fr = "Toujours bourré",
-			--de = "Die Verlassene",
-		},
-
-		["@Deltia"] = { -- v13
-			ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
-			en = "The Destroyer",
-			fr = "Le Destructeur",
-			--de = "Die Verlassene",
-		},
-
-		["@tannips"] = { -- v13
-			ov = true,
-			en = "Potentate",
-			fr = "Potentat",
-			--de = "Die Verlassene",
-		},
-
-		["@sioniann"] = { -- v13
-			["Uloth The Furious Blade"] = {
-				ov = true,
-				en = "Sinister Turkey",
-				fr = "Dindon Sinistre",
-				--de = "Meister",
-			},
-			["Enid an Gleana"] = {
-				ov = true,
-				en = "Fountain of Auridon",
-				fr = "Fontaine d'Auridia",
-				--de = "Meister",
-			},
-		},
-
-		["@HMS-Dragonfly"] = { -- v16
-			ov = true,
-			en = "Knight of Stendarr",
-			fr = "Chevalier de Stendarr",
-			--de = "Die Verlassene",
-		},
-
-		["@Faso"] = { -- v16
-			["Fasò"] = {
-				ov = true,
-				en = "Knights Radiant",
-			},
-		},
-
-		["@nifty2g"] = { -- v16
-			["Nifty Jong-Un"] = {
-				ov = true,
-				en = "Dawn of Anu",
-			},
-		},
-
-		["@Twirlz"] = { -- v17
-			["Yirel Virith"] = {
-				ov = true,
-				en = "Nightcaller",
-			},
-		},
-
-		["@Anceane"] = { -- v19
-			ov = true,
-			en = "Dark Emerald",
-			fr = "Emeraude Sombre",
-		},
-
-		["@Potato-Salad"] = { -- v19
-			ov = true,
-			en = "Seraphim of Azura",
-			fr = "Séraphin d'Azura",
-		},
-
-		["@blakeblox"] = { -- v19
-			["fyboba"] = {
-				ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
-				en = "Golden Lady",
-			},
-		},
-
-	}
-
-	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/FurnitureCatalogue/libs/LibStub/LibStub.lua b/FurnitureCatalogue/libs/LibStub/LibStub.lua
deleted file mode 100644
index 0e6bf67..0000000
--- a/FurnitureCatalogue/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
diff --git a/FurnitureCatalogue/locale/de.lua b/FurnitureCatalogue/locale/de.lua
deleted file mode 100644
index 00dfad3..0000000
--- a/FurnitureCatalogue/locale/de.lua
+++ /dev/null
@@ -1,211 +0,0 @@
-local filterDisabled = "disables this filter"
-local strings = {
-
-	-- Furniture Shopping List
-	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
-	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
-	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
-
-	-- GUI and debug
-	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
-	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
-	SI_FURC_ADD_FAVE = 							" Add Favorite",
-	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
-	SI_FURC_POST_RECIPE = 						" Post recipe",
-	SI_FURC_POST_MATERIAL = 					" Post material",
-	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
-	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
-	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
-	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
-	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
-	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
-	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
-	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
-	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
-	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
-	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
-	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
-	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
-	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
-	SI_FURC_STRING_AP =							" AP",
-	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
-	SI_FURC_STRING_HC = 						"Hollow City",
-	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
-	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
-
-	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
-	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
-	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
-	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
-	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
-
-	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
-	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
-	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
-	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
-	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
-	SI_FURC_CHESTS =                            "From treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
-
-	-- =============================== --
-	-- ============ MENU ============= --
-	-- =============================== --
-
-	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
-	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
-	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
-	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
-	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
-	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
-	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
-	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
-	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character data",
-	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
-	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
-	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
-	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
-	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
-	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
-	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
-	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
-	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
-
-	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
-	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
-	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
-	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
-	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
-	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
-	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
-	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
-	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
-	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
-	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
-	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
-	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
-	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
-
-	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
-	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
-	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
-	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
-
-	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
-	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
-
-	-- =============================== --
-	-- ==== GUI: Dropdown entries ==== --
-	-- =============================== --
-
-	SI_FURC_NONE 									= "Source filter: off",
-	SI_FURC_FAVE 									= "Favorites",
-	SI_FURC_CRAFTING								= "Craftable: All",
-	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
-	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
-	SI_FURC_VENDOR									= "Purchaseable (gold)",
-	SI_FURC_PVP										= "Purchaseable (AP)",
-	SI_FURC_CROWN									= "Crown Store",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_LUXURY									= "Luxury items",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_OTHER									= "Other",
-
-	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
-	SI_FURC_FILTER_VERSION_HS						= "Homestead",
-	SI_FURC_FILTER_VERSION_M						= "Morrowind",
-	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
-	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
-	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
-
-	-- =============================== --
-	-- = GUI: Dropdown entry tooltip = --
-	-- =============================== --
-
-	SI_FURC_NONE_TT 								= "disables this filter",
-	SI_FURC_FAVE_TT 								= "Shows your favorites",
-	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
-	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
-	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
-	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
-	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
-	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
-	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
-	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
-	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
-
-	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
-	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
-	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
-	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
-	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
-	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
-
-
-	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
-	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
-
-	-- =============================== --
-	-- ========= GUI: Heading ======== --
-	-- =============================== --
-
-	SI_FURC_LABEL_ENTRIES							= " entries -",
-
-
-    -- =============================== --
-	-- ========= Item Sources ======== --
-	-- =============================== --
-	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
-	SI_FURC_CANBESTOLEN 					        = "can be stolen",
-    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
-    SI_FURC_CANBEFISHED				                = "can be fished",
-    SI_FURC_HARVEST				                    = "from harvesting nodes",
-    SI_FURC_PLANTS						            = "from harvesting plants",
-    SI_FURC_SCAMBOX						            = "Crown Crates",
-    SI_FURC_AUTOMATON						        = "from automatons",
-    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
-    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
-    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
-    SI_FURC_DB_POISON					            = "with poison",
-    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
-    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
-    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
-    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
-    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
-	SI_FURC_CHESTS                                  = "from treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
-	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 2)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/locale/en.lua b/FurnitureCatalogue/locale/en.lua
deleted file mode 100644
index d7bc6ec..0000000
--- a/FurnitureCatalogue/locale/en.lua
+++ /dev/null
@@ -1,245 +0,0 @@
-local filterDisabled = "disables this filter"
-local strings = {
-
-	FURC_AV_RAZ									= "Razoufa",
-	FURC_AV_MUL									= "Mulvise Valyn",
-
-	FURC_AV_NAR									= "Narwaawende",
-	FURC_AV_LTS									= "Listens-To-Sea",
-	FURC_AV_HER									= "Heralda Garscroft",
-	FURC_AV_FRO									= "Frohilde Snow-Hair",
-	FURC_AV_LOT									= "Lozotusk",
-	FURC_AV_ROH									= "Rohzika",
-	FURC_AV_ATH									= "Athragor",
-	FURC_AV_MAL									= "Maladdiq",
-	FURC_AV_KRR									= "Krrztrrb",
-	FURC_AV_ENC									= "enchanters",
-	FURC_AV_ALC									= "alchemists",
-	FURC_AV_OUT									= "Outlaw Refuge, Merchant",
-	FURC_AV_COO									= "cooks",
-	FURC_AV_CLO									= "clothiers",
-	FURC_AV_CAR									= "carpenters",
-	FURC_AV_BSM									= "blacksmiths",
-
-
-
-	-- Furniture Shopping List
-	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
-	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
-	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
-
-	-- GUI and debug
-	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
-	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
-	SI_FURC_ADD_FAVE = 							" Add Favorite",
-	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
-	SI_FURC_POST_RECIPE = 						" Post recipe",
-	SI_FURC_POST_ITEM = 						" Post item",
-	SI_FURC_POST_MATERIAL = 					" Post material",
-	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
-	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
-	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
-	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
-	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
-	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
-	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
-	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
-	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
-	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
-	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
-	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
-	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
-	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>>, <<3>>)",
-	SI_FURC_STRING_AP =							" AP",
-	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
-	SI_FURC_STRING_HC = 						"Hollow City",
-	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
-	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
-
-	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
-	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
-	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
-	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
-	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
-
-	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
-	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
-	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
-	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
-
-	-- =============================== --
-	-- ============ MENU ============= --
-	-- =============================== --
-
-	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
-	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
-	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
-	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
-	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
-	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
-	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
-	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
-	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
-	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
-	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
-	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
-	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
-	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
-	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
-	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
-	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
-	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
-
-	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
-	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
-	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
-	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
-	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
-	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
-	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
-	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
-	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
-	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
-	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
-	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
-	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
-
-	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
-	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
-	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
-	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
-
-    -- Filter text search
-    SI_FURC_STRING_MENU_HEADER_F_ALL_ON_TEXT =  "Filter settings for text search",
-    SI_FURC_STRING_MENU_F_ALL_ON_TEXT =         "Configure this filter",
-    SI_FURC_STRING_MENU_HEADER_F_ALL_DESC =     "Configure filter settings for text search with disabled dropdowns. \nThese settings will only take effect when you have not set a source, character or version filter.",
-
-    SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
-    SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT_TT = "When doing a text search without any dropdown ",
-    SI_FURC_STRING_MENU_FALL_HIDE_BOOKS =       "Hide books anyway",
-    SI_FURC_STRING_MENU_FALL_HIDE_BOOKS_TT =    "Even when filtering all items, still hide books?",
-    SI_FURC_STRING_MENU_FALL_HIDE_CROWN =       "Hide crown store items anyway",
-    SI_FURC_STRING_MENU_FALL_HIDE_CROWN_TT =    "Even when filtering all items, still hide crown store items?",
-    SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR =      "Hide rumour items anyway",
-    SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR_TT =   "Even when filtering all items, still hide rumour items?",
-
-    -- Hide menu entries
-	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
-	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
-
-	-- =============================== --
-	-- ==== GUI: Dropdown entries ==== --
-	-- =============================== --
-
-	SI_FURC_NONE 									= "Source filter: off",
-	SI_FURC_FAVE 									= "Favorites",
-	SI_FURC_CRAFTING								= "Craftable: All",
-	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
-	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
-	SI_FURC_VENDOR									= "Purchaseable (gold)",
-	SI_FURC_PVP										= "Purchaseable (AP)",
-	SI_FURC_CROWN									= "Crown Store",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_LUXURY									= "Luxury items",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_OTHER									= "Other",
-
-	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
-	SI_FURC_FILTER_VERSION_HS						= "Homestead",
-	SI_FURC_FILTER_VERSION_M						= "Morrowind",
-	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
-	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
-	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
-
-	-- =============================== --
-	-- = GUI: Dropdown entry tooltip = --
-	-- =============================== --
-
-	SI_FURC_NONE_TT 								= "disables this filter",
-	SI_FURC_FAVE_TT 								= "Shows your favorites",
-	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
-	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
-	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
-	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
-	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
-	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
-	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
-	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
-	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
-
-	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
-	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
-	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
-	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
-	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
-	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
-
-
-	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
-	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
-
-	-- =============================== --
-	-- ========= GUI: Heading ======== --
-	-- =============================== --
-
-	SI_FURC_LABEL_ENTRIES							= " entries -",
-
-    -- =============================== --
-	-- ========= Item Sources ======== --
-	-- =============================== --
-	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
-	SI_FURC_CANBESTOLEN 					        = "can be stolen",
-    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
-    SI_FURC_CANBEFISHED				                = "can be fished",
-    SI_FURC_HARVEST				                    = "from harvesting nodes",
-    SI_FURC_WW				                        = "occasionally found in wood nodes",
-    SI_FURC_PLANTS						            = "from harvesting plants",
-    SI_FURC_SCAMBOX						            = "Crown Crates",
-    SI_FURC_AUTOMATON						        = "from automatons",
-    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
-    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
-    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
-    SI_FURC_DB_POISON					            = "with poison",
-    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
-    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
-    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
-    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
-    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
-	SI_FURC_CHESTS                                  = "from treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
-	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 1)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/locale/fr.lua b/FurnitureCatalogue/locale/fr.lua
deleted file mode 100644
index 31bc2bd..0000000
--- a/FurnitureCatalogue/locale/fr.lua
+++ /dev/null
@@ -1,213 +0,0 @@
-local filterDisabled = "disables this filter"
-local strings = {
-
-	-- Furniture Shopping List
-	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
-	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
-	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
-
-	-- GUI and debug
-	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
-	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
-	SI_FURC_ADD_FAVE = 							" Add Favorite",
-	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
-	SI_FURC_POST_RECIPE = 						" Post recipe",
-	SI_FURC_POST_MATERIAL = 					" Post material",
-	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
-	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
-	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
-	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
-	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
-	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
-	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
-	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
-	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
-	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
-	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
-	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
-	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
-	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
-	SI_FURC_STRING_AP =							" AP",
-	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
-	SI_FURC_STRING_HC = 						"Hollow City",
-	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
-	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
-
-	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
-	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
-
-	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
-	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
-	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
-
-	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
-	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
-	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
-	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
-	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
-	SI_FURC_CHESTS =                            "From treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
-
-	-- =============================== --
-	-- ============ MENU ============= --
-	-- =============================== --
-
-	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
-	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
-	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
-	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
-	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
-	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
-	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
-	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
-	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
-	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
-	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
-	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
-	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
-	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
-	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
-	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
-	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
-	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
-
-	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
-	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
-	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
-	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
-	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
-	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
-	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
-	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
-	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
-	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
-	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
-	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
-	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
-
-	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
-	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
-	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
-	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
-	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
-
-	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
-	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
-
-	-- =============================== --
-	-- ==== GUI: Dropdown entries ==== --
-	-- =============================== --
-
-	SI_FURC_NONE 									= "Source filter: off",
-	SI_FURC_FAVE 									= "Favorites",
-	SI_FURC_CRAFTING								= "Craftable: All",
-	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
-	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
-	SI_FURC_VENDOR									= "Purchaseable (gold)",
-	SI_FURC_PVP										= "Purchaseable (AP)",
-	SI_FURC_CROWN									= "Crown Store",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_LUXURY									= "Luxury items",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_OTHER									= "Other",
-
-	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
-	SI_FURC_FILTER_VERSION_HS						= "Homestead",
-	SI_FURC_FILTER_VERSION_M						= "Morrowind",
-	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
-	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
-	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
-
-	-- =============================== --
-	-- = GUI: Dropdown entry tooltip = --
-	-- =============================== --
-
-	SI_FURC_NONE_TT 								= "disables this filter",
-	SI_FURC_FAVE_TT 								= "Shows your favorites",
-	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
-	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
-	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
-	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
-	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
-	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
-	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
-	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
-	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
-
-	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
-	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
-	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
-	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
-	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
-	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
-
-
-	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
-	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
-
-	-- =============================== --
-	-- ========= GUI: Heading ======== --
-	-- =============================== --
-
-	SI_FURC_LABEL_ENTRIES							= " entries -",
-
-
-
-    -- =============================== --
-	-- ========= Item Sources ======== --
-	-- =============================== --
-	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
-	SI_FURC_CANBESTOLEN 					        = "can be stolen",
-    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
-    SI_FURC_CANBEFISHED				                = "can be fished",
-    SI_FURC_HARVEST				                    = "from harvesting nodes",
-    SI_FURC_PLANTS						            = "from harvesting plants",
-    SI_FURC_SCAMBOX						            = "Crown Crates",
-    SI_FURC_AUTOMATON						        = "from automatons",
-    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
-    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
-    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
-    SI_FURC_DB_POISON					            = "with poison",
-    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
-    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
-    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
-    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
-    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
-	SI_FURC_CHESTS                                  = "from treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
-	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 2)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/locale/jp.lua b/FurnitureCatalogue/locale/jp.lua
deleted file mode 100644
index f69c004..0000000
--- a/FurnitureCatalogue/locale/jp.lua
+++ /dev/null
@@ -1,213 +0,0 @@
-local filterDisabled = "disables this filter"
-local strings = {
-
-	-- Furniture Shopping List
-	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
-	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
-	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
-
-	-- GUI and debug
-	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
-	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
-	SI_FURC_ADD_FAVE = 							" Add Favorite",
-	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
-	SI_FURC_POST_RECIPE = 						" Post recipe",
-	SI_FURC_POST_MATERIAL = 					" Post material",
-	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
-	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
-	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
-	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
-	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
-	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
-	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
-	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
-	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
-	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
-	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
-	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
-	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
-	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
-	SI_FURC_STRING_AP =							" AP",
-	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
-	SI_FURC_STRING_HC = 						"Hollow City",
-	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
-	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
-
-	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
-	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
-
-	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
-	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
-	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
-
-	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
-	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
-	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
-	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
-	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
-	SI_FURC_CHESTS =                            "From treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
-
-	-- =============================== --
-	-- ============ MENU ============= --
-	-- =============================== --
-
-	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
-	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
-	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
-	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
-	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
-	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
-	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
-	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
-	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
-	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
-	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
-	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
-	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
-	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
-	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
-	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
-	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
-	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
-
-	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
-	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
-	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
-	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
-	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
-	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
-	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
-	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
-	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
-	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
-	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
-	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
-	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
-
-	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
-	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
-	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
-	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
-	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
-
-	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
-	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
-
-	-- =============================== --
-	-- ==== GUI: Dropdown entries ==== --
-	-- =============================== --
-
-	SI_FURC_NONE 									= "Source filter: off",
-	SI_FURC_FAVE 									= "Favorites",
-	SI_FURC_CRAFTING								= "Craftable: All",
-	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
-	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
-	SI_FURC_VENDOR									= "Purchaseable (gold)",
-	SI_FURC_PVP										= "Purchaseable (AP)",
-	SI_FURC_CROWN									= "Crown Store",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_LUXURY									= "Luxury items",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_OTHER									= "Other",
-
-	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
-	SI_FURC_FILTER_VERSION_HS						= "Homestead",
-	SI_FURC_FILTER_VERSION_M						= "Morrowind",
-	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
-	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
-	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
-
-	-- =============================== --
-	-- = GUI: Dropdown entry tooltip = --
-	-- =============================== --
-
-	SI_FURC_NONE_TT 								= "disables this filter",
-	SI_FURC_FAVE_TT 								= "Shows your favorites",
-	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
-	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
-	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
-	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
-	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
-	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
-	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
-	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
-	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
-
-	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
-	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
-	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
-	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
-	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
-	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
-
-
-	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
-	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
-
-	-- =============================== --
-	-- ========= GUI: Heading ======== --
-	-- =============================== --
-
-	SI_FURC_LABEL_ENTRIES							= " entries -",
-
-
-
-    -- =============================== --
-	-- ========= Item Sources ======== --
-	-- =============================== --
-	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
-	SI_FURC_CANBESTOLEN 					        = "can be stolen",
-    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
-    SI_FURC_CANBEFISHED				                = "can be fished",
-    SI_FURC_HARVEST				                    = "from harvesting nodes",
-    SI_FURC_PLANTS						            = "from harvesting plants",
-    SI_FURC_SCAMBOX						            = "Crown Crates",
-    SI_FURC_AUTOMATON						        = "from automatons",
-    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
-    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
-    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
-    SI_FURC_DB_POISON					            = "with poison",
-    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
-    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
-    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
-    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
-    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
-	SI_FURC_CHESTS                                  = "from treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
-	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 2)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/locale/ru.lua b/FurnitureCatalogue/locale/ru.lua
deleted file mode 100644
index 75f52e7..0000000
--- a/FurnitureCatalogue/locale/ru.lua
+++ /dev/null
@@ -1,212 +0,0 @@
-local filterDisabled = "disables this filter"
-local strings = {
-
-	-- Furniture Shopping List
-	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
-	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
-	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
-
-	-- GUI and debug
-	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
-	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
-	SI_FURC_ADD_FAVE = 							" Add Favorite",
-	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
-	SI_FURC_POST_RECIPE = 						" Post recipe",
-	SI_FURC_POST_MATERIAL = 					" Post material",
-	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
-	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
-	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
-	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
-	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
-	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
-	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
-	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
-	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
-	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
-	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
-	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
-	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
-	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
-	SI_FURC_STRING_AP =							" AP",
-	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
-	SI_FURC_STRING_HC = 						"Hollow City",
-	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
-	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
-
-	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
-	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
-
-	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
-	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
-	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
-
-	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
-	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
-	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
-	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
-	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
-	SI_FURC_CHESTS =                            "From treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
-
-	-- =============================== --
-	-- ============ MENU ============= --
-	-- =============================== --
-
-	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
-	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
-	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
-	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
-	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
-	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
-	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
-	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
-	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
-	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
-	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
-	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
-	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
-	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
-	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
-	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
-	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
-	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
-	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
-	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
-	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
-
-	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
-	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
-	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
-	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
-	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
-	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
-	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
-	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
-	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
-	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
-	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
-	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
-	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
-	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
-	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
-	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
-	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
-	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
-
-	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
-	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
-	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
-	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
-
-	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
-	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
-	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
-	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
-	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
-	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
-
-	-- =============================== --
-	-- ==== GUI: Dropdown entries ==== --
-	-- =============================== --
-
-	SI_FURC_NONE 									= "Source filter: off",
-	SI_FURC_FAVE 									= "Favorites",
-	SI_FURC_CRAFTING								= "Craftable: All",
-	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
-	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
-	SI_FURC_VENDOR									= "Purchaseable (gold)",
-	SI_FURC_PVP										= "Purchaseable (AP)",
-	SI_FURC_CROWN									= "Crown Store",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_LUXURY									= "Luxury items",
-	SI_FURC_RUMOUR									= "Rumour items",
-	SI_FURC_OTHER									= "Other",
-
-	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
-	SI_FURC_FILTER_VERSION_HS						= "Homestead",
-	SI_FURC_FILTER_VERSION_M						= "Morrowind",
-	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
-	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
-	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
-
-	-- =============================== --
-	-- = GUI: Dropdown entry tooltip = --
-	-- =============================== --
-
-	SI_FURC_NONE_TT 								= "disables this filter",
-	SI_FURC_FAVE_TT 								= "Shows your favorites",
-	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
-	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
-	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
-	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
-	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
-	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
-	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
-	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
-	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
-
-	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
-	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
-	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
-	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
-	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
-	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
-
-
-	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
-	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
-
-	-- =============================== --
-	-- ========= GUI: Heading ======== --
-	-- =============================== --
-
-	SI_FURC_LABEL_ENTRIES							= " entries -",
-
-
-    -- =============================== --
-	-- ========= Item Sources ======== --
-	-- =============================== --
-	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
-	SI_FURC_CANBESTOLEN 					        = "can be stolen",
-    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
-    SI_FURC_CANBEFISHED				                = "can be fished",
-    SI_FURC_HARVEST				                    = "from harvesting nodes",
-    SI_FURC_PLANTS						            = "from harvesting plants",
-    SI_FURC_SCAMBOX						            = "Crown Crates",
-    SI_FURC_AUTOMATON						        = "from automatons",
-    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
-    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
-    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
-    SI_FURC_DB_POISON					            = "with poison",
-    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
-    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
-    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
-    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
-    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
-	SI_FURC_CHESTS                                  = "from treasure chests",
-	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
-	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
-}
-
-
-for stringId, stringValue in pairs(strings) do
-	ZO_CreateStringId(stringId, stringValue)
-	SafeAddVersion(stringId, 2)
-end
\ No newline at end of file
diff --git a/FurnitureCatalogue/startup.lua b/FurnitureCatalogue/startup.lua
deleted file mode 100644
index e4875bc..0000000
--- a/FurnitureCatalogue/startup.lua
+++ /dev/null
@@ -1,301 +0,0 @@
-FurnitureCatalogue 					= {}
-FurnitureCatalogue.name				= "FurnitureCatalogue"
-FurnitureCatalogue.author			= "manavortex"
-FurnitureCatalogue.CharacterName	= nil
-FurnitureCatalogue.settings			= {}
-
-FurC 								= FurnitureCatalogue
-FurC.DevDebug						= false
-FurC.AccountName					= GetDisplayName()
-
-FurC.AchievementVendors				= {}
-FurC.LuxuryFurnisher				= {}
-FurC.Recipes						= {}
-FurC.Rollis							= {}
-FurC.RollisRecipes					= {}
-FurC.Books							= {}
-FurC.EventItems						= {}
-FurC.PVP							= {}
-
-FurC.HomesteadData 					= {}
-FurC.MorrowindData 					= {}
-FurC.ReachHornData 					= {}
-FurC.Cyrodiil						= {}
-FurC.ClockworkData					= {}
-
-
--- versioning
-FURC_HOMESTEAD						= 2
-FURC_MORROWIND						= 3
-FURC_REACH							= 4
-FURC_CLOCKWORK						= 5
-FURC_DRAGONS						= 6
-
-
-FurC.version						= 2.017
-
-local defaults 						= {
-
-	hideMats						= true,
-	dontScanTradingHouse 			= false,
-	enableDebug 					= false,
-
-	filterCraftingType 				= {},
-	filterQuality 					= {},
-
-	resetDropdownChoice				= false,
-	useTinyUi						= false,
-	useInventoryIcons				= true,
-	fontSize						= 18,
-
-	gui								= {
-		lastX						= 100,
-		lastY						= 100,
-		width						= 650,
-		height 						= 550,
-	},
-	dropdownDefaults				= {
-		Source						= 1,
-		Character					= 1,
-		Version						= 1,
-	},
-
-	accountCharacters				= {},
-
-	version 						= 2.0,
-
-	-- tooltips
-	disableTooltips					= false,
-	coloredTooltips 				= true,
-	hideKnowledge					= false,
-
-	hideBooks						= true,
-	hideDoubtfuls					= true,
-	hideCrownstore					= true,
-	hideRumourEntry					= false,
-	hideCrownStoreEntry				= false,
-	wipeDatabase					= false,
-	startupSilently					= true,
-
-	visibility						= {
-		hud							= true,
-		hudui						= true,
-	}
-}
-
-FURC_NONE				= 1
-FURC_FAVE 				= FURC_NONE +1
-FURC_CRAFTING			= FURC_FAVE +1
-FURC_CRAFTING_KNOWN		= FURC_CRAFTING +1
-FURC_CRAFTING_UNKNOWN	= FURC_CRAFTING_KNOWN +1
-FURC_VENDOR 			= FURC_CRAFTING_UNKNOWN +1
-FURC_PVP 				= FURC_VENDOR +1
-FURC_CROWN 				= FURC_PVP +1
-FURC_RUMOUR 			= FURC_CROWN +1
-FURC_LUXURY 			= FURC_RUMOUR +1
-FURC_OTHER 				= FURC_LUXURY +1
-FURC_ROLLIS 			= FURC_OTHER +1
-FURC_DROP 				= FURC_ROLLIS +1
-FURC_WRIT_VENDOR 		= FURC_DROP +1
-FURC_JUSTICE 			= FURC_WRIT_VENDOR +1
-FURC_FISHING 			= FURC_JUSTICE +1
-FURC_GUILDSTORE 		= FURC_FISHING +1
-FURC_FESTIVAL_DROP 		= FURC_GUILDSTORE +1
-FURC_EMPTY_STRING 		= ""
-
-local sourceIndicesKeys = {}
-local function getSourceIndicesKeys()
-	sourceIndicesKeys[FURC_NONE] 						= "off"
-	sourceIndicesKeys[FURC_FAVE] 						= "favorites"
-	sourceIndicesKeys[FURC_CRAFTING] 					= "craft_all"
-	sourceIndicesKeys[FURC_CRAFTING_KNOWN] 				= "craft_known"
-	sourceIndicesKeys[FURC_CRAFTING_UNKNOWN] 			= "craft_unknown"
-	sourceIndicesKeys[FURC_VENDOR] 						= "purch_gold"
-	sourceIndicesKeys[FURC_PVP] 						= "purch_ap"
-	sourceIndicesKeys[FURC_CROWN] 					    = "crownstore"
-    sourceIndicesKeys[FURC_RUMOUR] 					    = "rumour"
-    sourceIndicesKeys[FURC_LUXURY] 					    = "luxury"
-	sourceIndicesKeys[FURC_OTHER] 						= "other"
-	sourceIndicesKeys[FURC_WRIT_VENDOR] 				= "writ_vendor"
-	return sourceIndicesKeys
-end
-FurC.GetSourceIndicesKeys = getSourceIndicesKeys
-
-local choicesSource = {}
-local function getChoicesSource()
-	choicesSource[FURC_NONE]						= GetString(SI_FURC_NONE)
-	choicesSource[FURC_FAVE] 						= GetString(SI_FURC_FAVE)
-	choicesSource[FURC_CRAFTING] 					= GetString(SI_FURC_CRAFTING)
-	choicesSource[FURC_CRAFTING_KNOWN] 				= GetString(SI_FURC_CRAFTING_KNOWN)
-	choicesSource[FURC_CRAFTING_UNKNOWN] 			= GetString(SI_FURC_CRAFTING_UNKNOWN)
-	choicesSource[FURC_VENDOR] 						= GetString(SI_FURC_VENDOR)
-	choicesSource[FURC_PVP] 						= GetString(SI_FURC_PVP)
-	choicesSource[FURC_WRIT_VENDOR] 				= GetString(SI_FURC_STRING_WRIT_VENDOR)
-	choicesSource[FURC_CROWN] 					    = GetString(SI_FURC_CROWN)
-	choicesSource[FURC_RUMOUR] 					    = GetString(SI_FURC_RUMOUR)
-    choicesSource[FURC_LUXURY] 					    = GetString(SI_FURC_LUXURY)
-	choicesSource[FURC_OTHER] 				        = GetString(SI_FURC_OTHER)
-
-	return choicesSource
-end
-FurC.GetChoicesSource = getChoicesSource
-
-local tooltipsSource = {}
-local function getTooltipsSource()
-	tooltipsSource[FURC_NONE]						= GetString(SI_FURC_NONE_TT)
-	tooltipsSource[FURC_FAVE] 						= GetString(SI_FURC_FAVE_TT)
-	tooltipsSource[FURC_CRAFTING] 					= GetString(SI_FURC_CRAFTING_TT)
-	tooltipsSource[FURC_CRAFTING_KNOWN] 			= GetString(SI_FURC_CRAFTING_KNOWN_TT)
-	tooltipsSource[FURC_CRAFTING_UNKNOWN] 			= GetString(SI_FURC_CRAFTING_UNKNOWN_TT)
-	tooltipsSource[FURC_VENDOR] 					= GetString(SI_FURC_VENDOR_TT)
-	tooltipsSource[FURC_PVP] 						= GetString(SI_FURC_PVP_TT)
-    tooltipsSource[FURC_CROWN] 					    = GetString(SI_FURC_CROWN_TT)
-	tooltipsSource[FURC_WRIT_VENDOR] 				= GetString(SI_FURC_STRING_WRIT_VENDOR_TT)
-    tooltipsSource[FURC_RUMOUR] 				    = GetString(SI_FURC_RUMOUR_TT)
-    tooltipsSource[FURC_LUXURY] 				    = GetString(SI_FURC_LUXURY_TT)
-	tooltipsSource[FURC_OTHER] 				        = GetString(SI_FURC_OTHER_TT)
-
-	return tooltipsSource
-end
-
-FurnitureCatalogue.DropdownData = {
-	ChoicesVersion	= {
-		[1] = GetString(SI_FURC_FILTER_VERSION_OFF),
-		[2] = GetString(SI_FURC_FILTER_VERSION_HS	),
-		[3] = GetString(SI_FURC_FILTER_VERSION_M	),
-		[4] = GetString(SI_FURC_FILTER_VERSION_R	),
-		[5] = GetString(SI_FURC_FILTER_VERSION_CC	),
-		[6] = GetString(SI_FURC_FILTER_VERSION_DRAGON),
-	},
-	TooltipsVersion	= {
-		[1] =  GetString(SI_FURC_FILTER_VERSION_OFF_TT),
-		[2] =  GetString(SI_FURC_FILTER_VERSION_HS_TT),
-		[3] =  GetString(SI_FURC_FILTER_VERSION_M_TT),
-		[4] =  GetString(SI_FURC_FILTER_VERSION_R_TT),
-		[5] =  GetString(SI_FURC_FILTER_VERSION_CC_TT),
-		[6] =  GetString(SI_FURC_FILTER_VERSION_DRAGON_TT),
-	},
-	ChoicesCharacter  = {
-		[1]	= GetString(SI_FURC_FILTER_CHAR_OFF),
-	},
-	TooltipsCharacter = {
-		[1]	= GetString(SI_FURC_FILTER_CHAR_OFF_TT),
-	},
-
-	-- will be set in setupSourceDropdown
-	ChoicesSource	= {},
-	TooltipsSource 	= {},
-}
-
-
-local function updateDropdownData()
-	FurnitureCatalogue.DropdownData.ChoicesSource  = getChoicesSource()
-	FurnitureCatalogue.DropdownData.TooltipsSource = getTooltipsSource()
-end
-FurnitureCatalogue.updateDropdownData = updateDropdownData
-
-local function setupSourceDropdown()
-	updateDropdownData()
-	sourceIndices = {}
-
-	for idx, key in ipairs(getSourceIndicesKeys()) do
-		sourceIndices[key] = idx
-	end
-	FurC.SourceIndices = sourceIndices
-end
-
-function FurnitureCatalogue.DebugOut(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
-	if not FurC.GetEnableDebug() then return end
-	if a10 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
-	elseif a9 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8, a9))
-	elseif a8 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8))
-	elseif a7 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7))
-	elseif a6 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5, a6))
-	elseif a5 then
-		d(zo_strformat(output, a1, a2, a3, a4, a5))
-	elseif a4 then
-		d(zo_strformat(output, a1, a2, a3, a4))
-	elseif a3 then
-		d(zo_strformat(output, a1, a2, a3))
-	elseif a2 then
-		d(zo_strformat(output, a1, a2))
-	elseif a1 then
-		d(zo_strformat(output, a1))
-	elseif output then
-		d(zo_strformat(output))
-	else
-		d("\n")
-	end
-end
-
-local function p(...)
-	FurC.DebugOut(...)
-end
-
-function whoami()
-	return FurnitureCatalogue.CharacterName
-end
-
-
-function FurnitureCatalogue_ToggleDev(arg)
-	if arg == 0 or arg == "true" then
-		FurC.DevDebug = true
-	else
-		FurC.DevDebug = false
-	end
-end
-
--- initialization stuff
-function FurnitureCatalogue_Initialize(eventCode, addOnName)
-	if (addOnName ~= "FurnitureCatalogue") then return end
-
-	FurnitureCatalogue.settings 	= ZO_SavedVars:NewAccountWide("FurnitureCatalogue_Settings", 2, nil, defaults)
-
-
-	if FurC.AccountName == "@manavortex" or FurC.AccountName == "@Manorin" then
-		FurnitureCatalogue.devSettings 	= ZO_SavedVars:NewAccountWide("_FurC_DevData", 2, nil, {})
-		SLASH_COMMANDS["/furc_dev"] = FurnitureCatalogue_ToggleDev
-	end
-
-	-- initialise setting, also setup the "source" dropdown for the menu
-	FurC.settings.data 							= FurC.settings.data or {}
-	FurC.settings.filterCraftingType 			= {}
-	FurC.settings.filterQuality 				= {}
-	setupSourceDropdown()
-
-	FurnitureCatalogue.CreateSettings(FurnitureCatalogue.settings, defaults, FurnitureCatalogue)
-
-	FurnitureCatalogue.CharacterName = zo_strformat(GetUnitName('player'))
-
-	FurC.RegisterEvents()
-
-	FurnitureCatalogue.InitGui()
-    FurC.SetHideRumourRecipesEntry(false)
-    FurC.SetHideCrownStoreEntry(false)
-	
	FurnitureCatalogue.CreateTooltips()
-	FurC.InitRightclickMenu()
-
-	FurC.SetupInventoryRecipeIcons()
-
-	local scanFiles = false
-	if FurC.settings.version 		< FurC.version then
-			FurC.settings.version 		= FurC.version
-		scanFiles = true
-	end
-
-	FurnitureCatalogue.ScanRecipes(scanFiles, not FurC.GetSkipInitialScan())
-	FurC.settings.databaseVersion 	= FurC.version
-	SLASH_COMMANDS["/fur"] 			= FurnitureCatalogue_Toggle
-
-	FurC.SetFilter(true)
-	EVENT_MANAGER:UnregisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED)
-
-end
-
-ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_FURNITURE_CATALOGUE", "Toggle Furniture Catalogue")
-EVENT_MANAGER:RegisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED, FurnitureCatalogue_Initialize)
\ No newline at end of file
diff --git a/FurnitureCatalogue/textures/all_down.dds b/FurnitureCatalogue/textures/all_down.dds
deleted file mode 100644
index 71fc217..0000000
Binary files a/FurnitureCatalogue/textures/all_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/all_over.dds b/FurnitureCatalogue/textures/all_over.dds
deleted file mode 100644
index e09c40f..0000000
Binary files a/FurnitureCatalogue/textures/all_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/all_up.dds b/FurnitureCatalogue/textures/all_up.dds
deleted file mode 100644
index e891607..0000000
Binary files a/FurnitureCatalogue/textures/all_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/arcane_down.dds b/FurnitureCatalogue/textures/arcane_down.dds
deleted file mode 100644
index b350bd5..0000000
Binary files a/FurnitureCatalogue/textures/arcane_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/arcane_over.dds b/FurnitureCatalogue/textures/arcane_over.dds
deleted file mode 100644
index fd01896..0000000
Binary files a/FurnitureCatalogue/textures/arcane_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/arcane_up.dds b/FurnitureCatalogue/textures/arcane_up.dds
deleted file mode 100644
index 3a1450d..0000000
Binary files a/FurnitureCatalogue/textures/arcane_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/artifact_down.dds b/FurnitureCatalogue/textures/artifact_down.dds
deleted file mode 100644
index 04bfd85..0000000
Binary files a/FurnitureCatalogue/textures/artifact_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/artifact_over.dds b/FurnitureCatalogue/textures/artifact_over.dds
deleted file mode 100644
index 1af6c06..0000000
Binary files a/FurnitureCatalogue/textures/artifact_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/artifact_up.dds b/FurnitureCatalogue/textures/artifact_up.dds
deleted file mode 100644
index 00fca02..0000000
Binary files a/FurnitureCatalogue/textures/artifact_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/known_down.dds b/FurnitureCatalogue/textures/known_down.dds
deleted file mode 100644
index 3c44534..0000000
Binary files a/FurnitureCatalogue/textures/known_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/known_over.dds b/FurnitureCatalogue/textures/known_over.dds
deleted file mode 100644
index 5768567..0000000
Binary files a/FurnitureCatalogue/textures/known_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/known_up.dds b/FurnitureCatalogue/textures/known_up.dds
deleted file mode 100644
index 60b208f..0000000
Binary files a/FurnitureCatalogue/textures/known_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/legendary_down.dds b/FurnitureCatalogue/textures/legendary_down.dds
deleted file mode 100644
index 1746e3c..0000000
Binary files a/FurnitureCatalogue/textures/legendary_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/legendary_over.dds b/FurnitureCatalogue/textures/legendary_over.dds
deleted file mode 100644
index a6dc84a..0000000
Binary files a/FurnitureCatalogue/textures/legendary_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/legendary_up.dds b/FurnitureCatalogue/textures/legendary_up.dds
deleted file mode 100644
index 0922dfd..0000000
Binary files a/FurnitureCatalogue/textures/legendary_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/magic_down.dds b/FurnitureCatalogue/textures/magic_down.dds
deleted file mode 100644
index ccaac66..0000000
Binary files a/FurnitureCatalogue/textures/magic_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/magic_over.dds b/FurnitureCatalogue/textures/magic_over.dds
deleted file mode 100644
index d9d4c96..0000000
Binary files a/FurnitureCatalogue/textures/magic_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/magic_up.dds b/FurnitureCatalogue/textures/magic_up.dds
deleted file mode 100644
index 2d1a05d..0000000
Binary files a/FurnitureCatalogue/textures/magic_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/over.dds b/FurnitureCatalogue/textures/over.dds
deleted file mode 100644
index dc0d972..0000000
Binary files a/FurnitureCatalogue/textures/over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/unknown_down.dds b/FurnitureCatalogue/textures/unknown_down.dds
deleted file mode 100644
index 98bc7af..0000000
Binary files a/FurnitureCatalogue/textures/unknown_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/unknown_over.dds b/FurnitureCatalogue/textures/unknown_over.dds
deleted file mode 100644
index ffbcb23..0000000
Binary files a/FurnitureCatalogue/textures/unknown_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/unknown_up.dds b/FurnitureCatalogue/textures/unknown_up.dds
deleted file mode 100644
index e6f6a1a..0000000
Binary files a/FurnitureCatalogue/textures/unknown_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/white_down.dds b/FurnitureCatalogue/textures/white_down.dds
deleted file mode 100644
index 13e6a40..0000000
Binary files a/FurnitureCatalogue/textures/white_down.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/white_over.dds b/FurnitureCatalogue/textures/white_over.dds
deleted file mode 100644
index 279a281..0000000
Binary files a/FurnitureCatalogue/textures/white_over.dds and /dev/null differ
diff --git a/FurnitureCatalogue/textures/white_up.dds b/FurnitureCatalogue/textures/white_up.dds
deleted file mode 100644
index fd2af0d..0000000
Binary files a/FurnitureCatalogue/textures/white_up.dds and /dev/null differ
diff --git a/FurnitureCatalogue/xml/Bindings.xml b/FurnitureCatalogue/xml/Bindings.xml
deleted file mode 100644
index 5e8856b..0000000
--- a/FurnitureCatalogue/xml/Bindings.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<Bindings>
-    <Layer name="SI_KEYBINDINGS_CATEGORY_GENERAL">
-        <Category name="Furniture Catalogue">
-            <Action name="TOGGLE_FURNITURE_CATALOGUE">
-                <Down>
-					FurnitureCatalogue_Toggle()
-				</Down>
-            </Action>
-        </Category>
-    </Layer>
-</Bindings>
\ No newline at end of file
diff --git a/FurnitureCatalogue/xml/FurnitureCatalogue.xml b/FurnitureCatalogue/xml/FurnitureCatalogue.xml
deleted file mode 100644
index eb3a9fb..0000000
--- a/FurnitureCatalogue/xml/FurnitureCatalogue.xml
+++ /dev/null
@@ -1,365 +0,0 @@
-<GuiXml>
-	<Controls>
-		<TopLevelControl name="FurCGui" clampedToScreen="true"  movable="true" mouseEnabled="true" hidden="true" resizeHandleSize="10">
-			<DimensionConstraints x="800" y="500" minX="850" minY="200" maxY="2000"/>
-			<Anchor point="TOPRIGHT" relativeTo="GUI_ROOT" relativePoint="TOPRIGHT" offsetX="-25" offsetY="40" />
-			<OnMoveStop>FurC.SaveFrameInfo("onMoveStop")</OnMoveStop>
-
-			<OnResizeStop>FurC.SaveFrameInfo("onResizeStop")</OnResizeStop>
-			<Controls>
-				<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" >
-					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT"/>
-				</Backdrop>
-
-				<Control name="$(parent)_Header" resizeToFitDescendents="true" >
-					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
-					<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT"/>
-
-					<Controls>
-						<Control name="$(parent)_Bar1">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
-							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetY="50"/>
-							<Controls>
-								<Button name="$(parent)_Feedback">
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="20" offsetY="10"/>
-									<OnMouseEnter>FurC.GuiShowTooltip(self, "Click to say thank you:\nLeft: 2k\nRight: 10k\nMiddle: 25k\nYour feedback and/or donation is appreciated!")</OnMouseEnter>
-									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>FurC.Donate(self, button)</OnMouseUp>
-									<Dimensions x="40" y="40" />
-									<Textures
-										normal		="esoui/art/mail/mail_tabicon_compose_up.dds"
-										pressed		="esoui/art/mail/mail_tabicon_compose_down.dds"
-										mouseOver	="esoui/art/mail/mail_tabicon_compose_over.dds"
-									/>
-								</Button>
-								<Control name ="FurC_Label" resizeToFitDescendents="true">
-								<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="10" />
-								<Dimensions y="54"/>
-									<Controls>
-										<Label name="$(parent)_1" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="-Furniture Catalogue: " >
-											<Anchor point="LEFT" relativeTo="$(parent)" relativePoint="LEFT" offsetX="-40"/>
-										</Label>
-										<Label name="FurC_RecipeCount" font="$(STONE_TABLET_FONT)|24|soft-shadow-thick" mouseEnabled="true" resizeToFitDescendents="true">
-											<Anchor point="LEFT" 	relativeTo="$(parent)_1" relativePoint="RIGHT" offsetX="10" offsetY="1"/>
-											<OnMouseEnter>	FurC.GuiShowTooltip(self, "number of recipes below")</OnMouseEnter>
-											<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
-											<OnMouseUp>FurC.RefreshCounter()</OnMouseUp>
-										</Label>
-										<Label name="$(parent)_2" font="$(STONE_TABLET_FONT)|26|soft-shadow-thick" text=" entries -" >
-											<Anchor point="LEFT" relativeTo="FurC_RecipeCount" relativePoint="RIGHT" offsetY="-1"  />
-										</Label>
-									</Controls>
-								</Control>
-								<Button name="$(parent)_Hide">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-15" offsetY="15"/>
-									<OnMouseEnter>FurC.GuiShowTooltip(self, "Hide window")</OnMouseEnter>
-									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>FurnitureCatalogue_Toggle()</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)_Reload">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Hide" relativePoint="TOPLEFT" offsetX="-25" offsetY="-5"/>
-									<OnMouseEnter>FurC.GuiShowTooltip(self, "Click: Scan character knowledge to database\n\nRight-click: Re-scans data files\n\nMiddle-click: Re-create database (will ask you first)")</OnMouseEnter>
-									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>FurC.GUIButtonRefreshOnMouseUp(self, button)</OnMouseUp>
-
-
-									<Dimensions x="35" y="35" />
-									<Textures
-										normal		="/esoui/art/help/help_tabicon_feedback_up.dds"
-										pressed		="/esoui/art/help/help_tabicon_feedback_down.dds "
-										mouseOver	="/esoui/art/help/help_tabicon_feedback_over.dds"
-									/>
-								</Button>
-								<Button name="$(parent)_TemplateTiny">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Reload" relativePoint="TOPLEFT" offsetX="-15" offsetY="-2"/>
-									<OnMouseEnter>FurC.GuiShowTooltip(self, "change template")</OnMouseEnter>
-									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>FurC.ChangeTemplateFromButton(true)</OnMouseUp>
-
-									<Dimensions x="35" y="35" />
-									<Textures
-										normal		="/esoui/art/buttons/minus_up.dds"
-										pressed		="/esoui/art/buttons/minus_down.dds"
-										mouseOver	="/esoui/art/buttons/minus_over.dds"
-									/>
-								</Button>
-
-								<Button name="$(parent)_TemplateLarge" hidden="true">
-									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Reload" relativePoint="TOPLEFT" offsetX="-15" offsetY="-2"/>
-
-									<OnMouseEnter>FurC.GuiShowTooltip(self, "change template")</OnMouseEnter>
-									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
-									<OnMouseUp>FurC.ChangeTemplateFromButton(false)</OnMouseUp>
-
-									<Dimensions x="35" y="35" />
-									<Textures
-										normal		="/esoui/art/buttons/plus_up.dds"
-										pressed		="/esoui/art/buttons/plus_down.dds"
-										mouseOver	="/esoui/art/buttons/plus_over.dds"
-									/>
-								</Button>
-
-							</Controls>
-						</Control>
-						<Control name="$(parent)_Bar2">
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar1" relativePoint="BOTTOMLEFT" offsetX="20"/>
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Bar1" relativePoint="BOTTOMRIGHT" offsetX="-20" />
-							<Dimensions y="35" />
-
-							<Controls>
-								<Control name="FurC_DropdownSource" inherits="ZO_ComboBox" mouseEnabled="true" >
-									<Anchor point="TOPLEFT" 	relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="9" offsetY="10"/>
-									<Dimensions x="230" y="28" />
-									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
-									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: Knowledge and source", true)</OnMouseEnter>
-									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
-								</Control>
-
-								<Control name="FurC_QualityFilter" mouseEnabled="true">
-									<Anchor point="TOPLEFT" 	relativeTo="FurC_DropdownSource" relativePoint="TOPRIGHT" offsetX = "38" offsetY="3"/>
-									<Anchor point="BOTTOMRIGHT" relativeTo="FurC_DropdownSource"  relativePoint="BOTTOMRIGHT" offsetX = "300" />
-								</Control>
-
-								<Control name="FurC_DropdownVersion" inherits="ZO_ComboBox" mouseEnabled="true" >
-									<Anchor point="TOPLEFT" 	relativeTo="FurC_QualityFilter" relativePoint="TOPRIGHT" offsetX="10"/>
-									<Dimensions x="235" y="28" />
-									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
-									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: game version", true)</OnMouseEnter>
-									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
-								</Control>
-							</Controls>
-						</Control>
-						<!-- 3rd bar -->
-						<Control name="$(parent)_Bar3" mouseEnabled="true">
-
-							<Dimensions y="55" />
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar2" relativePoint="BOTTOMLEFT" offsetY="10"/>
-							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Bar2" relativePoint="BOTTOMRIGHT"/>
-							<Dimensions y="45" />
-							<Controls>
-								<!-- control above: FurC_DropdownSource -->
-								<Control name="FurC_DropdownCharacter" inherits="ZO_ComboBox" mouseEnabled="true" >
-									<Anchor point="TOPLEFT" 	relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="9" offsetY="10"/>
-									<Dimensions x="230" y="28" />
-									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
-									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: Character", true)</OnMouseEnter>
-									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
-								</Control>
-
-								<!-- Crafting type filter -->
-								<Control name="FurC_TypeFilter" mouseEnabled="true" resizeToFitDescendents="true">
-									<Anchor point="TOPLEFT" relativeTo="FurC_DropdownCharacter" relativePoint="TOPRIGHT" offsetX="17" offsetY="-5" />
-									<Anchor point="BOTTOMRIGHT" relativeTo="FurC_DropdownCharacter" relativePoint="BOTTOMRIGHT" offsetX="340"/>
-
-								</Control>
-
-								<!-- control above: FurC_DropdownVersion -->
-								<Control name="FurC_Search" mouseEnabled="true">
-
-									<Anchor point="TOPLEFT" 	relativeTo="FurC_TypeFilter" relativePoint="TOPRIGHT" offsetX="9" offsetY="10"/>
-									<Anchor point="BOTTOMLEFT" 	relativeTo="FurC_TypeFilter" relativePoint="BOTTOMRIGHT" offsetX="9" />
-									<Dimensions x="215" />
-									<Controls>
-
-										<EditBox name="$(parent)Box"  inherits="ZO_InventorySearchBox" >
-
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-40" offsetY="-10"/>
-											<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-20" offsetY="0"/>
-
-											<OnTextChanged>FurC.GuiSetSearchboxTextFrom(self)</OnTextChanged>
-											<OnMouseUp>FurC.GuiOnSearchBoxClick(self, button)</OnMouseUp>
-											<OnMouseDoubleClick>FurC.GuiOnSearchBoxClick(self, nil, true)</OnMouseDoubleClick>
-											<OnFocusLost>FurC.GuiOnSearchBoxFocusOut(self)</OnFocusLost>
-
-										</EditBox>
-									</Controls>
-								</Control>
-
-
-
-
-
-							</Controls>
-						</Control>
-
-
-						<!-- #4, sorts the list holder -->
-						<Control name="$(parent)_SortBar" mouseEnabled="true">
-
-							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar3" relativePoint="BOTTOMLEFT" offsetX="25" offsetY="20"/>
-							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)_Bar3" relativePoint="BOTTOMRIGHT" offsetY="40"/>
-							<Dimensions y="20" />
-
-							<Controls>
-								<Label name="$(parent)_Name" mouseEnabled="true" font="ZoFontGameSmall" text="Name" >
-									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" />
-									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMLEFT" offsetX="330"/>
-									<OnMouseUp>FurC.GuiOnSort("itemName")</OnMouseUp>
-									<Controls>
-										<Button name="$(parent)_Button" verticalAlignment="LEFT"  mouseEnabled="true">
-											<Dimensions y="20"  x="20"/>
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-25" />
-											<Textures
-												normal="esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
-												mouseOver="esoui/art/miscellaneous/list_sortheader_icon_over.dds"
-											/>
-											</Button>
-									</Controls>
-								</Label>
-
-								<Label name="$(parent)_Quality" mouseEnabled="true" font="ZoFontGameSmall" text="Quality" >
-									<Anchor point="TOPLEFT" relativeTo="$(parent)_Name" relativePoint="TOPRIGHT" />
-									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT"/>
-									<OnMouseUp>FurC.GuiOnSort("itemQuality")</OnMouseUp>
-									<Controls>
-										<Button name="$(parent)_Button" verticalAlignment="LEFT"  mouseEnabled="true">
-											<Dimensions y="20"  x="20"/>
-											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-25" />
-											<Textures
-												normal="esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
-												mouseOver="esoui/art/miscellaneous/list_sortheader_icon_over.dds"
-											/>
-										</Button>
-									</Controls>
-								</Label>
-
-
-							</Controls>
-
-						</Control>
-
-					</Controls>
-				<!-- $(parent)_Header -->
-				</Control>
-
-				<Label name="$(parent)_Wait" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="Please wait... loading data" >
-					<Anchor point="TOP" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOM" 	offsetY="35" />
-				</Label>
-				<Label name="$(parent)_Empty" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="No results, please check filter" hidden="true" >
-					<Anchor point="TOP" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOM" 	offsetY="35" />
-				</Label>
-
-				<Control name="$(parent)_ListHolder" mouseEnabled="true">
-
-					<DimensionConstraints  minY="52"/>
-					<Anchor point="TOPLEFT" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOMLEFT" 	offsetX="25" />
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" 			relativePoint="BOTTOMRIGHT" offsetX="-35" offsetY="-20"/>
-
-					<OnMouseWheel>FurC.GuiOnScroll(self, delta)</OnMouseWheel>
-
-					<Controls>
-						<Slider name="$(parent)_Slider" mouseEnabled="true" step="1" inherits="ZO_VerticalScrollbarBase">
-							<Anchor point="TOPRIGHT" 	relativeTo="$(parent)" 	relativePoint="TOPRIGHT" 	offsetX="20"	/>
-							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" 	relativePoint="BOTTOMRIGHT" offsetX="20" offsetY="-25"	/>
-
-							<OnMouseDown>self.locked = false</OnMouseDown>
-							<OnMouseUp>self.locked = true</OnMouseUp>
-							<OnValueChanged>FurC.GuiOnSliderUpdate(self, value)</OnValueChanged>
-						</Slider>
-					</Controls>
-
-				</Control>
-			</Controls>
-
-		</TopLevelControl>
-
-		<Button name="FurC_QualityFilterButton" virtual="true">
-			<Dimensions x="35" y="35" />
-			<OnMouseEnter>	FurC.GuiVirtualMouseOver(self)	</OnMouseEnter>
-			<OnMouseExit>	FurC.GuiVirtualMouseOut(self)	</OnMouseExit>
-			<OnMouseUp>		FurC.GuiQualityMouseUp(self, button)	</OnMouseUp>
-		</Button>
-		<Button name="FurC_CraftingTypeFilterButton" virtual="true">
-			<Dimensions x="40" y="40" />
-			<OnMouseEnter>	FurC.GuiVirtualMouseOver(self)	</OnMouseEnter>
-			<OnMouseExit>	FurC.GuiVirtualMouseOut(self)	</OnMouseExit>
-			<OnMouseUp>		FurC.GuiCraftingTypeMouseUp(self)	</OnMouseUp>
-		</Button>
-
-		<Control name="FurC_SlotTemplate" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
-			<Dimensions x="300"/>
-			<OnMouseEnter>			FurC.GuiLineOnMouseEnter(self)				</OnMouseEnter>
-			<OnMouseExit>			FurC.GuiLineOnMouseExit(self)				</OnMouseExit>
-			<OnMouseUp>				FurC.OnControlMouseUp(self, button)			</OnMouseUp>
-			<OnMouseDoubleClick>	FurC.OnControlDoubleClick(self) 			</OnMouseDoubleClick>
-
-			<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" hidden="false">
-					<Dimensions x="40" y="40" />
-					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="-10" offsetY="3" />
-				</Button>
-
-				<Label name="$(parent)Name" font="ZoFontGameShadow" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
-					<Dimensions y="50"  x="280"/>
-					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Button" relativePoint="TOPRIGHT" 		offsetX="18"/>
-					<Anchor point="BOTTOMLEFT" 	relativeTo="$(parent)Button" relativePoint="BOTTOMRIGHT" 	offsetX="0"/>
-				</Label>
-				<Label name="$(parent)Mats" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="LEFT">
-					<Dimensions y="50" />
-					<Anchor point="TOPLEFT" relativeTo="$(parent)Name" relativePoint="TOPRIGHT" offsetX="18"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="0" offsetY="-10"/>
-				</Label>
-
-			</Controls>
-		</Control>
-
-		<Control name="FurC_SlotTemplateTiny" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
-			<Dimensions x="300" />
-			<OnMouseEnter>			FurC.GuiLineOnMouseEnter(self)				</OnMouseEnter>
-			<OnMouseExit>			FurC.GuiLineOnMouseExit(self)				</OnMouseExit>
-			<OnMouseUp>				FurC.OnControlMouseUp(self, button)			</OnMouseUp>
-			<OnMouseDoubleClick>	FurC.OnControlDoubleClick(self) 			</OnMouseDoubleClick>
-
-			<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" hidden="true">
-					<Dimensions x="1"/>
-					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="0" offsetY="3" />
-				</Button>
-				<Label name="$(parent)Name" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
-					<Dimensions y="50"  x="230"/>
-					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Button" relativePoint="TOPRIGHT" />
-					<Anchor point="BOTTOMLEFT" 	relativeTo="$(parent)Button" relativePoint="BOTTOMRIGHT" />
-				</Label>
-				<Label name="$(parent)Mats" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="LEFT">
-					<Dimensions y="50"  />
-					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Name" relativePoint="TOPRIGHT" offsetX="18"/>
-					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="0" offsetY="-10"/>
-				</Label>
-
-			</Controls>
-		</Control>
-
-		<Texture name="FurC_SlotIconKnownNo" color="FF0000" textureFile="esoui/art/buttons/decline_up.dds" virtual="true">
-			<Dimensions x="24" y="24" />
-		</Texture>
-		<Texture name="FurC_SlotIconKnownYes" color="00FF00" textureFile="esoui/art/cadwell/check.dds" virtual="true">
-			<Dimensions x="24" y="24" />
-		</Texture>
-<!--
-		<Texture name="FurC_SlotIconKnownNo" color="FF0000" textureFile="esoui/art/miscellaneous/search_icon.dds" virtual="true">
-			<Dimensions x="30" y="30" />
-		</Texture>
-		<Texture name="FurC_SlotIconKnownNo" color="00FF00" textureFile="esoui/art/cadwell/check.dds" virtual="true">
-			<Dimensions x="30" y="30" />
-		</Texture>
--->
-	</Controls>
-</GuiXml>
diff --git a/FurnitureCatalogue_Export/FurCDataExport.lua b/FurnitureCatalogue_Export/FurCDataExport.lua
new file mode 100644
index 0000000..77d218f
--- /dev/null
+++ b/FurnitureCatalogue_Export/FurCDataExport.lua
@@ -0,0 +1,62 @@
+FurnitureCatalogue_Export 		= {}
+FurCExport 						= FurnitureCatalogue_Export
+
+
+local defaults 					= {
+}
+
+
+local function getSortTable(tbl)
+	list = {}
+	for name,	value in pairs(tbl) do
+		list[#list+1] = name
+	end
+	table.sort(list)
+	return list
+end
+
+function FurCExport.Export()
+
+	local itemNames = {}
+	local itemName
+	for itemId, recipeArray in pairs(FurC.settings.data) do
+		if recipeArray.origin == FURC_CRAFTING then
+			itemNames[GetItemLinkName(FurC.GetItemLink(itemId))] = FurC.GetItemLink(itemId)
+		end
+	end
+
+	local tkeys = getSortTable(itemNames)
+	local exportKnown = {}
+	local exportUnknown = {}
+	for key, itemName in pairs(tkeys) do
+		local itemLink = itemNames[itemName]
+		local recipeArray = FurC.Find(itemLink)
+		local known = FurC.IsAccountKnown(itemLink, recipeArray)
+
+		local exportArray = (known and exportKnown) or exportUnknown
+		local mats = FurC.GetMats(itemLink, recipeArray, false, true)
+		local knowledge = (known and (FurC.GetCrafterList(itemLink, recipeArray) .. ": "):gsub("Can be crafted by ", "")) or ""
+		local exportString = zo_strformat("<<1>><<2>>", knowledge, mats)
+		exportArray[itemName] = exportString
+	end
+
+	FurCExport.settings.known 		= exportKnown
+	FurCExport.settings.unknown 	= exportUnknown
+	ReloadUI()
+
+end
+
+SLASH_COMMANDS["/furcexport"] = function() FurCExport.Export() end
+
+
+-- initialization stuff
+function FurCExport_Initialize(eventCode, addOnName)
+	if (addOnName ~= "FurnitureCatalogue_Export") then return end
+
+	FurCExport.settings 	= ZO_SavedVars:NewAccountWide("FurnitureCatalogue_Export", nil, 0, defaults)
+	FurCExport.makeSettings()
+	EVENT_MANAGER:UnregisterForEvent("FurnitureCatalogue_Export", EVENT_ADD_ON_LOADED)
+end
+
+
+EVENT_MANAGER:RegisterForEvent("FurnitureCatalogue_Export", EVENT_ADD_ON_LOADED, FurCExport_Initialize)
\ No newline at end of file
diff --git a/FurnitureCatalogue_Export/FurCDataExport_Menu.lua b/FurnitureCatalogue_Export/FurCDataExport_Menu.lua
new file mode 100644
index 0000000..f20166d
--- /dev/null
+++ b/FurnitureCatalogue_Export/FurCDataExport_Menu.lua
@@ -0,0 +1,41 @@
+function FurCExport.makeSettings()
+
+	local settings = FurCExport.settings
+
+	local LAM = LibStub:GetLibrary("LibAddonMenu-2.0")
+	local panelData = {
+		type = "panel",
+		name = "FurnitureCatalogue_Export",
+		displayName = "FurnitureCatalogue Export",
+	 	author = "manavortex",
+		version = "1.0.0",
+		registerForRefresh = true,
+		registerForDefaults = true,
+	}
+
+	LAM:RegisterAddonPanel("FurnitureCatalogueExport_OptionsPanel", panelData)
+	local optionsData = { -- optionsData
+
+
+		{ -- description
+			type = "description",
+			name = "FurnitureCatalogue Export",
+			text = (
+				"After an UI reload, FurnitureCatalogue's database can be found in your \n" ..
+				"SavedVariables folder inside  FurnitureCatalogue_Export.lua \n"
+			),
+		},
+		{ -- button: Reset database
+			type = "button",
+			name = "Export data",
+			warning = "This will reload the UI",
+			func = function()
+				FurCExport.Export()
+			end,
+		},
+	}
+
+
+	LAM:RegisterOptionControls("FurnitureCatalogueExport_OptionsPanel", optionsData)
+
+end
\ No newline at end of file
diff --git a/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt b/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
new file mode 100644
index 0000000..68d8b0a
--- /dev/null
+++ b/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
@@ -0,0 +1,9 @@
+## Title: FurnitureCatalogue_Export
+## Author: manavortex
+## Version: 1.0.1
+## APIVersion: 100022
+## SavedVariables: FurnitureCatalogue_Export
+## DependsOn: FurnitureCatalogue
+
+FurCDataExport.lua
+FurCDataExport_Menu.lua
\ No newline at end of file
diff --git a/data/AchievementVendors.lua b/data/AchievementVendors.lua
new file mode 100644
index 0000000..ef51dbd
--- /dev/null
+++ b/data/AchievementVendors.lua
@@ -0,0 +1,177 @@
+FurC.AchievementVendors[FURC_DRAGONS] = {
+	["the Undaunted Enclaves"] = {
+		["Undaunted Quartermaster"] = {
+			[134908] = { -- Blackmarrow Banner
+				itemPrice 	= 15000,
+				achievement = 1975, -- Scalecaller Peak Vanquisher
+			},
+			[134907] = {
+				itemPrice 	= 50000,
+				achievement = 1959, -- Fang Lair Vanquisher
+			},
+		},
+	},
+}
+
+local bookList = {
+	[134553] = { -- The Truth in Sequence, Volume 1
+		itemPrice = 2000,
+	},
+	[134554] = { -- The Truth in Sequence, Volume 2
+		itemPrice = 2000,
+	},
+	[134555] = { -- The Truth in Sequence, Volume 3
+		itemPrice = 2000,
+	},
+	[134556] = { -- The Truth in Sequence, Volume 4
+		itemPrice = 2000,
+	},
+	[134557] = { -- The Truth in Sequence, Volume 5
+		itemPrice = 2000,
+	},
+	[134558] = { -- The Truth in Sequence, Volume 6
+		itemPrice = 2000,
+	},
+	[134559] = { -- The Truth in Sequence, Volume 7
+		itemPrice = 2000,
+	},
+	[134560] = { -- The Truth in Sequence, Volume 8
+		itemPrice = 2000,
+	},
+	[134561] = { -- The Truth in Sequence, Volume 9
+		itemPrice = 2000,
+	},
+	[134562] = { -- The Truth in Sequence, Volume 10
+		itemPrice = 2000,
+	},
+}
+FurC.Books[FURC_CLOCKWORK   ] = bookList
+FurC.AchievementVendors[FURC_CLOCKWORK] = {
+
+
+	["The Brass Citadel, Market"] = {
+		["Razoufa"] = {
+			[134285] = { -- Active Fabrication Tank
+				itemPrice 	= 75000,
+				achievement = 2049, -- Hero of Clockwork City
+			},
+			[134286] = { -- Clockwork Stylus
+				itemPrice = 3000,
+				achievement = 2068, -- CC Adventurer
+			},
+			[134289] = { -- Energetic Anima Core
+				itemPrice = 15000,
+				achievement = 2072, -- Brass Fortress Quarter Master
+			},
+			[134284] = { -- Mysterious Clockwork Sphere
+				itemPrice = 35000,
+				achievement = 2018, -- CC Master explorer
+			},
+			[134288] = { -- Skeleton Key Replica
+				itemPrice = 7500,
+				achievement = 2064, -- The Burden Of Knowledge
+			},
+			[134283] = { -- The motionless Guardian
+				itemPrice = 12000,
+				achievement = 2067, -- Honorary Blackfeather
+			},
+			[134547] = { -- The Truth in Sequence
+				itemPrice = 20000,
+				achievement = 2069, -- Grand Adventurer
+			},
+		},
+		["Mulvise Valyn"] = {
+			[134304] = { -- Boulder, Basalt Slap
+				itemPrice = 1000,
+			},
+			[134292] = { -- Boulder, Metallic Rubble
+				itemPrice = 500,
+			},
+			[134293] = { -- Boulder, Metallic Shard
+				itemPrice = 500,
+			},
+			[134305] = { -- Clockwork Junk Heap, Small
+				itemPrice = 1000,
+			},
+			[134303] = { -- Rock, Basalt Slab
+				itemPrice = 500,
+			},
+			[134296] = { -- Rocks, Sintered Cluster
+				itemPrice = 1000,
+			},
+			[134294] = { -- Rocks, Sintered Column
+				itemPrice = 1000,
+			},
+			[134295] = { -- Rocks, Sintered Pile
+				itemPrice = 1000,
+			},
+			[134297] = { -- Scavenged Grating, Narrow
+				itemPrice = 500,
+			},
+			[134298] = { -- Scavenged Grating, Wide
+				itemPrice = 500,
+			},
+			[134301] = { -- Scavenged Plate, Ornate
+				itemPrice = 500,
+			},
+			[134299] = { -- Scavenged Plate, Plain
+				itemPrice = 500,
+			},
+			[134300] = { -- Scavenged Plate, Wide
+				itemPrice = 500,
+			},
+			[134302] = { -- Scavenged Support, Straight
+				itemPrice = 500,
+			},
+		},
+	},
+
+	["any Alliance Capital"] = {
+		[GetString(FURC_AV_HER)] = {
+			[134291] = { -- New Life Bonfire
+				itemPrice = 10000,
+				achievement = 1671,
+			},
+			[134290] = { -- New Life Celebrant's Standard
+				itemPrice = 2500,
+				achievement = 1674,
+			}
+		},
+	},
+}
+
+
+
+function tableMerge(t1, t2)
+	if nil == t2 and nil == t1 then
+		return {}
+	elseif nil == t2 then
+		return t1
+	elseif nil == t1 then
+		return t2
+	end
+
+    for k,v in pairs(t2) do
+		t1[k] = v
+    end
+    return t1
+end
+
+
+-- global function, needs to live here, YES MANA
+function FurC.InitAchievementVendorList()
+
+	FurC.SetupHomesteadItems()
+	FurC.SetupMorrowindItems()
+	FurC.SetupReachItems()
+
+	-- local generatedTable, listTable
+
+	-- FurC.ReachHornData.AchievementVendors["the Mages' guild"]["the Mystic as part of a collection"] = bookList
+
+	-- listTable = FurC.ReachHornData.AchievementVendors["any Alliance Capital"]["Heralda Garscroft"]
+	-- listTable = tableMerge(listTable, achievementVendor)
+
+
+
+end
diff --git a/data/EventItems.lua b/data/EventItems.lua
new file mode 100644
index 0000000..e4480e5
--- /dev/null
+++ b/data/EventItems.lua
@@ -0,0 +1,67 @@
+FurC.Books = FurC.Books or {}
+FurC.Books[FURC_MORROWIND] = {
+    [126157] = {},
+    [126158] = {},
+    [126159] = {},
+    [126160] = {},
+    [126161] = {},
+    [126162] = {},
+    [126163] = {},
+    [126164] = {},
+}
+
+FurC.EventItems[FURC_DRAGONS] = {
+    ["Jester Festival"] = {
+		["Jester Boxes"] = {
+			[134680] = true, 	-- Jester Box
+		}
+	}
+
+}
+FurC.EventItems[FURC_MORROWIND] = {
+	["Midyear Mayhem"] = {
+		["Boon Box"] = {
+			[126157] = true,	-- Song of Pelinal, #1
+			[126158] = true,	-- Song of Pelinal, #2
+			[126159] = true,	-- Song of Pelinal, #3
+			[126160] = true,	-- Song of Pelinal, #4
+			[126161] = true,	-- Song of Pelinal, #5
+			[126162] = true,	-- Song of Pelinal, #6
+			[126163] = true,	-- Song of Pelinal, #7
+			[126164] = true,	-- Song of Pelinal, #8
+			[118053] = true, 	-- Common Campfire, Outdoor
+		},
+	},
+}
+FurC.EventItems[FURC_REACH] = {
+
+	["Witches' Festival"] = {
+		["Plunder Skull"] = {
+			[130326] = true, 	-- Witches Brazier, Primitive Log",
+			[130337] = true, 	-- Witches Corpse, Wrapped",
+			[130336] = true, 	-- Witches Remains, Hagraven",
+			[130325] = true, 	-- Witches Totem, Emphatic Warning",
+			[130334] = true, 	-- Witches Totem, Antler Charms",
+			[130327] = true, 	-- Witches Totem, Wooden Rack",
+			[130328] = true, 	-- Witches Skull, Horned Ram",
+			[130332] = true, 	-- Witches Totem, Bone Charms",
+			[130340] = true, 	-- Witches Totem, Gnarled Vines and Skull",
+			[130339] = true, 	-- Witches Totem, Twisted Vines and Skull
+			[130338] = true, 	-- Witches Bones, Offering",
+			[131434] = true, 	-- Witch's Festival, Cursed Totem,
+			[132154] = true, 	-- Witch's Totem, Bog",
+			[130302] = GetString(SI_FURC_WW), 	-- Shrub, Burnt Brush"
+			[130298] = GetString(SI_FURC_WW),	-- Branch, Curved Laurel
+			[130296] = GetString(SI_FURC_WW),	-- Branch, Sturdy Laurel
+			[130295] = GetString(SI_FURC_WW),	-- Branch, Sturdy Burnt
+			[130293] = GetString(SI_FURC_WW),	-- Branch, Forked Burnt
+			[130293] = GetString(SI_FURC_WW),	-- Branch, Curved Burnt
+			[130301] = GetString(SI_FURC_WW),	-- Saplings, Burnt Sparse
+			[130299] = GetString(SI_FURC_WW),	-- Saplings, Burnt Cluster
+			[130300] = GetString(SI_FURC_WW),	-- Saplings, Burnt Tall
+			[130297] = GetString(SI_FURC_WW),	-- Branch, Forked Laurel
+
+
+		}
+	}
+}
\ No newline at end of file
diff --git a/data/Homestead/H_AchievementVendors.lua b/data/Homestead/H_AchievementVendors.lua
new file mode 100644
index 0000000..b6e5f43
--- /dev/null
+++ b/data/Homestead/H_AchievementVendors.lua
@@ -0,0 +1,2578 @@
+FurC.AchievementVendors = FurC.AchievementVendors or {}
+FurC.Books	= FurC.Books or {}
+
+function tableMerge(t1, t2)
+	if nil == t2 and nil == t1 then
+		return {}
+	elseif nil == t2 then
+		return t1
+	elseif nil == t1 then
+		return t2
+	end
+
+    for k,v in pairs(t2) do
+		t1[k] = v
+    end
+    return t1
+end
+
+local jesterVendor = {
+	-- tree, Jester's Large
+	[120994]	= {
+		itemPrice 		= 15000,
+		achievement  	= 1723,
+	},
+	-- tree, Jester's Small
+	[118529]	= {
+		itemPrice 		= 5000,
+		achievement  	= 1723,
+	},
+	-- Banner of Mayhem
+	[126720]	= {
+		itemPrice 		= 5000,
+		achievement  	= 1883,
+	},
+	-- Corpse of Mayhem, Argonian
+	[126721]	= {
+		itemPrice 		= 15000,
+		achievement  	= 1888,
+	},
+	-- Corpse of Mayhem, Khajiit
+	[126722]	= {
+		itemPrice 		= 15000,
+		achievement  	= 1888,
+	},
+	-- Corpse of Mayhem, Orc
+	[126723]	= {
+		itemPrice 		= 15000,
+		achievement  	= 1888,
+	},
+	-- Probably-Not-Punch-Bowl of Mayhem
+	[126724]	= {
+		itemPrice 		= 30000,
+		achievement  	= 1892,
+	},
+	-- Stamdard of Mayhem
+	[126719]	= {
+		itemPrice 		= 2500,
+		achievement  	= 1883,
+	},
+	[131433] = { -- Witches Festival, Plunder Skulls
+		itemPrice 	= 10000,
+		-- achievement = 2049,
+	},
+}
+
+local capitalVendor = {
+	[119987] = {		-- Coldharbour Urn
+		itemPrice 	= 5000,
+	},
+	[120037] = {		-- Decorative Skyshard
+		itemPrice 	= 25000,
+		achievement  	= 1009,
+	},
+	[120001] = {		-- Decorative Treasure Chest
+		itemPrice 	= 10000,
+		achievement  	= "",
+	},
+	[119994] = {		-- Depleted Sigil Stone
+		itemPrice 	= 5000,
+		achievement  	= "",
+	},
+	[120066] = {		-- Display Craft Bag
+		itemPrice 	= 5000,
+		achievement  	= "",
+	},
+	[120043] = {		-- Fishing Vessel
+		itemPrice 	= 100000,
+		achievement  	= "",
+	},
+	[120056] = {		-- Hanging Map of Tamriel
+		itemPrice 	= 10000,
+		achievement  	= "",
+	},
+	[119993] = {		-- Lantern of Anguish
+		itemPrice 	= 5000,
+		achievement  	= "",
+	},
+	[120039] = {		-- Primal Altar to Hircine
+		itemPrice 	= 50000,
+		achievement  	= 1009,
+	},
+	[119989] = {		-- Replica Black Soulgem
+		itemPrice 	= 2500,
+		achievement  	= "",
+	},
+	[119988] = {		-- Replica Soul Gem
+		itemPrice 	= 500,
+		achievement  	= "",
+	},
+	[119995] = {		-- Silent Sentinel
+		itemPrice 	= 20000,
+		achievement  	= "",
+	},
+	[119990] = {		-- Soul Gem Case
+		itemPrice 	= 4000,
+		achievement  	= "",
+	},
+	[119992] = {		-- Soul Gem Crate
+		itemPrice 	= 5000,
+		achievement  	= "",
+	},
+	[119996] = {		-- Soul Gem Stand
+		itemPrice 	= 4000,
+		achievement  	= "",
+	},
+	[119991] = {		-- Spare Flesh Atronach Parts
+
+		itemPrice 	= 10000,
+		achievement  	= "",
+	},
+	[119873] = {		-- Tamrith Coffin
+		itemPrice 	= 20000,
+		achievement  	= 1010,
+	},
+	[119872] = {		-- Tamrith Coffin Lid
+		itemPrice 	= 5000,
+		achievement  	= 1010,
+	},
+	[120064] = {		-- DC shield
+		itemPrice 	= 10000,
+		achievement  	= 61,
+	},
+	[120063] = {		-- AD shield
+		itemPrice 	= 10000,
+		achievement  	= 618,
+	},
+	[120065] = {		-- EP shield
+		itemPrice 	= 10000,
+		achievement  	= 617,
+	},
+}
+
+local furnishingVendor = {
+		[120998] = {	-- Block,Wood Cutting
+			itemPrice 	= 100,
+		},
+		[117994] = {	-- Rough Block,Stone Slab
+			itemPrice 	= 100,
+		},
+		[117971] = {	-- Rough Clothesline,Post
+			itemPrice 	= 100,
+		},
+		[117980] = {	-- Rough Firewood,Fireplace
+			itemPrice 	= 100,
+		},
+		[117982] = {	-- Rough Firewood,Stack
+			itemPrice 	= 100,
+		},
+		[117977] = {	-- Rough Stool,Round
+			itemPrice 	= 100,
+		},
+		[117990] = {	-- Tea Table,Carved
+			itemPrice 	= 250,
+		},
+
+}
+
+local morrowindStones = {
+	[120563] = {	-- Stone,Jagged Grey
+		itemPrice 	= 100 ,
+	},
+	[120570] = {	-- Stone,Slanted Grey
+		itemPrice 	= 100 ,
+	},
+	[120571] = {	-- Pebbles,Stacked Grey
+		itemPrice 	= 100,
+	},
+	[120564] = {	-- Pebbles,Stacked Weathered
+		itemPrice 	= 100 ,
+	},
+	[120572] = {	-- Rocks,Jagged Set
+		itemPrice 	= 100,
+	},
+}
+
+local structures = {
+	[117984] = {		-- Rough Block, Dark Stone
+		itemPrice 	= 100,
+	},
+	[117983] = {		-- Rough Block, Light Stone
+		itemPrice 	= 100,
+	},
+	[117995] = {		-- Rough Block, Stone Brick
+		itemPrice 	= 100,
+	},
+	[117993] = {		-- Rough Block, Stone Chunk
+		itemPrice 	= 100,
+	},
+	[117992] = {		-- Rough Block, Stone Section
+		itemPrice 	= 100,
+	},
+	[117994] = {		-- Rough Block, Stone Slab
+		itemPrice 	= 100,
+	},
+
+	[117961] = {		-- Rough Block, Woodcutter's
+		itemPrice 	= 100,
+	},
+
+	[117987] = {		-- Rough Plank, Long
+		itemPrice 	= 100,
+	},
+	[117961] = {		-- Rough Planks, Narrow
+		itemPrice 	= 100,
+	},
+	[117988] = {		-- Rough Planks, Platform
+		itemPrice 	= 100,
+	},
+	[117989] = {		-- Rough Plank, Wide
+		itemPrice 	= 100,
+	},
+	[117973] = {		-- Rough Crate, Dry
+		itemPrice 	= 100,
+	},
+
+}
+
+local boxes = {
+	[120998] = {	-- Block,Wood Cutting
+				itemPrice 	= 100,
+	},
+	[117959] = {		-- Rough Container, Shipping
+		itemPrice 	= 100,
+	},
+
+	[117959] = {		-- Rough Box, Slatted
+		itemPrice 	= 100,
+	},
+	[117931] = {		-- Rough Crate Lid
+		itemPrice 	= 100,
+	},
+	[117957] = {		-- Rough Crate, Cracked
+		itemPrice 	= 100,
+	},
+	[117958] = {		-- Rough Crate, Empty
+		itemPrice 	= 100,
+	},
+	[117930] = {		-- Rough Crate, Open
+		itemPrice 	= 100,
+	},
+	[117953] = {		-- Rough Crate, Sealed
+		itemPrice 	= 100,
+	},
+	[117928] = {		-- Rough Crate, Sturdy
+		itemPrice 	= 100,
+	},
+}
+
+local laundry = {
+		[117968] = {		-- Rough Clothesline, Full
+			itemPrice 	= 100,
+		},
+		[117970] = {		-- Rough Clothesline, Half
+			itemPrice 	= 100,
+		},
+		[117969] = {		-- Rough Clothesline, Long
+			itemPrice 	= 100,
+		},
+		[117972] = {		-- Rough Clothesline, Short
+			itemPrice 	= 100,
+		},
+		[117971] = {		-- Rough Clothesline, Post
+			itemPrice 	= 100,
+		},
+		[117966] = {		-- Rough Tarp, Oversized
+			itemPrice 	= 100,
+		},
+		[117967] = {		-- Rough Tarp, Standard
+			itemPrice 	= 100,
+		},
+}
+
+local fishing_trip = {
+
+		[117965] = {		-- Rough Campfire, Doused
+			itemPrice 	= 100,
+		},
+		[117978] = {		-- Rough Rod, Fishing
+			itemPrice 	= 100,
+		},
+		[117979] = {		-- Rough Spear, Fishing
+			itemPrice 	= 100,
+		},
+		[117977] = {		-- Rough Stool, Fishing
+			itemPrice 	= 100,
+		},
+
+
+}
+
+local bookList = {
+	[120197] = { -- 16 accords of madness, vol vi
+		itemPrice = 500,
+	},
+	[120121] = { -- The Glenmoril Wyrd
+		itemPrice = 500,
+	},
+	[120112] = { -- Legend of the fallen drotto
+		itemPrice = 500,
+	},
+	[120115] = { -- The Posting of the hunt
+		itemPrice = 500,
+	},
+	[120117] = { -- The Viridian Sentinel
+		itemPrice = 500,
+	},
+	[120120] = { -- Ancient Scrolls of the Dwemer IV
+		itemPrice = 500,
+	},
+	[120181] = { -- Antecedent of Dwemer Law
+		itemPrice = 500,
+	},
+	[120116] = { -- Aspects of Lord Hircine
+		itemPrice = 500,
+	},
+	[120114] = { -- Bangkorai, Shield of High Rock
+		itemPrice = 500,
+	},
+	[120104] = { -- Bloodfiends of Rivenspire
+		itemPrice = 500,
+	},
+	[120132] = { -- Circus of Cheerful Slaughter
+		itemPrice = 5000,
+	},
+	[120186] = { -- Dwemer Inquiries, Vol I
+		itemPrice = 500,
+	},
+	[120187] = { -- Dwemer Inquiries, Vol II
+		itemPrice = 500,
+	},
+	[120188] = { -- Dwemer Inquiries, Vol III
+		itemPrice = 500,
+	},
+	[120106] = { -- House-Folk of Silverhoof
+		itemPrice = 500,
+	},
+	[120111] = { -- House Ravenwatch Proclamation
+		itemPrice = 500,
+	},
+	[120108] = { -- House Tamrith - A recent history
+		itemPrice = 500,
+	},
+	[120113] = { -- Living with Lycantrophy
+		itemPrice = 500,
+	},
+	[120194] = { -- Myths of Sheogorath, Vol 1
+		itemPrice = 500,
+	},
+	[120110] = { -- Myths of Sheogorath, Vol 2
+		itemPrice = 500,
+	},
+	[120195] = { -- Myths of Sheogorath, Vol 2
+		itemPrice = 500,
+	},
+	[120236] = { -- Proper Life: Three CHants
+		itemPrice = 500,
+	},
+	[120133] = { -- Robier's Vegetable Garden
+		itemPrice = 5000,
+	},
+	[120109] = { -- Shornhelm, city of the north
+		itemPrice = 500,
+	},
+	[120102] = { -- The Barrows of Westmark Moor
+		itemPrice = 500,
+	},
+	[120232] = { -- The Cantatas of Vivec
+		itemPrice = 500,
+	},
+	[120190] = { -- The Homilies of Blessed Almalexia
+		itemPrice = 500,
+	},
+	[120191] = { -- The Legendary Scourge
+		itemPrice = 500,
+	},
+	[120192] = { -- The LUsty Argonian Maid 1
+		itemPrice = 500,
+	},
+	[120193] = { -- The LUsty Argonian Maid 2
+		itemPrice = 500,
+	},
+	[120199] = { -- Wabbajack
+		itemPrice = 500,
+	},
+	[120235] = { -- Ode to the Tundrastriders
+		itemPrice = 500,
+	},
+	[120237] = { -- Song of the Askelde men
+		itemPrice = 500,
+	},
+	[120230] = { -- Battle of Glenumbra Moors
+		itemPrice = 500,
+	},
+	[120231] = { -- Book of Dawn and Dusk
+		itemPrice = 500,
+	},
+	[120196] = { -- Warrior's Charge
+		itemPrice = 500,
+	},
+	[120082] = {
+		itemPrice = 500,
+	},
+	[120083] = {
+		itemPrice = 500,
+	},
+	[120084] = {
+		itemPrice = 500,
+	},
+	[120085] = {
+		itemPrice = 500,
+	},
+	[120086] = {
+		itemPrice = 500,
+	},
+	[120087] = {
+		itemPrice = 500,
+	},
+	[120088] = {
+		itemPrice = 500,
+	},
+	[120089] = {
+		itemPrice = 500,
+	},
+	[120090] = {
+		itemPrice = 500,
+	},
+	[120091] = {
+		itemPrice = 500,
+	},
+	[120092] = {
+		itemPrice = 500,
+	},
+	[120093] = {
+		itemPrice = 500,
+	},
+	[120094] = {
+		itemPrice = 500,
+	},
+	[120095] = {
+		itemPrice = 500,
+	},
+	[120096] = {
+		itemPrice = 500,
+	},
+	[120097] = {
+		itemPrice = 500,
+	},
+	[120098] = {
+		itemPrice = 500,
+	},
+	[120099] = {
+		itemPrice = 500,
+	},
+	[120100] = {
+		itemPrice = 500,
+	},
+	[120101] = {
+		itemPrice = 500,
+	},
+	[120103] = {
+		itemPrice = 500,
+	},
+	[120105] = {
+		itemPrice = 500,
+	},
+	[120107] = {
+		itemPrice = 500,
+	},
+	[120118] = {
+		itemPrice = 500,
+	},
+	[120119] = {
+		itemPrice = 500,
+	},
+	[120122] = {
+		itemPrice = 500,
+	},
+	[120123] = {
+		itemPrice = 500,
+	},
+	[120124] = {
+		itemPrice = 500,
+	},
+	[120125] = {
+		itemPrice = 500,
+	},
+	[120126] = {
+		itemPrice = 500,
+	},
+	[120127] = {
+		itemPrice = 500,
+	},
+	[120128] = {
+		itemPrice = 500,
+	},
+	[120129] = {
+		itemPrice = 500,
+	},
+	[120130] = {
+		itemPrice = 500,
+	},
+	[120131] = {
+		itemPrice = 500,
+	},
+	[120134] = {
+		itemPrice = 500,
+	},
+	[120135] = {
+		itemPrice = 500,
+	},
+	[120136] = {
+		itemPrice = 500,
+	},
+	[120137] = {
+		itemPrice = 500,
+	},
+	[120138] = {
+		itemPrice = 500,
+	},
+	[120139] = {
+		itemPrice = 500,
+	},
+	[120140] = {
+		itemPrice = 500,
+	},
+	[120141] = {
+		itemPrice = 500,
+	},
+	[120142] = {
+		itemPrice = 500,
+	},
+	[120143] = {
+		itemPrice = 500,
+	},
+	[120144] = {
+		itemPrice = 500,
+	},
+	[120145] = {
+		itemPrice = 500,
+	},
+	[120146] = {
+		itemPrice = 500,
+	},
+	[120147] = {
+		itemPrice = 500,
+	},
+	[120148] = {
+		itemPrice = 500,
+	},
+	[120149] = {
+		itemPrice = 500,
+	},
+	[120150] = {
+		itemPrice = 500,
+	},
+	[120151] = {
+		itemPrice = 500,
+	},
+	[120152] = {
+		itemPrice = 500,
+	},
+	[120153] = {
+		itemPrice = 500,
+	},
+	[120154] = {
+		itemPrice = 500,
+	},
+	[120155] = {
+		itemPrice = 500,
+	},
+	[120156] = {
+		itemPrice = 500,
+	},
+	[120157] = {
+		itemPrice = 500,
+	},
+	[120158] = {
+		itemPrice = 500,
+	},
+	[120159] = {
+		itemPrice = 500,
+	},
+	[120160] = {
+		itemPrice = 500,
+	},
+	[120161] = {
+		itemPrice = 500,
+	},
+	[120162] = {
+		itemPrice = 500,
+	},
+	[120163] = {
+		itemPrice = 500,
+	},
+	[120164] = {
+		itemPrice = 500,
+	},
+	[120165] = {
+		itemPrice = 500,
+	},
+	[120166] = {
+		itemPrice = 500,
+	},
+	[120167] = {
+		itemPrice = 500,
+	},
+	[120168] = {
+		itemPrice = 500,
+	},
+	[120169] = {
+		itemPrice = 500,
+	},
+	[120170] = {
+		itemPrice = 500,
+	},
+	[120171] = {
+		itemPrice = 500,
+	},
+	[120172] = {
+		itemPrice = 500,
+	},
+	[120173] = {
+		itemPrice = 500,
+	},
+	[120174] = {
+		itemPrice = 500,
+	},
+	[120175] = {
+		itemPrice = 500,
+	},
+	[120176] = {
+		itemPrice = 500,
+	},
+	[120177] = {
+		itemPrice = 500,
+	},
+	[120178] = {
+		itemPrice = 500,
+	},
+	[120179] = {
+		itemPrice = 500,
+	},
+	[120180] = {
+		itemPrice = 500,
+	},
+	[120182] = {
+		itemPrice = 500,
+	},
+	[120183] = {
+		itemPrice = 500,
+	},
+	[120184] = {
+		itemPrice = 500,
+	},
+	[120185] = {
+		itemPrice = 500,
+	},
+	[120189] = {
+		itemPrice = 500,
+	},
+	[120197] = {
+		itemPrice = 500,
+	},
+	[120198] = {
+		itemPrice = 500,
+	},
+	[120200] = {
+		itemPrice = 500,
+	},
+	[120201] = {
+		itemPrice = 500,
+	},
+	[120202] = {
+		itemPrice = 500,
+	},
+	[120203] = {
+		itemPrice = 500,
+	},
+	[120204] = {
+		itemPrice = 500,
+	},
+	[120205] = {
+		itemPrice = 500,
+	},
+	[120206] = {
+		itemPrice = 500,
+	},
+	[120207] = {
+		itemPrice = 500,
+	},
+	[120208] = {
+		itemPrice = 500,
+	},
+	[120209] = {
+		itemPrice = 500,
+	},
+	[120210] = {
+		itemPrice = 500,
+	},
+	[120211] = {
+		itemPrice = 500,
+	},
+	[120212] = {
+		itemPrice = 500,
+	},
+	[120213] = {
+		itemPrice = 500,
+	},
+	[120214] = {
+		itemPrice = 500,
+	},
+	[120215] = {
+		itemPrice = 500,
+	},
+	[120216] = {
+		itemPrice = 500,
+	},
+	[120217] = {
+		itemPrice = 500,
+	},
+	[120218] = {
+		itemPrice = 500,
+	},
+	[120219] = {
+		itemPrice = 500,
+	},
+	[120220] = {
+		itemPrice = 500,
+	},
+	[120221] = {
+		itemPrice = 500,
+	},
+	[120222] = {
+		itemPrice = 500,
+	},
+	[120223] = {
+		itemPrice = 500,
+	},
+	[120224] = {
+		itemPrice = 500,
+	},
+	[120225] = {
+		itemPrice = 500,
+	},
+	[120226] = {
+		itemPrice = 500,
+	},
+	[120227] = {
+		itemPrice = 500,
+	},
+	[120228] = {
+		itemPrice = 500,
+	},
+	[120229] = {
+		itemPrice = 500,
+	},
+	[120231] = {
+		itemPrice = 500,
+	},
+	[120233] = {
+		itemPrice = 500,
+	},
+	[120234] = {
+		itemPrice = 500,
+	},
+	[120238] = {
+		itemPrice = 500,
+	},
+	[120239] = {
+		itemPrice = 500,
+	},
+	[120240] = {
+		itemPrice = 500,
+	},
+	[120241] = {
+		itemPrice = 500,
+	},
+	[120242] = {
+		itemPrice = 500,
+	},
+	[120243] = {
+		itemPrice = 500,
+	},
+	[120244] = {
+		itemPrice = 500,
+	},
+	[120245] = {
+		itemPrice = 500,
+	},
+	[120246] = {
+		itemPrice = 500,
+	},
+	[120247] = {
+		itemPrice = 500,
+	},
+	[120248] = {
+		itemPrice = 500,
+	},
+	[120249] = {
+		itemPrice = 500,
+	},
+	[120250] = {
+		itemPrice = 500,
+	},
+	[120251] = {
+		itemPrice = 500,
+	},
+	[120252] = {
+		itemPrice = 500,
+	},
+	[120253] = {
+		itemPrice = 500,
+	},
+	[120254] = {
+		itemPrice = 500,
+	},
+	[120255] = {
+		itemPrice = 500,
+	},
+	[120256] = {
+		itemPrice = 500,
+	},
+	[120257] = {
+		itemPrice = 500,
+	},
+	[120258] = {
+		itemPrice = 500,
+	},
+	[120259] = {
+		itemPrice = 500,
+	},
+	[120260] = {
+		itemPrice = 500,
+	},
+	[120261] = {
+		itemPrice = 500,
+	},
+	[120262] = {
+		itemPrice = 500,
+	},
+	[120263] = {
+		itemPrice = 500,
+	},
+	[120264] = {
+		itemPrice = 500,
+	},
+	[120265] = {
+		itemPrice = 500,
+	},
+	[120266] = {
+		itemPrice = 500,
+	},
+	[120267] = {
+		itemPrice = 500,
+	},
+	[120268] = {
+		itemPrice = 500,
+	},
+	[120269] = {
+		itemPrice = 500,
+	},
+	[120270] = {
+		itemPrice = 500,
+	},
+	[120271] = {
+		itemPrice = 500,
+	},
+	[120272] = {
+		itemPrice = 500,
+	},
+	[120273] = {
+		itemPrice = 500,
+	},
+	[120274] = {
+		itemPrice = 500,
+	},
+	[120275] = {
+		itemPrice = 500,
+	},
+	[120276] = {
+		itemPrice = 500,
+	},
+	[120277] = {
+		itemPrice = 500,
+	},
+	[120278] = {
+		itemPrice = 500,
+	},
+	[120279] = {
+		itemPrice = 500,
+	},
+	[120280] = {
+		itemPrice = 500,
+	},
+	[120281] = {
+		itemPrice = 500,
+	},
+	[120282] = {
+		itemPrice = 500,
+	},
+	[120283] = {
+		itemPrice = 500,
+	},
+	[120284] = {
+		itemPrice = 500,
+	},
+	[120285] = {
+		itemPrice = 500,
+	},
+	[120286] = {
+		itemPrice = 500,
+	},
+	[120287] = {
+		itemPrice = 500,
+	},
+	[120288] = {
+		itemPrice = 500,
+	},
+	[120289] = {
+		itemPrice = 500,
+	},
+	[120290] = {
+		itemPrice = 500,
+	},
+	[120291] = {
+		itemPrice = 500,
+	},
+	[120292] = {
+		itemPrice = 500,
+	},
+	[120293] = {
+		itemPrice = 500,
+	},
+	[120294] = {
+		itemPrice = 500,
+	},
+	[120295] = {
+		itemPrice = 500,
+	},
+	[120296] = {
+		itemPrice = 500,
+	},
+	[120297] = {
+		itemPrice = 500,
+	},
+	[120298] = {
+		itemPrice = 500,
+	},
+	[120299] = {
+		itemPrice = 500,
+	},
+	[120300] = {
+		itemPrice = 500,
+	},
+	[120301] = {
+		itemPrice = 500,
+	},
+	[120302] = {
+		itemPrice = 500,
+	},
+	[120303] = {
+		itemPrice = 500,
+	},
+	[120304] = {
+		itemPrice = 500,
+	},
+	[120305] = {
+		itemPrice = 500,
+	},
+	[120306] = {
+		itemPrice = 500,
+	},
+	[120307] = {
+		itemPrice = 500,
+	},
+	[120308] = {
+		itemPrice = 500,
+	},
+	[120309] = {
+		itemPrice = 500,
+	},
+	[120310] = {
+		itemPrice = 500,
+	},
+	[120311] = {
+		itemPrice = 500,
+	},
+	[120312] = {
+		itemPrice = 500,
+	},
+	[120313] = {
+		itemPrice = 500,
+	},
+	[120314] = {
+		itemPrice = 500,
+	},
+	[120315] = {
+		itemPrice = 500,
+	},
+	[120316] = {
+		itemPrice = 500,
+	},
+	[120317] = {
+		itemPrice = 500,
+	},
+	[120318] = {
+		itemPrice = 500,
+	},
+	[120319] = {
+		itemPrice = 500,
+	},
+	[120320] = {
+		itemPrice = 500,
+	},
+	[120321] = {
+		itemPrice = 500,
+	},
+	[120322] = {
+		itemPrice = 500,
+	},
+	[120323] = {
+		itemPrice = 500,
+	},
+	[120324] = {
+		itemPrice = 500,
+	},
+	[120325] = {
+		itemPrice = 500,
+	},
+	[120326] = {
+		itemPrice = 500,
+	},
+	[120327] = {
+		itemPrice = 500,
+	},
+	[120328] = {
+		itemPrice = 500,
+	},
+	[120329] = {
+		itemPrice = 500,
+	},
+	[120330] = {
+		itemPrice = 500,
+	},
+	[120331] = {
+		itemPrice = 500,
+	},
+	[120332] = {
+		itemPrice = 500,
+	},
+	[120333] = {
+		itemPrice = 500,
+	},
+	[120334] = {
+		itemPrice = 500,
+	},
+	[120335] = {
+		itemPrice = 500,
+	},
+	[120336] = {
+		itemPrice = 500,
+	},
+	[120337] = {
+		itemPrice = 500,
+	},
+	[120338] = {
+		itemPrice = 500,
+	},
+	[120339] = {
+		itemPrice = 500,
+	},
+	[120340] = {
+		itemPrice = 500,
+	},
+	[120341] = {
+		itemPrice = 500,
+	},
+	[120342] = {
+		itemPrice = 500,
+	},
+	[120343] = {
+		itemPrice = 500,
+	},
+	[120344] = {
+		itemPrice = 500,
+	},
+	[120345] = {
+		itemPrice = 500,
+	},
+	[120346] = {
+		itemPrice = 500,
+	},
+	[120347] = {
+		itemPrice = 500,
+	},
+	[120348] = {
+		itemPrice = 500,
+	},
+	[120349] = {
+		itemPrice = 500,
+	},
+	[120350] = {
+		itemPrice = 500,
+	},
+	[120351] = {
+		itemPrice = 500,
+	},
+	[120352] = {
+		itemPrice = 500,
+	},
+	[120353] = {
+		itemPrice = 500,
+	},
+	[120354] = {
+		itemPrice = 500,
+	},
+	[120355] = {
+		itemPrice = 500,
+	},
+	[120356] = {
+		itemPrice = 500,
+	},
+	[120357] = {
+		itemPrice = 500,
+	},
+	[120358] = {
+		itemPrice = 500,
+	},
+	[120359] = {
+		itemPrice = 500,
+	},
+	[120360] = {
+		itemPrice = 500,
+	},
+	[120361] = {
+		itemPrice = 500,
+	},
+	[120362] = {
+		itemPrice = 500,
+	},
+	[120363] = {
+		itemPrice = 500,
+	},
+	[120364] = {
+		itemPrice = 500,
+	},
+	[120365] = {
+		itemPrice = 500,
+	},
+	[120366] = {
+		itemPrice = 500,
+	},
+	[120367] = {
+		itemPrice = 500,
+	},
+	[120368] = {
+		itemPrice = 500,
+	},
+	[120369] = {
+		itemPrice = 500,
+	},
+	[120370] = {
+		itemPrice = 500,
+	},
+	[120371] = {
+		itemPrice = 500,
+	},
+	[120372] = {
+		itemPrice = 500,
+	},
+	[120373] = {
+		itemPrice = 500,
+	},
+	[120374] = {
+		itemPrice = 500,
+	},
+	[120375] = {
+		itemPrice = 500,
+	},
+	[120376] = {
+		itemPrice = 500,
+	},
+	[120406] = {
+		itemPrice = 500,
+	},
+	[120407] = {
+		itemPrice = 500,
+	},
+}
+
+FurC.Books[FURC_HOMESTEAD] = bookList
+--[[
+			[""] = {		--
+				itemPrice 	= 100,
+			},
+]]
+
+local miscVendor = tableMerge(tableMerge(tableMerge(structures, boxes), laundry), fishing_trip)
+
+
+FurC.AchievementVendors[FURC_HOMESTEAD] = {
+
+	["any Alliance Capital"] = {
+		[GetString(FURC_AV_NAR)] = capitalVendor,
+		[GetString(FURC_AV_HER)] = jesterVendor,
+	},
+	-- location name
+	["Mournhold Bank"] = {
+		-- vendor name
+		[GetString(FURC_AV_LTS)]	  = {
+			[119908] = {	-- Swamp Anemone
+				itemPrice 	= 15000,
+			},
+			[119914] = {	-- Touch of Plague
+				itemPrice 	= 500,
+			},
+			[119913] = {	-- Tribunal Altar
+				itemPrice 	= 25000,
+			},
+			[119911] = {	-- Tribunal Rug
+				itemPrice 	= 5000,
+			},
+			[119910] = {	-- Veloth's Reliquary
+				itemPrice 	= 50000,
+			},
+		},
+		[GetString(FURC_AV_FRO)] = {
+			[120567] = {	-- Bush,Vibrant Barberry
+				itemPrice 	= 250,
+			},
+			[120566] = {	-- Fern Plant,Healthy Green
+				itemPrice 	= 100,
+			},
+			[120574] = {	-- Mushroom,Huge Chanterelle
+				itemPrice 	= 250,
+			},
+			[120568] = {	-- Mushroom,Tall Chanterelle
+				itemPrice 	= 250,
+			},
+		},
+
+	},
+	["Dhalmora, Bal Foyen"] = {
+
+		[GetString(FURC_AV_FRO)] = {
+			[120502] = {	-- Flower, Grandmother Hibiscus
+				itemPrice 	= 1000,
+			},
+			[120621] = {	-- Plant, Red Aloe
+				itemPrice 	= 250,
+			},
+			[120620] = {	-- Plant, Red Aloe Succulent
+				itemPrice 	= 250,
+			},
+			[120618] = {	-- Tree, Gnarled Ashflower
+				itemPrice 	= 5000,
+			},
+			[120619] = {	-- Tree, Twisted Ashflower
+				itemPrice 	= 7500,
+			},
+			[120622] = {	-- Vines, Clustered Ivy
+				itemPrice 	= 600,
+			},
+
+		},
+		[GetString(FURC_AV_LTS)]	  = {
+			[120956] = {	-- Atmoran Eagle Totem Medallion
+				itemPrice 	= 3000,
+			},
+			[120954] = {	-- Atmoran Snake Totem Medallion
+				itemPrice 	= 3000,
+			},
+			[120955] = {	-- Atmoran Whale Totem Medallion
+				itemPrice 	= 3000,
+			},
+		},
+
+	},
+	["Stonefalls, Ebonheart"] = {
+
+		[GetString(FURC_AV_FRO)] = {
+			[120502] = {	-- Flower, Grandmother Hibiscus
+				itemPrice 	= 1000,
+			},
+			[121028] = {	-- Hedge, Dense Low Wall
+				itemPrice 	= 1300,
+			},
+
+			[121284] = {	-- Dark Elf Column Lantern
+				itemPrice 	= 250,
+			},
+
+			[120621] = {	-- Plant, Red Aloe
+				itemPrice 	= 250,
+			},[120620] = {	-- Plant, Red Aloe Succulent
+				itemPrice 	= 250,
+			},
+			[120618] = {	-- Tree, Gnarled Ashflower
+				itemPrice 	= 5000,
+			},
+			[120619] = {	-- Tree, Twisted Ashflower
+				itemPrice 	= 7500,
+			},
+			[120622] = {	-- Vines, Clustered Ivy
+				itemPrice 	= 600,
+			},
+			[120680] = {	-- Topiary, Fragile Cypress
+				itemPrice 	= 2500,
+			},
+			[120681] = {	-- Topiary, Pruned Cypress
+				itemPrice 	= 1100,
+			},
+			[120677] = {	-- Tree, Autumn Cherry Blossom
+				itemPrice 	= 15000,
+			},
+		},
+
+		[GetString(FURC_AV_LTS)]	  = {
+			[119890] = {	-- Blood Fountain
+				itemPrice 	= 100000,
+			},
+			[119889] = {	-- Daedric Sconce
+				itemPrice 	= 5000,
+			},
+			[119888] = {	-- Lacquered Kwama Egg
+				itemPrice 	= 1000,
+			},
+			[119892] = {	-- Remnant of Balreth
+				itemPrice 	= 15000,
+			},
+			[119887] = {	-- Serien's Stand
+				itemPrice 	= 10000,
+			},
+		},
+
+	},
+	["Eastmarch, Fort Amol"] = {
+
+		[GetString(FURC_AV_FRO)] = miscVendor,
+
+
+		[GetString(FURC_AV_LTS)]	  = {
+			[119905] = {	-- Dragon Shrine Altar
+				itemPrice 	= 20000,
+			},
+			[119901] = {	-- Lob's Challenge Horn
+				itemPrice 	= 1000,
+			},
+			[119904] = {	-- Standing Slab
+				itemPrice 	= 1000,
+			},
+			[119906] = {	-- Throne of the Skald King
+				itemPrice 	= 50000,
+			},
+			[119907] = {	-- Visage of the Skald
+				itemPrice 	= 25000,
+			},
+		},
+
+	},
+	["Shadowfen, Alten Corimont"] = {
+
+		[GetString(FURC_AV_FRO)] = {
+			[120502] = {	-- Flower, Grandmother Hibiscus
+				itemPrice 	= 1000,
+			},
+			[120630] = {	-- Pebble, Stacked Lichen
+				itemPrice 	= 100,
+			},
+			[120632] = {	-- Pebble, Stacked Mossy
+				itemPrice 	= 100,
+			},
+			[120637] = {	-- Plant, Dry Spike
+				itemPrice 	= 100,
+			},
+			[120627] = {	-- Rocks, Stacked Angular
+				itemPrice 	= 100,
+			},
+			[120628] = {	-- Rocks, Slanted Mossy
+				itemPrice 	= 100,
+			},
+			[120629] = {	-- Rocks, Smooth Mossy
+				itemPrice 	= 100,
+			},
+			[120634] = {	-- Tree, Towering Swamp Palm
+				itemPrice 	= 250,
+			},
+			[120636] = {	-- Tree, Mud Palm
+				itemPrice 	= 250,
+			},
+
+		},
+
+		[GetString(FURC_AV_LTS)]	  = {
+			[119897] = {	-- Argonian Egg
+				itemPrice 	= 2500,
+			},
+			[119893] = {	-- Mimic Hist Tree
+				itemPrice 	= 20000,
+			},
+			[119900] = {	-- Oblivion Stone
+				itemPrice 	= 5000,
+			},
+			[119898] = {	-- Replica Mnemic Egg
+				itemPrice 	= 100000,
+			},
+			[119899] = {	-- Replica Stone Nest
+				itemPrice 	= 10000,
+			},
+		},
+
+	},
+	["Riften, Market, Armorer"] = {
+
+		[GetString(FURC_AV_FRO)] = {
+			[120502] = {	-- Flower, Grandmother Hibiscus
+				itemPrice 	= 1000,
+			},
+			[120492] = {	-- Boulder, Flat , Weathered
+				itemPrice 	= 100,
+			},
+			[120496] = {	-- Fern, dead
+				itemPrice 	= 100,
+			},
+			[120494] = {	-- Pebble, Stacked, Weathered
+				itemPrice 	= 100,
+			},
+			[120493] = {	-- Rock, Slanted, Tan
+				itemPrice 	= 100,
+			},
+			[120495] = {	-- Sapling, Budding Red
+				itemPrice 	= 100,
+			},
+			[120500] = {	-- Sapling, Tender Autumn
+				itemPrice 	= 100,
+			},
+			[120499] = {	-- Sapling, Tender Harvest
+				itemPrice 	= 250,
+			},
+		},
+
+		[GetString(FURC_AV_LTS)]	  = {
+			[119915] = {	-- Ancient Cultist Totem
+				itemPrice 	= 5000,
+			},
+			[119918] = {	-- Statue of the Wolf
+				itemPrice 	= 7500,
+			},
+			[119922] = {	-- Torn Worm Cult Banner
+				itemPrice 	= 10000,
+			},
+			[119920] = {	-- Totem of the Reach
+				itemPrice 	= 40000,
+			},
+			[119916] = {	-- Ysgramor Statue
+				itemPrice 	= 20000,
+			},
+		},
+	},
+
+
+	["Alik'r, Kozanzet, Sweetwater Inn"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119879]	= { 		-- Kneeling Ansei Statue
+				itemPrice 	= 15000,
+			},
+			[119877]	= { 		-- Reconstructed Necromantic Focus
+				itemPrice 	= 5000,
+			},
+			[119880]	= { 		-- Replica Of Shattered Ansei Sword
+				itemPrice 	= 35000,
+			},
+			[119878]	= { 		-- Standing Ansei Statue
+				itemPrice 	= 15000,
+			},
+			[119876]	= { 		-- Tu'whacca's Braizer
+				itemPrice 	= 5000,
+			},
+		},
+		[GetString(FURC_AV_ROH)] = miscVendor,
+	},
+	["Bangkorai, Evermore"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119885] = {		-- ceremonial Redguard vessel
+				itemPrice 	= 3000,
+			},
+			[119882] = {		-- Damaged Knight of St. Pelin statue
+				itemPrice 	= 5000,
+			},
+			[119883] = {		-- Evermore Mourning Banner
+				itemPrice 	= 4000,
+			},
+			[119881] = {		-- Glenmoril Wyrd Stone
+				itemPrice 	= 5000,
+			},
+			[119884] = {		-- Ragged Imperial Banner
+				itemPrice 	= 4000,
+			},
+
+		},
+		[GetString(FURC_AV_ROH)] = {
+			[120449] = {		-- Bush, Desert Scrub
+				itemPrice 	= 100,
+			},
+			[120457] = {		-- Pebble, smooth desert
+				itemPrice 	= 100,
+			},
+			[120461] = {		-- Cactus, Desert Wine
+				itemPrice 	= 500,
+			},
+			[120452] = {		-- Pebble, smooth grey
+				itemPrice 	= 100,
+			},
+			[120460] = {		-- Plant, green water
+				itemPrice 	= 100,
+			},
+			[120450] = {		-- plant, squat Yucca
+				itemPrice 	= 100,
+			},
+			[120462] = {		-- Plant, tall flowering Yucca
+				itemPrice 	= 100,
+			},
+			[120440] = {		-- Rocks, Scattered, Weatherd
+				itemPrice 	= 100,
+			},
+			[120454] = {		-- Rocks, Stacked Desert
+				itemPrice 	= 100,
+			},
+			[120438] = {		-- Rocks, Stacked Weathered
+				itemPrice 	= 100,
+			},
+			[120441] = {		-- Sapling, Short Highland
+				itemPrice 	= 100,
+			},
+			[120443] = {		-- Sapling, Strong Highland
+				itemPrice 	= 100,
+			},
+			[120443] = {		-- Sapling, Tall Highland
+				itemPrice 	= 100,
+			},
+			[120442] = {		-- Sapling, Squat Highland
+				itemPrice 	= 100,
+			},
+			[120459] = {		-- Shrub, Browncrub
+				itemPrice 	= 100,
+			},
+			[120458] = {		-- Shrub, Speckled Forest
+				itemPrice 	= 250,
+			},
+			[120446] = {		-- Small Juniper Tree
+				itemPrice 	= 100,
+			},
+			[120451] = {		-- Stones, Smooth Gray
+				itemPrice 	= 100,
+			},
+			[120455] = {		-- Stone, stacked desert
+				itemPrice 	= 100,
+			},
+			[120439] = {		-- Stone, tapered weathered
+				itemPrice 	= 100,
+			},
+			[120445] = {		-- Sturdy Juniper Tree
+				itemPrice 	= 100,
+			},
+			[120453] = {		-- Tree, hardened Juniper
+				itemPrice 	= 100,
+			},
+			[120448] = {		-- Tree, old Juniper
+				itemPrice 	= 100,
+			},
+
+		},
+	},
+	["Bethnikh, near tavern"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119984] = {		-- Pirate Banner
+				itemPrice 	= 10000,
+			},
+		},
+		[GetString(FURC_AV_ROH)] = miscVendor,
+	},
+	["Glenumbra, Daggerfall, The Rosy Lion"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119855] = {		-- Wyrstone
+				itemPrice 	= 2500,
+			},
+			[119856] = {		-- Torn Lion Guard Banner
+				itemPrice 	= 5000,
+			},
+			[119862] = {		-- Hagraven Totem
+				itemPrice 	= 5000,
+			},
+			[119857] = {		-- Breton Gravewatcher Statue
+				itemPrice 	= 25000,
+			},
+			[119858] = {		-- Bloodthorn Vines, small
+				itemPrice 	= 5000,
+			},
+		},
+		[GetString(FURC_AV_ROH)] = {
+			[121011] = {		-- Trees, young autumn birch
+				itemPrice 	= 100,
+			},
+			[120713] = {		-- Trees, Towering Autumn Birch
+				itemPrice 	= 250,
+			},
+			[120720] = {		-- Shrubs, Small Berry
+				itemPrice 	= 100,
+			},
+			[120718] = {		-- Shrub, Dense Forest
+				itemPrice 	= 100,
+			},
+			[120717] = {		-- Shrub, Autumn Forest
+				itemPrice 	= 100,
+			},
+			[120711] = {		-- Sapling, Young Birch
+				itemPrice 	= 250,
+			},
+			[120716] = {		-- Sapling, Autumn Cluster
+				itemPrice 	= 100,
+			},
+			[120708] = {		-- Rocks, Craggy set
+				itemPrice 	= 100,
+			},
+			[120527] = {		-- Fern Plant, Green Curly
+				itemPrice 	= 100,
+			},
+			[120707] = {		-- Boulder, Mossy Weathered
+				itemPrice 	= 100,
+			},
+			[120705] = {		-- Boulder, Mossy Grey
+				itemPrice 	= 100,
+			},
+			[120706] = {		-- Boulder, Giant Mossy
+				itemPrice 	= 100,
+			},
+
+		},
+	},
+	["Rivenspire, Shornhelm, Dead Wolf Inn"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119871] = {		-- Wagon of DETH
+				itemPrice 	= 25000,
+			},
+			[120951] = {		-- Hope of Rivenspire
+				itemPrice 	= 5000,
+			},
+			[119875] = {		-- Gargoyle Statue
+				itemPrice 	= 50000,
+			},
+			[120040] = {		-- Crimson-Stained Bowl
+				itemPrice 	= 2500,
+			},
+			[119870] = {		-- Constellation: The Tower
+				itemPrice 	= 10000,
+			},
+			[119869] = {		-- Constellation: The Shadow
+				itemPrice 	= 10000,
+			},
+			[119868] = {		-- Constellation: The Ritual
+				itemPrice 	= 10000,
+			},
+		},
+		[GetString(FURC_AV_ROH)] = {
+			[120578] = {		-- Sapling, Young Aspen
+				itemPrice 	= 100,
+			},
+			[120576] = {		-- Sapling ,Fragile Aspen
+				itemPrice 	= 100,
+			},
+			[120579] = {		-- Flower, Stout Hibiscus
+				itemPrice 	= 250,
+			},
+			[120580] = {		-- Flower, Healthy Hibiscus
+				itemPrice 	= 250,
+			},
+		},
+	},
+	["Stormhaven, Wayrest, Merchant district"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119865] = {		-- Wayrest Guillotine
+				itemPrice 	= 75000,
+			},
+			[119867] = {		-- Vaermina Statue
+				itemPrice 	= 75000,
+			},
+			[119864] = {		-- Spirit Warden Azura Statue
+				itemPrice 	= 75000,
+			},
+			[119866] = {		-- Replica Dreamshard
+				itemPrice 	= 2000,
+			},
+			[119863] = {		-- Knights of the Flame Banner
+				itemPrice 	= 10000,
+			},
+		},
+		[GetString(FURC_AV_ROH)] = {
+
+			[120582] = {		-- Tree, Yellowing Oak
+				itemPrice 	= 20000,
+			},
+			[120442] = {		-- Sapling, Squat Highland
+				itemPrice 	= 100,
+			},
+			[120444] = {		-- Sapling, Tall Highland
+				itemPrice 	= 100,
+			},
+			[120443] = {		-- Sapling, strong Highland
+				itemPrice 	= 100,
+			},
+		}
+	},
+
+	["Skywatch, Auridon"]	= {
+		[GetString(FURC_AV_ATH)] = {
+			[119823] = {		-- Tanzelwil Culanda Stone
+				itemPrice 	= 5000,
+			},
+			[119824] = {		-- Veiled Crystal
+				itemPrice 	= 5000,
+			},
+			[119825] = {		-- Mehrunes Dagon Brazier
+				itemPrice 	= 10000,
+			},
+			[119826] = {		-- High Elf Throne
+				itemPrice 	= 25000,
+			},
+			[119827] = {		-- Ancient High Elf Statue
+				itemPrice 	= 35000,
+			},
+		},
+		[GetString(FURC_AV_MAL)] = {
+			[120663] = {		-- Saplings, Healthy Forest
+				itemPrice 	= 100,
+			},
+			[120662] = {		-- Saplings, Squat Forest
+				itemPrice 	= 100,
+			},
+			[120661] = {		-- Saplings, Young Forest
+				itemPrice 	= 100,
+			},
+
+		},
+	},
+	["Greenshade, Marbruk"] = {
+		[GetString(FURC_AV_MAL)] = {
+			[120597] = { 		-- Fern Plant, Vibrant
+				itemPrice 	= 100,
+			},
+			[120599] = { 		-- Fern, Healthy Green
+				itemPrice 	= 100,
+			},
+			[120595] = { 		-- Fern, Lush
+				itemPrice 	= 100,
+			},
+			[120600] = { 		-- Fern, Young, Healthy
+				itemPrice 	= 100,
+			},
+			[120598] = { 		-- Plants, Low weeds
+				itemPrice 	= 100,
+			},
+			[120588] = { 		-- Rock, Slanted Algae
+				itemPrice 	= 100,
+			},
+			[120590] = { 		-- Rocks, Smooth Set
+				itemPrice 	= 100,
+			},
+			[120592] = { 		-- Saplings, Highland Cluster
+				itemPrice 	= 100,
+			},
+			[120593] = { 		-- Saplings, Twin Highland
+				itemPrice 	= 100,
+			},
+			[120589] = { 		-- Stone, Slanted Weathered
+				itemPrice 	= 100,
+			},
+			[120591] = { 		-- Tree, Vibrant Privet
+				itemPrice 	= 250,
+			},
+			[120587] = { 		-- Boulder, Flat Grey
+				itemPrice 	= 250,
+			},
+			[120586] = { 		-- Boulder, Moss Covered
+				itemPrice 	= 250,
+			},
+
+		},
+
+
+		[GetString(FURC_AV_ATH)] = {
+			[119839] = { 		-- Fires of the WIlderking
+				itemPrice 	= 4000,
+			},
+			[119841] = { 		-- Hectahame Arboretum Relic
+				itemPrice 	= 10000,
+			},
+			[120991] = { 		-- Rise of the Silvenaar
+				itemPrice 	= 5000,
+			},
+			[119840] = { 		-- Sea Elf Banner
+				itemPrice 	= 10000,
+			},
+			[119842] = { 		--
+				itemPrice 	= 7500,
+			},
+		},
+
+	},
+	["Khenarthi's Roost, Mistral"] = {
+			[GetString(FURC_AV_MAL)] = miscVendor,
+			[GetString(FURC_AV_ATH)] = {
+				[119986] = {		-- Maomer Totem
+					itemPrice 	= 10000,
+				},
+			},
+	},
+	["Malabal Tor, Vulkwaesten, tavern"] = {
+			[GetString(FURC_AV_MAL)] = {
+				[120529] = {		-- Fern Cluster, Healthy
+					itemPrice 	= 100,
+				},
+				[120531] = {		-- Fern Fronts, Healthy Green
+					itemPrice 	= 100,
+				},
+				[120530] = {		-- Fern Fronds, Sunburst
+					itemPrice 	= 100,
+				},
+				[120527] = {		-- Fern Plant, Green Curly
+					itemPrice 	= 100,
+				},
+				[120528] = {		-- Fern Plant, Sturdy Mature
+					itemPrice 	= 100,
+				},
+				[120640] = {		-- Fern, Budding Forest
+					itemPrice 	= 100,
+				},
+				[120641] = {		-- Fern, Low Red
+					itemPrice 	= 100,
+				},
+				[120642] = {		-- Mushrooms, Brown Gilled
+					itemPrice 	= 100,
+				},
+				[120534] = {		-- Mushroom, Bruising Webcap
+					itemPrice 	= 250,
+				},
+				[120532] = {		-- Mushrooms, Poison Pax Cluster
+					itemPrice 	= 100,
+				},
+				[120533] = {		-- Mushrooms, Poison Pax Group
+					itemPrice 	= 100,
+				},
+				[120638] = {		-- Rock, Slanted Weathered
+					itemPrice 	= 100,
+				},
+				[120523] = {		-- Rocks, Mossy Cluster
+					itemPrice 	= 100,
+				},
+				[120524] = {		-- Rocks, Mossy Set
+					itemPrice 	= 100,
+				},
+				[120639] = {		-- Stones, Smooth Mossy
+					itemPrice 	= 100,
+				},
+				[120525] = {		-- Tree, Mossy Swamp
+					itemPrice 	= 100,
+				},
+				[120643] = {		-- Vines, Curtain Ivy
+					itemPrice 	= 750,
+				},
+				[120645] = {		-- Vines, Draped Ivy
+					itemPrice 	= 750,
+				},
+				[120644] = {		-- Vines, Lush Ivy
+					itemPrice 	= 600,
+				},
+			},
+			[GetString(FURC_AV_ATH)] = {
+				[119847] = {		-- Handfast
+					itemPrice 	= 25000,
+				},
+				[119846] = {		-- Handfast Pedestal
+					itemPrice 	= 5000,
+				},
+				[119845] = {		-- Wood Elf Union Trellis
+					itemPrice 	= 15000,
+				},
+				[119843] = {		-- Wood Orc Dream Catcher
+					itemPrice 	= 4000,
+				},
+				[119844] = {		-- Wood Orc Malacath Banner
+					itemPrice 	= 10000,
+				},
+			},
+	},
+	["Grahtwood, Redfur Trading Post"] = {
+			[GetString(FURC_AV_MAL)] = {
+				[120725] = {		-- Boulder, Mossy Crag
+					itemPrice 	= 100,
+				},
+				[121285] = {		-- Tree, Ancient Banyan
+					itemPrice 	= 25000,
+				},
+				[121286] = {		-- Tree, Giant Cypress
+					itemPrice 	= 5000,
+				},
+				[121287] = {		-- Tree, Towering Cypress
+					itemPrice 	= 5000,
+				},
+				[120742] = {		-- Tree, Twisted Banyan
+					itemPrice 	= 25000,
+				},
+				[119578] = {		-- Tree, Towering Palm Cluster
+					itemPrice 	= 100,
+				},
+				[120741] = {		-- Tree, Towering Wax Palm
+					itemPrice 	= 250,
+				},
+				[121288] = {		-- Tree, Mossy Murkmire Cluster
+					itemPrice 	= 250,
+				},
+				[117975] = {		-- Rough Hay Bed, Sloppy
+					itemPrice 	= 100,
+				},
+			},
+			[GetString(FURC_AV_ATH)] = {
+				[119834] = {		-- Aulus's Captive Audience
+					itemPrice 	= 10000,
+				},
+				[119836] = {		-- Guardian Mane
+					itemPrice 	= 10000,
+				},
+				[119837] = {		-- Orrery Control Pillar Replica
+					itemPrice 	= 10000,
+				},
+				[119835] = {		-- Ukaezai's Ward
+					itemPrice 	= 10000,
+				},
+				[119838] = {		-- Valenwood Brazier
+					itemPrice 	= 4000,
+				},
+			},
+	},
+
+	["Reaper's March, Rawl'Kha, Market"] = {
+			[GetString(FURC_AV_MAL)] = {
+
+				[120558] = {		-- Sapling, Eucalyptus Shrub
+					itemPrice 	= 100,
+				},
+				[120511] = {		-- Bush, Mountain Scrub
+					itemPrice 	= 100,
+				},
+				[120690] = {		-- Fern Plant, Hardy
+					itemPrice 	= 100,
+				},
+				[120510] = {		-- Fern Plant, Sturdy Towering
+					itemPrice 	= 100,
+				},
+				[120512] = {		-- Fern, Fragile
+					itemPrice 	= 100,
+				},
+				[120521] = {		-- Fern, Withering
+					itemPrice 	= 100,
+				},
+				[120691] = {		-- Fern, Young Sunburnt
+					itemPrice 	= 100,
+				},
+				[120561] = {		-- Plant, Jungle Leaf
+					itemPrice 	= 100,
+				},
+				[120697] = {		-- Plant, Leafy Sprouts
+					itemPrice 	= 100,
+				},
+				[120560] = {		-- Plant, Squat Jungle Leaf
+					itemPrice 	= 100,
+				},
+				[120562] = {		-- Plant, Towering Jungle Leaf
+					itemPrice 	= 100,
+				},
+				[120699] = {		-- Platform, Weathered Dock
+					itemPrice 	= 250,
+				},
+				[120700] = {		-- Post, Barnacle Covered
+					itemPrice 	= 100,
+				},
+				[120515] = {		-- Shrub, Lanky Highland
+					itemPrice 	= 100,
+				},
+				[120522] = {		-- Shrub, Tender Privet
+					itemPrice 	= 100,
+				},
+				[121282] = {		-- Tree, Ancient Jungle
+					itemPrice 	= 5000,
+				},
+				[121283] = {		-- Tree, Healthy Jungle
+					itemPrice 	= 250,
+				},
+				[120519] = {		-- Tree, Healthy Privet
+					itemPrice 	= 250,
+				},
+				[120687] = {		-- Tree, Sturdy Shade
+					itemPrice 	= 250,
+				},
+
+
+			},
+			[GetString(FURC_AV_ATH)] = {
+				[120703] = {		-- Khajiiti Column, Spiked
+					itemPrice 	= 4000,
+				},
+				[119848] = {		-- Colovian Projection Crystal
+					itemPrice 	= 5000,
+				},
+				[119853] = {		-- Full Moons Tile
+					itemPrice 	= 5000,
+				},
+				[119850] = {		-- Khajiiti Shrine Guardian Statue
+					itemPrice 	= 20000,
+				},
+				[119849] = {		-- Moonmont Lunar Altar
+					itemPrice 	= 15000,
+				},
+				[119854] = {		-- New Moon Tile
+					itemPrice 	= 5000,
+				},
+				[119852] = {		-- Waning Moons Tile
+					itemPrice 	= 5000,
+				},
+				[119851] = {		-- Waxing Moons Wall Tile
+					itemPrice 	= 5000,
+				},
+			},
+	},
+	["Craglorn, Belkarth Woodworking store"] = {
+		[GetString(FURC_AV_LOT)] = {
+			[119933] = {		-- Craglorn Brazier
+				itemPrice 	= 5000,
+			},
+			[119934] = {		-- Craglorn Sconce
+				itemPrice 	= 5000,
+			},
+			[119931] = {		-- Craglorn Tapestrie
+				itemPrice 	= 35000,
+			},
+			[119925] = {		-- Nirncrux Bowl
+				itemPrice 	= 4000,
+			},
+			[119935] = {		-- Observatory Banner
+				itemPrice 	= 25000,
+			},
+			[119923] = {		-- Serpent Stone
+				itemPrice 	= 5000,
+			},
+			[119929] = {		-- Snake Prayer Tile
+				itemPrice 	= 5000,
+			},
+			[119930] = {		-- Totem of the Serpent
+				itemPrice 	= 10000,
+			},
+
+		},
+		[GetString(FURC_AV_KRR)] = {
+			[120964] = {		-- Boulder, Craggy Heap
+				itemPrice 	= 100,
+			},
+			[120545] = {		-- Tree, Sturdy Summer
+				itemPrice 	= 250,
+			},
+			[120963] = {		-- Boulder, Jagged Crag
+				itemPrice 	= 100,
+			},
+			[120552] = {		-- Bush, Flowering Scrub
+				itemPrice 	= 250,
+			},
+			[120555] = {		-- Flowers, Healthy Goldenrod
+				itemPrice 	= 250,
+			},
+			[120551] = {		-- Plant, Healthy Sage
+				itemPrice 	= 100,
+			},
+			[120977] = {		-- Plant, Strong Sage
+				itemPrice 	= 100,
+			},
+			[120966] = {		-- Rock, Craggy Rubble
+				itemPrice 	= 100,
+			},
+			[120539] = {		-- Rock, Jagged Craggy
+				itemPrice 	= 100,
+			},
+			[120969] = {		-- Sapling, Crabapple
+				itemPrice 	= 100,
+			},
+			[120972] = {		-- Sapling, Desert
+				itemPrice 	= 100,
+			},
+			[120548] = {		-- Sapling, Leaning Ash
+				itemPrice 	= 100,
+			},
+			[120973] = {		-- Sapling, Mountain
+				itemPrice 	= 100,
+			},
+			[120983] = {		-- Sapling, Mountain
+				itemPrice 	= 100,
+			},
+			[120971] = {		-- Sapling, Tall Scrub
+				itemPrice 	= 100,
+			},
+			[120982] = {		-- Sapling, Twisted
+				itemPrice 	= 100,
+			},
+			[120553] = {		-- Sapling, Young Scrub
+				itemPrice 	= 100,
+			},
+			[120976] = {		-- Sapling, Juniper Cluster
+				itemPrice 	= 100,
+			},
+			[120981] = {		-- Sapling, Desert Scrub
+				itemPrice 	= 100,
+			},
+			[120967] = {		-- Stone, Angled Grey
+				itemPrice 	= 100,
+			},
+			[120975] = {		-- Tree, Angled Ash
+				itemPrice 	= 100,
+			},
+			[120543] = {		-- Tree, Blooming Crabapple
+				itemPrice 	= 6000,
+			},
+			[120549] = {		-- Tree, Large Twisted Ash
+				itemPrice 	= 250,
+			},
+			[120547] = {		-- Tree, Leaning Ash
+				itemPrice 	= 250,
+			},
+			[120970] = {		-- Tree, Sturdy Crabapple
+				itemPrice 	= 13000,
+			},
+			[120974] = {		-- Tree, Sturdy Summer
+				itemPrice 	= 250,
+			},
+			[120550] = {		-- Tree, Twisted
+				itemPrice 	= 100,
+			},
+
+		},
+	},
+
+	["Coldharbour, Hollow City, Cicero's General Good"] = {
+
+		[GetString(FURC_AV_LOT)] = {
+			[119828] = {		-- Ayleid Throne
+				itemPrice 	= 50000,
+			},
+			[119830] = {		-- Coldharbour Chandelier
+				itemPrice 	= 25000,
+			},
+			[119831] = {		-- Cowering Statue
+				itemPrice 	= 10000,
+			},
+			[119832] = {		-- Light of Meridia
+				itemPrice 	= 10000,
+			},
+			[119833] = {		-- Molag Bal Banner
+				itemPrice 	= 20000,
+			},
+			[119829] = {		-- Shackle Control Stone
+				itemPrice 	= 25000,
+			},
+		},
+		[GetString(FURC_AV_KRR)] = boxes,
+	},
+
+	["Gold Coast, Kvatch"] = {
+		[GetString(FURC_AV_ATH)] = {
+			[119947] = {		-- Banner of the Kvatch Guard
+				itemPrice 	= 15000,
+			},
+			[119697] = {	-- Blade of Woe, Replica
+				itemPrice 	= 25000,
+			},
+			[119941] = {		-- Brotherhood Poison Vial
+				itemPrice 	= 2500,
+			},
+			[119945] = {		-- Dark Brotherhood Banner
+				itemPrice 	= 10000,
+			},
+			[119953] = {		-- Dark Ledger
+				itemPrice 	= 50000,
+			},
+			[119937] = {		-- Gold Coast Estate Keg
+				itemPrice 	= 500000,
+			},
+			[120950] = {		-- Hanging Hourglass
+				itemPrice 	= 15000,
+			},
+			[119939] = {		-- Hourglass Rug
+				itemPrice 	= 10000,
+			},
+			[119951] = {		-- Litany of Blood
+				itemPrice 	= 25000,
+			},
+			[119944] = {		-- Order of the Hour banner
+				itemPrice 	= 5000,
+			},
+			[119950] = {		-- Preserved Sweetrolls
+				itemPrice 	= 500,
+			},
+			[119940] = {		-- Sanctuary Sconce
+				itemPrice 	= 10000,
+			},
+			[119948] = {		-- Statue of the Mother
+				itemPrice 	= 100000,
+			},
+		},
+		[GetString(FURC_AV_FRO)] = structures,
+	},
+
+	["Hew's Bane"] = {
+		[GetString(FURC_AV_LTS)] = {
+			[119965] = {		-- Abah's Landing Banner
+				itemPrice 	= 10000,
+			},
+			[119961] = {		-- An Adoring Fan
+				itemPrice 	= 2500,
+			},
+			[119969] = {		-- Banner of TAneth
+				itemPrice 	= 10000,
+			},
+			[119968] = {		-- Distracting Harpy Egg
+				itemPrice 	= 1500,
+			},
+			[120989] = {		-- Hanging Wedding Lantern
+				itemPrice 	= 3000,
+			},
+			[119974] = {		-- Hiding Place
+				itemPrice 	= 1000,
+			},
+			[119974] = {		-- Iron Wheel Banner
+				itemPrice 	= 15000,
+			},
+			[119960] = {		-- Jar of Green Dye
+				itemPrice 	= 500,
+			},
+			[120990] = {		-- Large Covered Well
+				itemPrice 	= 15000,
+			},
+			[120952] = {		-- Opulent Dowry Chest
+				itemPrice 	= 50000,
+			},
+			[119955] = {		-- Pale Garden Flowers
+				itemPrice 	= 500,
+			},
+			[119954] = {		-- Reliquary Skull
+				itemPrice 	= 25000,
+			},
+			[119954] = {		-- Statue of Shadows
+				itemPrice 	= 25000,
+			},
+			[119967] = {		-- Vibrant Garden Flowers
+				itemPrice 	= 500,
+			},
+			[119963] = {		-- Yokudan Puzzle Column
+				itemPrice 	= 5000,
+			},
+		},
+		["Rohiza"] = structures,
+	},
+
+	["Orsinium"] = {
+
+		[GetString(FURC_AV_LOT)] = {
+			[119979] = {		-- Fur Throne
+				itemPrice 	= 25000,
+			},
+			[119976] = {		-- Orc Adventuring Backpack
+				itemPrice 	= 500,
+			},
+			[119978] = {		-- Orcish Battle Totem
+				itemPrice 	= 7500,
+			},
+			[119980] = {		-- Orcish Totem
+				itemPrice 	= 10000,
+			},
+			[119977] = {		-- Orcish War Totem
+				itemPrice 	= 5000,
+			},
+			[119975] = {		-- Orsinium Cart
+				itemPrice 	= 10000,
+			},
+			[119981] = {		-- Throne of the Orc King
+				itemPrice 	= 50000,
+			},
+		},
+
+		[GetString(FURC_AV_MAL)] = {
+			[117955] = {		-- Box, Slatted
+				itemPrice 	= 100,
+			},
+			[117964] = {		-- Rough Fire, doused
+				itemPrice 	= 100,
+			},
+			[117985] = {		-- Rough Bread, Morsel
+				itemPrice 	= 100,
+			},
+			[117981] = {		-- Rough Firewood, Smoldering
+				itemPrice 	= 100,
+			},
+			[117976] = {		-- Rough Hay Bed, Sloppy
+				itemPrice 	= 100,
+			},
+			[117976] = {		-- Rough Hay Bed, Covered
+				itemPrice 	= 100,
+			},
+			[117974] = {		-- Rough Hay Bed, Tidy
+				itemPrice 	= 100,
+			},
+			[117986] = {		-- Rough Plank, Long
+				itemPrice 	= 100,
+			},
+
+		},
+
+	},
+
+	["any city"] = {
+		[FURC_AV_ENC] = {
+			[120050] = { -- Enchanter's Sign
+				itemPrice 	= 5000,
+			},
+			[120051] = { -- Enchanting Gem
+				itemPrice 	= 5000,
+				achievement = 1317,
+			},
+		},
+		[GetString(FURC_AV_ALC)] = {
+			[120044] = { -- Alchemy sign
+				itemPrice 	= 10000,
+				achievement = 1031,
+			},
+			[120058] = { -- Harvester's Herbs
+				itemPrice 	= 1000,
+			},
+			[120045] = { -- Poison Satchel
+				itemPrice 	= 5000,
+				achievement = 1464
+			},
+		},
+		[GetString(FURC_AV_COO)] = {
+			[120053] = { -- Chef's Cleaver
+				itemPrice 	= 2500,
+				achievement = 1028,
+			},
+			[120052] = { -- Provisioner's Sign
+				itemPrice 	= 5000,
+				achievement = 1035,
+			},
+		},
+		[GetString(FURC_AV_CLO)] = {
+			[120048] = { -- clothier's sign
+				itemPrice 	= 5000,
+				achievement = 1033,
+			},
+			[120060] = { -- Harvester's Critter Trap
+				itemPrice 	= 5000,
+				achievement = 68,
+			},
+			[120061] = { -- Harvester's Garden Shrub
+				itemPrice 	= 10000,
+				achievement = 68,
+			},
+		},
+		[GetString(FURC_AV_CAR)] = {
+			[120057] = { -- Harvester's Woodpile
+				itemPrice 	= 1000,
+				achievement = 68,
+			},
+			[120054] = { -- Woodworker's Sign
+				itemPrice 	= 5000,
+				achievement = 1036,
+			},
+		},
+		[GetString(FURC_AV_BSM)] = {
+
+			[120046] = { -- Blacksmith's Sign
+				itemPrice 	= 5000,
+				achievement = 1032,
+			},
+			[120059] = { -- Harvester's Ore
+				itemPrice 	= 1000,
+				achievement = 68,
+			},
+			[120062] = { -- Smith's Bellow
+				itemPrice 	= 10000,
+				achievement = 1022,
+			},
+		},
+		[GetString(FURC_AV_OUT)] = {
+			[120028] = { -- Death Marker
+				itemPrice 	= 5000,
+			},
+			[120033] = { -- Decorative Safebox
+				itemPrice 	= 5000,
+				achievement = 1200, -- Safebox Cracker
+			},
+			[120032] = { -- Decorative Thieves Trove
+				itemPrice 	= 5000,
+				achievement = "", -- No Stash Left Behind
+			},
+			[120957] = { -- Faded fence banner
+				itemPrice 	= 10000,
+				achievement = "Ledgerdmain Rank 20",
+			},
+			[120027] = { -- Mass Tombstone
+				itemPrice 	= 10000,
+			},
+			[120026] = { -- Mountain of Loot
+				itemPrice 	= 10000,
+				achievement = "", -- Black Market Mogul
+			},
+			[120029] = { -- Noble Pocket Lint
+				itemPrice 	= 1000,
+				achievement = 1192,-- Sneak Thief Extraordinaire
+			},
+			[120023] = { -- Outlaw Banner
+				itemPrice 	= 5000,
+				achievement = "Ledgerdmain Rank 20",
+			},
+			[120025] = { -- Pile of Coins
+				itemPrice 	= 2500,
+				achievement = 1196, -- Felonious Recompense
+			},
+			[120030] = { -- Pocket Change
+				itemPrice 	= 500,
+			},
+			[120031] = { -- Replica Key, Blank
+				itemPrice 	= 1000,
+				achievement = 1208, -- Master Burglar
+			},
+			[120993] = { -- Scales of Felonious Recompense
+				itemPrice 	= 5000,
+				achievement = 1196, -- Felonious Recompense
+			},
+		},
+
+	},
+
+	["the Mages' guild"] = {
+		["the Mystic as part of a collection"] = {},
+		["the Mystic"] = {
+			[120003] = { -- cheese cutter
+				itemPrice 	= 5000,
+			},
+			[120011] = { -- Mages' Guild Banner
+				itemPrice 	= 10000,
+			},
+		}
+
+	},
+	["the Fighters' guild"] = {
+		["Hall Steward"] = {
+			[120019] = { --Broken Chain
+				itemPrice 	= 50000,
+			},
+			[119999] = { -- Daedric Chest
+				itemPrice 	= 10000,
+			},
+			[120948] = { -- Dark Anchor Pinion
+				itemPrice 	= 100000,
+			},
+			[120019] = { -- Fighters' Guild Banner
+				itemPrice 	= 10000,
+			},
+		},
+	},
+	["the Undaunted Enclaves"] = {
+		["Undaunted Quartermaster"] = {
+			[120036] = { -- Undaunted Banner
+				itemPrice 	= 15000,
+			},
+			[120035] = { -- Undaunted Chest
+				itemPrice 	= 5000,
+			},
+			[120034] = { -- Undaunted Mug
+				itemPrice 	= 1000,
+			},
+		},
+	},
+}
+
+function FurC.SetupHomesteadItems()
+	local generatedTable, listTable
+
+	FurC.AchievementVendors[FURC_HOMESTEAD]["the Mages' guild"]["the Mystic as part of a collection"] = bookList
+
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Dhalmora, Bal Foyen"][GetString(FURC_AV_FRO)]
+	addTable = tableMerge(furnishingVendor, morrowindStones)
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Mournhold Bank"][GetString(FURC_AV_FRO)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Stonefalls, Ebonheart"][GetString(FURC_AV_FRO)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Shadowfen, Alten Corimont"][GetString(FURC_AV_FRO)]
+	addTable = furnishingVendor
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Riften, Market, Armorer"][GetString(FURC_AV_FRO)]
+	addTable = furnishingVendor
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Bangkorai, Evermore"][GetString(FURC_AV_ROH)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Stormhaven, Wayrest, Merchant district"][GetString(FURC_AV_ROH)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Greenshade, Marbruk"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Malabal Tor, Vulkwaesten, tavern"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, addTable)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Reaper's March, Rawl'Kha, Market"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, structures)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Grahtwood, Redfur Trading Post"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, furnishingVendor)
+	listTable = tableMerge(listTable, miscVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Craglorn, Belkarth Woodworking store"][GetString(FURC_AV_KRR)]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Coldharbour, Hollow City, Cicero's General Good"][GetString(FURC_AV_KRR)]
+	listTable = tableMerge(listTable, structures)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Gold Coast, Kvatch"][GetString(FURC_AV_FRO)]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Hew's Bane"]["Rohiza"]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Orsinium"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Glenumbra, Daggerfall, The Rosy Lion"]["Rohiza"]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Rivenspire, Shornhelm, Dead Wolf Inn"]["Rohiza"]
+	listTable = tableMerge(listTable, furnishingVendor)
+
+	listTable = FurC.AchievementVendors[FURC_HOMESTEAD]["Orsinium"][GetString(FURC_AV_MAL)]
+	listTable = tableMerge(listTable, structures)
+
+
+end
\ No newline at end of file
diff --git a/data/Homestead/H_Cyrodiil.lua b/data/Homestead/H_Cyrodiil.lua
new file mode 100644
index 0000000..2936b10
--- /dev/null
+++ b/data/Homestead/H_Cyrodiil.lua
@@ -0,0 +1,130 @@
+FurC.PVP = FurC.PVP or {}
+FURC_CYRO = "Cyrodiil"
+FURC_IC = "Imperial City"
+FURC_ITEMSOURCE_VENDOR = "Furnishing vendor"
+FurC.PVP[FURC_HOMESTEAD] = {
+	[FURC_ITEMSOURCE_VENDOR] = {
+		[FURC_CYRO] = {
+			[119656] = {	-- Pennant, Small
+				itemPrice 	= 200,
+				achievement = 92,	-- Volunteer
+			},
+			[119656] = {	-- Wall Banner, Small
+				itemPrice 	= 400,
+				achievement = 93,	-- Recruit
+			},
+			[119635] = {	-- Wall Banner, Medium
+				itemPrice 	= 600,
+				achievement = 94,	-- Tyro
+			},
+			[119636] = {	-- Camp Banner
+				itemPrice 	= 1000,
+				achievement = 95,	-- Legionary
+			},
+			[119675] = {	-- Defaced Covenant Flag
+				itemPrice 	= 2000,
+				achievement = 110,
+			},
+			[119629] = {	-- Defaced Dominion Flag
+				itemPrice 	= 2000,
+				achievement = 110,
+			},
+			[119637] = {	-- Wall Banner, Large
+				itemPrice 	= 3000,
+				achievement = 96,	-- Veteran
+			},
+			[119638] = {	-- Point Capture Flag
+				itemPrice 	= 4000,
+				achievement = 97,	-- Corporal
+			},
+			[119639] = {	-- Spare figurehead
+				itemPrice 	= 5000,
+				achievement = 98, -- Sergeant
+			},
+			[119655] = {	-- Keep Pennant
+				itemPrice 	= 8000,
+				achievement = 113, -- Grand Warlord
+			},
+			[119617] = {	-- Flaming Oil
+				itemPrice 	= 10000,
+				achievement = 104,	-- Tribune
+			},
+			[119642] = {	-- Scattershot Catapult
+				itemPrice 	= 15000,
+				achievement = 100,	-- Captain
+			},
+			[120002] = {	-- Dueling Banner
+				itemPrice 	= 20000,
+				achievement = 1689,
+			},
+			[119641] = {	-- Ballista
+				itemPrice 	= 20000,
+				achievement = 99,
+			},
+			[119644] = {	-- Battering ram
+				itemPrice 	= 25000,
+				achievement = 102,
+			},
+			[119646] = {	-- Oil Catapult
+				itemPrice 	= 25000,
+				achievement = 104,
+			},
+			[119653] = {	-- Cold fire ballista
+				itemPrice 	= 30000,
+				achievement = 111,
+			},
+			[119645] = {	-- Fire Ballista
+				itemPrice 	= 30000,
+				achievement = 103, -- Colonel
+			},
+			[119649] = {	-- Lightning Ballista
+				itemPrice 	= 30000,
+				achievement = 107,
+			},
+			[119650] = {	-- Meatbag Catapult
+				itemPrice 	= 30000,
+				achievement = 107,
+			},
+			[119643] = {	-- Stone Trebuchet
+				itemPrice 	= 40000,
+				achievement = 108,
+			},
+			[119647] = {	-- Fire
+				itemPrice 	= 45000,
+				achievement = 105,
+			},
+			[119654] = {	-- Cold Fire
+				itemPrice 	= 50000,
+				achievement = 112,
+			},
+			[119648] = {	-- Forward Camp
+				itemPrice 	= 50000,
+				achievement = 106,
+			},
+			[119651] = {	-- Iceball Treb
+				itemPrice 	= 50000,
+				achievement = 109,
+			},
+			[120079] = {	-- Transitus shrine
+				itemPrice 	= 100000,
+				achievement = 114,
+			},
+			[120075] = {	-- Elder Scroll
+				itemPrice 	= 200000,
+				achievement = 935,
+			},
+			[120038] = {	-- Throne
+				itemPrice 	= 250000,
+				achievement = 935,
+			},
+		},
+		["Imperial City"] = {
+			[119983] = {	-- Imperial Banner
+				itemPrice 	= 15000,
+			},
+			[119982] = {	-- Molag Bal Brazier
+				itemPrice 	= 25000,
+			},
+		}
+	}
+}
\ No newline at end of file
diff --git a/data/Homestead/H_EventItems.lua b/data/Homestead/H_EventItems.lua
new file mode 100644
index 0000000..2ad6289
--- /dev/null
+++ b/data/Homestead/H_EventItems.lua
@@ -0,0 +1,10 @@
+FurC.EventItems = FurC.EventItems or {}
+FurC.EventItems[FURC_HOMESTEAD] = {
+	["Jester Festival"] = {
+		["Jester Boxes"] = {
+			[120995] = true, 	-- Banner, Jester's Standard
+			[134680] = true, 	-- Banner, Jester's Standard
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/data/Homestead/H_LuxuryFurnisher.lua b/data/Homestead/H_LuxuryFurnisher.lua
new file mode 100644
index 0000000..817a2e1
--- /dev/null
+++ b/data/Homestead/H_LuxuryFurnisher.lua
@@ -0,0 +1,67 @@
+FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
+
+FurC.LuxuryFurnisher[FURC_HOMESTEAD] = {
+
+	[120821] = {	-- Sigil Stendarr
+		itemPrice 	= 15000,
+		itemDate	= "2017-04-28",
+	},
+
+	[120824] = {	-- Body Cage
+		itemPrice 	= 5000,
+		itemDate	= "2017-05-12",
+	},
+	[120829] = {	-- Torture Rack
+		itemPrice 	= 5000,
+		itemDate	= "2017-05-12",
+	},
+	[120828] = {	-- Torture Wheel
+		itemPrice 	= 100000,
+		itemDate	= "2017-05-12",
+	},
+
+
+	[120803] = {	-- Hews Bane Bed, Royal
+		itemPrice 	= 20000,
+		itemDate	= "2018-02-24",
+	},
+	[121266] = {	-- Hews Bane Lantern
+		itemPrice 	= 5000,
+		itemDate	= "2018-02-24",
+	},
+	[121267] = {	-- Hews Bane Merchants Basket
+		itemPrice 	= 2500,
+		itemDate	= "2018-02-24",
+	},
+
+	[120802] = {	-- Shrine of Mara, Decorative
+		itemPrice 	= 50000,
+		itemDate	= "2018-02-17",
+	},
+	[120799] = {	-- Wedding Blossoms, Peach
+		itemPrice 	= 2500,
+		itemDate	= "2018-02-17",
+	},
+	[120893] = {	-- Wedding Gazebo
+		itemPrice 	= 50000,
+		itemDate	= "2018-02-17",
+	},
+
+	[120798] = {	-- Wedding Blossoms, Blue
+		itemPrice 	= 2500,
+		itemDate	= "2018-02-10",
+	},
+	[120800] = {	-- Wedding Curtain
+		itemPrice 	= 7500,
+		itemDate	= "2018-02-10",
+	},
+	[120801] = {	-- Wedding Lantern
+		itemPrice 	= 5000,
+		itemDate	= "2018-02-10",
+	},
+	[120797] = {	-- Wedding Flower Trellis
+		itemPrice 	= 10000,
+		itemDate	= "2018-02-10",
+	},
+
+}
diff --git a/data/Homestead/H_Recipes.lua b/data/Homestead/H_Recipes.lua
new file mode 100644
index 0000000..f29a41b
--- /dev/null
+++ b/data/Homestead/H_Recipes.lua
@@ -0,0 +1,1077 @@
+FurC.Recipes = FurC.Recipes or {}
+
+FurC.Recipes[FURC_HOMESTEAD] = {
+
+	115721, -- Argonian Chimney Stack
+	115722, -- Argonian Rack, Sturdy
+	115723, -- Argonian Shelves, Half
+	115724, -- Argonian Shelves, Full
+	115725, -- Argonian Snakes on a Rope
+	115726, -- Argonian Dried Leaves
+	115727, -- Argonian Lattice, Rough
+	115728, -- Argonian Tarp, Woven
+	115729, -- Argonian Tarp, Sturdy
+	115730, -- Argonian Counter, Long
+	115731, -- Argonian Pole, Split
+	115732, -- Argonian Stool, Roped
+	115733, -- Argonian Chair, Rough
+	115734, -- Argonian Table, Rough
+	115735, -- Argonian Cup, Tall
+	115736, -- Argonian Cup, Short
+	115737, -- Argonian Bowl, Wooden
+	115738, -- Argonian Baskets, Double
+	115739, -- Argonian Basket, Serving
+	115740, -- Argonian Mug, Tooth
+	115741, -- Argonian Ramekin, Hardened
+	115742, -- Argonian Pan, Frying
+	115743, -- Argonian Banner, Hanging
+	115744, -- Argonian Post, Sturdy
+	115745, -- Argonian Post, Rough
+	115746, -- Argonian Mat, Tidy Reed
+	115747, -- Argonian Mat, Rolled Reed
+	115748, -- Argonian Mat, Reed
+	115749, -- Argonian Tent, Reed
+	115750, -- Argonian Canopy, Reed
+	115751, -- Argonian Basket, Closed
+	115752, -- Argonian Bin, Woven
+	115753, -- Argonian Totem, Painted Skull
+	115754, -- Argonian Rack, Drying
+	115755, -- Argonian Totem, Frilled Skull
+	115756, -- Argonian Cage, Rat
+	115757, -- Argonian Cage, Bird
+	115758, -- Argonian Wind Chimes
+	115759, -- Argonian Bar, Woven Corner
+	115760, -- Argonian Snakes in a Basket
+	115761, -- Argonian Bed, Woven
+	115762, -- Argonian Bench", Woven
+	115763, -- Argonian Chair, Woven
+	115764, -- Argonian Trunk, Sturdy
+	115765, -- Argonian Bookshelf, Woven
+	115766, -- Argonian Dresser, Sturdy
+	115767, -- Argonian Shelf, Woven
+	115768, -- Argonian Bookcase, Sturdy
+	115769, -- Argonian Stool, Woven
+	115770, -- Argonian Table, Formal
+	115771, -- Argonian End Table, Woven
+	115772, -- Argonian Bowl, Serving
+	115773, -- Argonian Cup, Bordered
+	115774, -- Argonian Basket, Woven
+	115775, -- Argonian Bowl, Bordered
+	115776, -- Argonian Ramekin, Bordered
+	115777, -- Argonian Urn, Clawfoot
+	115778, -- Argonian Tray, Woven
+	115779, -- Argonian Curtain, Woven
+	115780, -- Argonian Curtains, Woven
+	115781, -- Argonian Medallion, Stone
+	115782, -- Argonian Scaleskin, Pale
+	115783, -- Argonian Scaleskin, Striped
+	115784, -- Argonian Scaleskin, Faded
+	115785, -- Argonian Lamppost
+	115787, -- Argonian Canopy, Frilled
+	115788, -- Argonian Canopy, Skull
+	115789, -- Argonian Canopy, Scaled
+	115790, -- Argonian Trunk, Painted
+	115791, -- Argonian Chest, Carved
+	115792, -- Argonian Skull, Crocodile
+	115793, -- Argonian Totem of the Snake
+	115794, -- Argonian Skull, Lizard
+	115795, -- Argonian Bone Chimes
+	115796, -- Argonian Hamper, Woven
+	115799, -- Argonian Table, Horn
+	115800, -- Argonian Curtain of Smoke
+	115801, -- Argonian Curtain of the Nest
+	115802, -- Argonian Drum, Ceremonial
+	115803, -- Argonian Bowl, Ritual
+	115804, -- Argonian Jug, Ritual
+	115805, -- Argonian Pot, Ritual
+	115806, -- Argonian Pestle, Bone
+	115807, -- Argonian Seat of Authority
+	115808, -- Argonian Seat of Honor
+	115809, -- Argonian Mortar and Pestle, Bone
+	115810, -- Argonian Mortar, Bone
+	115811, -- Argonian Pedestal, Altar
+	115812, -- Argonian Censer
+	115813, -- Argonian Relic, Small Serpent
+	115814, -- Argonian Relic, Serpent
+	115815, -- Argonian Seat of Comfort
+	115816, -- Argonian Divider, Stretched
+	115817, -- Argonian Bedroll, Woven
+	115818, -- Argonian Banners, Frilled
+	115819, -- Argonian Banner, Half Hands
+	115820, -- Argonian Post, Frilled
+	115821, -- Argonian Lanterns, String
+	115822, -- Argonian Lanterns, Strand
+	115823, -- Argonian Light, Stick
+	115824, -- Argonian Lamp, Mud
+	115825, -- Argonian Brazier, Mud
+	115826, -- Argonian Lights, Branch
+	115827, -- Argonian Bark, Painted
+	115828, -- Argonian Relic, Basin
+	115829, -- Argonian Totem of Skulls
+	115830, -- Argonian Gravestick
+	115831, -- Argonian Tree of Lights
+	115832, -- Argonian Tile, Inscribed
+	115833, -- Wood Elf Stool, Leather
+	115834, -- Wood Elf Counter, Long Leather
+	115835, -- Wood Elf Shelf, Tiered
+	115836, -- Wood Elf Table, Leather
+	115837, -- Wood Elf Bar, Sturdy
+	115838, -- Wood Elf Bar, Long
+	115839, -- Wood Elf Bar, Drying
+	115840, -- Wood Elf Bar, Short
+	115841, -- Wood Elf Rack, Brace
+	115842, -- Wood Elf Divider, Stretched
+	115843, -- Wood Elf Divider, Narrow
+	115844, -- Wood Elf Vase, Swirled
+	115845, -- Wood Elf Urn, Scratched
+	115846, -- Wood Elf Urn, Deer
+	115847, -- Wood Elf Cup, Ceramic
+	115848, -- Wood Elf Cup, Chipped
+	115849, -- Wood Elf Cup, Striped
+	115850, -- Wood Elf Pedestal, Engraved
+	115851, -- Wood Elf Basin, Stone
+	115852, -- Wood Elf Awning, Leather
+	115853, -- Wood Elf Canopy, Leather
+	115854, -- Wood Elf Bedding, Scattered
+	115855, -- Wood Elf Grinding Stone
+	115856, -- Wood Elf Hide, Heavy
+	115857, -- Wood Elf Wall Hide, Pierced
+	115858, -- Wood Elf Wall Hide, Fur
+	115859, -- Wood Elf Wall Hide, Spotted
+	115860, -- Wood Elf Cauldron, Stone
+	115861, -- Wood Elf Tent, Sturdy
+	115862, -- Wood Elf Chair, Leather
+	115863, -- Wood Elf Bookcase, Leather
+	115864, -- Wood Elf Table, Formal
+	115865, -- Wood Elf Barrel, Ceramic
+	115866, -- Wood Elf Cask, Ceramic
+	115867, -- Wood Elf Bladder, Fermenting
+	115868, -- Wood Elf Cauldron, Ceramic
+	115869, -- Wood Elf Hammock, Single
+	115870, -- Wood Elf Hammock, Double
+	115871, -- Wood Elf Rack, Single
+	115872, -- Wood Elf Rack, Double
+	115873, -- Wood Elf Divider, Relaxed
+	115874, -- Wood Elf Divider, Taut
+	115875, -- Wood Elf Vessel, Tiered Ceramic
+	115876, -- Wood Elf Vessel, Tiered Painted
+	115877, -- Wood Elf Pitcher, Painted
+	115878, -- Wood Elf Pitcher, Marked
+	115879, -- Wood Elf Vase, Painted
+	115880, -- Wood Elf Vase, Chipped
+	115881, -- Wood Elf Pitcher, Chipped
+	115882, -- Wood Elf Pitcher, Ceramic
+	115883, -- Wood Elf Bowl, Striped
+	115884, -- Wood Elf Canopy, Braced
+	115885, -- Wood Elf Bedding, Layered
+	115886, -- Wood Elf Censer, Hanging
+	115887, -- Wood Elf Tent, Frame
+	115888, -- Wood Elf Rack, Meat
+	115889, -- Wood Elf Totem, Framed
+	115890, -- Wood Elf Totem, Skull
+	115891, -- Wood Elf Trough", Slop
+	115892, -- Wood Elf Bin, Blue Feathers
+	115893, -- Wood Elf Bin, Feathers
+	115894, -- Wood Elf Cask, Painted
+	121371, -- Wood Elf Hearth, Forest
+	121309, -- High Elf Medal, Winged
+	115895, -- Wood Elf Fish Dish
+	115896, -- Wood Elf Tapestry, Painted
+	115897, -- Wood Elf Tapestry, Deer
+	115898, -- Wood Elf Tapestry, Vine
+	115899, -- Wood Elf Canopy, Spine
+	115900, -- Wood Elf Bedding, Padded
+	115901, -- Wood Elf Skull and Bones
+	115902, -- Wood Elf Bone Chimes
+	115903, -- Wood Elf Rack, Dried Fish
+	115904, -- Wood Elf Rack, Dried Meat
+	115906, -- Breton Stall, Merchant
+	115907, -- Breton Cart, Wheelbarrow
+	115908, -- Breton Bed, Bunk
+	115909, -- Breton Bed, Single
+	115910, -- Breton Pew, Windowed
+	115911, -- Breton Bench", Plain
+	115912, -- Breton Nightstand, Open
+	115913, -- Breton Bookcase, Tall
+	115914, -- Breton Chair, Slatted
+	115915, -- Breton Chair, Windowed
+	115916, -- Breton Shelves, Double
+	115917, -- Breton Rack, Barrel
+	115918, -- Breton Dresser, Open
+	115919, -- Breton Desk
+	115920, -- Breton Table, Dining
+	115921, -- Breton Trestle, Sturdy
+	115922, -- Breton Table, Kitchen
+	115923, -- Breton Shelf, Long
+	115924, -- Breton Pitcher, Ceramic
+	115925, -- Breton Carpet, Bordered
+	115926, -- Breton Carpet, Square
+	115927, -- Breton Amphora, Ceramic
+	115928, -- Breton Vase, Ceramic
+	115929, -- Breton Lightpost, Single
+	115930, -- Breton Sconce, Sturdy Torch
+	115931, -- Breton Street Post, Stone
+	115932, -- Breton Sconce, Torch
+	115933, -- Breton Street Post, Plain
+	115934, -- Breton Bed, Four-poster
+	115935, -- Breton Bed, Full
+	115936, -- Breton Pew, Knotwork
+	115937, -- Breton Bench", Knotwork
+	115938, -- Breton Bookcase, Knotwork
+	115939, -- Breton Chair, Rocking
+	115940, -- Breton Chest, Knotwork
+	115941, -- Breton Hutch", Knotwork
+	115942, -- Breton Cupboard, Knotwork
+	115943, -- Breton Chest of Drawers
+	115944, -- Breton Counter, Long Cabinet
+	115945, -- Breton Shelf, Barrel Rack
+	115946, -- Breton Stool, Plain
+	115947, -- Breton Desk, Knotwork
+	115948, -- Breton Table, Round
+	115949, -- Breton Table, Square
+	115950, -- Breton Shelf, Scrolled
+	115951, -- Breton Rack, Wine
+	115952, -- Breton Carpet, Full
+	115953, -- Breton Rug, Starburst
+	115954, -- Breton Carpet, Dark
+	115955, -- Breton Pottery, Lid
+	115956, -- Breton Urn, Glazed
+	115957, -- Breton Amphora, Glazed
+	115959, -- Breton Vase, Glazed
+	115961, -- Breton Streetlight, Arched Stone
+	115962, -- Breton Streetlight, Paired Stone
+	115963, -- Breton Cart, Covered Open
+	115964, -- Breton Stall, Vending
+	115965, -- Breton Lightpost, Arched
+	115966, -- Breton Streetlight, Paired
+	115967, -- Breton Figure, Stone
+	115968, -- Breton Chandelier, Wrought Iron
+	115969, -- Breton Curtains, Window
+	115970, -- Breton Bed, Canopy
+	115971, -- Breton Sideboard, Knotwork
+	115972, -- Breton Chair, Padded
+	115973, -- Breton Armchair, Padded
+	115974, -- Breton Cabinet, Knotwork
+	115975, -- Breton Curio, Knotwork
+	115976, -- Breton Drapes, Grand
+	115977, -- Breton Coffer, Knotwork
+	115978, -- Breton Cradle, Infant
+	115979, -- Breton Dresser, Knotwork
+	115980, -- Breton Counter, Corner
+	115981, -- Breton Counter, Cabinet
+	115982, -- Breton Mirror, Knotwork
+	115983, -- Breton Nightstand, Knotwork
+	115984, -- Breton Divider, Folded Knotwork
+	115985, -- Breton Divider, Curved Knotwork
+	115986, -- Breton Stool, Padded
+	115987, -- Breton Desk, Scholar's
+	115988, -- Breton Table, Formal
+	115989, -- Breton Trestle, Formal
+	115990, -- Breton Rug, Bordered
+	115991, -- Breton Runner, Bordered
+	115992, -- Breton Carpet, Bordered
+	115993, -- Breton Medallion, Lion
+	115994, -- Breton Tablecloth", Blue
+	115995, -- Breton Lamp, Oil
+	115996, -- Breton Tablecloth", Striped
+	115997, -- Breton Footlocker, Knotwork
+	115998, -- Breton Armoire, Knotwork
+	115999, -- Breton Cart, Palanquin
+	116000, -- Breton Tapestry, Vines
+	116001, -- Breton Tapestry, Boughs
+	116002, -- Breton Urn Lid, Striated
+	116003, -- Breton Urn, Striated
+	116004, -- Breton Lamp, Hanging
+	116005, -- Breton Streetlight, Full Stone
+	116006, -- Breton Vase, Delicate
+	116007, -- Breton Streetlight, Full
+	116008, -- Breton Sconce, Floor
+	116009, -- Breton Sconce, Grand
+	116010, -- Breton Candelabra, Formal
+	116011, -- Breton Sconce, Wall
+	116012, -- Dark Elf Cart, Merchant
+	116013, -- Dark Elf Rack, Barrel
+	116014, -- Dark Elf Armchair, Angled
+	116015, -- Dark Elf Chest of Drawers
+	116016, -- Dark Elf Bed, Single
+	116017, -- Dark Elf Table, Formal
+	116018, -- Dark Elf Shelf, Wall
+	116019, -- Dark Elf Urn, Banded
+	116020, -- Dark Elf Basin, Ringed
+	116021, -- Dark Elf Runner, Bordered
+	116022, -- Dark Elf Carpet, Mottled
+	116023, -- Dark Elf Carpet, Patterned
+	116024, -- Dark Elf Tapestry, Emblazoned
+	116025, -- Dark Elf Candle, Claw Base
+	116026, -- Dark Elf Lantern, Oil
+	116027, -- Dark Elf Streetpost, Banner
+	116028, -- Dark Elf Streetpost, Banners
+	116029, -- Dark Elf Wagon, Merchant
+	116030, -- Dark Elf Caravan, Cargo
+	116031, -- Dark Elf Dresser, Angled
+	116032, -- Dark Elf Bookcase, Sectioned
+	116033, -- Dark Elf Chair, Angled
+	116034, -- Dark Elf Counter, Bar
+	116035, -- Dark Elf Wardrobe, Scaled
+	116036, -- Dark Elf Desk, Angled
+	116037, -- Dark Elf Bed, Full
+	116038, -- Dark Elf Pillow, Body
+	116039, -- Dark Elf Stool, Angled
+	116040, -- Dark Elf Table, Tea
+	116041, -- Dark Elf Trestle, Scaled
+	116042, -- Dark Elf Wine Rack, Sturdy
+	116043, -- Dark Elf Shelf, Barrel
+	116044, -- Dark Elf Pot, Scaled
+	116045, -- Dark Elf Decanter, Glass
+	116046, -- Dark Elf Cruet, Glass
+	116047, -- Dark Elf Flags, Hanging
+	116048, -- Dark Elf Cauldron, Banded
+	116049, -- Dark Elf Carpet, Mossy
+	116050, -- Dark Elf Carpet, Fungal
+	116051, -- Dark Elf Rug, Fungal
+	116052, -- Dark Elf Hook, Wall
+	116053, -- Dark Elf Lantern, Caged
+	116054, -- Dark Elf Lantern, Hanging
+	116055, -- Dark Elf Streetlamp, Stone
+	116056, -- Dark Elf Streetlamps, Stone
+	116057, -- Dark Elf Sofa, Angled
+	116058, -- Dark Elf Bed, Canopy
+	116059, -- Dark Elf Counter, Corner
+	116060, -- Dark Elf Counter, Block
+	116061, -- Dark Elf Nightstand, Angled
+	116062, -- Dark Elf Pillow, Cushion
+	116063, -- Dark Elf Pillow, Roll
+	116064, -- Dark Elf Divider, Folded
+	116065, -- Dark Elf End Table, Angled
+	116066, -- Dark Elf Trunk, Buckled
+	116067, -- Dark Elf Wardrobe, Angled
+	116068, -- Dark Elf Kettle Cooker
+	116069, -- Dark Elf Pot, Banded
+	116070, -- Dark Elf Carpet, Ashen
+	116071, -- Dark Elf Rug, Mossy
+	116072, -- Dark Elf Rug, Striated
+	116073, -- Dark Elf Medallion, Tribunal
+	116074, -- Dark Elf Censer, Hanging
+	116075, -- Dark Elf Thurible, Caged
+	116077, -- Dark Elf Cauldron, Ringed
+	116078, -- Dark Elf Lantern, Ashen
+	116079, -- Dark Elf Candelabra, Angled
+	116080, -- Dark Elf Candle, Votive Tray
+	116081, -- Khajiit Firepit, Brick
+	116082, -- Khajiit Loft, Reed
+	116083, -- Khajiit Dresser, Faded
+	116084, -- Khajiit Stool, Crescent
+	116085, -- Khajiit End Table, Faded
+	116086, -- Khajiit Drapes, Tattered
+	116087, -- Khajiit Bottle, Amber
+	116088, -- Khajiit Flask, Amber
+	116089, -- Khajiit Carpet, Crescent Moons
+	116090, -- Khajiit Vase, Amber
+	116091, -- Khajiit Banner, Moons
+	116092, -- Khajiit Banner, Crescents
+	116093, -- Khajiit Candle, Clawfoot
+	116094, -- Khajiit Frame, Arched
+	116095, -- Khajiit Banner, Claw
+	116096, -- Khajiit Bed, Fur
+	116097, -- Khajiit Bedding, Padded
+	116098, -- Khajiit Signpost, Fortified
+	116099, -- Khajiit Bed, Faded
+	116100, -- Khajiit Bench", Padded
+	116101, -- Khajiit Bookshelf, Arched
+	116102, -- Khajiit Trunk, Arched
+	116103, -- Khajiit Counter, Faded
+	116104, -- Khajiit Nightstand, Gilded
+	116105, -- Khajiit Table, Formal
+	116106, -- Khajiit Jug, Amber
+	116107, -- Khajiit Pitcher, Amber
+	116108, -- Khajiit Carpet, Sun
+	116109, -- Khajiit Cushion, Long
+	116110, -- Khajiit Cushion, Single
+	116111, -- Khajiit Carafe, Amber
+	116112, -- Khajiit Decanter, Amber
+	116113, -- Khajiit Banner, Hooked
+	116114, -- Khajiit Brazier, Claw
+	116115, -- Khajiit Basin, Claw
+	116116, -- Khajiit Lantern, Hanging
+	116117, -- Khajiit Tent, Mercantile
+	116118, -- Khajiit Tent, Storage
+	116119, -- Khajiit Wagon, Reed
+	116120, -- Khajiit Curtains, Moons
+	116121, -- Khajiit Barstool, Clawfoot
+	116122, -- Khajiit Barstool, Padded
+	116123, -- Khajiit Skooma Bubbler
+	116124, -- Khajiit Tent, Vacation
+	116125, -- Khajiit Bed, Canopy
+	116126, -- Khajiit Couch", Padded
+	116127, -- Khajiit Bookcase, Arched
+	116128, -- Khajiit Footlocker, Arched
+	116129, -- Khajiit Counter, Long Cabinet
+	116130, -- Khajiit Desk, Faded
+	116131, -- Khajiit Divider, Folding
+	116132, -- Khajiit Table, Round
+	116133, -- Khajiit Wardrobe, Arched
+	116134, -- Khajiit Rug, Moons
+	116135, -- Khajiit Drapes, Grand
+	116136, -- Khajiit Pillow, Crescents
+	116137, -- Khajiit Vial, Amber
+	116138, -- Khajiit Urn, Amber
+	116139, -- Khajiit Vessel, Amber
+	116140, -- Khajiit Candles, Clawfoot
+	116141, -- Khajiit Sofa, Padded
+	116142, -- Khajiit Pillow, Roll
+	116143, -- Khajiit Rug, Sun
+	116144, -- Khajiit Brazier, Hanging
+	116145, -- Khajiit Sconce, Spiked
+	116146, -- Khajiit Candle-Filled Lamp
+	116147, -- Nord Cart, Hay
+	116148, -- Nord Trunk, Heavy
+	116149, -- Nord Hutch", Rough
+	116150, -- Nord Dresser, Rough
+	116151, -- Nord Nightstand, Rough
+	116152, -- Nord Lantern, Cage
+	116153, -- Nord Pot, Ceramic
+	116154, -- Nord Urn, Ceramic
+	116155, -- Nord Bed, Single
+	116156, -- Nord Bench", Braced
+	116157, -- Nord Stool, Rough
+	116158, -- Nord Table, Kitchen
+	116159, -- Nord Shelf, Wall
+	116160, -- Nord Shelf, Braced
+	116161, -- Nord Pot, Covered
+	116162, -- Nord Pot, Stew
+	116163, -- Nord Candle, Tealight
+	116164, -- Nord Candleholder, Cup
+	116165, -- Nord Torch", Triple
+	116166, -- Nord Cart, Cargo
+	116167, -- Nord Trunk, Faded
+	116168, -- Nord Cauldron, Glazed
+	116169, -- Nord Pot, Chunky Stew
+	116170, -- Nord Amphora, Glazed
+	116171, -- Nord Vase, Bent
+	116172, -- Nord Bed, Sleigh
+	116173, -- Nord Bench", Plank
+	116174, -- Nord Bookshelf, Alcove
+	116175, -- Nord Chair, Braced
+	116176, -- Nord Counter, Long
+	116177, -- Nord Dresser, Braced
+	116178, -- Nord Stool, Braced
+	116179, -- Nord Table, Dining
+	116180, -- Nord Table, Round
+	116181, -- Nord Table, Braced
+	116182, -- Nord Trestle, Braced
+	116183, -- Nord Footlocker, Braced
+	116184, -- Nord Armoire, Lattice
+	116185, -- Nord Rack, Wine
+	116186, -- Nord Crockpot, Carrot Soup
+	116187, -- Nord Crockpot, Covered
+	116188, -- Nord Tapestry, Dragon
+	116189, -- Nord Lantern, Hanging
+	116190, -- Nord Drinking Horn, Empty
+	116191, -- Nord Cart, Covered
+	116192, -- Nord Chest, Latched
+	116193, -- Nord Urn, Braided
+	116194, -- Nord Bed, Canopy
+	116195, -- Nord Bookcase, Alcove
+	116196, -- Nord Chair, Lattice
+	116197, -- Nord Counter, Corner
+	116198, -- Nord Counter, Cabinet
+	116199, -- Nord Desk, Tied
+	116200, -- Nord Nightstand, Braced
+	116201, -- Nord Divider, Folding
+	116202, -- Nord Table, Great
+	116203, -- Nord Table, Formal
+	116204, -- Nord Table, Game
+	116205, -- Nord Trestle, Tied
+	116206, -- Nord Rug, Bearskin
+	116207, -- Nord Banner, Knotwork
+	116208, -- Nord Tapestry, Ship
+	116209, -- Nord Candle, Antler
+	116210, -- Nord Chandelier, Antler
+	116211, -- Nord Streetlamps, Stone
+	116212, -- Nord Lamppost, Stone
+	116213, -- Nord Brazier, Hanging
+	116216, -- Nord Trunk, Buckled
+	118916, -- High Elf Wagon, Covered
+	118917, -- High Elf Bed, Winged Double
+	118918, -- High Elf Bench", Covered
+	118919, -- High Elf Bookshelf, Winged
+	118920, -- High Elf Armoire, Winged
+	118921, -- High Elf Bookcase, Winged
+	118922, -- High Elf Dresser, Corner
+	118923, -- High Elf Chair, Regal Verdant
+	118924, -- High Elf Chair, Regal Winged
+	118925, -- High Elf Trunk, Jeweled
+	118926, -- High Elf Counter, Block
+	118927, -- High Elf Cabinet, Corner
+	118928, -- High Elf Desk, Regal Winged
+	118929, -- High Elf Dresser, Winged
+	118930, -- High Elf Divider, Delicate
+	118931, -- High Elf Divider, Carved
+	118932, -- High Elf Table, Tea
+	118933, -- High Elf Stool, Covered
+	118934, -- High Elf End Table, Winged
+	118935, -- High Elf Table, Winged Formal
+	118936, -- High Elf Table, Winged Kitchen
+	118937, -- High Elf Trestle, Winged
+	118938, -- High Elf Bowl, Serving
+	118939, -- High Elf Pot, Hanging
+	118940, -- High Elf Basin, Standing
+	118941, -- High Elf Platter, Winged
+	118942, -- High Elf Carpet, Eagle
+	118943, -- High Elf Tapestry, Eagle
+	118944, -- High Elf Vase, Winged
+	118945, -- High Elf Decanter, Glass
+	118946, -- High Elf Goblet, Winged
+	118947, -- High Elf Goblet, Glass
+	118948, -- High Elf Brazier, Winged
+	118949, -- High Elf Chandelier, Winged
+	118950, -- High Elf Candle, Winged
+	118951, -- High Elf Lamppost, Stone
+	118952, -- High Elf Candelabra, Winged
+	118953, -- High Elf Crest, Winged
+	118954, -- High Elf Streetlight, Stone
+	118955, -- Breton Cart, Covered Closed
+	118956, -- High Elf Wagon, Sturdy
+	118957, -- High Elf Bed, Winged
+	118958, -- High Elf Bed, Verdant
+	118959, -- High Elf Chest of Drawers
+	118960, -- High Elf Bookcase, Verdant
+	118961, -- High Elf Chair, Verdant
+	118962, -- High Elf Chair, Winged
+	118963, -- High Elf Bar, Overhanging
+	118964, -- High Elf Desk, Verdant
+	118965, -- High Elf Dresser, Verdant
+	118966, -- High Elf End Table, Verdant
+	118967, -- High Elf Table, Verdant Formal
+	118968, -- High Elf Table, Verdant Kitchen
+	118969, -- High Elf Trestle, Verdant
+	118970, -- High Elf Trunk, Winged
+	118971, -- High Elf Wine Rack, Folding
+	118972, -- High Elf Platter, Gilded
+	118973, -- High Elf Carpet, Water-Themed
+	118974, -- High Elf Carpet, Tree-Themed
+	118975, -- High Elf Tapestry, Water-Themed
+	118976, -- High Elf Tapestry, Tree-Themed
+	118977, -- High Elf Carafe, Gilded
+	118978, -- High Elf Vase, Gilded
+	118979, -- High Elf Bottle, Winged
+	118980, -- High Elf Flute, Wine
+	118981, -- High Elf Basin, Winged
+	118982, -- High Elf Lamppost, Spiked
+	118983, -- High Elf Lamp, Oil
+	118984, -- High Elf Bed, Bunk
+	118985, -- High Elf Bed, Single
+	118986, -- High Elf Bench", Curved
+	118987, -- High Elf Bookshelf, Verdant
+	118988, -- High Elf Counter, Long Cabinet
+	118989, -- High Elf Desk, Sturdy
+	118990, -- High Elf Dresser, Sturdy
+	118991, -- High Elf Stool, Curved
+	118992, -- High Elf End Table, Sturdy
+	118993, -- High Elf Table, Sturdy Formal
+	118994, -- High Elf Table, Sturdy Kitchen
+	118995, -- High Elf Trestle, Sturdy
+	118996, -- High Elf Shelf, Short
+	118997, -- High Elf Shelf, Long
+	118998, -- High Elf Basin, Gilded
+	118999, -- High Elf Cup, Gilded
+	119000, -- High Elf Flask, Gilded
+	119001, -- High Elf Plate, Dinner
+	119002, -- High Elf Carpet, Rustic
+	119003, -- High Elf Tapestry, Rustic
+	119004, -- High Elf Candleholder, Sturdy
+	119005, -- Orcish Tent, Shingled
+	119006, -- Orcish Platform, Block
+	119007, -- Orcish Counter, Island Stall
+	119008, -- Orcish Wash Tub
+	119009, -- Orcish Bedding, Stone
+	119010, -- Orcish Bedding, Fur
+	119011, -- Orcish Table, Block
+	119012, -- Orcish Table, Braced Formal
+	119013, -- Orcish Table, Braced Kitchen
+	119014, -- Orcish Trunk, Braced
+	119015, -- Orcish Bench", Cabled
+	119016, -- Orcish Shelves, Braced
+	119017, -- Orcish Bar, Long Block
+	119018, -- Orcish Counter, Block
+	119019, -- Orcish Bar, Side
+	119020, -- Orcish Shelf, Long
+	119021, -- Orcish Shelf, Short
+	119022, -- Orcish Stool, Cabled
+	119023, -- Orcish Bowl, Rugged
+	119024, -- Orcish Mug, Rugged
+	119025, -- Orcish Canister, Rugged
+	119026, -- Orcish Cask, Rugged
+	119027, -- Orcish Carpet, Fringed
+	119028, -- Orcish Brazier, Smoldering
+	119029, -- Orcish Lantern, Hooded
+	119030, -- Orcish Banner, Faded
+	119031, -- Orcish Banner, Worn
+	119032, -- Breton Chamberstick, Short
+	119033, -- Breton Chamberstick, Tall
+	119034, -- Orcish Canopy, Shingled
+	119035, -- Orcish Shelter, Shingled
+	119036, -- Orcish Platform, Stage
+	119037, -- Orcish Sack, Grain
+	119038, -- Orcish Sack, Flour
+	119039, -- Orcish Sack, Bean
+	119040, -- Orcish Bucket, Cistern
+	119041, -- Orcish Curtain, Folding
+	119042, -- Orcish Curtain, Curved
+	119043, -- Orcish Armchair, Peaked
+	119044, -- Orcish Pew, Peaked
+	119045, -- Orcish Bedding, Peaked
+	119046, -- Orcish Bookshelf, Engraved
+	119047, -- Orcish Bunkbed, Leather
+	119048, -- Orcish Chair, Peaked
+	119049, -- Orcish Trunk, Heavy
+	119050, -- Orcish Desk, Engraved
+	119051, -- Orcish Bar, Long Branded Block
+	119052, -- Orcish Counter, Branded
+	119053, -- Orcish Cabinet, Branded
+	119054, -- Orcish Dresser, Open
+	119055, -- Orcish Nightstand, Open
+	119056, -- Orcish Table, Engraved
+	119057, -- Orcish Trestle, Engraved
+	119058, -- Orcish Table, Kitchen
+	119059, -- Orcish Table, Formal
+	119060, -- Orcish Footlocker, Buckled
+	119061, -- Orcish Bowl, Stone
+	119062, -- Orcish Goblet, Stone
+	119063, -- Orcish Plate, Stone
+	119064, -- Orcish Saucer, Stone
+	119065, -- Orcish Vessel, Sealed Ceramic
+	119066, -- Orcish Urn, Ceramic
+	119067, -- Orcish Lantern, Hanging
+	119068, -- Orcish Brazier, Pedestal
+	119069, -- Orcish Chandelier, Practical
+	119070, -- Orcish Sconce, Caged
+	119071, -- Orcish Banner, Hammer Fist
+	119072, -- Orcish Strongbox, Buckled
+	119073, -- Orcish Trunk, Buckled
+	119074, -- Orcish Chest, Buckled
+	119075, -- Orcish Chair, Peaked
+	119076, -- Orcish Throne, Stone
+	119077, -- Orcish Throne, Engraved
+	119078, -- Orcish Capsule, Sealed
+	119079, -- Orcish Armoire, Peaked
+	119080, -- Orcish Bed, Peaked
+	119081, -- Orcish Bookcase, Peaked
+	119082, -- Orcish Bookshelf, Peaked
+	119083, -- Orcish Sideboard, Engraved
+	119084, -- Orcish Cabinet, Engraved
+	119085, -- Orcish Hutch", Engraved
+	119086, -- Orcish Coffer, Bolted
+	119087, -- Orcish Cupboards, Peaked
+	119088, -- Orcish Dresser, Engraved
+	119089, -- Orcish Cabinet, Bedside
+	119090, -- Orcish Counter, Corner
+	119091, -- Orcish Hutch", Storage
+	119092, -- Orcish Shelves, Storage
+	119093, -- Orcish Nightstand, Engraved
+	119094, -- Orcish Divider, Folded
+	119095, -- Orcish Divider, Curved
+	119096, -- Orcish Table, Game
+	119097, -- Orcish Table, Grand
+	119098, -- Orcish Throne, Peaked
+	119099, -- Orcish Stein, Horn
+	119100, -- Orcish Mug, Horn
+	119101, -- Orcish Knife, Kitchen
+	119102, -- Orcish Backpack
+	119103, -- Orcish Bowl, Buffed
+	119104, -- Orcish Platter, Serving
+	119105, -- Orcish Urn, Sealed
+	119106, -- Orcish Tapestry, Axe
+	119107, -- Orcish Tapestry, Heroes
+	119108, -- Orcish Tapestry, Sword
+	119109, -- Orcish Vessel, Sealed
+	119110, -- Orcish Cauldron, Sealed
+	119111, -- Orcish Candleholder, Horn
+	119112, -- Orcish Candlestick, Horn
+	119113, -- Orcish Candle Sconce, Horn
+	119114, -- Orcish Brazier, Bordered
+	119115, -- Orcish Brazier, Hanging
+	119116, -- Orcish Brazier, Tabletop
+	119117, -- Orcish Brazier, Floor
+	119118, -- Orcish Sconce, Bordered
+	119119, -- Orcish Sconce, Scrolled
+	119120, -- Orcish Cradle, Peaked
+	121306, -- Orcish Figurine, Strength
+	119121, -- Orcish Mirror, Peaked
+	119122, -- Orcish Tapestry, War
+	119123, -- Orcish Chandelier, Spiked
+	119124, -- Redguard Carriage, Practical
+	119125, -- Redguard Cart, Practical
+	119126, -- Redguard Wagon, Merchant
+	119127, -- Redguard Cart, Work
+	119128, -- Redguard Bin, Roped
+	119129, -- Redguard Bin, Sealed
+	119130, -- Redguard Pot, Sealed
+	119131, -- Redguard Pot, Capped
+	119132, -- Redguard Desk, Florid
+	119133, -- Redguard Rack, Barrel
+	119134, -- Redguard Bar, Long Cabinet
+	119135, -- Redguard Trunk, Heavy
+	119136, -- Redguard Bed, Wide
+	119137, -- Redguard Bed, Full
+	119138, -- Redguard Couch", Bolted
+	119139, -- Redguard Bench", Slatted
+	119140, -- Redguard Armchair, Slatted
+	119141, -- Redguard Chair, Backless
+	119142, -- Redguard Chair, Slatted
+	119143, -- Redguard Desk, Sturdy
+	119144, -- Redguard Nightstand, Sturdy
+	119145, -- Redguard Table, Sturdy
+	119146, -- Redguard Stool, Sturdy
+	119147, -- Redguard Stool, Block
+	119148, -- Redguard Shelf, Sturdy
+	119149, -- Redguard Pot, Hanging Brushed
+	119150, -- Redguard Kabobs, Wax
+	119151, -- Redguard Vessel, Lacquered
+	119152, -- Redguard Urn, Lacquered
+	119153, -- Redguard Pot, Ceramic
+	119154, -- Redguard Curtain, Smoky
+	119155, -- Redguard Curtain, Desert Rose
+	119156, -- Redguard Banner, Post
+	119157, -- Redguard Candlestick, Practical
+	119158, -- Redguard Candleholder, Practical
+	119159, -- Redguard Candelabra, Practical
+	119160, -- Redguard Well, Covered
+	119161, -- Redguard Cup, Empty
+	119162, -- Redguard Cup, Full
+	119163, -- Redguard Caravan, Practical
+	119164, -- Redguard Carriage, Merchant
+	119165, -- Redguard Vase, Lacquered
+	119166, -- Redguard Pot, Lacquered
+	119167, -- Redguard Amphora, Polished
+	119168, -- Redguard Cask, Sealed
+	119169, -- Redguard Keg, Hefty
+	119170, -- Redguard Couch", Padded
+	119171, -- Redguard Cabinet, Inlaid
+	119172, -- Redguard Armchair, Cushioned
+	119173, -- Redguard Cupboard, Lattice
+	119174, -- Redguard Vanity, Florid
+	119175, -- Redguard Counter, Corner
+	119176, -- Redguard Counter, Cabinet
+	119177, -- Redguard Shelf, Barrel
+	119178, -- Redguard Nightstand, Florid
+	119179, -- Redguard Divider, Florid
+	119180, -- Redguard Sofa, Desert Flame
+	119181, -- Redguard Tuffet, Flames
+	119182, -- Redguard Stool, Padded
+	119183, -- Redguard Bed, Wide Grand
+	119184, -- Redguard Bed, Full Arched
+	119185, -- Redguard Bowl, Hanging Star
+	119186, -- Redguard Urn, Star
+	119187, -- Redguard Footlocker, Braced
+	119188, -- Redguard Table, Grand Oasis
+	119189, -- Redguard Table, Oasis
+	119190, -- Redguard End Table, Oasis
+	119191, -- Redguard Trunk, Bolted
+	119192, -- Redguard Wine Rack, Sturdy
+	119193, -- Redguard Shelf, Arched
+	119194, -- Redguard Wardrobe, Inlaid
+	119195, -- Redguard Kabobs, Plate
+	119196, -- Redguard Runner, Sun
+	119197, -- Redguard Mat, Sunset
+	119198, -- Redguard Carpet, Dunes
+	119199, -- Redguard Tapestry, Lattice
+	119200, -- Redguard Satchel, Heavy
+	119201, -- Redguard Goblet, Empty
+	119202, -- Redguard Goblet, Full
+	119203, -- Redguard Spittoon, Gilded
+	119204, -- Redguard Cauldron, Clawfoot
+	119205, -- Redguard Sconce, Polished
+	119206, -- Redguard Mug, Empty
+	119207, -- Redguard Mug, Full
+	119208, -- Redguard Tankard, Empty
+	119209, -- Redguard Tankard, Full
+	119210, -- Redguard Streetlamp, Single
+	119211, -- Redguard Streetlamps, Paired
+	119212, -- Redguard Streetlamps, Triple
+	119213, -- Redguard Brazier, Robust
+	119214, -- Redguard Candlestick, Polished
+	119215, -- Redguard Candleholder, Polished
+	119216, -- Redguard Well, Arched
+	119217, -- Redguard Bowl, Gilded
+	119218, -- Redguard Censer, Hanging Bell
+	119219, -- Redguard Censer, Hanging Horn
+	119220, -- Redguard Basket, Closed
+	119221, -- Redguard Mat, Meditation
+	119222, -- Redguard Mat, Desert Sun
+	119223, -- Redguard Mat, Sunrise
+	119224, -- Redguard Awning, Desert Flame
+	119225, -- Redguard Tent, Scaled Flames
+	119226, -- Redguard Canopy, Dawn
+	119228, -- Redguard Caravan, Cargo
+	119229, -- Redguard Caravan, Merchant
+	119230, -- Redguard Brazier, Garish
+	119231, -- Redguard Urn, Mural
+	119232, -- Redguard Pillow, Sunset
+	119233, -- Redguard Pillow, Oasis
+	119234, -- Redguard Pillow, Florid Oasis
+	119235, -- Redguard Pillow Roll, Oasis
+	119236, -- Redguard Throw Pillow, Oasis
+	119238, -- Redguard Bed, Wide Canopy
+	119239, -- Redguard Couch", Slatted
+	119240, -- Redguard Bench", Padded
+	119241, -- Redguard Wardrobe, Braced
+	119242, -- Redguard Bookcase, Arched
+	119243, -- Redguard Wardrobe, Sturdy
+	119244, -- Redguard Bookcase, Piled
+	119245, -- Redguard Bookcase, Full
+	119246, -- Redguard Armchair, Starry
+	119247, -- Redguard Chair, Starry
+	119248, -- Redguard Desk, Bolted
+	119249, -- Redguard Vanity, Bolted
+	119250, -- Redguard Nightstand, Bolted
+	119251, -- Redguard Pot, Hanging Garish
+	119252, -- Redguard Table, Formal
+	119253, -- Redguard Table, Game
+	119254, -- Redguard Divider, Lattice
+	119255, -- Redguard Stool, Starry
+	119256, -- Redguard Footstool, Starry
+	119257, -- Redguard Cupboard, Sturdy
+	119258, -- Redguard Shelf, Bolted
+	119259, -- Redguard Wine Rack, Inlaid
+	119260, -- Redguard Bench", Arc
+	119261, -- Redguard Pot, Mosaic
+	119262, -- Redguard Pot, Hanging Mosaic
+	119263, -- Redguard Slices, Wax
+	119264, -- Redguard Runner, Oasis
+	119265, -- Redguard Mat, Desert
+	119266, -- Redguard Carpet, Mirage
+	119267, -- Redguard Tapestry, Oasis
+	119268, -- Redguard Chalice, Empty
+	119269, -- Redguard Chalice, Full
+	119270, -- Redguard Hourglass of Desert Sands
+	119271, -- Redguard Jar, Oasis
+	119272, -- Redguard Vase, Baroque
+	119273, -- Redguard Bottle, Delicate
+	119274, -- Redguard Jar, Baroque
+	119275, -- Redguard Decanter, Delicate
+	119276, -- Redguard Lantern, Delicate
+	119277, -- Redguard Streetlamps, Full
+	119278, -- Redguard Candelabra, Twisted
+	119279, -- Redguard Candelabra, Polished
+	119280, -- Redguard Chandelier, Polished
+	119281, -- Redguard Chandelier, Polished Grated
+	119282, -- Redguard Awning, Oasis
+	119283, -- Redguard Tent, Starry
+	119284, -- Redguard Firepit, Stone
+	119285, -- Redguard Counter, Block Island
+	119286, -- Redguard Counter, Bar Island
+	119287, -- Redguard Counter, Grill
+	119288, -- Redguard Brazier, Enchanted
+	119290, -- Redguard Canopy, Stars
+	119291, -- Redguard Pillow, Lattice Flames
+	119292, -- Redguard Pillow, Florid Flames
+	119293, -- Redguard Pillow, Florid Sunset
+	119295, -- Redguard Table, Inlaid
+	119296, -- Redguard Table, Grand Inlaid
+	119297, -- Redguard End Table, Tea
+	119298, -- Redguard Pillow Roll, Desert Flame
+	119299, -- Redguard Throw Pillow, Desert Flame
+	119300, -- Redguard Tuffet, Oasis
+	119301, -- Redguard End Table, Inlaid
+	119302, -- Redguard Decanter, Glass
+	119303, -- Redguard Bottle, Stained Glass
+	119304, -- Redguard Vial, Stained Glass
+	119305, -- Redguard Carpet, Oasis
+	119306, -- Redguard Mat, Mirage
+	119307, -- Redguard Mat, Starburst
+	119308, -- Redguard Lantern, Cannister
+	119309, -- Redguard Lamp, Caged
+	119310, -- Redguard Lantern, Caged
+	119311, -- Redguard Lantern, Caged Stand
+	119312, -- Redguard Tapestry, Starry
+	121373, -- Redguard Censer, Hanging Bulb
+	119314, -- Rough Stretcher, Military
+	119317, -- Rough Crate, Reinforced
+	119325, -- Rough Bag, Burlap
+	119328, -- Rough Hatchet, Practical
+	119330, -- Rough Knife, Butcher
+	119331, -- Rough Bowl, Common
+	119338, -- Rough Platform, Stage
+	119342, -- Rough Crate, Bolted
+	119344, -- Rough Box, Boarded
+	119348, -- Rough Container, Cargo
+	119350, -- Rough Bedroll, Basic
+	119351, -- Lettuce, Display
+	119352, -- Pumpkin, Display
+	119353, -- Winter Squash", Display
+	119354, -- Beet String, Display
+	119355, -- Garlic String, Display
+	119356, -- Beets, Display
+	119357, -- Common Counter, Island Stall
+	119358, -- Common Barrel, Sealed
+	119359, -- Common Basket, Closed
+	119360, -- Common Basket, Lid
+	119361, -- Common Basket, Open
+	119362, -- Common Basket, Tall
+	119363, -- Common Bucket, Basic
+	119364, -- Common Bucket, Rope
+	119365, -- Common Cargo, Covered
+	119366, -- Common Crate, Sealed
+	119367, -- Common Washtub, Empty
+	119368, -- Footstool, Block
+	119369, -- Common Trough
+	119370, -- Common Wheelbarrow, Flat
+	119371, -- Common Wheelbarrow, Barrel
+	119372, -- Common Wheelbarrow, Sided
+	119373, -- Apple, Display
+	119374, -- Common Pack, Backpack
+	119375, -- Common Pack, Satchel
+	119376, -- Banana, Wax
+	119377, -- Common Bowl of Soup, Display
+	119378, -- Carrots, Wax
+	119379, -- Common Cleaver, Cooking
+	119380, -- Common Pot, Cooking
+	119381, -- Grapes, Wax
+	119382, -- Common Inkwell, Practical
+	119383, -- Common Plate, Simple
+	119384, -- Common Plate, Setting
+	119385, -- Sugar Pumpkin, Wax
+	119386, -- Radish", Wax
+	119387, -- Bowl, Serving
+	119388, -- Common Bowl of Stew, Display
+	119389, -- Common Platter, Serving
+	119390, -- Common Skillet, Practical
+	119391, -- Common Candle, Set
+	119392, -- Common Candles, Pair
+	119393, -- Common Candle, Lasting
+	119394, -- Common Bookrest, Practical
+	119395, -- Common Post, Flag Pole
+	119396, -- Common Lantern, Hanging
+	119397, -- Common Lantern, Stationary
+	119399, -- Common Post, Sign Holder
+	119400, -- Hammer, Forge
+	119401, -- Tongs, Forge
+	119402, -- Potato, Wax
+	119403, -- Common Table, Slanted
+	119404, -- Common Cage, Hunting
+	119405, -- Common Trap, Hunting
+	119406, -- Common Cargo, Sealed
+	119407, -- Common Cargo, Reinforced
+	119408, -- Simple Blue Banner
+	119413, -- Cauldron of Soup
+	119416, -- Cauldron of Stew
+	119418, -- Cauldron, Covered
+	119420, -- Cart, Sided
+	119421, -- Coffin, Lid
+	119422, -- Coffin, Case
+	119423, -- Keg
+	119424, -- Cleaver, Butcher's
+	119425, -- Hearty Bread
+	119426, -- Bread, Plain
+	119427, -- Cheese Wedge
+	119428, -- Common Bowl, Serving
+	119429, -- Ham, Display
+	119432, -- Hourglass, Common
+	119438, -- Baked Potato, Display
+	119439, -- Pot Pie, Display
+	119440, -- Pie Dish", Empty
+	119443, -- Drumstick
+	119444, -- Candle, Group
+	119445, -- Lantern, Stationary
+	119446, -- Lantern, Hanging
+	119447, -- Candles, Lasting
+	119448, -- Minecart, Empty
+	119449, -- Minecart, Push
+	119450, -- Knife, Carving
+	119451, -- Kennel, Locked
+	119462, -- Plums, Bunch
+	119463, -- Tangerines, Bunch
+	119464, -- Peaches, Bunch
+	119465, -- Oranges, Bunch
+	119467, -- Cured Meat
+	119468, -- Cured Meats
+	119469, -- Cured Meat Chunks
+	119470, -- Cured Meat Chunk
+	119471, -- Cured Meat Pile
+	119472, -- Cured Meat Hock
+	119476, -- Grilling Rack
+	119477, -- Basket of Apples
+	119478, -- Basket of Apples, Full
+	119479, -- Basket of Lettuce
+	119480, -- Basket of Gourds
+	119481, -- Basket of Corn
+	119482, -- Basket of Tomatoes
+	119483, -- Gibbet, Single
+	119484, -- Bottle, Elixir
+	119485, -- Bottle, Liquor
+	119486, -- Vial, Delicate
+	119487, -- Pie Dish", Display
+	119488, -- Bottle, Wine
+	119489, -- Candle Set, Ritual
+	119490, -- Horn, Ritual
+	119491, -- Cured Meat Shank
+	119518, -- Cage, Wild Animal
+	119520, -- Cage, Covered
+	119524, -- Stockade
+	119525, -- Bread, Braided
+	119526, -- Goblet, Wine
+	119527, -- Bread, Round
+	119529, -- Bread Loaves, Round
+	119532, -- Bread, Hearty Loaves
+	119533, -- Box of Plums
+	119539, -- Sweetroll
+	119540, -- Desk, Engraved
+	119541, -- Fish", Small
+	119542, -- Fish", Medium
+	119543, -- Fish", Large
+	119592, -- Target Skeleton, Humanoid
+
+
+	-- Rollis's recipes
+	121200, -- Cabinet, Poisonmaker's
+	121166, -- Podium, Skinning
+	121168, -- Tools, Case
+	121199, -- Mortar and Pestle
+	121214, -- Orcish Skull Goblet, Full
+	121163, -- Apparatus, Boiler
+	121197, -- Bottle, Poison Elixir
+	121164, -- Case of Vials
+	121209, -- Orcish Tapestry, Spear
+	121207, -- Orcish Table with Fur
+	121207, -- Orcish Table with Fur
+	121315, -- Target Skeleton, Robust Humanoid
+	119592, -- Target Skeleton, Humanoid
+
+	121311, -- Breton Throne
+	121120, -- Chair, Carved
+	121308, -- High Elf Banner, Gilded
+
+	121546, -- Argonian Box, Woven
+	121374, -- Redguard Censer, Hanging Disc
+	121108, -- Simple Brown Banner
+	121310, -- High Elf Sconce, Winged
+	121307, -- Orcish Brazier, Pillar
+
+	-- 116214, -- Nord Banner, Bear
+	-- 115786, -- Argonian Skiff, Common Reed
+
+
+	121207, -- Orcish Table with Fur
+	121203, -- Khajiit Brazier, Enchanted
+	121201, -- Sack of Beans
+
+
+	121111, -- Simple Red Banner
+	121110, -- Simple Purple Banner
+	121109, -- Simple Gray Banner
+	121372, -- Noble Standing Cauldron
+
+	121101, -- Sack of Millet,
+	121100, -- Common Stewpot, Hanging
+	121091, -- Stool, Carved
+	121059, -- Rough Cup, Empty
+
+	121313, -- Wood Elf Throne, Vine
+	121104, -- Common Quill, Feather
+
+	121305, -- Redguard Chandelier, Dark
+	121304, -- Redguard Chandelier, Grated
+	121366, -- Orcish Tapestry, Hunt
+	121365, -- High Elf Tapestry, Gilded
+}
diff --git a/data/Homestead/H_Rollis.lua b/data/Homestead/H_Rollis.lua
new file mode 100644
index 0000000..3a6f647
--- /dev/null
+++ b/data/Homestead/H_Rollis.lua
@@ -0,0 +1,35 @@
+FurC.Rollis 		= FurC.Rollis or {}
+FurC.Rollis_Recipes = FurC.Rollis_Recipes or {}
+
+
+FurC.Rollis[FURC_HOMESTEAD] = {
+	-- Alchemy station
+	[118328] = 35,
+	-- Blacksmithing station
+	[119781] = 35,
+	-- Clothing station
+	[119707] = 35,
+	-- Dye Station
+	[118329] = 35,
+	-- Enchanting station
+	[118330] = 35,
+	-- Provisioning station
+	[118327] = 35,
+	-- Woodworking station
+	[119744] = 35,
+
+	-- Attunable Blacksmithing station
+	[119594] = 250,
+	-- Attunable Clothing station
+	[119821] = 250,
+	-- Attunable Woodworking station
+	[119822] = 250,
+}
+
+FurC.Rollis_Recipes[FURC_HOMESTEAD] = {
+	 121207,	-- Target Skeleton
+	 121315,	-- Robust Target Skeleton
+	 126582,	-- Target Centurion
+	 126583,	-- Robust Target Centurion
+}
+
diff --git a/data/LuxuryFurnisher.lua b/data/LuxuryFurnisher.lua
new file mode 100644
index 0000000..2aa8c74
--- /dev/null
+++ b/data/LuxuryFurnisher.lua
@@ -0,0 +1,417 @@
+FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
+FurC.LuxuryFurnisher[FURC_DRAGONS] = {
+
+	[134833] = {	-- Gibbet, Hanging Hooked
+		itemPrice 	= 75000,
+		itemDate	= "2018-04-21",
+	},
+
+	[120826] = {	-- Iron Cross
+		itemPrice 	= 10000,
+		itemDate	= "2017-04-21",
+	},
+	[120825] = {	-- Iron Cross, Large
+		itemPrice 	= 25000,
+		itemDate	= "2017-04-21",
+	},
+	[120827] = {	-- Iron Maiden, Chained
+		itemPrice 	= 20000,
+		itemDate	= "2017-04-21",
+	},
+
+
+
+	[134832] = {	-- Basin of the Divines
+		itemPrice 	= 35000,
+		itemDate	= "2018-04-14",
+	},
+    [120823] = {	-- Sigil Stand
+		itemPrice 	= 15000,
+		itemDate	= "2018-04-14",
+	},
+    [120819] = {	-- Sigil, Kynareth
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-14",
+	},
+    [120820] = {	-- Sigil, Mara
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-14",
+	},
+    [120821] = {	-- Sigil, Stendarr
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-14",
+	},
+    [120822] = {	-- Sigil, Zenithar
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-14",
+	},
+
+
+    [120823] = {	-- Sigil Stand
+		itemPrice 	= 15000,
+		itemDate	= "2018-04-07",
+	},
+	[120815] = {	-- Sigil, Akatosh
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-07",
+	},
+	[120816] = {	-- Sigil, Arkay
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-07",
+	},
+	[120817] = {	-- Sigil, Dibella
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-07",
+	},
+	[120818] = {	-- Sigil, Julianos
+		itemPrice 	= 20000,
+		itemDate	= "2018-04-07",
+	},
+	[134831] = {	-- Altar of the Divines
+		itemPrice 	= 50000,
+		itemDate	= "2018-04-07",
+	},
+
+	[134830] = {	-- Flowers, Blue Starbloom
+		itemPrice 	= 15000,
+		itemDate	= "2018-03-31",
+	},
+	[120888] = {	-- Bat Bloom
+		itemPrice 	= 10000,
+		itemDate	= "2018-03-31",
+	},
+	[120887] = {	-- Fan Bush
+		itemPrice 	= 1000,
+		itemDate	= "2018-03-31",
+	},
+	[120889] = {	-- Glow Bush, Purple
+		itemPrice 	= 20000,
+		itemDate	= "2018-03-31",
+	},
+	-- April, 7-9
+	[120885] = {	-- Alik'r Cactus
+		itemPrice 	= 2000,
+		itemDate	= "2018-03-24",
+	},
+	[120884] = {	-- Buckthorn
+		itemPrice 	= 4000,
+		itemDate	= "2018-03-24",
+	},
+	[120883] = {	-- Voidflower
+		itemPrice 	= 5000,
+		itemDate	= "2018-03-24",
+	},
+	[134829] = {	-- Fern, Woody Slough
+		itemPrice 	= 3000,
+		itemDate	= "2018-03-24",
+	},
+	[120886] = {	-- White Hosta
+		itemPrice 	= 3000,
+		itemDate	= "2018-03-24",
+	},
+	[134828] = {	-- Antler Coral, Branched Spiree
+		itemPrice 	= 100000,
+		itemDate	= "2018-03-17",
+	},
+	[120847] = {	-- Dock Winch
+		itemPrice 	= 4000,
+		itemDate	= "2018-03-17",
+	},
+	[120849] = {	-- Anchor
+		itemPrice 	= 10000,
+		itemDate	= "2018-03-17",
+	},
+	[120848] = {	-- Fishing Pole Rack
+		itemPrice 	= 2500,
+		itemDate	= "2018-03-17",
+	},
+	[121269] = {	-- Ocean Antler Coral
+		itemPrice 	= 7500,
+		itemDate	= "2018-03-31",
+	},
+	[121268] = {	-- Fisher's Catch of the Day Rack
+		itemPrice 	= 5000,
+		itemDate	= "2018-03-10",
+	},
+	[120850] = { -- Harbor Floats
+		itemPrice 	= 5000,
+		itemDate	= "2018-03-10",
+	},
+	[120846] = { -- Dock Rope Wheel
+		itemPrice 	= 3000,
+		itemDate	= "2018-03-10",
+	},
+	[134827] = { -- Mooring Line, Coiled
+		itemPrice 	= 7500,
+		itemDate	= "2018-03-10",
+	},
+	[134826] = { -- Mooring Line, Tidy
+		itemPrice 	= 5000,
+		itemDate	= "2018-03-10",
+	},
+	[120806] = {	-- Hew'S Bane Candlestick
+		itemPrice 	= 2500,
+		itemDate	= "2018-03-03",
+	},
+	[120805] = {	-- Hew's Bane Rug
+		itemPrice 	= 5000,
+		itemDate	= "2018-03-03",
+	},
+	[120807] = {	-- Hew's Bane Well
+		itemPrice 	= 10000,
+		itemDate	= "2018-03-03",
+	},
+	[134825] = {	-- Redguard Tent, Squared Silk
+		itemPrice 	= 100000,
+		itemDate	= "2018-03-03",
+	},
+	[117876] = {	-- Wedding Curtain, Wide
+		itemPrice 	= 7500,
+		itemDate	= "2018-02-10",
+	},
+	[134469] = { -- Ayleid Constellation Stele, the Mage
+		itemPrice	= 20000,
+		itemDate	= "2018-02-30",
+	},
+	[134470] = { -- Ayleid Constellation Stele, Thief
+		itemPrice	= 20000,
+		itemDate	= "2018-02-30",
+	},
+	[134471] = { -- Ayleid Constellation Stele, Warrior
+		itemPrice	= 20000,
+		itemDate	= "2018-02-30",
+	},
+	[117875] = {	-- Wedding Gazebo, Bare
+		itemPrice 	= 35000,
+		itemDate	= "2018-02-17",
+	},
+	[134824] = {	-- Redguard Tent, Rounded Silk
+		itemPrice 	= 100000,
+		itemDate	= "2018-02-24",
+	},
+}
+FurC.LuxuryFurnisher[FURC_CLOCKWORK] = {
+	[134466] = { -- Ayleid Sconce, Empty
+		itemPrice	= 4000,
+		itemDate	= "2018-01-27",
+	},
+	[134467] = { -- Culanda Stone ,Glowing
+		itemPrice	= 5000,
+		itemDate	= "2018-01-27",
+	},
+	[134465] = { -- Varla Stone ,Glowing
+		itemPrice	= 5000,
+		itemDate	= "2018-01-27",
+	},
+	[134463] = { -- Riekling Brazier, Ceremonial
+		itemPrice	= 4000,
+		itemDate	= "2018-01-19",
+	},
+	[134462] = { -- Riekling Grinding Stone
+		itemPrice	= 450,
+		itemDate	= "2018-01-19",
+	},
+	[134461] = { -- Riekling Tanning Rack, Stretched
+		itemPrice	= 450,
+		itemDate	= "2018-01-19",
+	},
+	[134457] = {	-- Riekling Bedding, Icy Straw
+		itemPrice 	= 2500,
+		itemDate	= "2018-01-12",
+	},
+	[134458] = {	-- Riekling Pelt, Boar
+		itemPrice 	= 4000,
+		itemDate	= "2018-01-12",
+	},
+	[134459] = {	-- Riekling Pit, Ash and Bone
+		itemPrice 	= 7500,
+		itemDate	= "2018-01-12",
+	},
+	[134453] = {	-- Ancient Orcish Counterweight
+		itemPrice 	= 20000,
+		itemDate	= "2018-01-05",
+	},
+	[134450] = {	-- Seal of Clan Morkul, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2018-01-05",
+	},
+	[134451] = {	-- Seal of Clan Shatul, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2018-01-05",
+	},
+	[134452] = {	-- Seal of Clan Tumnosh, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2018-01-05",
+	},
+	-- Dec. 30thst
+	[134442] = {	-- Seal of Clan Bagrakh, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2017-12-29",
+	},
+	[134443] = {	-- Seal of Clan Fharun, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2017-12-29",
+	},
+	[134444] = {	-- Seal of Clan Igrun, Stone
+		itemPrice 	= 4000,
+		itemDate	= "2017-12-29",
+	},
+	[134446] = {	-- Ancient Orcish Sarcophagus Lid
+		itemPrice 	= 10000,
+		itemDate	= "2017-12-29",
+	},
+	[134445] = {	-- Ancient Orcish Sarcophagus, Peaked
+		itemPrice 	= 14000,
+		itemDate	= "2017-12-29",
+	},
+	-- Dec. 23rd
+	[134439] = {	-- Clockwork Alchemy Flask
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-22",
+	},
+	[134438] = {	-- Clockwork Alchemy Rack, Tubes
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-22",
+	},
+	[134440] = {	-- Clockwork Alchemy Titration Stand
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-22",
+	},
+	-- Dec. 16th
+	[134435] = {	-- Clockwork Loom, Sturdy
+		itemPrice 	= 20000,
+		itemDate	= "2017-12-15",
+	},
+	[134434] = {	-- Quality Fabric, Stacked
+		itemPrice 	= 450,
+		itemDate	= "2017-12-15",
+	},
+	[134436] = {	-- Spool, Blue Thread
+		itemPrice 	= 450,
+		itemDate	= "2017-12-15",
+	},
+	-- Dec. 8th
+	[134432] = {	-- Banker's Sign, Small
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-08",
+	},
+	[134431] = {	-- Merchant's Sign, Small
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-08",
+	},
+	[134433] = {	-- Stablemaster's Sign, Small
+		itemPrice 	= 3000,
+		itemDate	= "2017-12-08",
+	},
+	-- Dec. 1st
+	[134428] = {	-- Banker's Sign, Large
+		itemPrice 	= 12000,
+		itemDate	= "2017-12-01",
+	},
+	[134429] = {	-- Merchant's Sign, Large
+		itemPrice 	= 12000,
+		itemDate	= "2017-12-01",
+	},
+	[134430] = {	-- Stablemaster's Sign, Large
+		itemPrice 	= 12000,
+		itemDate	= "2017-12-01",
+	},
+	-- Nov. 25th
+	[134424] = {	-- Clockwork Gear Display, Bell Jar
+		itemPrice 	= 2500,
+		itemDate	= "2017-11-24",
+	},
+	[134423] = {	-- Clockwork Gear Display, Tall Jar
+		itemPrice 	= 3000,
+		itemDate	= "2017-11-24",
+	},
+	[134426] = {	-- Clockwork Globe, Stand
+		itemPrice 	= 4000,
+		itemDate	= "2017-11-24",
+	},
+	[134425] = {	-- Clockwork Orrery, Compact
+		itemPrice 	= 20000,
+		itemDate	= "2017-11-24",
+	},
+	-- Nov. 18th
+	[134419] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-24",
+	},
+	[134420] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-24",
+	},
+	[134421] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-24",
+	},
+	[134418] = {	-- Clockwork Telescope, Surveyor's
+		itemPrice = 15000,
+		itemDate	= "2017-11-24",
+	},
+	-- Nov. 18th
+	[134419] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-17",
+	},
+	[134420] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-17",
+	},
+	[134421] = {	-- Clockwork Calibration Guide
+		itemPrice = 50000,
+		itemDate	= "2017-11-17",
+	},
+	[134418] = {	-- Clockwork Telescope, Surveyor's
+		itemPrice = 15000,
+		itemDate	= "2017-11-17",
+	},
+	-- Nov. 11th
+	[118285] = {	-- Carcass, Fresh Pheasant
+		itemPrice = 7500,
+		itemDate	= "2017-11-10",
+	},
+	[118292] = {	-- Elk Head, Wall Mount
+		itemPrice = 20000,
+		itemDate	= "2017-11-10",
+	},
+	[116506] = {	-- Orcish Grand Table with Skins
+		itemPrice = 50000,
+		itemDate	= "2017-11-10",
+	},
+	[118243] = {	-- Tapestry, Echatere Pelt
+		itemPrice = 25000,
+		itemDate	= "2017-11-10",
+	},
+	-- Nov. 4th
+	[118286] = {	-- Carcass, Grey Hare
+		itemPrice = 5000,
+		itemDate	= "2017-11-03",
+	},
+	[118281] = {	-- Carcass, Hanging Geese
+		itemPrice = 7000,
+		itemDate	= "2017-11-03",
+	},
+	[118279] = {	-- Deer Head, Wall Mount
+		itemPrice = 15000,
+		itemDate	= "2017-11-03",
+	},
+	[118298] = {	-- Wolf Head, Wall Mount
+		itemPrice = 20000,
+		itemDate	= "2017-11-03",
+	},
+	-- Oct 28th
+	[132143] = {	-- Reach Sapling, Briarheart
+		itemPrice = 50000,
+		itemDate	= "2017-10-27",
+	},
+	[132158] = {	-- Witch's Remains, Offering
+		itemPrice = 50000,
+		itemDate	= "2017-10-27",
+	},
+	[132157] = {	-- Witch's Remains, Sacrificial
+		itemPrice = 50000,
+		itemDate	= "2017-10-27",
+	},
+}
\ No newline at end of file
diff --git a/data/MiscItemSources.lua b/data/MiscItemSources.lua
new file mode 100644
index 0000000..2726693
--- /dev/null
+++ b/data/MiscItemSources.lua
@@ -0,0 +1,296 @@
+-- use constants because it's a huge performance gain due to how LUA handles strings... at least unless siri lied :P
+
+local FURC_CANBEPICKED_WW		= GetString(SI_FURC_CANBEPICKED) .. " from woodworkers"
+local FURC_CANBEPICKED_ASS 	    = GetString(SI_FURC_CANBEPICKED) .. " from outlaws and assassins"
+local FURC_CANBEPICKED_GUARD	= GetString(SI_FURC_CANBEPICKED) .. " from guards"
+
+
+local FURC_CANBESTOLENINCC 		= GetString(SI_FURC_CANBESTOLEN) .. " in Clockwork City"
+local FURC_CANBESTOLEN_SCHOLARS = GetString(SI_FURC_CANBESTOLEN) .. " from scholars"
+local FURC_CANBESTOLEN_NERDS	= FURC_CANBESTOLEN_SCHOLARS      .. " and mages"
+local FURC_CANBESTOLEN_RELIG	= GetString(SI_FURC_CANBESTOLEN) .. " from priests and pilgrims"
+local FURC_CANBESTOLEN_THIEF	= GetString(SI_FURC_CANBESTOLEN) .. " from thieves"
+local FURC_CANBESTOLEN_WW	    = GetString(SI_FURC_CANBESTOLEN) .. " from woodworkers"
+
+
+local FURC_CANBESTOLEN_WROTHGAR	= GetString(SI_FURC_CANBESTOLEN) .. " in Wrothgar"
+
+local FURC_AUTOMATON_CC			= GetString(SI_FURC_AUTOMATON) .. " in Clockwork City"
+local FURC_AUTOMATON_VV			= GetString(SI_FURC_AUTOMATON) .. " on Vvardenfell"
+
+local FURC_HARVEST_CHARBOR		= GetString(SI_FURC_HARVEST) .. " in Coldharbour"
+
+local FURC_SCAMBOX_F_ATRO		= zo_strformat("<<1>> (<<2>>)",
+                                                GetString(SI_FURC_SCAMBOX), GetString(SI_FURC_FLAME_ATRONACH))
+
+local FURC_DB_POISON			= zo_strformat("<<1>> <<2>>", GetString(SI_FURC_DB), GetString(SI_FURC_DB_POISON))
+local FURC_DB_SNEAKY			= zo_strformat("<<1>> <<2>>", GetString(SI_FURC_DB), GetString(SI_FURC_DB_STEALTH))
+
+local function getCrownStorePriceString(price)
+    return string.format("%s (%u)", GetString(SI_FURC_CROWNSTORESOURCE), price)
+end
+
+local function getScamboxString(scamboxVersion)
+    return string.format("%s (%s)", GetString(SI_FURC_SCAMBOX), GetString(scamboxVersion))
+end
+
+
+FurC.MiscItemSources 	= {
+
+	[FURC_DRAGONS] = { -- Reach
+		[FURC_DROP] = {
+            [134909] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Puspocket Group
+            [134910] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Puspocket Cluster
+            [134911] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Puspocket Sporecap
+            [134912] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Large Puspocket
+            [134913] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushroom, Tall Puspocket
+            [134914] = GetString(SI_FURC_DRAGON_DUNGEON_DROP), 	-- Mushrooms, Large Puspocket Cluster
+        },
+
+		[FURC_JUSTICE] 	= {},
+		[FURC_CROWN] 	= {
+			[134970] = getCrownStorePriceString(100), 	-- Mushrooms, Glowing Sprawl
+			[134947] = getCrownStorePriceString(100), 	-- Mushrooms, Glowing Field
+			[134948] = getCrownStorePriceString(400),	-- Mushrooms, Glowing Cluster
+			[134971] = getCrownStorePriceString(400),	-- Candles, Votive Group
+			[134872] = getCrownStorePriceString(400),	-- Ancient Nord Brazier, Dragon Crest
+			[134863] = getCrownStorePriceString(400),	-- Ancient Nord Sconce, Dragon Crest
+			[134972] = getCrownStorePriceString(400),	-- Brotherhood Brazier, Wrought Iron
+			[134849] = getCrownStorePriceString(400),	-- Monarch Butterfly Flock
+			[134848] = getCrownStorePriceString(400),	-- Blue Butterfly Flock
+			[94100]  = getCrownStorePriceString(50),	-- Imperial BookCase, Swirled
+			[130211]  = getCrownStorePriceString(50),	-- Books, Ordered Row
+			[130210]  = getCrownStorePriceString(50),	-- Books, Scattered Row
+		}
+	},
+	[FURC_CLOCKWORK] = { -- Reach
+		[FURC_DROP] = {
+			[134407] = FURC_AUTOMATON_CC,			-- Factotum Torso, Obsolete
+			[134404] = FURC_AUTOMATON_CC,			-- Factotum Knee, Obsolete
+			[134408] = FURC_AUTOMATON_CC,			-- Factotum Elbow, Obsolete
+			[134405] = FURC_AUTOMATON_CC,			-- Factotum Arm, Obsolete
+			[134409] = FURC_AUTOMATON_CC,			-- Factotum Head, Obsolete
+			[134406] = FURC_AUTOMATON_CC,			-- Factotum Body, Obsolete
+
+		},
+		[FURC_JUSTICE] 	= {
+			[134410] = FURC_CANBESTOLENINCC, 		    -- Clockwork Crank, Miniature
+			[134411] = FURC_CANBESTOLENINCC, 		    -- Clockwork Gear Shaft, Miniature
+			[134412] = FURC_CANBESTOLENINCC, 		    -- Clockwork Piston, Miniature
+			[134413] = FURC_CANBESTOLENINCC, 		    -- Clockwork Magnifier, Handheld
+			[134414] = FURC_CANBESTOLENINCC, 		    -- Clockwork Micrometer, Handheld
+			[134415] = FURC_CANBESTOLENINCC, 		    -- Clockwork Dial Calipers, Handheld
+			[134416] = FURC_CANBESTOLENINCC, 		    -- Clockwork Slide Calipers, Handheld
+			[134402] = GetString(SI_FURC_CANBESTOLEN), 	-- Spool, Empty
+			[134400] = GetString(SI_FURC_CANBESTOLEN), 	-- Soft Leather, Stacked
+			[134401] = GetString(SI_FURC_CANBESTOLEN), 	-- Soft Leather, Folded
+			[134417] = GetString(SI_FURC_CANBESTOLEN), 	-- Calipers, Handheld
+			[134399] = GetString(SI_FURC_CANBESTOLEN), 	-- Quality Fabric, Folded
+			[117939] = FURC_CANBESTOLEN_WW, 		    -- Rough Axe, Practical
+		},
+		[FURC_CROWN] 	= {
+			[134266] = getCrownStorePriceString(80), 	-- Daedric Books, Stacked
+			[134265] = getCrownStorePriceString(80), 	-- Daedric Books, Piled
+
+		}
+	},
+
+	[FURC_REACH] = { -- Reach
+		[FURC_JUSTICE] 	= {
+			[130191] = GetString(SI_FURC_CANBESTOLEN), 			-- Shivering Cheese
+			[118206] = FURC_CANBESTOLEN_THIEF, 		            -- Gaming dice
+		},
+		[FURC_CROWN] 	= {
+			[131423] = getCrownStorePriceString(750),
+		},
+		[FURC_DROP] 	= {
+			-- Coldharbour items
+			[130284] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Seedlings
+			[131422] = FURC_HARVEST_CHARBOR, 		-- Flower Patch, Glowstalks
+			[130283] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Sprout
+			[130285] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Young
+			[131420] = FURC_HARVEST_CHARBOR, 		-- Shrub, Glowing Thistle
+			[130281] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Towering
+			[130282] = FURC_HARVEST_CHARBOR, 		-- Glowstalk, Strong
+
+			[130067] = GetString(SI_FURC_DAEDRA_SOURCE), 			-- Daedric Chain Segment
+		},
+
+	},
+	[FURC_MORROWIND]	= { -- Morrowind
+		[FURC_DROP] 	= {
+
+			-- Dwemer parts
+			[126660] = FURC_AUTOMATON_VV, 			-- Dwemer Gear, Tiered
+			[126659] = FURC_AUTOMATON_VV, 			-- Dwemer Gear, Flat
+
+			-- lootable in tombs
+			[126754] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Seeker
+			[126705] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Wisdom
+			[126704] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Majesty
+			[126706] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Knowledge
+			[126701] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Nerevar
+			[126764] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Prowess
+			[126702] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Reverance
+			[126700] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Honor
+			[126703] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Mourning
+			[126572] = GetString(SI_FURC_TOMBS), 					-- Velothi Shroud, Mysteries
+
+			[126773] = GetString(SI_FURC_TOMBS), 					-- Velothi Caisson, Crypt
+			[126753] = GetString(SI_FURC_TOMBS),					-- Velothi Cerecloth, Austere
+			[126758] = GetString(SI_FURC_TOMBS),					-- Velothi Mat, Prayer
+			[126757] = GetString(SI_FURC_TOMBS),
+
+
+			[126462] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Volcanic
+			[126463] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Forest
+			[126464] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Oversized Valley
+
+            [126465] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Volcanic
+			[126466] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Forest
+			[126467] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Modest Valley
+
+            [126468] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Volcanic
+            [126469] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Forest
+            [126470] = GetString(SI_FURC_DROP_CHEST_VVARDENFELL),     -- Telvanni Painting, Classic Valley
+
+
+			[126592] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Volcano
+			[126593] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tryptich, Volcano
+			[126594] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Classic Volcano
+			[126595] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Modest Volcano
+			[126596] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tapestry, Volcano
+			[126597] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Oversized Volcano
+
+            [126598] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Waterfall
+            [126599] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tryptich, Geyser
+			[126600] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Tapestry, Geyser
+			[126601] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Oversized Geyser
+			[126602] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Classic Geyser
+			[126603] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Painting, Modest Geyser
+			[126604] = GetString(SI_FURC_VVARDENFELL_PAINTING),     -- Velothi Panels, Geyser
+
+
+			-- Ashlander dailies
+			[126119] = GetString(SI_FURC_DAILY_ASHLANDERS), 		-- Crimson Shard of Moonshadow
+			[126393] = GetString(SI_FURC_DAILY_ASHLANDERS), 		-- Crimson Shard of Moonshadow
+
+			-- drops from plants
+			[125631] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
+			[125647] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
+			[131420] = GetString(SI_FURC_PLANTS), 					-- Plants, Ash Frond
+			[125553] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage Stalks
+			[125551] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage
+			[125552] = GetString(SI_FURC_PLANTS), 					-- Flowers, Netch Cabbage Patch
+			[125543] = GetString(SI_FURC_PLANTS), 					-- Fern, Ashen
+			[125633] = GetString(SI_FURC_PLANTS), 					-- Plants, Hanging Pitcher Pair
+
+            [130280] = GetString(SI_FURC_WW), 					    -- Sapling, Petrified Ashen
+
+
+            [126592] = GetString(SI_FURC_PLANTS), 					-- Plants, Hanging Pitcher Pair
+
+		},
+		[FURC_CROWN] 	= {
+		},
+		[FURC_JUSTICE] 	= {
+			[126481] = FURC_CANBESTOLEN_RELIG, 		-- Indoril Incense, Burning
+		},
+	},
+	[FURC_HOMESTEAD]	= {
+		[FURC_JUSTICE] 	= {
+				-- stealing
+			[118489] = FURC_CANBESTOLEN_SCHOLARS, 	        -- Papers, Stack
+			[118528] = GetString(SI_FURC_CANBESTOLEN), 		-- Signed Contract
+			[118890] = GetString(SI_FURC_CANBESTOLEN), 		-- Skull, Human
+			[118487] = FURC_CANBESTOLEN_SCHOLARS, 	        -- Letter, Personal
+			[120008] = FURC_CANBESTOLEN_NERDS, 		        -- Lesser Soul Gem, Empty
+			[120005] = FURC_CANBESTOLEN_NERDS, 		        -- Medium Soul Gem, Empty
+
+			-- Bounty Sheets
+			[118711] = FURC_CANBEPICKED_GUARD, 				-- Argonian Male
+			[118709] = FURC_CANBEPICKED_GUARD, 				-- Breton Male
+			[118712] = FURC_CANBEPICKED_GUARD, 				-- Breton Woman
+			[118715] = FURC_CANBEPICKED_GUARD, 				-- Colovian Man
+			[118710] = FURC_CANBEPICKED_GUARD, 				-- High Elf Male
+			[118714] = FURC_CANBEPICKED_GUARD, 				-- Imperial Man
+			[118713] = FURC_CANBEPICKED_GUARD, 				-- Khajiiti Male
+			[118716] = FURC_CANBEPICKED_GUARD, 				-- Orc Female
+			[118717] = FURC_CANBEPICKED_GUARD, 				-- Orc Male
+
+            [116512] = FURC_CANBESTOLEN_WROTHGAR,		    -- Orcish Carpet Blood
+
+
+		},
+		[FURC_FISHING] 	= {
+			-- fishing
+			[118902] = GetString(SI_FURC_CANBEFISHED), 		-- Coral, Sun
+			[118903] = GetString(SI_FURC_CANBEFISHED), 		-- Coral, Crown
+			[118896] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Sandcake
+			[118901] = GetString(SI_FURC_CANBEFISHED), 		-- Sea sponge
+			[118338] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Bass
+			[118339] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Salmon
+			[118337] = GetString(SI_FURC_CANBEFISHED), 		-- Fish, Trout
+			[120753] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Green Pile
+			[120755] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Lush Pile
+			[120754] = GetString(SI_FURC_CANBEFISHED), 		-- Kelp, Small Pile
+			[118897] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Pink Scallop
+			[118898] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, White Scallop
+			[118899] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Starfish
+			[118900] = GetString(SI_FURC_CANBEFISHED), 		-- Seashell, Noble Starfish
+
+		},
+		[FURC_DROP]		= {
+			[121058] = FURC_DB_SNEAKY, 						-- Candles of Silence
+
+			[119936] = FURC_DB_POISON, 						-- Poisoned Blood
+			[119938] = FURC_DB_POISON, 						-- Light and Shadow
+			[119952] = FURC_DB_POISON, 						-- Sacrificial Heart
+
+            -- Paintings
+			[118216] = GetString(SI_FURC_CHESTS), 		        -- Painting of Spring, Sturdy
+			[118217] = GetString(SI_FURC_CHESTS), 		        -- Painting of Pasture, Sturdy
+			[118218] = GetString(SI_FURC_CHESTS), 		        -- Painting of Creek, Sturdy
+			[118219] = GetString(SI_FURC_CHESTS), 		        -- Painting of Lakes, Sturdy
+			[118220] = GetString(SI_FURC_CHESTS), 		        -- Painting of Crags, Sturdy
+			[118221] = GetString(SI_FURC_CHESTS), 		        -- Painting of Summer, Sturdy
+			[118222] = GetString(SI_FURC_CHESTS), 		        -- Painting of Jungle, Sturdy
+			[118223] = GetString(SI_FURC_CHESTS), 		        -- Painting of Palms, Sturdy
+			[190912] = GetString(SI_FURC_CHESTS), 		        -- Painting of Lake, Sturdy
+
+        },
+		[FURC_CROWN]	= {
+			[118096] = getCrownStorePriceString(10), 			-- Bread, Plain
+			[118098] = getCrownStorePriceString(10), 			-- Common Bowl, Serving
+			[118061] = getCrownStorePriceString(15), 			-- Chicken Dinner, Display
+			[118062] = getCrownStorePriceString(15), 			-- Chicken Meal, Display
+			[118056] = getCrownStorePriceString(15), 			-- Common Stewpot, Hanging
+			[118121] = getCrownStorePriceString(15), 			-- Knife, Carving
+			[118066] = getCrownStorePriceString(15), 			-- Steak Dinner
+
+			[118057] = getCrownStorePriceString(20), 				-- Sack of Beans
+			[118060] = getCrownStorePriceString(20), 				-- Sack of Grain
+			[118059] = getCrownStorePriceString(20), 				-- Sack of Millet,
+			[118058] = getCrownStorePriceString(20), 				-- Sack of Rice
+
+			[134473] = getScamboxString(SI_FURC_FLAME_ATRONACH),    -- Malacath Banner
+
+
+
+			[118064] = getCrownStorePriceString(45), 			-- Common Barrel, Dry
+			[118065] = getCrownStorePriceString(45), 			-- Common Cargo Crate, Dry
+			[118064] = getCrownStorePriceString(45), 			-- Common Barrel, Dry
+
+			[118054] = getCrownStorePriceString(80), 			-- Common Firepit, Outdoor
+			[118055] = getCrownStorePriceString(80), 			-- Common Firepit, Piled
+			[118126] = getCrownStorePriceString(95), 			-- Plaque, Standard
+
+			[118068] = getCrownStorePriceString(120), 			-- Simple Brown Banner
+			[118069] = getCrownStorePriceString(120), 			-- Simple Gray Banner
+			[118071] = getCrownStorePriceString(120), 			-- Simple Red Banner
+			[118070] = getCrownStorePriceString(120), 			-- Simple Purple Banner
+
+			[115698] = getCrownStorePriceString(1100), 		-- Khajiit Statue, Guardian
+		}
+	},
+}
diff --git a/data/Morrowind/M_AchievementVendors.lua b/data/Morrowind/M_AchievementVendors.lua
new file mode 100644
index 0000000..2839f0f
--- /dev/null
+++ b/data/Morrowind/M_AchievementVendors.lua
@@ -0,0 +1,375 @@
+
+--[[
+			[""] = {		--
+				itemPrice 		= 100,
+			},
+]]
+function tableMerge(t1, t2)
+	if nil == t2 and nil == t1 then
+		return {}
+	elseif nil == t2 then
+		return t1
+	elseif nil == t1 then
+		return t2
+	end
+
+    for k,v in pairs(t2) do
+		t1[k] = v
+    end
+    return t1
+end
+
+local bookList = {
+	-- [120197] = { -- 16 accords of madness, vol vi
+		-- itemPrice = 500,
+	-- },
+}
+
+local boxes = {}
+local b2 = {
+	[120998] = {	-- Block,Wood Cutting
+		itemPrice 		= 100,
+	},
+	[117959] = {		-- Rough Container, Shipping
+		itemPrice 		= 100,
+	},
+	[117959] = {		-- Rough Box, Slatted
+		itemPrice 		= 100,
+	},
+	[117931] = {		-- Rough Crate Lid
+		itemPrice 		= 100,
+	},
+	[117957] = {		-- Rough Crate, Cracked
+		itemPrice 		= 100,
+	},
+	[117958] = {		-- Rough Crate, Empty
+		itemPrice 		= 100,
+	},
+	[117930] = {		-- Rough Crate, Open
+		itemPrice 		= 100,
+	},
+	[117953] = {		-- Rough Crate, Sealed
+		itemPrice 		= 100,
+	},
+	[117928] = {		-- Rough Crate, Sturdy
+		itemPrice 		= 100,
+	},
+}
+FurC.Books[FURC_MORROWIND] = bookList
+
+FurC.AchievementVendors[FURC_MORROWIND] = {
+	["Vivec City, Saint Delyn Inn"] = {
+		["Drops-No-Glass"] = {
+			[126638] = { -- Ashlander Altar, Anticipations
+				itemPrice 		= 50000,
+				achievement 	= 1825, -- Clanfriend
+			},
+			[126640] = { -- Ashlander Fence, Totems
+				itemPrice 		= 10000,
+				achievement 	= 1881, -- Ashlander Relic Preserver
+			},
+			[126613] = { -- Ashlander Throne
+				itemPrice 		= 100000,
+				achievement 	= 1849, -- Voices of the Failed Incarnates
+			},
+			[126639] = { -- Ashlander Yurt, Netch-Hide
+				itemPrice 		= 75000,
+				achievement 	= 1880,  -- Ashlands Stalker
+			},
+			[126623] = { -- Banner of House Dres
+				itemPrice 		= 10000,
+				achievement 	= 1867,  -- Morrowind Grand Adventurer
+			},
+			[126621] = { -- Banner of House Hlaalu
+				itemPrice 		= 10000,
+				achievement 	= 1867,  -- Morrowind Grand Adventurer
+			},
+			[126620] = { -- Banner of House Redoran
+				itemPrice 		= 10000,
+				achievement 	= 1867,  -- Morrowind Grand Adventurer
+			},
+			[126622] = { -- Banner of House Telvanni
+				itemPrice 		= 10000,
+				achievement 	= 1867,  -- Morrowind Grand Adventurer
+			},
+			[126628] = { -- Banner, Morag Tong
+				itemPrice 		= 25000,
+				achievement 	= 1870,  -- Naryu's Confidant
+			},
+			[126615] = { -- Blessing Stone
+				itemPrice 		= 10000,
+				achievement 	= 1850,  -- Bearer of the Blessed Staff
+			},
+			[126614] = { -- Blessing Stone Device
+				itemPrice 		= 20000,
+				achievement 	= 1850,  -- Bearer of the Blessed Staff
+			},
+			[126618] = { -- Dwarven Brazier, Eternal
+				itemPrice 		= 50000,
+				achievement 	= 1854,  -- N'chow conqueror
+			},
+			[126632] = { -- Glass Crystal, Plume
+				itemPrice 		= 15000,
+				achievement 	= 1874,  -- Pilgrim Protector
+			},
+			[126631] = { -- Glass Crystal, Radiance
+				itemPrice 		= 15000,
+				achievement 	= 1874,  -- Pilgrim Protector
+			},
+			[126633] = { -- Glass Crystals, Bed
+				itemPrice 		= 20000,
+				achievement 	= 1874,  -- Pilgrim Protector
+			},
+			[126629] = { -- Kwama Queen Egg
+				itemPrice 		= 15000,
+				achievement 	= 1872,  -- Kwama Miner
+			},
+			[126630] = { -- Replica Stone of Ashalmwia
+				itemPrice 		= 75000,
+				achievement 	= 1873,  -- Dratha Quest
+			},
+			[126635] = { -- Sacred Guar Skull
+				itemPrice 		= 15000,
+				achievement 	= 1876,  -- Ald'Ruhn Annalist
+			},
+			[126642] = { -- Silt Strider Shell, Hollow
+				itemPrice 		= 10000,
+				achievement 	= 1826,  -- Strider Carawaner
+			},
+			[126617] = { -- Statue of Vivec the Champion
+				itemPrice 		= 150000,
+				achievement 	= 1852,  -- Champion of Vivec
+			},
+			[126636] = { -- Statue, Cowering Ebony
+				itemPrice 		= 50000,
+				achievement 	= 1877,  -- Ebony Enforcer
+			},
+			[126637] = { -- Statue, Terrified Ebony
+				itemPrice 		= 50000,
+				achievement 	= 1877,  -- Ebony Enforcer
+			},
+			[126616] = { -- Statuette of Clavicus Vile, Masked
+				itemPrice 		= 100000,
+				achievement 	= 1851,  -- Hand of a Living God
+			},
+			[126627] = { -- Tapestry, Morag Tong
+				itemPrice 		= 35000,
+				achievement 	= 1870,  -- Naryu's Confidant
+			},
+			[126634] = { -- Tapestry, St. Veloth
+				itemPrice 		= 20000,
+
+				achievement 	= 1875,  -- Narsis's Apprentice
+			},
+			[126626] = { -- Telvanni Device
+				itemPrice 		= 50000,
+				achievement 	= 1869,  -- Telvanni quest
+			},
+			[126792] = { -- Temple Doctrine: the 36
+				itemPrice 		= 130000,
+				achievement 	= 1824,  -- Tribunal Preacher
+			},
+			[126619] = { -- Totem of the Sixth House
+				itemPrice 		= 100000,
+				achievement 	= 1856,  -- Forgotten Wastes Vanquisher
+			},
+			[126625] = { -- Tribunal Shrine in Fountain
+				itemPrice 		= 50000,
+				achievement 	= 1868,  -- Savior of Morrowind
+			},
+			[126641] = { -- Triptych of the Triune
+				itemPrice 		= 20000,
+				achievement 	= 1827,  -- The Pilgrim's Path
+			},
+		},
+		["Uzipa"] = {
+			[120998] = { -- Block, Wood Cutting
+				itemPrice 		= 100,
+			},
+			[125481] = { -- Boulder, Volcanic Column
+				itemPrice 		= 500,
+			},
+			[125483] = { -- Boulder, Volcanic Plug
+				itemPrice 		= 500,
+			},
+			[125587] = { -- Mushroom ,Funnel Caps
+				itemPrice 		= 15000,
+			},
+			[125588] = { -- Mushroom, Lanky Erupted Stinkcap
+				itemPrice 		= 750,
+			},
+			[125593] = { -- Mushroom, Netch Shield Platform
+				itemPrice 		= 25000,
+			},
+			[125594] = { -- Mushroom, Netch Shield Tower
+				itemPrice 		= 20000,
+			},
+			[125599] = { --
+				itemPrice 		= 750,
+			},
+			[125602] = { --
+				itemPrice 		= 750,
+			},
+			[125601] = { --
+				itemPrice 		= 750,
+			},
+			[125604] = { --
+				itemPrice 		= 750,
+			},
+			[125612] = { -- Mushrooms, Funnel Cap Cluster
+				itemPrice 		= 22500,
+			},
+			[125614] = { -- Mushrooms, Netch Hide Shade
+				itemPrice 		= 750,
+			},
+			[125638] = { -- Rock, Volcanic Chunk
+				itemPrice 		= 100,
+			},
+			[125639] = { -- Rock, Volcanic Slab
+				itemPrice 		= 100,
+			},
+			[125641] = { -- Sapling, Forked Ashland
+				itemPrice 		= 250,
+			},
+			[125642] = { -- Sapling, Lanky Ash Laurel
+				itemPrice 		= 250,
+			},
+			[125643] = { -- Sapling, Sturdy Ash Laurel
+				itemPrice 		= 250,
+			},
+			[125644] = { -- Sapling, Tall Ashland
+				itemPrice 		= 250,
+			},
+			[125645] = { -- Saplings, Ashland
+				itemPrice 		= 250,
+			},
+			[125673] = { -- Tree, Lanky Poplar
+				itemPrice 		= 500,
+			},
+			[125678] = { -- Tree, Sturdy Poplar
+				itemPrice 		= 500,
+			},
+			[125679] = { -- Tree, Poplar Cluster
+				itemPrice 		= 500,
+			},
+			[125677] = { -- Tree, Rooted Ashland
+				itemPrice 		= 40000,
+			},
+			[125676] = { -- Tree, Rooted Cedar
+				itemPrice 		= 50000,
+			},
+
+		},
+	},
+	["Vivec City, Gladiator's Quarters"] = {
+		["Brelda Ofemalen"] = {
+			[126649]	= { -- Banner of the Fire Drakes
+				itemPrice 		= 50000,
+				achievement 	= 1909, -- Crowd Favorite
+			},
+			[126712]	= { -- Banner of the PD
+				itemPrice 		= 50000,
+				achievement 	= 1909, -- Crowd Favorite
+			},
+			[126650]	= { -- Banner of the SL
+				itemPrice 		= 50000,
+				achievement 	= 1909, -- Crowd Favorite
+			},
+			[126646]	= { -- Standard of the FD
+				itemPrice 		= 25000,
+				achievement 	= 1907, -- Grand Standard-Guardian
+			},
+			[126648]	= { -- Standard of the PD
+				itemPrice 		= 25000,
+				achievement 	= 1907, -- Grand Standard-Guardian
+			},
+			[126647]	= { -- Standard of the SL
+				itemPrice 		= 25000,
+				achievement 	= 1907, -- Grand Standard-Guardian
+			},
+
+			[126713]	= { -- Tapestry of the FD
+				itemPrice 		= 100000,
+				achievement 	= 1910, -- Conquering Hero
+			},
+			[126715]	= { -- Tapestry of the PD
+				itemPrice 		= 100000,
+				achievement 	= 1910, -- Conquering Hero
+			},
+			[126714]	= { -- Tapestry of the SL
+				itemPrice 		= 100000,
+
+				achievement 	= 1910, -- Conquering Hero
+			},
+		},
+		["Llivas Driler"] = {
+			[126716]	= { -- Brazier of the FD
+				itemPrice 		= 50000,
+				achievement 	= 1913, -- Grand Champion
+			},
+			[126718]	= { -- Chained Skull of the PD
+				itemPrice 		= 100000,
+				achievement 	= 1913, -- Grand Champion
+			},
+			[126717]	= { -- Weathervane of the SL
+				itemPrice 		= 125000,
+				achievement 	= 1913, -- Grand Champion
+			},
+			[126643]	= { -- Crown of the SL
+				itemPrice 		= 75000,
+				achievement 	= 1901, -- Grand Relic Guardian
+			},
+			[126644]	= { -- FD's Skull
+				itemPrice 		= 150000,
+				achievement 	= 1901, -- Grand Relic Guardian
+			},
+			[126645]	= { -- Skull of the PD
+				itemPrice 		= 100000,
+				achievement 	= 1901, -- Grand Relic Guardian
+			},
+		},
+	},
+	["any Alliance Capital"] = {
+		[GetString(FURC_AV_HER)] = {
+			[126720]	= { -- Banner of Mayhem
+				itemPrice 		= 5000,
+				achievement 	= 1883, -- Mayhem Connaiseour
+			},
+			[126721]	= { -- Corpse of Mayhem, Argonian
+				itemPrice 		= 15000,
+				achievement 	= 1888, -- Wrath of the Whitestrake
+			},
+			[126722]	= { -- Corpse of Mayhem,Khajiit
+				itemPrice 		= 15000,
+				achievement 	= 1888, -- Wrath of the Whitestrake
+			},
+			[126723]	= { -- Corpse of Mayhem, Orc
+				itemPrice 		= 15000,
+				achievement 	= 1888, -- Wrath of the Whitestrake
+			},
+			[126724]	= { -- Propbably-Not-Punch Bowl of Mayhem
+				itemPrice 		= 30000,
+				achievement 	= 1892, -- Star-made Knight
+			},
+			[126719]	= { -- Standard of Mayhem
+				itemPrice 		= 2500,
+				achievement 	= 1883, -- Mayhem Connaiseour
+			},
+		},
+	},
+	["the Mages' guild"] = {
+		["the Mystic as part of a collection"] = bookList,
+	},
+ }
+
+
+-- global function, needs to live here, YES MANA
+function FurC.SetupMorrowindItems()
+
+	-- FurC.AchievementVendors[FURC_MORROWIND]["the Mages' guild"]["the Mystic as part of a collection"] = bookList
+	local listTable
+	listTable = FurC.AchievementVendors[FURC_MORROWIND]["Vivec City, Saint Delyn Inn"]["Uzipa"]
+	listTable = tableMerge(listTable, boxes)
+
+
+end
diff --git a/data/Morrowind/M_EventItems.lua b/data/Morrowind/M_EventItems.lua
new file mode 100644
index 0000000..a2368d6
--- /dev/null
+++ b/data/Morrowind/M_EventItems.lua
@@ -0,0 +1,16 @@
+local t = {
+	[126157] = {},	-- Song of Pelinal, #1
+	[126158] = {},	-- Song of Pelinal, #2
+	[126159] = {},	-- Song of Pelinal, #3
+	[126160] = {},	-- Song of Pelinal, #4
+	[126161] = {},	-- Song of Pelinal, #5
+	[126162] = {},	-- Song of Pelinal, #6
+	[126163] = {},	-- Song of Pelinal, #7
+	[126164] = {},	-- Song of Pelinal, #8
+}
+
+FurC.EventItems[FURC_MORROWIND] = FurC.EventItems[FURC_MORROWIND] or {}
+FurC.EventItems[FURC_MORROWIND]["Midyear Mayhem"] = {}
+FurC.EventItems[FURC_MORROWIND]["Midyear Mayhem"]["Boon Box"] = t
+
+FurC.Books[FURC_MORROWIND] = t
\ No newline at end of file
diff --git a/data/Morrowind/M_LuxuryFurnisher.lua b/data/Morrowind/M_LuxuryFurnisher.lua
new file mode 100644
index 0000000..20e3a8d
--- /dev/null
+++ b/data/Morrowind/M_LuxuryFurnisher.lua
@@ -0,0 +1,184 @@
+FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
+
+FurC.LuxuryFurnisher[FURC_MORROWIND] = {
+
+	-- August 5+6
+	[126573] = { -- Velothi Candle, Mourning
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-11",
+	},
+	[126574] = { -- Velothi Cerecloth, Prayer
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-11",
+	},
+	[126575] = { -- Velothi Shroud, Mourning
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-11",
+	},
+	[126576] = { -- Velothi Seat, Meditation
+		itemPrice 	= 10834,
+		itemDate	= "2017-08-11",
+	},
+
+	-- August 5+6
+	[126611] = { -- Vvardenfell Anemone, Sprout
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-04",
+	},
+	[126612] = { -- Vvardenfell Anemone, Strong
+		itemPrice 	= 27084,
+		itemDate	= "2017-08-04",
+	},
+	[126610] = { -- Vvardenfell Coral Plant,
+		itemPrice 	= 10834,
+		itemDate	= "2017-08-04",
+	},
+	[126591] = { -- Vvardenfell Coral Plant, Young
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-04",
+	},
+
+	--July 29 + 30
+	[126587] = {	-- Vvardenfell Glowstalk, Sprout
+		itemPrice 	= 2500,
+		itemDate	= "2017-07-28",
+	},
+	[126585] = {	-- Vvardenfell Glowstalk, Strong
+		itemPrice 	= 10834,
+		itemDate	= "2017-07-28",
+	},
+	[126580] = {	-- Vvardenfell Glowstalk, Towering
+		itemPrice 	= 16250,
+		itemDate	= "2017-07-28",
+	},
+	[126586] = {	-- Vvardenfell Glowstalk, Young
+		itemPrice 	= 5417,
+		itemDate	= "2017-07-28",
+	},
+
+	-- July 22 - July 23
+	[126571] = {	-- Daedric Chandelier, Spiked
+		itemPrice 	= 8125,
+		itemDate	= "2017-07-21",
+	},
+	[126569] = {	-- Daedric Chest, Sealed
+		itemPrice 	= 8125,
+		itemDate	= "2017-07-21",
+	},
+	[126570] = {	-- Daedric Throne, Skulls
+		itemPrice 	= 0,
+		itemDate	= "2017-07-21",
+	},
+
+	-- July 15 - July 16
+	[126567] = {	-- Daedric Brazier, Ritual
+		itemPrice 	= 10834,
+		itemDate	= "2017-07-14",
+	},
+	[126565] = {	-- Daedric Platform, Sarcophagus
+		itemPrice 	= 8125,
+		itemDate	= "2017-07-14",
+	},
+	[126566] = {	-- Daedric Sarcophagus, Sealed
+		itemPrice 	= 27084,
+		itemDate	= "2017-07-14",
+	},
+
+
+	-- July 8 - July 9
+	[126562] = {	-- Dwarven Crystal Mechanism
+		itemPrice 	= 53571,
+		itemDate	= "2017-07-07",
+	},
+	[126563] = {	-- Dwarven Orrery, Reference
+		itemPrice 	= 27084,
+		itemDate	= "2017-07-07",
+	},
+	[126559] = {	-- Dwarven Schematics, technical
+		itemPrice 	= 8125,
+		itemDate	= "2017-07-07",
+	},
+
+
+	-- July 1st - 2nd
+	[126560] = {	-- Dwarven fountain, forged
+		itemPrice 	= 53571,
+		itemDate	= "2017-06-30",
+	},
+	[126564] = {	-- Dwarven Clock, Deactivated
+		itemPrice 	= 16250,
+		itemDate	= "2017-06-30",
+	},
+	[126561] = {	-- Dwarven Pillar, Forged
+		itemPrice 	= 10834,
+		itemDate	= "2017-06-30",
+	},
+
+
+	-- June, 23 - 26
+	[121270] = {	-- Brotherhood Banner, Large
+		itemPrice 	= 27084,
+		itemDate	= "2017-06-23",
+	},
+	[120836] = {	-- Brotherhood Candelabra, Floor
+		itemPrice 	= 8125,
+		itemDate	= "2017-06-23",
+	},
+	[120839] = {	-- Brotherhood Ledger, Stand
+		itemPrice 	= 4000,
+		itemDate	= "2017-06-23",
+	},
+	[120838] = {	-- Brotherhood Plaque, Wolf
+		itemPrice 	= 27084,
+		itemDate	= "2017-06-23",
+	},
+
+	-- June, 16
+
+	[120837] = {	-- Brotherhood Window, Stained Glass
+		itemPrice 	= 107143,
+		itemDate	= "2017-06-16",
+	},
+
+	[121271] = {	-- Brotherhood Tapestry
+		itemPrice 	= 10834,
+		itemDate	= "2017-06-16",
+	},
+
+	[120835] = {	-- Brotherhood Candelabra, Table
+		itemPrice 	= 2500,
+		itemDate	= "2017-06-16",
+	},
+
+	-- June, 9-11
+	[120808] = {	-- Statue Base, Circular
+		itemPrice 	= 10000,
+		itemDate	= "2017-06-09",
+	},
+	[120811] = {	-- Statue, Justice
+		itemPrice 	= 25000,
+		itemDate	= "2017-06-09",
+	},
+	[120814] = {	-- Statue, Order
+		itemPrice 	= 25000,
+		itemDate	= "2017-06-09",
+	},
+	[120813] = {	-- Statue, Truth
+		itemPrice 	= 25000,
+		itemDate	= "2017-06-09",
+	},
+
+	-- June, 3-5
+	[120809] = {	-- Statue Base, Square
+		itemPrice 	= 10000,
+		itemDate	= "2017-06-02",
+	},
+	[120810] = {	-- Statue, Faith
+		itemPrice 	= 25000,
+		itemDate	= "2017-06-02",
+	},
+	[120812] = {	-- Statue, Light
+		itemPrice 	= 25000,
+		itemDate	= "2017-06-02",
+	},
+}
diff --git a/data/Morrowind/M_Recipes.lua b/data/Morrowind/M_Recipes.lua
new file mode 100644
index 0000000..25e7b4f
--- /dev/null
+++ b/data/Morrowind/M_Recipes.lua
@@ -0,0 +1,323 @@
+FurC.Recipes = FurC.Recipes or {}
+
+FurC.Recipes[FURC_MORROWIND] = {
+
+	126966, -- Redoran Trestle, Corridor
+	126881, -- Dwarven Jar, Sealed
+	126865, -- Dwarven Engine, Turbine
+	126899, -- Dwarven Sconce, Framework
+	121545, -- Redguard Cannister, Gilded
+	121099, -- Common Firepit, Outdoor
+	127084, -- Indoril Candelabra, Shrine
+	127015, -- Hlaalu Censer, Mesh
+	127092, -- Hlaalu Lantern, Classic Vellum
+	126869, -- Dwarven Table, Workbench
+	126877, -- Dwarven Candlestick, Laboratory
+	121175, -- Geese, Hanging
+	127067, -- Dres Jar, Stoneflower
+	127075, -- Indoril Brazier, Cauldron
+	126941, -- Hlaalu Wardrobe, Formal
+	126925, -- Redoran Bed, Canopy
+	126903, -- Redoran Urn, Pale Marble
+	127019, -- Indoril Incense Cup, Silver
+	127027, -- Indoril Rug, Almalexia
+	126907, -- Hlaalu Settee, Polished
+	126978, -- Telvanni Bed, Organic
+	121061, -- Common Firepit, Piled
+	126860, -- Dwarven Engine, Boiler
+	121156, -- Papers, Stack
+	127080, -- Indoril Candelabra, Shrine Chamber
+	121192, -- Wolf Head, Wall Mount
+	126847, -- Indoril Streetlight, Full Stone
+	126991, -- Indoril Bellows, Practical
+	126834, -- Daedric Candles, Group
+	121183, -- Haj Mota Shell, Wall Mount
+	121187, -- Echatere, Wall Mount
+	126890, -- Dwarven Basin, Forged
+	127059, -- Hlaalu Banner, Floral
+	126963, -- Indoril Footlocker, Fortified
+	127023, -- Redoran Plate, Meal
+	126582, -- Target Centurion, Dwarf-Brass
+	121206, -- Orcish Desk with Furs
+	126954, -- Hlaalu Rack, Barrel
+	127051, -- Redoran Mantle Cloth, Crimson Cover
+	126937, -- Redoran Stool, Sanded
+	121210, -- Orcish Throne, Skull
+	127038, -- Indoril Runner, Sotha Sil
+	126916, -- Dres Sideboard, Display
+	121198, -- Shelf, Poison
+	126898, -- Dwarven Sconce, Barred
+	126894, -- Dwarven Chandelier, Framework
+	126866, -- Dwarven Pew, Refined
+	121305, -- Redguard Chandelier, Dark
+	127068, -- Redoran Fork, Wooden
+	127072, -- Indoril Banner, Sotha Sil
+	126983, -- Telvanni Nightstand, Organic
+	126878, -- Dwarven Goblet, Forged
+	126886, -- Dwarven Valve, Disconnected
+	127048, -- Hlaalu Box, Trinket
+	126870, -- Dwarven Table, Assembly
+	126846, -- Indoril Streetlight, Stone
+	127104, -- Hlaalu Boxes, Compact
+	126910, -- Hlaalu Stool, Mossy Cushion
+	126837, -- Daedric Urn, Ashen
+	126862, -- Dwarven Pipeline Cap, Sealed
+	126942, -- Hlaalu Bookcase, Orderly
+	121217, -- Redguard Lamp, Oil
+	121213, -- Orcish Skull Goblet, Empty
+	126902, -- Redoran Amphora, Sealed Marble
+	126958, -- Hlaalu Nightstand, Formal
+	127026, -- Indoril Runner, Almalexia
+	127018, -- Redoran Incense Holder, Ceramic Pan
+	121193, -- Bottle, Beaker
+	126861, -- Dwarven Boiler, Central
+	126874, -- Dwarven Candles, Plate
+	126854, -- Dwarven Pipe, Elbow
+	126891, -- Dwarven Chandelier, Caged
+	126919, -- Hlaalu Table, Formal Turtle
+	127035, -- Dres Carpet, Chains
+	127009, -- Redoran Cup, Mazte
+	126841, -- Daedric Brazier, Standing
+	126975, -- Hlaalu Shelf, Long
+	126887, -- Dwarven Vase, Forged
+	126962, -- Indoril Chest, Fortified
+	127022, -- Redoran Plate, Floral
+	126850, -- Dwarven Engine, Fan
+	127056, -- Dres Tapestry, Vines
+	126938, -- Redoran Armchair, Fungal Cushion
+	121161, -- Ram Horns, Mounted
+	126951, -- Redoran End Table, sanded
+	121369, -- Redguard Bed, Full Lattice
+	126955, -- Hlaalu Cabinet, Clerk
+	126988, -- Telvanni Stool, Organic
+	126923, -- Redoran Bed, Single Pillow
+	126915, -- Dres Trestle, Corridor
+	121216, -- Redguard Divider, Gilded
+	126897, -- Dwarven Sconce, Powered
+	126893, -- Dwarven Chandelier, Braced
+	121313, -- Wood Elf Throne, Vine
+	126968, -- Redoran Table, Kitchen
+	126913, -- Hlaalu Armchair, Polished
+	127090, -- Indoril Lantern, Hanging
+	127103, -- Hlaalu Hanger, Mounted
+	127099, -- Telvanni Arched Light, Organic Azure
+	126863, -- Dwarven Pipeline Cap, Sealed
+	127073, -- Indoril Banner, Vivec
+	126840, -- Daedric Brazier, Table
+	127082, -- Indoril Sconce, Shrine
+	127013, -- Redoran Incense Holder, Curved
+	126871, -- Dwarven Table, Refined
+	126867, -- Dwarven Bench, Forged
+	126845, -- Indoril Lightpost, Stone
+	126947, -- Hlaalu Sideboard, Scholar's
+	126875, -- Dwarven Candles, Cup
+	127078, -- Indoril Candle, Temple
+	121177, -- Horn, Display, Huge
+	121185, -- Durzog Head, Wall Mount
+	127004, -- Dres Cup, Empty Greef
+	121212, -- Orcish Effigy, Bear
+	127102, -- Tribunal Tablet of Almalexia
+	127101, -- Velothi Brazier, Temple
+	126888, -- Dwarven Pot, Sealed
+	127100, -- Telvanni Sconce, Organic Azure
+	127061, -- Indoril Tapestry, Vivec
+	121171, -- Rug, Bearskin
+	127097, -- Telvanni Candelabra, Organic
+	127096, -- Telvanni Lamp, Organic Azure
+	127094, -- Hlaalu Lantern, Stationary
+	127093, -- Hlaalu Lantern, Modest Vellum
+	127089, -- Hlaalu Streetlight, Vellum
+	127088, -- Hlaalu Sconce, Vellum
+	127087, -- Indoril Streetlight, Brick
+	127012, -- Indoril Platter, Floral
+	126905, -- Hlaalu Cannister, Sealed Azurite
+	126946, -- Hlaalu Cabinet of drawers, Clerk
+	121097, -- Plaque, Bordered Deer Antlers
+	127086, -- Indoril Chandelier, Knotwork
+	127085, -- Indoril Candelabra, Temple
+	127083, -- Dres Candles, Meditation
+	127081, -- Indoril Sconce, Temple
+	121190, -- Mantikora Head, Wall Mount
+	127077, -- Indoril Brazier, Pedestal
+	127076, -- Indoril Brazier, Kettle
+	127071, -- Indoril Banner, Almalexia
+	127070, -- Redoran Spoon, Wooden
+	127069, -- Redoran Knife, Wooden
+	127065, -- Hlaalu Vase, Gilded
+	127064, -- Hlaalu Jar, Garden Moss
+	127063, -- Redoran Urn, Imprinted Clay
+	126976, -- Indoril Shelf, Long
+	127008, -- Redoran Cup, Empty
+	127062, -- Dres Teapot, Ceramic
+	127060, -- Indoril Tapestry, Sotha Sil
+	127058, -- Hlaalu Tapestry, Floral
+	127057, -- Indoril Tapestry, Almalexia
+	127055, -- Telvanni Table Runner, Bordered Azure
+	127054, -- Redoran Table Runner, Gilded Ochre
+	121194, -- Bottle, Poison
+	126989, -- Telvanni Table, Organic Game
+	127052, -- Telvanni Table Runner, Gilded Azure
+	127050, -- Redoran Steamer, Iron
+	127040, -- Indoril Carpet, Sotha Sil
+	127049, -- Indoril Box, Trinket
+	127047, -- Hlaalu Cannister, Trinket
+	127032, -- Dres Carpet, Fertile Peat
+	127046, -- Indoril Cannister, Trinket
+	127045, -- Indoril Carpet, Grand Vivec
+	127044, -- Indoril Carpet, Vivec
+	127043, -- Indoril Rug, Vivec
+	127042, -- Indoril Runner, Vivec
+	127039, -- Indoril Rug, Sotha Sil
+	127034, -- Redoran Carpet, Volcanic Sands
+	127031, -- Hlaalu Carpet, Garden Moss
+	127030, -- Redoran Carpet, Volcanic Ash
+	127029, -- Indoril Carpet, Grand Almalexia
+	127028, -- Indoril Carpet, Almalexia
+	127025, -- Dres Pot, Sauce
+	127024, -- Redoran Tray, Floral
+	127021, -- Hlaalu Towels, Folded
+	127020, -- Redoran Incense Pot, Beastly
+	127017, -- Dres Censer, Chains
+	127014, -- Redoran Incense Holder, Mesh
+	127010, -- Dres Cup, Empty Mazte
+	127007, -- Dres Cup, Sujamma
+	127006, -- Dres Cup, Empty Sujamma
+	127005, -- Dres Cup, Greef
+	127003, -- Ashlander Cup, Mazte
+	127002, -- Ashlander Cup, Empty
+	127001, -- Dres Cannister, Portable
+	127000, -- Dres Cauldron, Floral Banded
+	126999, -- Ashlander Platter, Bread and Cheese
+	126996, -- Dres Bowl, Empty
+	126995, -- Redoran Bowl, Saltrice Mash
+	126997, -- Dres Bowl, Saltrice Mash
+	126993, -- Dres Bowl, Dinner
+	126992, -- Dres Bowl, Serving
+	127053, -- Redoran Mantle Cloth, Crimson Coverle
+	126987, -- Telvanni Shelves, Organic t
+	126836, -- Daedric Bench, Ashen
+	126952, -- Hlaalu End Table, Formal Turtle
+	126984, -- Telvanni Desk, Organic
+	121304, -- Redguard Chandelier, Grated
+	126982, -- Telvanni Sofa, Organic
+	126981, -- Telvanni Throne, Organic
+	126980, -- Telvanni Armchair, Organic
+	126979, -- Telvanni Chair, Organic
+	126977, -- Hlaalu Dresser, Scroll Rack
+	126974, -- Indoril Shelf, Block
+	126973, -- Dres Shelf, Block
+	126971, -- Hlaalu Footlocker, Secure
+	126972, -- Hlaalu Chest, Secure
+	126970, -- Redoran Table, Formal Turtle
+	126969, -- Redoran Table, Formal Floral
+	126967, -- Redoran Sideboard, Display
+	126965, -- Indoril Cassone, Sealed
+	126964, -- Indoril Vault, Sealed
+	126961, -- Dres Divider, Honeycomb
+	126959, -- Dres Divider, Screen
+	126956, -- Hlaalu Mirror, Standing
+	127036, -- Dres Runner, Chains
+	126950, -- Indoril End Table, Rounded
+	126949, -- Hlaalu Sideboard, Scribe's
+	126946, -- Hlaalu Cabinet of Drawers, Clerk
+	126945, -- Hlaalu Sideboard, Low Cabinet
+	126943, -- Hlaalu Cupboard, Formal
+	126939, -- Redoran Armchair, Sanded
+	126936, -- Redoran Stool, Fungal Cushion
+	126935, -- Hlaalu Dresser, Open
+	126934, -- Hlaalu Cabinet, Open
+	126933, -- Hlaalu Cupboard, Open
+	126932, -- Hlaalu Bookcase, Empty
+	126931, -- Redoran Bench, Sanded
+	126930, -- Redoran Bench, Fungal Cushion
+	126929, -- Redoran Settee, Sanded
+	126928, -- Redoran Settee, Fungal Cushion
+	126927, -- Redoran Bed, Single
+	126926, -- Hlaalu Bed, Single
+	126924, -- Redoran Bed, Double Pillow
+	126922, -- Hlaalu Bed, Canopy
+	126921, -- Hlaalu Bed, Double Pillow
+	126920, -- Hlaalu Bed, Single Pillow
+	126918, -- Hlaalu Table, Formal Floral
+	126917, -- Dres Table, Kitchen
+	126914, -- Hlaalu Chair, Polished
+	126857, -- Dwarven Pipeline, Junction
+	126911, -- Hlaalu Stool, Polished
+	126909, -- Hlaalu Bench, Polished
+	126906, -- Hlaalu Settee, Mossy Cushion
+	126904, -- Redoran Urn, Dusky Marble
+	126901, -- Hlaalu Amphora, Sealed Orichalcum
+	126900, -- Hlaalu Jar, Sealed Malachite
+	126873, -- Dwarven Bowl, Forged Serving
+	126895, -- Dwarven Lantern, Oil
+	126885, -- Dwarven Cannister, Sealed
+	121191, -- Mantikora Horns, Wall Mount
+	126883, -- Dwarven Platform, Steps
+	126882, -- Dwarven Plate, Forged
+	126880, -- Dwarven Amphora, Sealed
+	126879, -- Dwarven Jug, Sealed
+	121106, -- Common Cargo Crate, Dry
+	121215, -- Redguard Canopy, Dusk
+	126896, -- Dwarven Lamppost, Powered
+	126859, -- Dwarven Pipeline, Column
+	126858, -- Dwarven Pipeline, Full Column
+	126912, -- Hlaalu Armchair, Mossy Cushion
+	126855, -- Dwarven Pipe, Corner
+	126853, -- Dwarven Pipe, Full Column
+	126851, -- Dwarven Pipe, Quarter Column
+	126849, -- Dwarven Pipe Cap, Bolted
+	126842, -- Daedric Chandelier, Ritual
+	126838, -- Daedric Base, Ashen
+	126985, -- Telvanni End Table, Organic
+	126835, -- Daedric Candles, Ritual Set
+	121102, -- Chicken Dinner, Display
+	126583, -- Target Centurion, Robust Refabricated
+	126884, -- Dwarven Vessel, Sealed
+	121189, -- Haj Mota Head, Wall Mount
+	121188, -- Echatere Horns, Wall Mount
+	121184, -- Antlers, Wall Mount
+	127091, -- Hlaalu Lantern, Oversized Vellum
+	121174, -- Sack of Grain
+	127098, -- Telvanni Lantern, Organic Azure
+	126839, -- Daedric Platform, Ashen
+	127074, -- Indoril Brazier, Knotwork
+	121107, -- Steak Dinner
+	126876, -- Dwarven Candlestick, Orrery
+	121105, -- Common Barrel, Dry
+	121103, -- Chicken Meal, Display
+	126944, -- Hlaalu Desk, Scholar's
+	121098, -- Common Campfire, Outdoor
+	127066, -- Redoran Jar, Jazbay
+	126872, -- Dwarven Bowl, Forged
+	126908, -- Hlaalu Bench, Mossy Cushion
+	126868, -- Dwarven Bookcase, Full
+	121366, -- Orcish Tapestry, Hunt
+	126892, -- Dwarven Chandelier, Barred
+	126948, -- Hlaalu Dresser, Scroll Drawers
+	126864, -- Dwarven Engine, Switch
+	126844, -- Daedric Pedestal, Ritual
+	121157, -- Sack of Rice
+	126960, -- Dres Divider, Chains
+	127079, -- Indoril Candelabra, Temple Chamber
+	121178, -- Horn, Display, Cracked
+	127095, -- Hlaalu Lamp, Portable
+	126940, -- Redoran Chair, Sanded
+	126889, -- Dwarven Urn, Sealed
+	126856, -- Dwarven Pipeline, Elbow
+	127041, -- Indoril Carpet, Grand Sotha Sil
+	126848, -- Dwarven Altar, Stairs
+	127016, -- Dres Incense Stand, Chains
+	127011, -- Dres Cup, Mazte
+	127033, -- Hlaalu Mat, Welcoming
+	126998, -- Ashlander Platter, Ceramic
+	126986, -- Telvanni Bookcase, Organic
+	126994, -- Redoran Bowl, Empty
+	126990, -- Telvanni Table, Organic Grand
+	126953, -- Hlaalu End Table, Formal Scales
+	121211, -- Orcish Effigy, Mammoth
+	126852, -- Dwarven Pipe, Half Column
+	121205, -- Nord Drinking Horn, Display
+	126957, -- Hlaalu Nightstand, Scholar's
+	127037, -- Dres Rug, Chains
+
+}
\ No newline at end of file
diff --git a/data/Reach/HotR_AchievementVendors.lua b/data/Reach/HotR_AchievementVendors.lua
new file mode 100644
index 0000000..5c9d5c9
--- /dev/null
+++ b/data/Reach/HotR_AchievementVendors.lua
@@ -0,0 +1,255 @@
+FurC.AchievementVendors[FURC_REACH] = {
+	["Coldharbour, Cicero's General Goods"] = {
+		[GetString(FURC_AV_KRR)] = {
+			[130273] = { -- Boulder, Coldharbour Fan
+				itemPrice 	= 5000,
+			},
+			[130274] = { -- Boulder, Coldharbour Shard
+				itemPrice 	= 5000,
+			},
+			[130275] = { -- Boulder, Coldharbour Spikes
+				itemPrice 	= 5000,
+			},
+			[130276] = { -- Boulder, Coldharbour Spikes
+				itemPrice 	= 250,
+			},
+			[131421] = { -- Sapling, Withered Thicket
+				itemPrice 	= 250,
+			},
+			[130279] = { -- Tree, Petrified AShen
+				itemPrice 	= 2500,
+			},
+			[130278] = { -- Tree, Strong Withered
+				itemPrice 	= 5000,
+			},
+			[130277] = { -- Tree, Towering Withered
+				itemPrice 	= 5000,
+			},
+		}
+	},
+	 ["Glenumbra, Daggerfall, The Rosy Lion"] = {
+		[GetString(FURC_AV_ROH)] = {
+
+			[120706] = {		-- Boulder, Giant Mossy
+				itemPrice 	= 100,
+			},
+			[130309] = {		-- Boulder, Swampy Growth
+				itemPrice 	= 250,
+			},
+			[132221] = {		-- Lily Pads, Swamp Cluster
+				itemPrice 	= 5000,
+			},
+			[130287] = {		-- Log, Fallen Laurel
+				itemPrice 	= 250,
+			},
+			[130288] = {		-- Log, Fallen Pine
+				itemPrice 	= 250,
+			},
+			[130286] = {		-- Log, Rotten Log
+				itemPrice 	= 250,
+			},
+			[130307] = {		-- Rocks, Swampy Slan
+				itemPrice 	= 250,
+			},
+			[130304] = {		-- Saplings, Marsh Cluster
+				itemPrice 	= 250,
+			},
+			[130303] = {		-- Shrug, Swamp Sprig
+				itemPrice 	= 250,
+			},
+			[130289] = {		-- Stump, Mossy Cypress
+				itemPrice 	= 250,
+			},
+			[130290] = {		-- Stump, Rotten Hollow
+				itemPrice 	= 250,
+			},
+			[130315] = {		-- Tree, Ancient Rotten
+				itemPrice 	= 7500,
+			},
+			[130310] = {		-- Tree, Dead Marsh
+				itemPrice 	= 7500,
+			},
+			[130312] = {		-- Tree, Dead Pine
+				itemPrice 	= 2500,
+			},
+			[130311] = {		-- Tree, Dead Swamp
+				itemPrice 	= 5000,
+			},
+			[130313] = {		-- Tree, Gnarled Marsh
+				itemPrice 	= 5000,
+			},
+			[130314] = {		-- Tree, Withering Marsh
+				itemPrice 	= 2500,
+			},
+
+		},
+	},
+	["the Undaunted Enclaves"] = {
+		["Undaunted Quartermaster"] = {
+			[131428] = { -- Horn of the Reachclans
+				itemPrice 	= 50000,
+			},
+			[131429] = { -- Vine, Bloodroot Wiggler
+				itemPrice 	= 5000,
+			},
+			[131432] = { -- Vine, Bloodroot Stem
+				itemPrice 	= 5000,
+			},
+			[131430] = { -- Vine, Bloodroot Mangler
+				itemPrice 	= 5000,
+			},
+			[131431] = { -- Vine, Bloodroot Grasper
+				itemPrice 	= 5000,
+			},
+
+		},
+	},
+	["Eastmarch"] = {
+		[GetString(FURC_AV_FRO)] = {
+			[132215] = { -- Boulder, Granite Cap
+				itemPrice 	= 1000,
+			},
+			[132213] = { -- Boulder, Granite Chunk
+				itemPrice 	= 1000,
+			},
+			[132214] = { -- Boulder, Granite Slab
+				itemPrice 	= 1000,
+			},
+			[132217] = { -- Rock, Granite Chunk
+				itemPrice 	= 5000,
+			},
+			[132209] = { -- Sapling, Foothills Pine
+				itemPrice 	= 250,
+			},
+			[132212] = { -- Shrub, Mountain Thistle
+				itemPrice 	= 250,
+			},
+			[132220] = { -- Stones, Granite Cluster
+				itemPrice 	= 250,
+			},
+			[132219] = { -- Stones, Granite Group
+				itemPrice 	= 250,
+			},
+			[132218] = { -- Stones, Granite Pair
+				itemPrice 	= 250,
+			},
+			[132210] = { -- Tree, Ancient Cedar
+				itemPrice 	= 2500,
+			},
+			[132207] = { -- Tree, Ancient Mountain Pine
+				itemPrice 	= 1000,
+			},
+			[132208] = { -- Tree, Foothills Pine
+				itemPrice 	= 1000,
+			},
+			[132205] = { -- Tree, Hardy Cedar
+				itemPrice 	= 250,
+			},
+			[132206] = { -- Tree, Towering Mountain Pine
+				itemPrice 	= 1000,
+			},
+
+		},
+	},
+	["Auridon, Skywatch"] = {
+		[GetString(FURC_AV_MAL)] = {
+			[120652] = { -- Boulder, Flat Lichen
+				itemPrice 	= 100,
+			},
+			[120651] = { -- Boulder, Grey Saddle
+				itemPrice 	= 100,
+			},
+			[120648] = { -- Boulder, Lichen Covered
+				itemPrice 	= 100,
+			},
+
+			[120672] = { -- Hedge, Green Short
+				itemPrice 	= 1000,
+			},
+			[120673] = { -- Hedge, Long Horseshoe
+				itemPrice 	= 2500,
+			},
+			[120671] = { -- Hedge, Small Horseshoe
+				itemPrice 	= 1250,
+			},
+			[120674] = { -- Hedge, Tall Green
+				itemPrice 	= 1250,
+			},
+			[121005] = { -- Hedge, Wall Arc
+				itemPrice 	= 3000,
+			},
+
+			[120653] = { -- Rock, Slanted Lichen
+				itemPrice 	= 100,
+			},
+			[120655] = { -- Stone, Slanted Lichen
+				itemPrice 	= 100,
+			},
+			[120654] = { -- Stone, Slanted Rough
+				itemPrice 	= 100,
+			},
+			[120656] = { -- Stones, Gray Mossy
+				itemPrice 	= 100,
+			},
+			[120675] = { -- Topiary, Manicured Evergreen
+				itemPrice 	= 2000,
+			},
+			[120676] = { -- Topiary, Pruned Evergreen
+				itemPrice 	= 1000,
+			},
+
+			[120670] = { -- Tree, Sturdy Jungle
+				itemPrice 	= 250,
+			},
+			[120664] = { -- Tree, Tiered Light Cherry
+				itemPrice 	= 15000,
+			},
+			[120665] = { -- Tree, Tiered Pink Cherry
+				itemPrice 	= 15000,
+			},
+			[120666] = { -- Tree, Tiered White Cherry
+				itemPrice 	= 25000,
+			},
+			[120657] = { -- Tree, twisted Pink cherry
+				itemPrice 	= 15000,
+			},
+			[120667] = { -- Tree, twisted white cherry
+				itemPrice 	= 12000,
+			},
+			[120659] = { -- Trees, Crooked Swamp
+				itemPrice 	= 100,
+			},
+			[120668] = {		-- Tree, Squat Pink Cherry
+				itemPrice 	= 10000,
+			},
+			[120669] = {		-- Tree, Squat White Cherry
+				itemPrice 	= 10000,
+			},
+
+		},
+
+	}
+
+}
+function tableMerge(t1, t2)
+	if nil == t2 and nil == t1 then
+		return {}
+	elseif nil == t2 then
+		return t1
+	elseif nil == t1 then
+		return t2
+	end
+
+    for k,v in pairs(t2) do
+		t1[k] = v
+    end
+    return t1
+end
+
+
+-- global function, needs to live here, YES MANA
+function FurC.SetupReachItems()
+
+
+
+end
diff --git a/data/Reach/HotR_LuxuryFurnisher.lua b/data/Reach/HotR_LuxuryFurnisher.lua
new file mode 100644
index 0000000..b87d31f
--- /dev/null
+++ b/data/Reach/HotR_LuxuryFurnisher.lua
@@ -0,0 +1,166 @@
+FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}
+
+FurC.LuxuryFurnisher[FURC_REACH] = {
+
+	-- Oct. 21
+	[132155] = { -- Witch's Torch, Wretched
+		itemPrice 	= 5000,
+		itemDate	= "2017-10-20",
+	},
+	[132154] = { -- Witch's Totem, Bog
+		itemPrice 	= 50000,
+		itemDate	= "2017-10-20",
+	},
+	[132153] = { -- Witch's Tree, Captive
+		itemPrice 	= 35000,
+		itemDate	= "2017-10-20",
+	},
+
+	-- Oct. 14
+	[119977] = { -- Orcish War Totem
+		itemPrice 	= 5000,
+		itemDate	= "2017-10-13",
+	},
+	[119978] = { -- Orcish Battle Totem
+		itemPrice 	= 7500,
+		itemDate	= "2017-10-13",
+	},
+	[119980] = { -- Orchish Totem
+		itemPrice 	= 10000,
+		itemDate	= "2017-10-13",
+	},
+
+	-- Oct. 7
+	[132145] = { -- Orsinium Tent, Chief’s
+		itemPrice 	= 5000,
+		itemDate	= "2017-10-06",
+	},
+	[132146] = { -- Orsinium Relief, Malacath
+		itemPrice 	= 25000,
+		itemDate	= "2017-10-06",
+	},
+	[132148] = { -- Orsinium Statue, Head
+		itemPrice 	= 25000,
+		itemDate	= "2017-10-06",
+	},
+	[132147] = { -- Orsinium Statue, Honor’s Rest
+		itemPrice 	= 25000,
+		itemDate	= "2017-10-06",
+	},
+
+	-- Sept. 30
+	[132144] = { -- Reach Briarheart, Blood Red
+		itemPrice 	= 15000,
+		itemDate	= "2017-09-29",
+	},
+	[132141] = { -- Reach Skull, Mammoth
+		itemPrice 	= 50000,
+		itemDate	= "2017-09-29",
+	},
+	[132142] = { -- Reach Tent, Camp
+		itemPrice 	= 2500,
+		itemDate	= "2017-09-29",
+	},
+
+
+	-- Sept. 23rd
+	[131435] = { -- Reach Bowl, Nirncrux
+		itemPrice 	= 5000,
+		itemDate	= "2017-09-22",
+	},
+	[131438] = { -- Reach Grinder, Nirncrux
+		itemPrice 	= 50000,
+		itemDate	= "2017-09-22",
+	},
+	[131436] = { -- Reach Vine, Bloodroot Sprout
+		itemPrice 	= 15000,
+		itemDate	= "2017-09-22",
+	},
+	[131437] = { -- Reach Vine, Bloodroot Tendril
+		itemPrice 	= 20000,
+		itemDate	= "2017-09-22",
+	},
+
+	-- Craglorn items
+	[120844] = { -- Craglorn Brazier, Ornate
+		itemPrice 	= 15000,
+		itemDate	= "2017-09-15, 2017-04-28",
+	},
+	[120843] = { -- Craglorn Skull, Carved
+		itemPrice 	= 35000,
+		itemDate	= "2017-09-15, 2017-04-28",
+	},
+	[120845] = { -- Craglorn Sword Sconce
+		itemPrice 	= 5000,
+		itemDate	= "2017-09-15, 2017-04-28",
+	},
+
+
+	[120842] = { -- Craglorn Chair, Serpent
+		itemPrice 	= 2500,
+		itemDate	= "2017-09-08, 2017-04-21",
+	},
+	[120841] = { -- Craglorn Urn, Standing
+		itemPrice 	= 7500,
+		itemDate	= "2017-09-08, 2017-04-21",
+	},
+	[120840] = { -- Craglorn Coffer, Ornate
+		itemPrice 	= 5000,
+		itemDate	= "2017-09-08, 2017-04-21",
+	},
+
+
+	-- Sept. 2nd + 3rd
+	[120832] = { -- Blue Crystal Spire
+		itemPrice 	= 12000,
+		itemDate	= "2017-09-01",
+	},
+	[120834] = { -- Blue Flame Brazier
+		itemPrice 	= 5000,
+		itemDate	= "2017-09-01",
+	},
+	[121272] = { -- Great Soul Gem
+		itemPrice 	= 20000,
+		itemDate	= "2017-09-01",
+	},
+
+
+	-- Aug 26+27
+	[120831] = { -- Blue Crystal Cluster
+		itemPrice 	= 10834,
+		itemDate	= "2017-08-25",
+	},
+	[120833] = { -- Blue Crystal Fragments
+		itemPrice 	= 8125,
+		itemDate	= "2017-08-25",
+	},
+	[120830] = { -- Blue Flame Candles
+		itemPrice 	= 2500,
+		itemDate	= "2017-08-25",
+	},
+	[121273] = { -- Soul Gem, Grand
+		itemPrice 	= 5417,
+		itemDate	= "2017-08-25",
+	},
+
+	-- August 19-20
+	[126579] = { -- Velothi Altar, Sacrificial
+		itemPrice 	= 10834,
+		itemDate	= "2017-08-18",
+	},
+	[126576] = { -- Velothi Kneeler, Prayer
+		itemPrice 	= 3000,
+		itemDate	= "2017-08-18",
+	},
+
+	[126577] = { -- Velothi Podium of Recitation
+		itemPrice 	= 37500,
+		itemDate	= "2017-08-18",
+	},
+
+	[126578] = { -- Velothi Burial Urn
+		itemPrice 	= 10834,
+		itemDate	= "2017-08-18",
+	},
+
+}
diff --git a/data/Reach/HotR_Recipes.lua b/data/Reach/HotR_Recipes.lua
new file mode 100644
index 0000000..181ac32
--- /dev/null
+++ b/data/Reach/HotR_Recipes.lua
@@ -0,0 +1,49 @@
+FurC.Recipes = FurC.Recipes or {}
+FurC.Recipes[FURC_REACH] = {
+	132179,
+	132168,
+	132178,
+	132176,
+	132177,
+	132188,
+	132180,
+	132169,
+	132195,
+	132194,
+	132186,
+	132170,
+	132192,
+	132167,
+	132193,
+	132191,
+	132182,
+	132190,
+	132183,
+	132181,
+	132189,
+	132196,
+	132187,
+	132184,
+	132175,
+	132185,
+	132173,
+	132174,
+	132172,
+	132171,
+
+
+	-- witches festival ayleid stuff
+	132342, -- Ayleid Table, Carved
+	132343, -- Ayleid Bench, Carved
+	132344, -- Ayleid Brazier, Welkynd Holder
+	132187, -- Ayleid Bookcase, Cluttered
+	132188, -- Ayleid Bookshelf, Cluttered
+	132189, -- Ayleid Brazier, Fiery
+
+	-- witches festival
+	132167,	-- Praxis, Hagraven Cauldron, Rough Stone
+	132196, -- Pattern: Witches Corpse, Wrapped",
+	132173, -- Blueprint: Witches Brazier, Primitive Log",
+	132179, -- Blueprint: Witches Totem, Antler Charms",
+
+}
diff --git a/data/Reach/HotR_Rollis.lua b/data/Reach/HotR_Rollis.lua
new file mode 100644
index 0000000..5f1caaa
--- /dev/null
+++ b/data/Reach/HotR_Rollis.lua
@@ -0,0 +1,10 @@
+FurC.Rollis_Recipes = FurC.Rollis_Recipes or {}
+
+FurC.Rollis_Recipes[FURC_REACH] = {
+	[132195] = true, -- Telvanni Candelabra, Masterwork
+	[132194] = true, -- Mammoth Cheese, Mastercrafted
+	[132191] = true, -- Dwarven Gyroscope
+	[132190] = true, -- Mages Apparatus, Master
+	[132192] = true, -- Dres Sewing Kit
+	[132193] = true, -- Hlaalu Bathtub, Masterwork
+}
\ No newline at end of file
diff --git a/data/RecipeSources.lua b/data/RecipeSources.lua
new file mode 100644
index 0000000..bf3039a
--- /dev/null
+++ b/data/RecipeSources.lua
@@ -0,0 +1,3 @@
+FurC.RecipeSources = {
+
+}
\ No newline at end of file
diff --git a/data/Recipes.lua b/data/Recipes.lua
new file mode 100644
index 0000000..cfacaf5
--- /dev/null
+++ b/data/Recipes.lua
@@ -0,0 +1,80 @@
+FurC.Recipes = FurC.Recipes or {}
+FurC.Recipes[FURC_DRAGONS] = {
+	127101, -- Velothi Brazier, Temple - talked to a Russian who sold it
+	127102, -- Praxis: Tribunal Tablet of Almalexia, comfirmed by Almariel
+	134999, -- Praxis: Table, Blackmarrow Slab, drops in Fang Lair
+	127054,	-- Pattern: Redoran Table Runner, Gilded Ochre
+	134998,	-- Pattern: Jester's Pavillon, Open
+
+}
+FurC.Recipes[FURC_CLOCKWORK] = {
+	134527, -- Design: Clockwork Meal, Dish
+	134512, -- Diagram: Clockwork Table, Octagonal
+	134478, -- Formula: Fabricant Saplings, Electrum
+	134531, -- Diagram: Clockwork Sequence Plaque, Single
+	134543, -- Diagram: Clockwork Wall Machinery, Arched
+	134479, -- Formula: Fabricant Tree, Electrum
+	134486, -- Diagram: Clockwork Barrel, Sealed
+	134505, -- Diagram: Clockwork Drafting Table, Flat
+	134509, -- Diagram: Clockwork Cabinet, Sequence Plaque Storag
+	134500, -- Diagram: Clockwork Furnace, Socketed
+	134484, -- Formula: Fabricant Shrub, Gold
+	134496, -- Praxis: Clockwork Switch, Sturdy
+	134490, -- Diagram: Clockwork Crate, Wide
+	134476, -- Formula: Fabricant Tree, Gnarled Cypress
+	134504, -- Diagram: Clockwork Drafting Table, Raised
+	132188, -- Praxis: Ayleid Bookshelf, Cluttered
+	134477, -- Formula: Fabricant Trees, Clustered Maple
+	134518, -- Diagram: Clockwork Coffer, Robust
+	134515, -- Diagram: Clockwork Wardrobe, Precision Engineered
+	134526, -- Design: Clockwork Meal, Plate
+	134513, -- Diagram: Clockwork Nightstand, Octagonal
+	134546, -- Design: Clockwork Paste Dispenser, Empty
+	134492, -- Diagram: Clockwork Crate, Large Open
+	134487, -- Diagram: Clockwork Barrel, Wide
+	134493, -- Formula: Clockwork Lamppost, Gas
+	134485, -- Formula: Fabricant Shrub, Copper
+	134506, -- Diagram: Clockwork Sequence Spool, Single
+	134525, -- Diagram: Clockwork Mug, Reinforced
+	134582, -- Diagram: Clockwork Shelf, Wall
+	134545, -- Praxis: Clockwork Charging Station, Factotum
+	134508, -- Diagram: Clockwork Lectern, Empty
+	134520, -- Design: Clockwork Cup, Recycled Water
+	134488, -- Diagram: Clockwork Keg, Sturdy
+	134540, -- Praxis: Clockwork Illuminator, Compact
+	134516, -- Design: Clockwork Bowl, Large Nutriment Paste
+	134538, -- Praxis: Clockwork Illuminator, Capsule Tower
+	134517, -- Design: Clockwork Bowl, Nutriment Paste
+	134537, -- Praxis: Clockwork Illuminator, Powered Capsule
+	134536, -- Praxis: Clockwork Illuminator, Solitary Capsule
+	134497, -- Diagram: Clockwork Vent, Octagonal Fan
+	134535, -- Praxis: Clockwork Illuminator, Personal Desk
+	134534, -- Diagram: Clockwork Surveyor's Tripod, Calibrated
+	134483, -- Formula: Fabricant Shrubs, Beryl
+	134533, -- Diagram: Clockwork Flask Stand, Tall
+	134494, -- Diagram: Clockwork Pump, Vertical
+	134489, -- Diagram: Clockwork Crate, Square
+	134532, -- Diagram: Clockwork Flask Stand, Short
+	134530, -- Diagram: Clockwork Sequence Plaques, Unfolded
+	134491, -- Diagram: Clockwork Crate, Large Closed
+	134529, -- Diagram: Clockwork Sequence Plaques, Folded
+	134528, -- Diagram: Clockwork Scales, Precision Calibrated
+	134524, -- Praxis: Clockwork Mortar and Pestle, Sintered
+	134523, -- Praxis: Clockwork Measuring Cup, Sintered
+	134522, -- Design: Clockwork Goblet, Recycled Water
+	134511, -- Diagram: Clockwork Table, Beveled
+	134521, -- Diagram: Clockwork Goblet, Empty
+	134544, -- Praxis: Clockwork Charging Station, Animo Core
+	134519, -- Diagram: Clockwork Cup, Empty
+	134502, -- Diagram: Clockwork Chair, Practical
+	134514, -- Diagram: Clockwork Table, Grand
+	134510, -- Diagram: Clockwork Stool, Practical
+	134539, -- Praxis: Clockwork Illuminator, Compact Stand
+	134507, -- Diagram: Clockwork Sequence Spool, Triple
+	134482, -- Formula: Fabricant Tree, Cobalt Spruce
+	134481, -- Formula: Fabricant Tree, Miniature Cherry Blossom
+	134503, -- Diagram: Clockwork Chair, Reinforced
+	134501, -- Diagram: Clockwork Somnolostation
+	134480, -- Formula: Fabricant Tree, Vibrant Cherry Blossom
+	134498, -- Praxis: Clockwork Control Panel, Single
+}
\ No newline at end of file
diff --git a/data/Rollis.lua b/data/Rollis.lua
new file mode 100644
index 0000000..d946a5d
--- /dev/null
+++ b/data/Rollis.lua
@@ -0,0 +1,42 @@
+FurC.Rollis_Recipes = FurC.Rollis_Recipes 		or {}
+FurC.FaustinaRecipes	= FurC.FaustinaRecipes 	or {}
+FurC.Faustina			= FurC.Faustina 		or {}
+
+
+FurC.Rollis_Recipes[FURC_CLOCKWORK] = {
+	[133576] = 50,
+}
+
+FurC.FaustinaRecipes[FURC_DRAGONS] = {
+	 121200,	-- Cabinet, Poisonmaker's
+	 121166,	-- Heirloom Podium, Skinning
+	 121168,	-- Tools, Case
+	 121214,	-- Mortar + Pestle
+	 121163,	-- Orcish Skull Goblet, Full
+	 121163,	-- Apparatus, Boiler
+	 121165,	-- Apparatus, Gem Caliper
+	 121197,	-- Bottle, Poison Elixir
+	 121164,	-- Case of Vials
+	 121209,	-- Orcish Tapestry, Spear
+	 132194,	-- Mammoth Cheese
+	 132191,	-- Dwarven Gyroscope, Masterwork
+	 132190,	-- Mages' Apparatus, Master
+	 132192,	-- Dres Sewing Kit
+	 132193,	-- Hlaalu Bathtub
+	 132195,	-- Telvanni Candelabra
+	 121166,	-- Podium, Skinning
+}
+FurC.Faustina[FURC_DRAGONS] = {
+	[134675] = 1500,
+}
+
+FurC.Rollis[FURC_DRAGONS] = {
+	134983,
+	134984,
+	134985,
+	134986,
+	134987,
+}
+FurC.Rollis_Recipes[FURC_DRAGONS] = {
+	[133576] = 50,
+}
\ No newline at end of file
diff --git a/data/RumourRecipes.lua b/data/RumourRecipes.lua
new file mode 100644
index 0000000..765f9c7
--- /dev/null
+++ b/data/RumourRecipes.lua
@@ -0,0 +1,60 @@
+FurC.RumourRecipes = {
+	118290, -- Antlers, Wall Mount
+	118299, -- Bottle, Beaker
+	118300, -- Bottle, Poison
+
+	118291, -- Durzog Head, Wall Mount
+	118294, -- Echatere Horns, Wall Mount
+	118293, -- Echatere, Wall Mount
+	118295, -- Haj Mota Head, Wall Mount
+	118289, -- Haj Mota Shell, Wall Mount
+	118284, -- Horn, Display, Cracked
+	118283, -- Horn, Display, Huge
+
+	118296, -- Mantikora Head, Wall Mount
+	118297, -- Mantikora Horns, Wall Mount
+	118242, -- Rug, Bearskin
+
+	121207, -- Recipe: Orcish Table with Fur_S_
+	121210, -- Recipe: Orcish Throne, Skull
+	121212, -- Recipe: Orcish Effigy, Bear
+	121213, -- Recipe: Orcish Skull Goblet, Empty
+
+	116473, -- Orcish Effigy, Mammoth
+	116474, -- Orcish Effigy, Bear
+	116433, -- Orcish Table with Fur_S
+
+	118065, -- Common Cargo Crate, Dry
+	118054, -- Common Firepit, Outdoor
+	118055, -- Common Firepit, Piled
+
+	118000, -- Garlic String, Display
+
+	118119, -- Minecart, Empty
+	118120, -- Minecart, Push
+	117991, -- Stool, Carved
+	118278, -- Plaque, Bordered Deer Antlers
+	132199, -- Telvanni Tower, Miniature
+	-- 132197, -- Death Skeleton, Shrouded
+	121198, -- Shelf, Poison
+	118304, -- Shelf, Poison
+
+	119441, -- Steak, Display
+	119442, -- Teapot, Common
+
+	119454, -- Plaque, Large
+	119455, -- Plaque, Standard
+
+	119466, -- Podium, Engraved
+
+	119437, -- Pie, Display
+
+	121161, -- Ram Horns, Mounted
+	121216, -- Redguard Divider, Gilded
+
+	118118, -- Candles, Lasting
+	115395, -- Nord Drinking Horn, Display
+	121203, -- Khajiit Brazier, Enchanted
+
+
+}
\ No newline at end of file
diff --git a/libs/LibAddonMenu-2.0/LICENSE b/libs/LibAddonMenu-2.0/LICENSE
new file mode 100644
index 0000000..f69cbd4
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
new file mode 100644
index 0000000..3c4ab31
--- /dev/null
+++ b/libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
@@ -0,0 +1,1226 @@
+-- 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", 25
+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",
+    },
+    it = { -- provided by JohnnyKing
+        PANEL_NAME = "Addon",
+        VERSION = "Versione: <<X:1>>",
+        WEBSITE = "Visita il Sitoweb",
+        RELOAD_UI_WARNING = "Cambiare questa impostazione richiede un Ricarica UI al fine che faccia effetto.",
+        RELOAD_DIALOG_TITLE = "Ricarica UI richiesto",
+        RELOAD_DIALOG_TEXT = "Alcune modifiche richiedono un Ricarica UI al fine che facciano effetto. Sei sicuro di voler ricaricare ora o di voler annullare le modifiche?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Ricarica",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Annulla",
+    },
+    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",
+        RELOAD_UI_WARNING = "Для применения этой настройки необходима перезагрузка интерфейса.",
+        RELOAD_DIALOG_TITLE = "Необходима перезагрузка интерфейса",
+        RELOAD_DIALOG_TEXT = "Для применения некоторых изменений необходима перезагрузка интерфейса. Перезагрузить интерфейс сейчас или отменить изменения?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Перезагрузить",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Отменить изменения",
+    },
+    es = { -- provided by Morganlefai, checked by Kwisatz
+        PANEL_NAME = "Configuración",
+        VERSION = "Versión: <<X:1>>",
+        WEBSITE = "Visita la página web",
+        RELOAD_UI_WARNING = "Cambiar este ajuste recargará la interfaz del usuario.",
+        RELOAD_DIALOG_TITLE = "Requiere recargar la interfaz",
+        RELOAD_DIALOG_TEXT = "Algunos cambios requieren recargar la interfaz para poder aplicarse. Quieres aplicar los cambios y recargar la interfaz?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Recargar",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Cancelar",
+    },
+    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",
+    },
+    pl = { -- provided by EmiruTegryfon
+        PANEL_NAME = "Dodatki",
+        VERSION = "Wersja: <<X:1>>",
+        WEBSITE = "Odwiedź stronę",
+        RELOAD_UI_WARNING = "Zmiany będą widoczne po ponownym załadowaniu UI.",
+        RELOAD_DIALOG_TITLE = "Wymagane przeładowanie UI",
+        RELOAD_DIALOG_TEXT = "Niektóre zmiany wymagają ponownego załadowania UI. Czy chcesz teraz ponownie załadować, czy porzucić zmiany?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Przeładuj",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Porzuć",
+    },
+}
+
+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.uniformControlHeight or 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
+    local selectionIsFinal = false
+
+    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.pendingAddonPanel or data.panel == lam.currentAddonPanel then
+                if not selectionIsFinal then
+                    selectedData = data
+                end
+                if data.panel == lam.pendingAddonPanel then
+                    lam.pendingAddonPanel = nil
+                    selectionIsFinal = true
+                end
+            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)
+            lam.pendingAddonPanel = addonData.panel
+            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, GetStringFromValue(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(GetStringFromValue(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
new file mode 100644
index 0000000..82b5032
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/checkbox.lua b/libs/LibAddonMenu-2.0/controls/checkbox.lua
new file mode 100644
index 0000000..6696dd7
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/colorpicker.lua b/libs/LibAddonMenu-2.0/controls/colorpicker.lua
new file mode 100644
index 0000000..a57aab0
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/custom.lua b/libs/LibAddonMenu-2.0/controls/custom.lua
new file mode 100644
index 0000000..40a7c42
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/description.lua b/libs/LibAddonMenu-2.0/controls/description.lua
new file mode 100644
index 0000000..da207a0
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/divider.lua b/libs/LibAddonMenu-2.0/controls/divider.lua
new file mode 100644
index 0000000..8089539
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/dropdown.lua b/libs/LibAddonMenu-2.0/controls/dropdown.lua
new file mode 100644
index 0000000..70e23bb
--- /dev/null
+++ b/libs/LibAddonMenu-2.0/controls/dropdown.lua
@@ -0,0 +1,387 @@
+--[[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)
+    scrollable = true, -- boolean or number, if set the dropdown will feature a scroll bar if there are a large amount of choices and limit the visible lines to the specified number or 10 if true is used (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 = 18
+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")
+        if not control.scrollHelper then -- only do this for non-scrollable
+            SetupTooltips(control.dropdown, choicesTooltips)
+        end
+    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
+        if choicesTooltips and control.scrollHelper then
+            entry.tooltip = choicesTooltips[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
+
+local DEFAULT_VISIBLE_ROWS = 10
+local SCROLLABLE_ENTRY_TEMPLATE_HEIGHT = 25 -- same as in zo_combobox.lua
+local CONTENT_PADDING = 24
+local SCROLLBAR_PADDING = 16
+local PADDING = GetMenuPadding() / 2 -- half the amount looks closer to the regular dropdown
+local ROUNDING_MARGIN = 0.01 -- needed to avoid rare issue with too many anchors processed
+local ScrollableDropdownHelper = ZO_Object:Subclass()
+
+function ScrollableDropdownHelper:New(...)
+    local object = ZO_Object.New(self)
+    object:Initialize(...)
+    return object
+end
+
+function ScrollableDropdownHelper:Initialize(parent, control, visibleRows)
+    local combobox = control.combobox
+    local dropdown = control.dropdown
+    self.parent = parent
+    self.control = control
+    self.combobox = combobox
+    self.dropdown = dropdown
+    self.visibleRows = visibleRows
+
+    -- clear anchors so we can adjust the width dynamically
+    dropdown.m_dropdown:ClearAnchors()
+    dropdown.m_dropdown:SetAnchor(TOPLEFT, combobox, BOTTOMLEFT)
+
+    -- handle dropdown or settingsmenu opening/closing
+    local function onShow() self:OnShow() end
+    local function onHide() self:OnHide() end
+    local function doHide() self:DoHide() end
+
+    ZO_PreHook(dropdown, "ShowDropdownOnMouseUp", onShow)
+    ZO_PreHook(dropdown, "HideDropdownInternal", onHide)
+    combobox:SetHandler("OnEffectivelyHidden", onHide)
+    parent:SetHandler("OnEffectivelyHidden", doHide)
+
+    -- dont fade entries near the edges
+    local scrollList = dropdown.m_scroll
+    scrollList.selectionTemplate = nil
+    scrollList.highlightTemplate = nil
+    ZO_ScrollList_EnableSelection(scrollList, "ZO_SelectionHighlight")
+    ZO_ScrollList_EnableHighlight(scrollList, "ZO_SelectionHighlight")
+    ZO_Scroll_SetUseFadeGradient(scrollList, false)
+
+    -- adjust scroll content anchor to mimic menu padding
+    local scroll = dropdown.m_dropdown:GetNamedChild("Scroll")
+    local anchor1 = {scroll:GetAnchor(0)}
+    local anchor2 = {scroll:GetAnchor(1)}
+    scroll:ClearAnchors()
+    scroll:SetAnchor(anchor1[2], anchor1[3], anchor1[4], anchor1[5] + PADDING, anchor1[6] + PADDING)
+    scroll:SetAnchor(anchor2[2], anchor2[3], anchor2[4], anchor2[5] - PADDING, anchor2[6] - PADDING)
+    ZO_ScrollList_Commit(scrollList)
+
+    -- hook mouse enter/exit
+    local function onMouseEnter(control) self:OnMouseEnter(control) end
+    local function onMouseExit(control) self:OnMouseExit(control) end
+
+    -- adjust row setup to mimic the highlight padding
+    local dataType1 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
+    local dataType2 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 2)
+    local oSetup = dataType1.setupCallback -- both types have the same setup function
+    local function SetupEntry(control, data, list)
+        oSetup(control, data, list)
+        control.m_label:SetAnchor(LEFT, nil, nil, 2)
+        -- no need to store old ones since we have full ownership of our dropdown controls
+        if not control.hookedMouseHandlers then --only do it once per control
+            control.hookedMouseHandlers = true
+            ZO_PreHookHandler(control, "OnMouseEnter", onMouseEnter)
+            ZO_PreHookHandler(control, "OnMouseExit", onMouseExit)
+            -- we could also just replace the handlers
+            --control:SetHandler("OnMouseEnter", onMouseEnter)
+            --control:SetHandler("OnMouseExit", onMouseExit)
+        end
+    end
+    dataType1.setupCallback = SetupEntry
+    dataType2.setupCallback = SetupEntry
+
+    -- adjust dimensions based on entries
+    local scrollContent = scroll:GetNamedChild("Contents")
+    ZO_PreHook(dropdown, "AddMenuItems", function()
+        local width = PADDING * 2 + zo_max(self:GetMaxWidth(), combobox:GetWidth())
+        local numItems = #dropdown.m_sortedItems
+        local anchorOffset = 0
+        if(numItems > self.visibleRows) then
+            width = width + CONTENT_PADDING + SCROLLBAR_PADDING
+            anchorOffset = -SCROLLBAR_PADDING
+            numItems = self.visibleRows
+        end
+        scrollContent:SetAnchor(BOTTOMRIGHT, nil, nil, anchorOffset)
+        local height = PADDING * 2 + numItems * (SCROLLABLE_ENTRY_TEMPLATE_HEIGHT + dropdown.m_spacing) - dropdown.m_spacing + ROUNDING_MARGIN
+        dropdown.m_dropdown:SetWidth(width)
+        dropdown.m_dropdown:SetHeight(height)
+    end)
+end
+
+function ScrollableDropdownHelper:OnShow()
+    local dropdown = self.dropdown
+    if dropdown.m_lastParent ~= ZO_Menus then
+        dropdown.m_lastParent = dropdown.m_dropdown:GetParent()
+        dropdown.m_dropdown:SetParent(ZO_Menus)
+        ZO_Menus:BringWindowToTop()
+    end
+end
+
+function ScrollableDropdownHelper:OnHide()
+    local dropdown = self.dropdown
+    if dropdown.m_lastParent then
+        dropdown.m_dropdown:SetParent(dropdown.m_lastParent)
+        dropdown.m_lastParent = nil
+    end
+end
+
+function ScrollableDropdownHelper:DoHide()
+    local dropdown = self.dropdown
+    if dropdown:IsDropdownVisible() then
+        dropdown:HideDropdown()
+    end
+end
+
+function ScrollableDropdownHelper:GetMaxWidth()
+    local dropdown = self.dropdown
+    local dataType = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
+
+    local dummy = dataType.pool:AcquireObject()
+    dataType.setupCallback(dummy, {
+        m_owner = dropdown,
+        name = "Dummy"
+    }, dropdown)
+
+    local maxWidth = 0
+    local label = dummy.m_label
+    local entries = dropdown.m_sortedItems
+    local numItems = #entries
+    for index = 1, numItems do
+        label:SetText(entries[index].name)
+        local width = label:GetTextWidth()
+        if (width > maxWidth) then
+            maxWidth = width
+        end
+    end
+
+    dataType.pool:ReleaseObject(dummy.key)
+    return maxWidth
+end
+
+function ScrollableDropdownHelper:OnMouseEnter(control)
+    -- call original code if we replace instead of hook the handler
+        --ZO_ScrollableComboBox_Entry_OnMouseEnter(control)
+    -- show tooltip
+    if control.m_data.tooltip then
+        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
+        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.m_data.tooltip))
+        InformationTooltipTopLevel:BringWindowToTop()
+    end
+end
+function ScrollableDropdownHelper:OnMouseExit(control)
+    -- call original code if we replace instead of hook the handler
+        --ZO_ScrollableComboBox_Entry_OnMouseExit(control)
+    -- hide tooltip
+    if control.m_data.tooltip then
+        ClearTooltip(InformationTooltip)
+    end
+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, dropdownData.scrollable and "ZO_ScrollableComboBox" or "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
+
+    if dropdownData.scrollable then
+        local visibleRows = type(dropdownData.scrollable) == "number" and dropdownData.scrollable or DEFAULT_VISIBLE_ROWS
+        control.scrollHelper = ScrollableDropdownHelper:New(parent, control, visibleRows)
+    end
+
+    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
new file mode 100644
index 0000000..d6baf11
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/header.lua b/libs/LibAddonMenu-2.0/controls/header.lua
new file mode 100644
index 0000000..eadff38
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/iconpicker.lua b/libs/LibAddonMenu-2.0/controls/iconpicker.lua
new file mode 100644
index 0000000..65c7782
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/panel.lua b/libs/LibAddonMenu-2.0/controls/panel.lua
new file mode 100644
index 0000000..1404686
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/slider.lua b/libs/LibAddonMenu-2.0/controls/slider.lua
new file mode 100644
index 0000000..bd721c5
--- /dev/null
+++ b/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, 16)
+        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
new file mode 100644
index 0000000..1766a1f
--- /dev/null
+++ b/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/libs/LibAddonMenu-2.0/controls/texture.lua b/libs/LibAddonMenu-2.0/controls/texture.lua
new file mode 100644
index 0000000..29dda7c
--- /dev/null
+++ b/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/libs/LibAsync/LibAsync.lua b/libs/LibAsync/LibAsync.lua
new file mode 100644
index 0000000..d5dab4b
--- /dev/null
+++ b/libs/LibAsync/LibAsync.lua
@@ -0,0 +1,332 @@
+local MAJOR, MINOR = "LibAsync", 1.3
+local async, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not async then return end -- the same or newer version of this lib is already loaded into memory
+
+if async.Unload then
+	async:Unload()
+end
+
+local em = GetEventManager()
+local remove, min = table.remove, math.min
+
+local function RemoveCall(job, callstackIndex)
+	remove(job.callstack, callstackIndex)
+	job.lastCallIndex = min(job.lastCallIndex, #job.callstack)
+end
+
+local current, call
+local function safeCall() return call(current) end
+
+local function DoCallback(job, callstackIndex)
+	local success, shouldContinue = pcall(safeCall)
+	if success then
+		-- If the call returns true, the call wants to be called again
+		if not shouldContinue then RemoveCall(job, callstackIndex) end
+	else
+		-- shouldContinue is the value returned by error or assert
+		job.Error = shouldContinue
+		RemoveCall(job, callstackIndex)
+
+		call = job.OnError
+		if call then
+			pcall(safeCall)
+		else
+			job:Suspend()
+			error(job)
+		end
+	end
+end
+
+local jobs = async.jobs or { }
+async.jobs = jobs
+-- async.registered = { }
+
+local function DoJob(job)
+	current = job
+	local index = #job.callstack
+	call = job.callstack[index]
+	if call then
+		DoCallback(job, index)
+	else
+		assert(index == 0, "No call on non-empty stack?!")
+		jobs[job] = nil
+		call = job.finally
+		if call then pcall(safeCall) end
+	end
+	current, call = nil, nil
+end
+
+-- time we can spend until the next frame must be shown
+local frameTimeTarget = 13
+-- we allow a function to use 25% of the frame time before it gets critical
+local spendTimeDef = frameTimeTarget * 0.75
+local spendTime = spendTimeDef
+
+local debug = false
+
+local GetFrameTimeMilliseconds, GetGameTimeMilliseconds = GetFrameTimeMilliseconds, GetGameTimeMilliseconds
+local identifier = "ASYNCTASKS_JOBS"
+local job = nil
+local function Scheduler()
+	local start = GetFrameTimeMilliseconds()
+	local runTime = start
+	if (GetGameTimeMilliseconds() - start) > spendTime then
+		spendTime = 750 / GetFramerate()
+		if debug then
+			df("initial gap: %ims. skip. new threshold: %ims", GetGameTimeMilliseconds() - start, spendTime)
+		end
+		return
+	end
+	if debug then
+		df("initial gap: %ims", GetGameTimeMilliseconds() - start)
+	end
+	while (GetGameTimeMilliseconds() - start) <= spendTime do
+		job = next(jobs, job) or next(jobs)
+		if job then
+			runTime = GetGameTimeMilliseconds()
+			DoJob(job)
+		else
+			-- Finished
+			em:UnregisterForUpdate(identifier)
+			spendTime = spendTimeDef
+			return
+		end
+	end
+	spendTime = spendTimeDef
+	if debug and job then
+		local now = GetGameTimeMilliseconds()
+		local freezeTime = now - start
+		if freezeTime >= 16 then
+			runTime = now - runTime
+			df("%s freeze. used %ims, resulting frametime %ims.", job.name, runTime, freezeTime)
+		end
+	end
+end
+
+function async:GetDebug()
+	return debug
+end
+
+function async:SetDebug(enabled)
+	debug = enabled
+end
+
+-- Class task
+
+local task = async.task or ZO_Object:Subclass()
+async.task = task
+
+-- Called from async:Create()
+function task:New(name)
+	local instance = ZO_Object.New(self)
+	instance.name = name or tostring(instance)
+	instance:Initialize()
+	return instance
+end
+
+function task:Initialize()
+	self.callstack = { }
+	self.lastCallIndex = 0
+	-- async.registered[#async.registered + 1] = self
+end
+
+-- Resume the execution context.
+function task:Resume()
+	jobs[self] = true
+	em:RegisterForUpdate(identifier, 0, Scheduler)
+	return self
+end
+
+-- Suspend the execution context and allow to resume anytime later.
+function task:Suspend()
+	jobs[self] = nil
+	return self
+end
+
+-- Interupt and fully stop the execution context. Can be called from outside to stop everything.
+function task:Cancel()
+	if jobs[self] then
+		ZO_ClearNumericallyIndexedTable(self.callstack)
+		self.lastCallIndex = 0
+		if not self.finally then
+			jobs[self] = nil
+			-- else run job with empty callstack to run finalizer
+		end
+	end
+	return self
+end
+
+do
+	-- Run the given FuncOfTask in your task context execution.
+	function task:Call(funcOfTask)
+		self.lastCallIndex = #self.callstack + 1
+		self.callstack[self.lastCallIndex] = funcOfTask
+		return self:Resume()
+	end
+
+	local insert = table.insert
+	-- Continue your task context execution with the given FuncOfTask after the previous as finished.
+	function task:Then(funcOfTask)
+		assert(self.lastCallIndex > 0 and self.lastCallIndex <= #self.callstack, "cap!")
+		insert(self.callstack, self.lastCallIndex, funcOfTask)
+		return self
+	end
+end
+
+-- Start an interruptible for-loop.
+function task:For(p1, p2, p3)
+	-- If called as a normal job, false will prevent it is kept in callstack doing an endless loop
+	self.callstack[#self.callstack + 1] = function() return false, p1, p2, p3 end
+	return self
+end
+
+do
+	local function ForConditionAlreadyFalse() end
+	local function ContinueForward(index, endIndex) return index <= endIndex end
+	local function ContinueBackward(index, endIndex) return index >= endIndex end
+
+	local function asyncForWithStep(self, func, index, endIndex, step)
+		step = step or 1
+		if step == 0 then error("step is zero") end
+
+		local ShouldContinue
+		if step > 0 then
+			if index > endIndex then return ForConditionAlreadyFalse end
+			ShouldContinue = ContinueForward
+		else
+			if index < endIndex then return ForConditionAlreadyFalse end
+			ShouldContinue = ContinueBackward
+		end
+		return function()
+			if func(index) ~= async.BREAK then
+				index = index + step
+				return ShouldContinue(index, endIndex)
+			end
+		end
+	end
+
+	local function asyncForPairs(self, func, iter, list, key)
+		return function()
+			local value
+			key, value = iter(list, key)
+			return key and func(key, value) ~= async.BREAK
+		end
+	end
+
+	-- Execute the async-for with the given step-function. The parameters of the step-function are those you would use in your for body.
+	function task:Do(func)
+		local callstackIndex = #self.callstack
+		local shouldBeFalse, p1, p2, p3 = self.callstack[callstackIndex]()
+		assert(shouldBeFalse == false and p1, "Do without For")
+		remove(self.callstack, callstackIndex)
+
+		local DoLoop = type(p1) == "number" and
+		asyncForWithStep(self, func, p1, p2, p3) or
+		asyncForPairs(self, func, p1, p2, p3)
+
+		if current or #self.callstack == 0 then return self:Call(DoLoop) else return self:Then(DoLoop) end
+	end
+end
+
+-- Suspend the execution of your task context for the given delay in milliseconds and then call the given FuncOfTask to continue.
+function task:Delay(delay, funcOfTask)
+	self:StopTimer()
+	if delay < 10 then return self:Call(funcOfTask) end
+	self:Suspend()
+	em:RegisterForUpdate(self.name, delay, function()
+		em:UnregisterForUpdate(self.name)
+		self:Call(funcOfTask)
+	end )
+	return self
+end
+
+-- Stop the delay created by task:Delay or task:Interval.
+function task:StopTimer()
+	em:UnregisterForUpdate(self.name)
+	return self
+end
+
+-- Set a FuncOfTask as a final handler. If you call Called if something went wrong in your context.
+function task:Finally(funcOfTask)
+	self.finally = funcOfTask
+	return self
+end
+
+-- Set a FuncOfTask as an error handler. Called if something went wrong in your context.
+function task:OnError(funcOfTask)
+	self.onError = funcOfTask
+	return self
+end
+
+do
+	-- Thanks to: https://de.wikipedia.org/wiki/Quicksort
+
+	local function simpleCompare(a, b) return a < b end
+	local function sort(task, array, compare)
+		local function quicksort(left, right)
+			if left >= right then return end
+
+			-- partition
+			local i, j, pivot = left, right - 1, array[right]
+
+			task:Call( function()
+				while i < right and compare(array[i], pivot) do i = i + 1 end
+				while j > left and not compare(array[j], pivot) do j = j - 1 end
+				if i < j then
+					array[i], array[j] = array[j], array[i]
+					-- repeatly call this function until i >= j
+					return true
+				end
+			end ):Then( function()
+				if compare(pivot, array[i]) then array[i], array[right] = array[right], array[i] end
+				quicksort(left, i - 1)
+				quicksort(i + 1, right)
+			end )
+		end
+		quicksort(1, #array)
+	end
+
+	-- This sort function works like table.sort(). The compare function is optional.
+	function task:Sort(array, compare)
+		local sortJob = function(task) sort(task, array, compare or simpleCompare) end
+		if current or #self.callstack == 0 then return self:Call(sortJob) else return self:Then(sortJob) end
+	end
+end
+
+-- Class async
+
+-- Get the current context, if you are within a FuncOfTask or nil.
+function async:GetCurrent()
+	return current
+end
+
+-- Create an interruptible task context.
+function async:Create(name)
+	return task:New(name)
+end
+
+do
+	local Default = task:New("*Default Task*")
+	function Default:Cancel() error("Not allowed on default task. Use your_lib_var:Create(optional_name) for an interruptible task context.") end
+	Default.Finally = Default.Cancel
+	Default.OnError = Default.Cancel
+
+	-- Start a non-interruptible task or start a nested call in the current context.
+	function async:Call(funcOfTask)
+		-- if async:Call is called from within a task callback (the moment where GetCurrent() is not nil) use it for nested calls
+		return(async:GetCurrent() or Default):Call(funcOfTask)
+	end
+	-- Start a non-interruptible for-loop or start a nested for-loop in the current context.
+	function async:For(p1, p2, p3)
+		return(self:GetCurrent() or Default):For(p1, p2, p3)
+	end
+
+	-- Start a non-interruptible sort or start a nested sort in the current context.
+	function async:Sort(array, compare)
+		return(self:GetCurrent() or Default):Sort(array, compare)
+	end
+end
+
+-- async.BREAK is the new 'break' for breaking loops. As Lua would not allowed the keyword 'break' in that context.
+-- To break a for-loop, return async.BREAK
+async.BREAK = true
diff --git a/libs/LibCustomMenu/LibCustomMenu.lua b/libs/LibCustomMenu/LibCustomMenu.lua
new file mode 100644
index 0000000..f458546
--- /dev/null
+++ b/libs/LibCustomMenu/LibCustomMenu.lua
@@ -0,0 +1,665 @@
+-- authors: votan, sirinsidiator
+-- thanks to: baertram & circonian
+
+-- Register with LibStub
+local MAJOR, MINOR = "LibCustomMenu", 6.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
+
+---- Hook points for context menu -----
+local function PreHook(objectTable, existingFunctionName, hookFunction)
+	if type(objectTable) == "string" then
+		hookFunction = existingFunctionName
+		existingFunctionName = objectTable
+		objectTable = _G
+	end
+
+	local existingFn = objectTable[existingFunctionName]
+	local newFn
+	if existingFn and type(existingFn) == "function" then
+		newFn = function(...)
+			hookFunction(...)
+			return existingFn(...)
+		end
+	else
+		newFn = hookFunction
+	end
+	objectTable[existingFunctionName] = newFn
+end
+
+local function HookContextMenu()
+	local category, registry, inventorySlot, slotActions, entered
+	local function Reset()
+		category, registry, inventorySlot, slotActions = 0, nil, nil, nil
+	end
+	local function RemoveMouseOverKeybinds()
+		if entered then
+			entered = false
+			lib.keybindRegistry:FireCallbacks("Exit")
+		end
+		Reset()
+	end
+	local function addCategory()
+		category = category + 1
+		registry:FireCallbacks(category, inventorySlot, slotActions)
+	end
+	local function AddSlots(...)
+		Reset()
+		inventorySlot, slotActions = ...
+		if slotActions.m_contextMenuMode then
+			registry = lib.contextMenuRegistry
+		else
+			entered = true
+			registry = lib.keybindRegistry
+		end
+	end
+	local function InsertToMenu()
+		if category < 4 and inventorySlot then
+			addCategory()
+		end
+	end
+	local function AppendToMenu()
+		if registry then
+			if inventorySlot then
+				while category <= 6 do addCategory() end
+			end
+			Reset()
+		end
+	end
+	Reset()
+
+	PreHook("ZO_InventorySlot_RemoveMouseOverKeybinds", RemoveMouseOverKeybinds)
+	PreHook("ZO_InventorySlot_OnMouseExit", RemoveMouseOverKeybinds)
+	PreHook("ZO_InventorySlot_DiscoverSlotActionsFromActionList", AddSlots)
+	PreHook(ZO_InventorySlotActions, "AddSlotAction", InsertToMenu)
+	PreHook(ZO_InventorySlotActions, "Show", AppendToMenu)
+	PreHook(ZO_InventorySlotActions, "GetPrimaryActionName", AppendToMenu)
+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
+
+function lib:RegisterContextMenu(func, category, ...)
+	category = zo_clamp(category or self.CATEGORY_LATE, self.CATEGORY_EARLY, self.CATEGORY_LATE)
+	self.contextMenuRegistry:RegisterCallback(category, func, ...)
+end
+
+function lib:RegisterKeyStripEnter(func, category, ...)
+	category = zo_clamp(category or self.CATEGORY_LATE, self.CATEGORY_EARLY, self.CATEGORY_LATE)
+	self.keybindRegistry:RegisterCallback(category, func, ...)
+end
+
+function lib:RegisterKeyStripExit(func, ...)
+	self.keybindRegistry:RegisterCallback("Exit", func, ...)
+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()
+	HookContextMenu()
+end
+
+lib.contextMenuRegistry = lib.contextMenuRegistry or ZO_CallbackObject:New()
+lib.keybindRegistry = lib.keybindRegistry or ZO_CallbackObject:New()
+
+lib.CATEGORY_EARLY = 1
+lib.CATEGORY_PRIMARY = 2
+lib.CATEGORY_SECONDARY = 3
+lib.CATEGORY_TERTIARY = 4
+lib.CATEGORY_QUATERNARY = 5
+lib.CATEGORY_LATE = 6
+
+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
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/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/libs/LibCustomTitles/LibCustomTitles.lua b/libs/LibCustomTitles/LibCustomTitles.lua
new file mode 100644
index 0000000..441c396
--- /dev/null
+++ b/libs/LibCustomTitles/LibCustomTitles.lua
@@ -0,0 +1,563 @@
+--[[
+Author: Ayantir
+Filename: LibCustomTitles.lua
+Version: 20
+]]--
+
+--[[
+
+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", 20
+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 (v12 changes)
+			["Vivicah Telvanni"] = {
+				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
+				en = "Archmagister",
+				fr = "Archimage",
+				de = "Erzmagister",
+			},
+			["Sugar-Paws Underfoot"] = {
+				ov = true,
+				en = "Favorite Apprentice",
+				fr = "Apprenti préféré",
+				de = "Lieblingslehrling",
+			},
+			["Ravani Indoril"] = {
+				ov = true,
+				en = "Warden",
+				fr = "Sentinelle",
+				de = "Aufseher",
+			},
+			["Telvanni Ravani Varo"] = {
+				ov = true,
+				en = "Warden",
+				fr = "Sentinelle",
+				de = "Aufseher",
+			},
+		},
+
+		["@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",
+			},
+			["Nathyn Varo"] = {
+				ov = true,
+				en = "Warden",
+				fr = "Sentinelle",
+				de = "Aufseher",
+			},
+		},
+
+		["@Manorin"] = { -- EU v10 (v12 fix)
+			["Foryn Telvanni"] = {
+				ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
+				en = "Hero",
+				fr = "Héros",
+				de = "Helt",
+			},
+			["Serjo Vivicah Telvanni"] = {
+				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meisterin der Zauberei"},
+				en = "Archmagister",
+				fr = "Archimage",
+				de = "Erzmagister",
+			},
+		},
+
+		["@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",
+			},
+		},
+
+		["@Haunted1994"] = { -- v12
+			["Jah'rakal"] = {
+				ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
+				en = "Troll Warlord",
+				fr = "Troll Warlord",
+				de = "Troll Warlord",
+			},
+		},
+
+		["@Vortexman11"] = { -- v12
+			["Ålaunus"] = {
+				ov = true,
+				en = "The Silent",
+				fr = "Le Discret",
+				de = "Die Stille",
+			},
+		},
+
+		["@Domardal"] = { -- v12
+			ov = true,
+			en = "Coco",
+			fr = "Coco",
+			de = "Coco",
+		},
+
+		["@RaddyBK"] = { -- v12
+			["Radolfus"] = {
+				ov = {en = "Major", fr = "Major", de = "Major"},
+				en = "The Elder Dragon",
+				fr = "Le Vieux Dragon",
+				de = "The Elder Dragon",
+			},
+			["RADOLFUS II"] = {
+				ov = {en = "Executioner", fr = "Exécuteur", de = "Henker"},
+				en = "The Elder Dragon",
+				fr = "Le Vieux Dragon",
+				de = "The Elder Dragon",
+			},
+		},
+
+		["@Dolgubon"] = { -- v12
+			["Relthion"] = {
+				ov = true,
+				en = "Undying",
+				fr = "L'immortel",
+				de = "Undying",
+			},
+		},
+
+		["@Sethize"] = { -- EU v12
+			["Nelvan Telvanni"] = {
+				ov = {en = "Master Wizard", fr = "Maître mage", de = "Meister der Zauberei"},
+				en = "Master",
+				fr = "Maître",
+				de = "Meister",
+			},
+		},
+
+		["@ScattyThePirate"] = { -- EU v13
+			["Teldryn Dreth"] = {
+				ov = true,
+				en = "Warden",
+				fr = "Sentinelle",
+				de = "Aufseher",
+			},
+			["Ralyn Telvanni"] = {
+				ov = true,
+				en = "Spellwright",
+				fr = "Tisseur de Sorts",
+				--de = "Meister",
+			},
+			["Shabar-Jo"] = {
+				ov = true,
+				en = "Tisseur de Sorts",
+				fr = "Spellwright",
+				--de = "Meister",
+			},
+			["Shurkul gro-Kharzog"] = {
+				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
+				en = "The Monster",
+				fr = "La Bête",
+				de = "Das Monster",
+			},
+			["Azuk gro-Shakh"] = {
+				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
+				en = "Windsinger",
+				fr = "Ténor des tempêtes",
+				--de = "Das Monster",
+			},
+			["Xal-Shei"] = {
+				ov = {en = "Fighters Guild Victor", fr = "Champion de la guilde des guerriers", de = "Sieger der Kriegergilde"},
+				en = "Swamp Knight",
+				fr = "Chevalier des Marais",
+				--de = "Das Monster",
+			},
+		},
+
+		["@ScattyTheWizard"] = { -- v13
+			["Marukh-do"] = {
+				ov = true,
+				en = "Privateer",
+				fr = "Corsaire",
+				--de = "Meister",
+			},
+		},
+
+		["@Karstyll"] = { -- v13
+			ov = true,
+			en = "Forsaken",
+			fr = "L'oublié",
+			de = "Die Verlassene",
+		},
+
+		["@Methuselah86"] = { -- v13
+			ov = true,
+			en = "Wabbajack Warrior",
+			fr = "Guerrier de Wabbajack",
+			--de = "Die Verlassene",
+		},
+
+		["@DaedricAdept"] = { -- v14
+			ov = {en = "Pact Hero", fr = "Héros du Pacte", de = "Held des Paktes"},
+			en = "Hand of Almalexia",
+			fr = "Main d'Almalexia",
+			--de = "Die Verlassene",
+		},
+
+		["@Cloudless"] = { -- v14
+			ov = true,
+			en = "Order of Doctrine",
+			fr = "Ordre de la Doctrine",
+			--de = "Die Verlassene",
+		},
+
+		["@Atomkern"] = { -- v13
+			ov = true,
+			en = "The Refrigerator",
+			fr = "Le glacé",
+			--de = "Die Verlassene",
+		},
+
+		["@Orizonta"] = { -- v13
+			ov = true,
+			en = "Manslayer",
+			fr = "Assassin",
+			--de = "Die Verlassene",
+		},
+
+		["@laksikus"] = { -- v13
+			ov = {en = "Veteran", fr = "Vétéran", de = "Veteran"},
+			en = "Sexy Zogger",
+			fr = "Zog-Zog",
+			--de = "Die Verlassene",
+		},
+
+		["@flyty"] = { -- v13
+			ov = true,
+			en = "Always Drunk",
+			fr = "Toujours bourré",
+			--de = "Die Verlassene",
+		},
+
+		["@Deltia"] = { -- v13
+			ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
+			en = "The Destroyer",
+			fr = "Le Destructeur",
+			--de = "Die Verlassene",
+		},
+
+		["@tannips"] = { -- v13
+			ov = true,
+			en = "Potentate",
+			fr = "Potentat",
+			--de = "Die Verlassene",
+		},
+
+		["@sioniann"] = { -- v13
+			["Uloth The Furious Blade"] = {
+				ov = true,
+				en = "Sinister Turkey",
+				fr = "Dindon Sinistre",
+				--de = "Meister",
+			},
+			["Enid an Gleana"] = {
+				ov = true,
+				en = "Fountain of Auridon",
+				fr = "Fontaine d'Auridia",
+				--de = "Meister",
+			},
+		},
+
+		["@HMS-Dragonfly"] = { -- v16
+			ov = true,
+			en = "Knight of Stendarr",
+			fr = "Chevalier de Stendarr",
+			--de = "Die Verlassene",
+		},
+
+		["@Faso"] = { -- v16
+			["Fasò"] = {
+				ov = true,
+				en = "Knights Radiant",
+			},
+		},
+
+		["@nifty2g"] = { -- v16
+			["Nifty Jong-Un"] = {
+				ov = true,
+				en = "Dawn of Anu",
+			},
+		},
+
+		["@Twirlz"] = { -- v17
+			["Yirel Virith"] = {
+				ov = true,
+				en = "Nightcaller",
+			},
+		},
+
+		["@Anceane"] = { -- v19
+			ov = true,
+			en = "Dark Emerald",
+			fr = "Emeraude Sombre",
+		},
+
+		["@Potato-Salad"] = { -- v19
+			ov = true,
+			en = "Seraphim of Azura",
+			fr = "Séraphin d'Azura",
+		},
+
+		["@blakeblox"] = { -- v19
+			["fyboba"] = {
+				ov = {en = "Tyro", fr = "Première classe", de = "Tyro"},
+				en = "Golden Lady",
+			},
+		},
+
+	}
+
+	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/LibStub/LibStub.lua b/libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/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/locale/de.lua b/locale/de.lua
new file mode 100644
index 0000000..00dfad3
--- /dev/null
+++ b/locale/de.lua
@@ -0,0 +1,211 @@
+local filterDisabled = "disables this filter"
+local strings = {
+
+	-- Furniture Shopping List
+	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
+	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
+	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
+
+	-- GUI and debug
+	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
+	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
+	SI_FURC_ADD_FAVE = 							" Add Favorite",
+	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
+	SI_FURC_POST_RECIPE = 						" Post recipe",
+	SI_FURC_POST_MATERIAL = 					" Post material",
+	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
+	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
+	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
+	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
+	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
+	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
+	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
+	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
+	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
+	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
+	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
+	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
+	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
+	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
+	SI_FURC_STRING_AP =							" AP",
+	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
+	SI_FURC_STRING_HC = 						"Hollow City",
+	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
+	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
+
+	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
+	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
+	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
+	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
+	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
+
+	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
+	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
+	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
+	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
+	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
+	SI_FURC_CHESTS =                            "From treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
+
+	-- =============================== --
+	-- ============ MENU ============= --
+	-- =============================== --
+
+	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
+	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
+	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
+	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
+	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
+	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
+	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
+	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
+	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character data",
+	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
+	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
+	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
+	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
+	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
+	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
+	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
+	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
+	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
+
+	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
+	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
+	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
+	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
+	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
+	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
+	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
+	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
+	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
+	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
+	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
+	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
+	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
+	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
+
+	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
+	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
+	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
+	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
+
+	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
+	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
+
+	-- =============================== --
+	-- ==== GUI: Dropdown entries ==== --
+	-- =============================== --
+
+	SI_FURC_NONE 									= "Source filter: off",
+	SI_FURC_FAVE 									= "Favorites",
+	SI_FURC_CRAFTING								= "Craftable: All",
+	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
+	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
+	SI_FURC_VENDOR									= "Purchaseable (gold)",
+	SI_FURC_PVP										= "Purchaseable (AP)",
+	SI_FURC_CROWN									= "Crown Store",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_LUXURY									= "Luxury items",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_OTHER									= "Other",
+
+	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
+	SI_FURC_FILTER_VERSION_HS						= "Homestead",
+	SI_FURC_FILTER_VERSION_M						= "Morrowind",
+	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
+	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
+	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
+
+	-- =============================== --
+	-- = GUI: Dropdown entry tooltip = --
+	-- =============================== --
+
+	SI_FURC_NONE_TT 								= "disables this filter",
+	SI_FURC_FAVE_TT 								= "Shows your favorites",
+	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
+	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
+	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
+	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
+	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
+	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
+	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
+	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
+	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
+
+	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
+	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
+	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
+	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
+	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
+	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
+
+
+	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
+	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
+
+	-- =============================== --
+	-- ========= GUI: Heading ======== --
+	-- =============================== --
+
+	SI_FURC_LABEL_ENTRIES							= " entries -",
+
+
+    -- =============================== --
+	-- ========= Item Sources ======== --
+	-- =============================== --
+	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
+	SI_FURC_CANBESTOLEN 					        = "can be stolen",
+    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
+    SI_FURC_CANBEFISHED				                = "can be fished",
+    SI_FURC_HARVEST				                    = "from harvesting nodes",
+    SI_FURC_PLANTS						            = "from harvesting plants",
+    SI_FURC_SCAMBOX						            = "Crown Crates",
+    SI_FURC_AUTOMATON						        = "from automatons",
+    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
+    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
+    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
+    SI_FURC_DB_POISON					            = "with poison",
+    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
+    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
+    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
+    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
+    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
+	SI_FURC_CHESTS                                  = "from treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
+	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 2)
+end
\ No newline at end of file
diff --git a/locale/en.lua b/locale/en.lua
new file mode 100644
index 0000000..d7bc6ec
--- /dev/null
+++ b/locale/en.lua
@@ -0,0 +1,245 @@
+local filterDisabled = "disables this filter"
+local strings = {
+
+	FURC_AV_RAZ									= "Razoufa",
+	FURC_AV_MUL									= "Mulvise Valyn",
+
+	FURC_AV_NAR									= "Narwaawende",
+	FURC_AV_LTS									= "Listens-To-Sea",
+	FURC_AV_HER									= "Heralda Garscroft",
+	FURC_AV_FRO									= "Frohilde Snow-Hair",
+	FURC_AV_LOT									= "Lozotusk",
+	FURC_AV_ROH									= "Rohzika",
+	FURC_AV_ATH									= "Athragor",
+	FURC_AV_MAL									= "Maladdiq",
+	FURC_AV_KRR									= "Krrztrrb",
+	FURC_AV_ENC									= "enchanters",
+	FURC_AV_ALC									= "alchemists",
+	FURC_AV_OUT									= "Outlaw Refuge, Merchant",
+	FURC_AV_COO									= "cooks",
+	FURC_AV_CLO									= "clothiers",
+	FURC_AV_CAR									= "carpenters",
+	FURC_AV_BSM									= "blacksmiths",
+
+
+
+	-- Furniture Shopping List
+	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
+	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
+	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
+
+	-- GUI and debug
+	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
+	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
+	SI_FURC_ADD_FAVE = 							" Add Favorite",
+	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
+	SI_FURC_POST_RECIPE = 						" Post recipe",
+	SI_FURC_POST_ITEM = 						" Post item",
+	SI_FURC_POST_MATERIAL = 					" Post material",
+	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
+	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
+	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
+	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
+	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
+	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
+	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
+	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
+	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
+	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
+	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
+	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
+	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
+	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>>, <<3>>)",
+	SI_FURC_STRING_AP =							" AP",
+	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
+	SI_FURC_STRING_HC = 						"Hollow City",
+	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
+	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
+
+	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
+	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
+	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
+	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
+	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
+
+	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
+	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
+	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
+	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
+
+	-- =============================== --
+	-- ============ MENU ============= --
+	-- =============================== --
+
+	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
+	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
+	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
+	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
+	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
+	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
+	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
+	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
+	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
+	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
+	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
+	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
+	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
+	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
+	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
+	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
+	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
+	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
+
+	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
+	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
+	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
+	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
+	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
+	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
+	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
+	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
+	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
+	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
+	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
+	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
+	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
+
+	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
+	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
+	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
+	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
+
+    -- Filter text search
+    SI_FURC_STRING_MENU_HEADER_F_ALL_ON_TEXT =  "Filter settings for text search",
+    SI_FURC_STRING_MENU_F_ALL_ON_TEXT =         "Configure this filter",
+    SI_FURC_STRING_MENU_HEADER_F_ALL_DESC =     "Configure filter settings for text search with disabled dropdowns. \nThese settings will only take effect when you have not set a source, character or version filter.",
+
+    SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
+    SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT_TT = "When doing a text search without any dropdown ",
+    SI_FURC_STRING_MENU_FALL_HIDE_BOOKS =       "Hide books anyway",
+    SI_FURC_STRING_MENU_FALL_HIDE_BOOKS_TT =    "Even when filtering all items, still hide books?",
+    SI_FURC_STRING_MENU_FALL_HIDE_CROWN =       "Hide crown store items anyway",
+    SI_FURC_STRING_MENU_FALL_HIDE_CROWN_TT =    "Even when filtering all items, still hide crown store items?",
+    SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR =      "Hide rumour items anyway",
+    SI_FURC_STRING_MENU_FALL_HIDE_RUMOUR_TT =   "Even when filtering all items, still hide rumour items?",
+
+    -- Hide menu entries
+	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
+	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
+
+	-- =============================== --
+	-- ==== GUI: Dropdown entries ==== --
+	-- =============================== --
+
+	SI_FURC_NONE 									= "Source filter: off",
+	SI_FURC_FAVE 									= "Favorites",
+	SI_FURC_CRAFTING								= "Craftable: All",
+	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
+	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
+	SI_FURC_VENDOR									= "Purchaseable (gold)",
+	SI_FURC_PVP										= "Purchaseable (AP)",
+	SI_FURC_CROWN									= "Crown Store",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_LUXURY									= "Luxury items",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_OTHER									= "Other",
+
+	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
+	SI_FURC_FILTER_VERSION_HS						= "Homestead",
+	SI_FURC_FILTER_VERSION_M						= "Morrowind",
+	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
+	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
+	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
+
+	-- =============================== --
+	-- = GUI: Dropdown entry tooltip = --
+	-- =============================== --
+
+	SI_FURC_NONE_TT 								= "disables this filter",
+	SI_FURC_FAVE_TT 								= "Shows your favorites",
+	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
+	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
+	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
+	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
+	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
+	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
+	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
+	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
+	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
+
+	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
+	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
+	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
+	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
+	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
+	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
+
+
+	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
+	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
+
+	-- =============================== --
+	-- ========= GUI: Heading ======== --
+	-- =============================== --
+
+	SI_FURC_LABEL_ENTRIES							= " entries -",
+
+    -- =============================== --
+	-- ========= Item Sources ======== --
+	-- =============================== --
+	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
+	SI_FURC_CANBESTOLEN 					        = "can be stolen",
+    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
+    SI_FURC_CANBEFISHED				                = "can be fished",
+    SI_FURC_HARVEST				                    = "from harvesting nodes",
+    SI_FURC_WW				                        = "occasionally found in wood nodes",
+    SI_FURC_PLANTS						            = "from harvesting plants",
+    SI_FURC_SCAMBOX						            = "Crown Crates",
+    SI_FURC_AUTOMATON						        = "from automatons",
+    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
+    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
+    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
+    SI_FURC_DB_POISON					            = "with poison",
+    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
+    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
+    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
+    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
+    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
+	SI_FURC_CHESTS                                  = "from treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
+	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 1)
+end
\ No newline at end of file
diff --git a/locale/fr.lua b/locale/fr.lua
new file mode 100644
index 0000000..31bc2bd
--- /dev/null
+++ b/locale/fr.lua
@@ -0,0 +1,213 @@
+local filterDisabled = "disables this filter"
+local strings = {
+
+	-- Furniture Shopping List
+	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
+	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
+	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
+
+	-- GUI and debug
+	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
+	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
+	SI_FURC_ADD_FAVE = 							" Add Favorite",
+	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
+	SI_FURC_POST_RECIPE = 						" Post recipe",
+	SI_FURC_POST_MATERIAL = 					" Post material",
+	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
+	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
+	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
+	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
+	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
+	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
+	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
+	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
+	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
+	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
+	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
+	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
+	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
+	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
+	SI_FURC_STRING_AP =							" AP",
+	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
+	SI_FURC_STRING_HC = 						"Hollow City",
+	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
+	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
+
+	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
+	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
+
+	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
+	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
+	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
+
+	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
+	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
+	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
+	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
+	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
+	SI_FURC_CHESTS =                            "From treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
+
+	-- =============================== --
+	-- ============ MENU ============= --
+	-- =============================== --
+
+	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
+	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
+	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
+	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
+	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
+	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
+	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
+	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
+	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
+	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
+	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
+	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
+	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
+	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
+	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
+	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
+	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
+	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
+
+	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
+	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
+	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
+	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
+	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
+	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
+	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
+	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
+	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
+	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
+	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
+	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
+	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
+
+	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
+	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
+	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
+	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
+	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
+
+	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
+	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
+
+	-- =============================== --
+	-- ==== GUI: Dropdown entries ==== --
+	-- =============================== --
+
+	SI_FURC_NONE 									= "Source filter: off",
+	SI_FURC_FAVE 									= "Favorites",
+	SI_FURC_CRAFTING								= "Craftable: All",
+	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
+	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
+	SI_FURC_VENDOR									= "Purchaseable (gold)",
+	SI_FURC_PVP										= "Purchaseable (AP)",
+	SI_FURC_CROWN									= "Crown Store",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_LUXURY									= "Luxury items",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_OTHER									= "Other",
+
+	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
+	SI_FURC_FILTER_VERSION_HS						= "Homestead",
+	SI_FURC_FILTER_VERSION_M						= "Morrowind",
+	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
+	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
+	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
+
+	-- =============================== --
+	-- = GUI: Dropdown entry tooltip = --
+	-- =============================== --
+
+	SI_FURC_NONE_TT 								= "disables this filter",
+	SI_FURC_FAVE_TT 								= "Shows your favorites",
+	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
+	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
+	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
+	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
+	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
+	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
+	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
+	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
+	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
+
+	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
+	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
+	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
+	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
+	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
+	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
+
+
+	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
+	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
+
+	-- =============================== --
+	-- ========= GUI: Heading ======== --
+	-- =============================== --
+
+	SI_FURC_LABEL_ENTRIES							= " entries -",
+
+
+
+    -- =============================== --
+	-- ========= Item Sources ======== --
+	-- =============================== --
+	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
+	SI_FURC_CANBESTOLEN 					        = "can be stolen",
+    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
+    SI_FURC_CANBEFISHED				                = "can be fished",
+    SI_FURC_HARVEST				                    = "from harvesting nodes",
+    SI_FURC_PLANTS						            = "from harvesting plants",
+    SI_FURC_SCAMBOX						            = "Crown Crates",
+    SI_FURC_AUTOMATON						        = "from automatons",
+    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
+    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
+    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
+    SI_FURC_DB_POISON					            = "with poison",
+    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
+    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
+    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
+    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
+    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
+	SI_FURC_CHESTS                                  = "from treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
+	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 2)
+end
\ No newline at end of file
diff --git a/locale/jp.lua b/locale/jp.lua
new file mode 100644
index 0000000..f69c004
--- /dev/null
+++ b/locale/jp.lua
@@ -0,0 +1,213 @@
+local filterDisabled = "disables this filter"
+local strings = {
+
+	-- Furniture Shopping List
+	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
+	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
+	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
+
+	-- GUI and debug
+	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
+	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
+	SI_FURC_ADD_FAVE = 							" Add Favorite",
+	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
+	SI_FURC_POST_RECIPE = 						" Post recipe",
+	SI_FURC_POST_MATERIAL = 					" Post material",
+	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
+	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
+	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
+	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
+	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
+	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
+	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
+	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
+	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
+	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
+	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
+	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
+	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
+	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
+	SI_FURC_STRING_AP =							" AP",
+	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
+	SI_FURC_STRING_HC = 						"Hollow City",
+	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
+	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
+
+	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
+	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
+
+	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
+	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
+	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
+
+	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
+	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
+	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
+	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
+	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
+	SI_FURC_CHESTS =                            "From treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
+
+	-- =============================== --
+	-- ============ MENU ============= --
+	-- =============================== --
+
+	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
+	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
+	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
+	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
+	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
+	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
+	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
+	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
+	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
+	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
+	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
+	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
+	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
+	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
+	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
+	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
+	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
+	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
+
+	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
+	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
+	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
+	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
+	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
+	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
+	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
+	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
+	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
+	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
+	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
+	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
+	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
+
+	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
+	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
+	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
+	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
+	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
+
+	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
+	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
+
+	-- =============================== --
+	-- ==== GUI: Dropdown entries ==== --
+	-- =============================== --
+
+	SI_FURC_NONE 									= "Source filter: off",
+	SI_FURC_FAVE 									= "Favorites",
+	SI_FURC_CRAFTING								= "Craftable: All",
+	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
+	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
+	SI_FURC_VENDOR									= "Purchaseable (gold)",
+	SI_FURC_PVP										= "Purchaseable (AP)",
+	SI_FURC_CROWN									= "Crown Store",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_LUXURY									= "Luxury items",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_OTHER									= "Other",
+
+	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
+	SI_FURC_FILTER_VERSION_HS						= "Homestead",
+	SI_FURC_FILTER_VERSION_M						= "Morrowind",
+	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
+	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
+	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
+
+	-- =============================== --
+	-- = GUI: Dropdown entry tooltip = --
+	-- =============================== --
+
+	SI_FURC_NONE_TT 								= "disables this filter",
+	SI_FURC_FAVE_TT 								= "Shows your favorites",
+	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
+	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
+	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
+	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
+	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
+	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
+	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
+	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
+	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
+
+	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
+	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
+	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
+	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
+	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
+	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
+
+
+	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
+	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
+
+	-- =============================== --
+	-- ========= GUI: Heading ======== --
+	-- =============================== --
+
+	SI_FURC_LABEL_ENTRIES							= " entries -",
+
+
+
+    -- =============================== --
+	-- ========= Item Sources ======== --
+	-- =============================== --
+	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
+	SI_FURC_CANBESTOLEN 					        = "can be stolen",
+    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
+    SI_FURC_CANBEFISHED				                = "can be fished",
+    SI_FURC_HARVEST				                    = "from harvesting nodes",
+    SI_FURC_PLANTS						            = "from harvesting plants",
+    SI_FURC_SCAMBOX						            = "Crown Crates",
+    SI_FURC_AUTOMATON						        = "from automatons",
+    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
+    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
+    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
+    SI_FURC_DB_POISON					            = "with poison",
+    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
+    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
+    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
+    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
+    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
+	SI_FURC_CHESTS                                  = "from treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
+	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 2)
+end
\ No newline at end of file
diff --git a/locale/ru.lua b/locale/ru.lua
new file mode 100644
index 0000000..75f52e7
--- /dev/null
+++ b/locale/ru.lua
@@ -0,0 +1,212 @@
+local filterDisabled = "disables this filter"
+local strings = {
+
+	-- Furniture Shopping List
+	SI_FURC_ONE_TO_SHOPPINGLIST = 				"Add 1 to shopping list",
+	SI_FURC_FIVE_TO_SHOPPINGLIST = 				"Add 5 to shopping list",
+	SI_FURC_TOGGLE_SHOPPINGLIST = 				" Toggle shopping list",
+
+	-- GUI and debug
+	SI_FURC_MENU_HEADER = 						"- |cD3B830Furniture|r:",
+	SI_FURC_REMOVE_FAVE = 						" Remove Favorite",
+	SI_FURC_ADD_FAVE = 							" Add Favorite",
+	SI_FURC_POST_ITEMSOURCE = 					" Post item source",
+	SI_FURC_POST_RECIPE = 						" Post recipe",
+	SI_FURC_POST_MATERIAL = 					" Post material",
+	SI_FURC_DIALOGUE_RESET_DB_HEADER = 			"Really re-create furniture database?",
+	SI_FURC_DIALOGUE_RESET_DB_BODY = 			"This will re-create the FurnitureCatalogue database from scratch",
+	SI_FURC_TEXTBOX_FILTER_DEFAULT = 			"Filter by text search",
+	SI_FURC_DEBUG_CHARSCANCOMPLETE = 			"|c2266ffFurniture Catalogue|r|cffffff: Character scan complete...|r",
+	SI_FURC_VERBOSE_STARTUP = 					"|c2266ffFurniture Catalogue|r|cffffff: |cffffffIf you miss any recipes, please trigger a scan on your furniture crafter by clicking the refresh button in the UI.|r",
+	SI_FURC_VERBOSE_DB_UPTODATE = 				"|c2266ffFurniture Catalogue|r|cffffff: The database is up-to-date.|r",
+	SI_FURC_VERBOSE_SCANNING_DATA_FILE =		"|c2266ffFurniture Catalogue|r|cffffff: Scanning data files...|r",
+	SI_FURC_VERBOSE_SCANNING_CHARS =			"Not scanning files, scanning character knowledge now...",
+	SI_FURC_ITEMSOURCE_EMPTY =					"Item source unknown.\nTry to re-scan files (refresh button right click).\nIf still unknown after, please send a mail with the item link and -source to @manavortex",
+	SI_FURC_RUMOUR_SOURCE_RECIPE =				"This recipe has been datamined, but not seen in-game",
+	SI_FURC_RUMOUR_SOURCE_ITEM =				"This item has been datamined, but not seen in-game",
+	SI_FURC_STRING_CRAFTABLE_BY =				"Can be crafted by ",
+	SI_FURC_STRING_CANNOT_CRAFT =				"You cannot craft this yet",
+	SI_FURC_STRING_VENDOR = 					"sold by <<1>> in <<2>> (<<3>>, <<4>>)",
+	SI_FURC_STRING_AP =							" AP",
+	SI_FURC_STRING_ASSHOLE = 					"Zanil Theran",
+	SI_FURC_STRING_HC = 						"Hollow City",
+	SI_FURC_STRING_WASSOLDBY = 					"Was sold by <<1>> in <<2>> (<<3>>) <<4>>",
+	SI_FURC_STRING_WEEKEND_AROUND = 			"(around <<1>>)",
+
+	SI_FURC_STRING_WRIT_VENDOR =				"Master Writ Vendor",
+	SI_FURC_STRING_WRIT_VENDOR_TT =				"Obtainable for Master Writs in your alliance's capital",
+
+	SI_FURC_STRING_ROLLIS = 					"Sold by |cd68957Rollis Hlaalu|r <<1>>",
+	SI_FURC_STRING_FAUSTINA = 					"Sold by |cd68957Faustina Curio|r <<1>>",
+	SI_FURC_STRING_FOR_VOUCHERS =				"for <<1>> vouchers",
+
+	SI_FURC_FESTIVAL_DROP = 					"can be acquired during <<1>> (<<2>>)",
+	SI_FURC_STRING_RECIPELEARNED = 				"Recipe learned: <<1>> <<2>> <<3>>",
+	SI_FURC_STRING_RECIPESFORCHAR = 			"recipes for <<1>>",
+	SI_FURC_STRING_VENDOR =						"Sold by <<1>> (<<2>><<3>>)",
+	SI_FURC_STRING_VOUCHER_VENDOR =				"Sold by either Rollis Hlaalu or Faustina Curio",
+	SI_FURC_CHESTS =                            "From treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING =              "extremely rarely from safeboxes or treasure chests",
+
+	-- =============================== --
+	-- ============ MENU ============= --
+	-- =============================== --
+
+	SI_FURC_STRING_MENU_DEBUG = 				"Enable debug output",
+	SI_FURC_STRING_MENU_RESET_DB_NAME = 		"|cFF0000Reset database|r",
+	SI_FURC_STRING_MENU_RESET_DB_TT = 			"This will reset the furniture database.",
+	SI_FURC_STRING_MENU_RESET_DB_WARNING =		"All your data will be reset. Only recipe knowledge for this character will be considered.",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_NAME =  	"Re-scan Rumour recipes",
+	SI_FURC_STRING_MENU_RESCAN_RUMOUR_TT = 		"Will update the rumour recipes against the updated list",
+	SI_FURC_STRING_MENU_SCAN_FILES_NAME =		"Scan files",
+	SI_FURC_STRING_MENU_SCAN_FILES_TT = 		"Will run a full scan of the data in Furniture Catalogue's files",
+	SI_FURC_STRING_MENU_SCAN_CHAR_NAME = 		"Scan character",
+	SI_FURC_STRING_MENU_SCAN_CHAR_TT = 			"Will run a full scan of your known furniture recipes and update the database accordingly",
+	SI_FURC_STRING_MENU_DELETE_CHAR_NAME =		"delete character",
+	SI_FURC_STRING_MENU_DELETE_CHAR_TT =		"Deletes all knowledge for this character from the database. \nCharacter will be scanned again the next time they log in with the add-on enabled. \n Character name won't show up in the dropdown if they don't know any recipes!",
+	SI_FURC_STRING_MENU_DELETE_CHAR_WARNING =	"Character knowledge will be wiped immediately",
+	SI_FURC_STRING_MENU_ENABLE_SHOPPINGLIST =	"Enable integration?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN =		"Skip Initial Scan?",
+	SI_FURC_STRING_MENU_SKIP_INITIALSCAN_TT =	"Check this to not scan your character's recipes on login. \nThanks to votan's awesome LibAsync the lag is gone now in any case..",
+	SI_FURC_STRING_MENU_HEADER_ICONS =			"Inventory and bank icons",
+	SI_FURC_STRING_MENU_ADD_ITEMS_NAME = 		"Add items to known/unknown recipes?",
+	SI_FURC_STRING_MENU_ADD_ITEMS_TT = 			"You shouldn't notice any lag",
+	SI_FURC_STRING_MENU_IT_UNKNOWN_NAME = 		"Only mark unknown recipes?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY = 			"Only for this character?",
+	SI_FURC_STRING_MENU_IT_THIS_ONLY_TT = 		"Will be accountwide otherwise.",
+	SI_FURC_STRING_MENU_USETINY = 	 			"Use tiny interface?",
+	SI_FURC_STRING_MENU_USETINY_TT = 	 		"Use a smaller interface (Craft Store like). \nYou can toggle this from the UI by clicking the +/- button.",
+
+	SI_FURC_STRING_MENU_STARTSILENT = 	 		"Start silently?",
+	SI_FURC_STRING_MENU_STARTSILENT_TT = 	 	"Suppress startup message",
+	SI_FURC_STRING_MENU_FONTSIZE = 	 			"Font size",
+	SI_FURC_STRING_MENU_FONTSIZE_TT = 	 		"adjust font size for FurnitureCatalogue here",
+	SI_FURC_STRING_MENU_DEFAULT_DD = 	 		"Default dropdown values",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE = 	 	"Will be set on initial launch",
+	SI_FURC_STRING_MENU_DEFAULT_DD_USE_TT = 	"These will not reset if you open and close the UI",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET = 		"Reset filters when closing UI?",
+	SI_FURC_STRING_MENU_DEFAULT_DD_RESET_TT = 	"If you check this, opening and closing will cause the filters to reset to whatever you set below.",
+	SI_FURC_STRING_MENU_DEFAULT_DD_SOURCE = 	"default source filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_CHAR = 		"default character filter",
+	SI_FURC_STRING_MENU_DEFAULT_DD_VERSION = 	"default version filter",
+	SI_FURC_STRING_MENU_FILTERING = 			"Catalogue filtering",
+	SI_FURC_STRING_MENU_FILTER_BOOKS = 			"Mages guild books",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_N = 		"Hide books?",
+	SI_FURC_STRING_MENU_FILTER_BOOKS_TT = 		"A real book lover knows where everything is by heart. Hide books from Furniture Catalogue?",
+	SI_FURC_STRING_MENU_LUXURY = 				"Luxury Furnishings",
+	SI_FURC_STRING_MENU_LUXURY_N = 				"Treat luxury items as purchaseables?",
+	SI_FURC_STRING_MENU_LUXURY_TT = 			"This will show everything that was sold by Zanil Theran under 'purchaseable' and deactvates the custom filter",
+	SI_FURC_STRING_MENU_LUXURY_WARN = 			"Hiding the dropdown entry requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_RUMOUR = 				"Rumour recipes",
+	SI_FURC_STRING_MENU_RUMOUR_DESC = 		 	"The furniture database contains a list of recipes that I have datamined.\nHowever, not all of those have been seen in-game.\nEnable this option to exclude them from the default filters.\nYou can still view them with their own filter, which you can disable below.",
+	SI_FURC_STRING_MENU_FILTER_ALL_ON_TEXT =    "Search filtered items when doing a text search with no dropdown filters set?",
+
+	SI_FURC_STRING_MENU_RUMOUR_N = 				"Hide rumour recipes?",
+	SI_FURC_STRING_MENU_CROWN = 				"Crown store items",
+	SI_FURC_STRING_MENU_CROWN_N = 				"Hide crown store items?",
+	SI_FURC_STRING_MENU_CROWN_DESC = 			"The furniture database will update whenever the tooltip shows a furniture item. \nSome items can only be acquired via crown store. \nCheck this box to exclude them from the default filters (disable crown store filter below).",
+
+	SI_FURC_STRING_MENU_HIDE_MENU = 				"Hide menu entries?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT = 				"Hides \"Crown store\" and \"Rumour recipes\" from the dropdown \nactivated for crown store by default, as there aren't any items yet",
+	SI_FURC_STRING_MENU_HIDE_MENU_RUMOUR = 			"Hide \"Rumour recipes\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_CROWN = 			"Hide \"Crown Store\" drop down entry?",
+	SI_FURC_STRING_MENU_HIDE_MENU_TT =				"Requires UI reload (won't happen automatically for your convenience)",
+	SI_FURC_STRING_MENU_TOOLTIP =					"Enable tooltips?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR =	 			"Colorize tooltips for clarity?",
+	SI_FURC_STRING_MENU_TOOLTIP_COLOR_TT = 			"Will colour 'can' and 'cannot'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN =  		"Hide if item is known",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_KNOWN_TT = 	"Hides 'can be crafted by...' from tooltip",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN =  	"Hide if item is unknown",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_UNKNOWN_TT =	"Hides 'you cannot craft this yet'",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_SOURCE =  		"Hide item source?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_STATION =  	"Hide crafting station?",
+	SI_FURC_STRING_MENU_TOOLTIP_HIDE_MATERIAL =  	"Hide material?",
+
+	-- =============================== --
+	-- ==== GUI: Dropdown entries ==== --
+	-- =============================== --
+
+	SI_FURC_NONE 									= "Source filter: off",
+	SI_FURC_FAVE 									= "Favorites",
+	SI_FURC_CRAFTING								= "Craftable: All",
+	SI_FURC_CRAFTING_KNOWN							= "Craftable: Known",
+	SI_FURC_CRAFTING_UNKNOWN						= "Craftable: Unknown",
+	SI_FURC_VENDOR									= "Purchaseable (gold)",
+	SI_FURC_PVP										= "Purchaseable (AP)",
+	SI_FURC_CROWN									= "Crown Store",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_LUXURY									= "Luxury items",
+	SI_FURC_RUMOUR									= "Rumour items",
+	SI_FURC_OTHER									= "Other",
+
+	SI_FURC_FILTER_VERSION_OFF						= "Version filter: off",
+	SI_FURC_FILTER_VERSION_HS						= "Homestead",
+	SI_FURC_FILTER_VERSION_M						= "Morrowind",
+	SI_FURC_FILTER_VERSION_R						= "Horns of the Reach",
+	SI_FURC_FILTER_VERSION_CC						= "Clockwork City",
+	SI_FURC_FILTER_VERSION_DRAGON					= "Dragon Bones",
+
+	-- =============================== --
+	-- = GUI: Dropdown entry tooltip = --
+	-- =============================== --
+
+	SI_FURC_NONE_TT 								= "disables this filter",
+	SI_FURC_FAVE_TT 								= "Shows your favorites",
+	SI_FURC_CRAFTING_TT								= "Shows all craftable items",
+	SI_FURC_CRAFTING_KNOWN_TT						= "Shows only known craftable items",
+	SI_FURC_CRAFTING_UNKNOWN_TT						= "Shows only unknown craftable items",
+	SI_FURC_VENDOR_TT								= "Shows only items that cannot be crafted",
+	SI_FURC_PVP_TT									= "Items that are sold for alliance points",
+	SI_FURC_CROWN_TT								= "Shows items that can only be acquired from crown store",
+	SI_FURC_RUMOUR_TT								= "Items and recipes that have been datamined, but haven't been confirmed existing",
+	SI_FURC_LUXURY_TT								= "Items that at some point were sold by Zanil Theran, Cicero's General Goods, Coldharbour",
+	SI_FURC_OTHER_TT								= "Shows items that can be farmed/stolen/found",
+
+	SI_FURC_FILTER_VERSION_OFF_TT					= filterDisabled,
+	SI_FURC_FILTER_VERSION_HS_TT					= "Items released in Homestead update",
+	SI_FURC_FILTER_VERSION_M_TT						= "YOU N\'WAH!",
+	SI_FURC_FILTER_VERSION_R_TT						= "Because all we needed were more Reachmen",
+	SI_FURC_FILTER_VERSION_CC_TT					= "Where the flywheels churn and the brass is pretty",
+	SI_FURC_FILTER_VERSION_DRAGON_TT				= "If you got this from Narsis Dren, well...",
+
+
+	SI_FURC_FILTER_CHAR_OFF							= "Character filter: off",
+	SI_FURC_FILTER_CHAR_OFF_TT						= filterDisabled,
+
+	-- =============================== --
+	-- ========= GUI: Heading ======== --
+	-- =============================== --
+
+	SI_FURC_LABEL_ENTRIES							= " entries -",
+
+
+    -- =============================== --
+	-- ========= Item Sources ======== --
+	-- =============================== --
+	SI_FURC_CANBEPICKED 					        = "can be pickpocketed",
+	SI_FURC_CANBESTOLEN 					        = "can be stolen",
+    SI_FURC_CROWNSTORESOURCE				        = "Crown Store ",
+    SI_FURC_CANBEFISHED				                = "can be fished",
+    SI_FURC_HARVEST				                    = "from harvesting nodes",
+    SI_FURC_PLANTS						            = "from harvesting plants",
+    SI_FURC_SCAMBOX						            = "Crown Crates",
+    SI_FURC_AUTOMATON						        = "from automatons",
+    SI_FURC_TOMBS 						            = "Ancestor tombs and ruins on Vvardenfell",
+    SI_FURC_DAEDRA_SOURCE 						    = "from Daedra and Dolmen chests",
+    SI_FURC_DB					                    = "The Dark Brotherhood supplies vendor hands these out ",
+    SI_FURC_DB_POISON					            = "with poison",
+    SI_FURC_DB_STEALTH					            = "as a way to be less obtrusive",
+    SI_FURC_DAILY_ASHLANDERS			            = "Ashlander daily quest rewards",
+    SI_FURC_PLUNDERSKULL			                = "Drops from Plunder Skulls during Witches' Festival",
+    SI_FURC_DROP_CHEST_VVARDENFELL	                = "Extremely rarely from chests on Vvardenfell",
+    SI_FURC_FLAME_ATRONACH	                        = "Flame Atronach",
+	SI_FURC_CHESTS                                  = "from treasure chests",
+	SI_FURC_VVARDENFELL_PAINTING                    = "extremely rarely from safeboxes",
+	SI_FURC_DRAGON_DUNGEON_DROP                     = "Fang Lair/Scalecaller Peak",
+}
+
+
+for stringId, stringValue in pairs(strings) do
+	ZO_CreateStringId(stringId, stringValue)
+	SafeAddVersion(stringId, 2)
+end
\ No newline at end of file
diff --git a/startup.lua b/startup.lua
new file mode 100644
index 0000000..e4875bc
--- /dev/null
+++ b/startup.lua
@@ -0,0 +1,301 @@
+FurnitureCatalogue 					= {}
+FurnitureCatalogue.name				= "FurnitureCatalogue"
+FurnitureCatalogue.author			= "manavortex"
+FurnitureCatalogue.CharacterName	= nil
+FurnitureCatalogue.settings			= {}
+
+FurC 								= FurnitureCatalogue
+FurC.DevDebug						= false
+FurC.AccountName					= GetDisplayName()
+
+FurC.AchievementVendors				= {}
+FurC.LuxuryFurnisher				= {}
+FurC.Recipes						= {}
+FurC.Rollis							= {}
+FurC.RollisRecipes					= {}
+FurC.Books							= {}
+FurC.EventItems						= {}
+FurC.PVP							= {}
+
+FurC.HomesteadData 					= {}
+FurC.MorrowindData 					= {}
+FurC.ReachHornData 					= {}
+FurC.Cyrodiil						= {}
+FurC.ClockworkData					= {}
+
+
+-- versioning
+FURC_HOMESTEAD						= 2
+FURC_MORROWIND						= 3
+FURC_REACH							= 4
+FURC_CLOCKWORK						= 5
+FURC_DRAGONS						= 6
+
+
+FurC.version						= 2.017
+
+local defaults 						= {
+
+	hideMats						= true,
+	dontScanTradingHouse 			= false,
+	enableDebug 					= false,
+
+	filterCraftingType 				= {},
+	filterQuality 					= {},
+
+	resetDropdownChoice				= false,
+	useTinyUi						= false,
+	useInventoryIcons				= true,
+	fontSize						= 18,
+
+	gui								= {
+		lastX						= 100,
+		lastY						= 100,
+		width						= 650,
+		height 						= 550,
+	},
+	dropdownDefaults				= {
+		Source						= 1,
+		Character					= 1,
+		Version						= 1,
+	},
+
+	accountCharacters				= {},
+
+	version 						= 2.0,
+
+	-- tooltips
+	disableTooltips					= false,
+	coloredTooltips 				= true,
+	hideKnowledge					= false,
+
+	hideBooks						= true,
+	hideDoubtfuls					= true,
+	hideCrownstore					= true,
+	hideRumourEntry					= false,
+	hideCrownStoreEntry				= false,
+	wipeDatabase					= false,
+	startupSilently					= true,
+
+	visibility						= {
+		hud							= true,
+		hudui						= true,
+	}
+}
+
+FURC_NONE				= 1
+FURC_FAVE 				= FURC_NONE +1
+FURC_CRAFTING			= FURC_FAVE +1
+FURC_CRAFTING_KNOWN		= FURC_CRAFTING +1
+FURC_CRAFTING_UNKNOWN	= FURC_CRAFTING_KNOWN +1
+FURC_VENDOR 			= FURC_CRAFTING_UNKNOWN +1
+FURC_PVP 				= FURC_VENDOR +1
+FURC_CROWN 				= FURC_PVP +1
+FURC_RUMOUR 			= FURC_CROWN +1
+FURC_LUXURY 			= FURC_RUMOUR +1
+FURC_OTHER 				= FURC_LUXURY +1
+FURC_ROLLIS 			= FURC_OTHER +1
+FURC_DROP 				= FURC_ROLLIS +1
+FURC_WRIT_VENDOR 		= FURC_DROP +1
+FURC_JUSTICE 			= FURC_WRIT_VENDOR +1
+FURC_FISHING 			= FURC_JUSTICE +1
+FURC_GUILDSTORE 		= FURC_FISHING +1
+FURC_FESTIVAL_DROP 		= FURC_GUILDSTORE +1
+FURC_EMPTY_STRING 		= ""
+
+local sourceIndicesKeys = {}
+local function getSourceIndicesKeys()
+	sourceIndicesKeys[FURC_NONE] 						= "off"
+	sourceIndicesKeys[FURC_FAVE] 						= "favorites"
+	sourceIndicesKeys[FURC_CRAFTING] 					= "craft_all"
+	sourceIndicesKeys[FURC_CRAFTING_KNOWN] 				= "craft_known"
+	sourceIndicesKeys[FURC_CRAFTING_UNKNOWN] 			= "craft_unknown"
+	sourceIndicesKeys[FURC_VENDOR] 						= "purch_gold"
+	sourceIndicesKeys[FURC_PVP] 						= "purch_ap"
+	sourceIndicesKeys[FURC_CROWN] 					    = "crownstore"
+    sourceIndicesKeys[FURC_RUMOUR] 					    = "rumour"
+    sourceIndicesKeys[FURC_LUXURY] 					    = "luxury"
+	sourceIndicesKeys[FURC_OTHER] 						= "other"
+	sourceIndicesKeys[FURC_WRIT_VENDOR] 				= "writ_vendor"
+	return sourceIndicesKeys
+end
+FurC.GetSourceIndicesKeys = getSourceIndicesKeys
+
+local choicesSource = {}
+local function getChoicesSource()
+	choicesSource[FURC_NONE]						= GetString(SI_FURC_NONE)
+	choicesSource[FURC_FAVE] 						= GetString(SI_FURC_FAVE)
+	choicesSource[FURC_CRAFTING] 					= GetString(SI_FURC_CRAFTING)
+	choicesSource[FURC_CRAFTING_KNOWN] 				= GetString(SI_FURC_CRAFTING_KNOWN)
+	choicesSource[FURC_CRAFTING_UNKNOWN] 			= GetString(SI_FURC_CRAFTING_UNKNOWN)
+	choicesSource[FURC_VENDOR] 						= GetString(SI_FURC_VENDOR)
+	choicesSource[FURC_PVP] 						= GetString(SI_FURC_PVP)
+	choicesSource[FURC_WRIT_VENDOR] 				= GetString(SI_FURC_STRING_WRIT_VENDOR)
+	choicesSource[FURC_CROWN] 					    = GetString(SI_FURC_CROWN)
+	choicesSource[FURC_RUMOUR] 					    = GetString(SI_FURC_RUMOUR)
+    choicesSource[FURC_LUXURY] 					    = GetString(SI_FURC_LUXURY)
+	choicesSource[FURC_OTHER] 				        = GetString(SI_FURC_OTHER)
+
+	return choicesSource
+end
+FurC.GetChoicesSource = getChoicesSource
+
+local tooltipsSource = {}
+local function getTooltipsSource()
+	tooltipsSource[FURC_NONE]						= GetString(SI_FURC_NONE_TT)
+	tooltipsSource[FURC_FAVE] 						= GetString(SI_FURC_FAVE_TT)
+	tooltipsSource[FURC_CRAFTING] 					= GetString(SI_FURC_CRAFTING_TT)
+	tooltipsSource[FURC_CRAFTING_KNOWN] 			= GetString(SI_FURC_CRAFTING_KNOWN_TT)
+	tooltipsSource[FURC_CRAFTING_UNKNOWN] 			= GetString(SI_FURC_CRAFTING_UNKNOWN_TT)
+	tooltipsSource[FURC_VENDOR] 					= GetString(SI_FURC_VENDOR_TT)
+	tooltipsSource[FURC_PVP] 						= GetString(SI_FURC_PVP_TT)
+    tooltipsSource[FURC_CROWN] 					    = GetString(SI_FURC_CROWN_TT)
+	tooltipsSource[FURC_WRIT_VENDOR] 				= GetString(SI_FURC_STRING_WRIT_VENDOR_TT)
+    tooltipsSource[FURC_RUMOUR] 				    = GetString(SI_FURC_RUMOUR_TT)
+    tooltipsSource[FURC_LUXURY] 				    = GetString(SI_FURC_LUXURY_TT)
+	tooltipsSource[FURC_OTHER] 				        = GetString(SI_FURC_OTHER_TT)
+
+	return tooltipsSource
+end
+
+FurnitureCatalogue.DropdownData = {
+	ChoicesVersion	= {
+		[1] = GetString(SI_FURC_FILTER_VERSION_OFF),
+		[2] = GetString(SI_FURC_FILTER_VERSION_HS	),
+		[3] = GetString(SI_FURC_FILTER_VERSION_M	),
+		[4] = GetString(SI_FURC_FILTER_VERSION_R	),
+		[5] = GetString(SI_FURC_FILTER_VERSION_CC	),
+		[6] = GetString(SI_FURC_FILTER_VERSION_DRAGON),
+	},
+	TooltipsVersion	= {
+		[1] =  GetString(SI_FURC_FILTER_VERSION_OFF_TT),
+		[2] =  GetString(SI_FURC_FILTER_VERSION_HS_TT),
+		[3] =  GetString(SI_FURC_FILTER_VERSION_M_TT),
+		[4] =  GetString(SI_FURC_FILTER_VERSION_R_TT),
+		[5] =  GetString(SI_FURC_FILTER_VERSION_CC_TT),
+		[6] =  GetString(SI_FURC_FILTER_VERSION_DRAGON_TT),
+	},
+	ChoicesCharacter  = {
+		[1]	= GetString(SI_FURC_FILTER_CHAR_OFF),
+	},
+	TooltipsCharacter = {
+		[1]	= GetString(SI_FURC_FILTER_CHAR_OFF_TT),
+	},
+
+	-- will be set in setupSourceDropdown
+	ChoicesSource	= {},
+	TooltipsSource 	= {},
+}
+
+
+local function updateDropdownData()
+	FurnitureCatalogue.DropdownData.ChoicesSource  = getChoicesSource()
+	FurnitureCatalogue.DropdownData.TooltipsSource = getTooltipsSource()
+end
+FurnitureCatalogue.updateDropdownData = updateDropdownData
+
+local function setupSourceDropdown()
+	updateDropdownData()
+	sourceIndices = {}
+
+	for idx, key in ipairs(getSourceIndicesKeys()) do
+		sourceIndices[key] = idx
+	end
+	FurC.SourceIndices = sourceIndices
+end
+
+function FurnitureCatalogue.DebugOut(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+	if not FurC.GetEnableDebug() then return end
+	if a10 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10))
+	elseif a9 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8, a9))
+	elseif a8 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7, a8))
+	elseif a7 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5, a6, a7))
+	elseif a6 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5, a6))
+	elseif a5 then
+		d(zo_strformat(output, a1, a2, a3, a4, a5))
+	elseif a4 then
+		d(zo_strformat(output, a1, a2, a3, a4))
+	elseif a3 then
+		d(zo_strformat(output, a1, a2, a3))
+	elseif a2 then
+		d(zo_strformat(output, a1, a2))
+	elseif a1 then
+		d(zo_strformat(output, a1))
+	elseif output then
+		d(zo_strformat(output))
+	else
+		d("\n")
+	end
+end
+
+local function p(...)
+	FurC.DebugOut(...)
+end
+
+function whoami()
+	return FurnitureCatalogue.CharacterName
+end
+
+
+function FurnitureCatalogue_ToggleDev(arg)
+	if arg == 0 or arg == "true" then
+		FurC.DevDebug = true
+	else
+		FurC.DevDebug = false
+	end
+end
+
+-- initialization stuff
+function FurnitureCatalogue_Initialize(eventCode, addOnName)
+	if (addOnName ~= "FurnitureCatalogue") then return end
+
+	FurnitureCatalogue.settings 	= ZO_SavedVars:NewAccountWide("FurnitureCatalogue_Settings", 2, nil, defaults)
+
+
+	if FurC.AccountName == "@manavortex" or FurC.AccountName == "@Manorin" then
+		FurnitureCatalogue.devSettings 	= ZO_SavedVars:NewAccountWide("_FurC_DevData", 2, nil, {})
+		SLASH_COMMANDS["/furc_dev"] = FurnitureCatalogue_ToggleDev
+	end
+
+	-- initialise setting, also setup the "source" dropdown for the menu
+	FurC.settings.data 							= FurC.settings.data or {}
+	FurC.settings.filterCraftingType 			= {}
+	FurC.settings.filterQuality 				= {}
+	setupSourceDropdown()
+
+	FurnitureCatalogue.CreateSettings(FurnitureCatalogue.settings, defaults, FurnitureCatalogue)
+
+	FurnitureCatalogue.CharacterName = zo_strformat(GetUnitName('player'))
+
+	FurC.RegisterEvents()
+
+	FurnitureCatalogue.InitGui()
+    FurC.SetHideRumourRecipesEntry(false)
+    FurC.SetHideCrownStoreEntry(false)
+	
	FurnitureCatalogue.CreateTooltips()
+	FurC.InitRightclickMenu()
+
+	FurC.SetupInventoryRecipeIcons()
+
+	local scanFiles = false
+	if FurC.settings.version 		< FurC.version then
+			FurC.settings.version 		= FurC.version
+		scanFiles = true
+	end
+
+	FurnitureCatalogue.ScanRecipes(scanFiles, not FurC.GetSkipInitialScan())
+	FurC.settings.databaseVersion 	= FurC.version
+	SLASH_COMMANDS["/fur"] 			= FurnitureCatalogue_Toggle
+
+	FurC.SetFilter(true)
+	EVENT_MANAGER:UnregisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED)
+
+end
+
+ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_FURNITURE_CATALOGUE", "Toggle Furniture Catalogue")
+EVENT_MANAGER:RegisterForEvent("FurnitureCatalogue", EVENT_ADD_ON_LOADED, FurnitureCatalogue_Initialize)
\ No newline at end of file
diff --git a/xml/Bindings.xml b/xml/Bindings.xml
new file mode 100644
index 0000000..5e8856b
--- /dev/null
+++ b/xml/Bindings.xml
@@ -0,0 +1,11 @@
+<Bindings>
+    <Layer name="SI_KEYBINDINGS_CATEGORY_GENERAL">
+        <Category name="Furniture Catalogue">
+            <Action name="TOGGLE_FURNITURE_CATALOGUE">
+                <Down>
+					FurnitureCatalogue_Toggle()
+				</Down>
+            </Action>
+        </Category>
+    </Layer>
+</Bindings>
\ No newline at end of file
diff --git a/xml/FurnitureCatalogue.xml b/xml/FurnitureCatalogue.xml
new file mode 100644
index 0000000..eb3a9fb
--- /dev/null
+++ b/xml/FurnitureCatalogue.xml
@@ -0,0 +1,365 @@
+<GuiXml>
+	<Controls>
+		<TopLevelControl name="FurCGui" clampedToScreen="true"  movable="true" mouseEnabled="true" hidden="true" resizeHandleSize="10">
+			<DimensionConstraints x="800" y="500" minX="850" minY="200" maxY="2000"/>
+			<Anchor point="TOPRIGHT" relativeTo="GUI_ROOT" relativePoint="TOPRIGHT" offsetX="-25" offsetY="40" />
+			<OnMoveStop>FurC.SaveFrameInfo("onMoveStop")</OnMoveStop>
+
+			<OnResizeStop>FurC.SaveFrameInfo("onResizeStop")</OnResizeStop>
+			<Controls>
+				<Backdrop name="$(parent)_BG" inherits="ZO_DefaultBackdrop" >
+					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT"/>
+				</Backdrop>
+
+				<Control name="$(parent)_Header" resizeToFitDescendents="true" >
+					<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
+					<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT"/>
+
+					<Controls>
+						<Control name="$(parent)_Bar1">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT"/>
+							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetY="50"/>
+							<Controls>
+								<Button name="$(parent)_Feedback">
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="20" offsetY="10"/>
+									<OnMouseEnter>FurC.GuiShowTooltip(self, "Click to say thank you:\nLeft: 2k\nRight: 10k\nMiddle: 25k\nYour feedback and/or donation is appreciated!")</OnMouseEnter>
+									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>FurC.Donate(self, button)</OnMouseUp>
+									<Dimensions x="40" y="40" />
+									<Textures
+										normal		="esoui/art/mail/mail_tabicon_compose_up.dds"
+										pressed		="esoui/art/mail/mail_tabicon_compose_down.dds"
+										mouseOver	="esoui/art/mail/mail_tabicon_compose_over.dds"
+									/>
+								</Button>
+								<Control name ="FurC_Label" resizeToFitDescendents="true">
+								<Anchor point="TOP" relativeTo="$(parent)" relativePoint="TOP" offsetX="0" offsetY="10" />
+								<Dimensions y="54"/>
+									<Controls>
+										<Label name="$(parent)_1" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="-Furniture Catalogue: " >
+											<Anchor point="LEFT" relativeTo="$(parent)" relativePoint="LEFT" offsetX="-40"/>
+										</Label>
+										<Label name="FurC_RecipeCount" font="$(STONE_TABLET_FONT)|24|soft-shadow-thick" mouseEnabled="true" resizeToFitDescendents="true">
+											<Anchor point="LEFT" 	relativeTo="$(parent)_1" relativePoint="RIGHT" offsetX="10" offsetY="1"/>
+											<OnMouseEnter>	FurC.GuiShowTooltip(self, "number of recipes below")</OnMouseEnter>
+											<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
+											<OnMouseUp>FurC.RefreshCounter()</OnMouseUp>
+										</Label>
+										<Label name="$(parent)_2" font="$(STONE_TABLET_FONT)|26|soft-shadow-thick" text=" entries -" >
+											<Anchor point="LEFT" relativeTo="FurC_RecipeCount" relativePoint="RIGHT" offsetY="-1"  />
+										</Label>
+									</Controls>
+								</Control>
+								<Button name="$(parent)_Hide">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-15" offsetY="15"/>
+									<OnMouseEnter>FurC.GuiShowTooltip(self, "Hide window")</OnMouseEnter>
+									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>FurnitureCatalogue_Toggle()</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)_Reload">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Hide" relativePoint="TOPLEFT" offsetX="-25" offsetY="-5"/>
+									<OnMouseEnter>FurC.GuiShowTooltip(self, "Click: Scan character knowledge to database\n\nRight-click: Re-scans data files\n\nMiddle-click: Re-create database (will ask you first)")</OnMouseEnter>
+									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>FurC.GUIButtonRefreshOnMouseUp(self, button)</OnMouseUp>
+
+
+									<Dimensions x="35" y="35" />
+									<Textures
+										normal		="/esoui/art/help/help_tabicon_feedback_up.dds"
+										pressed		="/esoui/art/help/help_tabicon_feedback_down.dds "
+										mouseOver	="/esoui/art/help/help_tabicon_feedback_over.dds"
+									/>
+								</Button>
+								<Button name="$(parent)_TemplateTiny">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Reload" relativePoint="TOPLEFT" offsetX="-15" offsetY="-2"/>
+									<OnMouseEnter>FurC.GuiShowTooltip(self, "change template")</OnMouseEnter>
+									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>FurC.ChangeTemplateFromButton(true)</OnMouseUp>
+
+									<Dimensions x="35" y="35" />
+									<Textures
+										normal		="/esoui/art/buttons/minus_up.dds"
+										pressed		="/esoui/art/buttons/minus_down.dds"
+										mouseOver	="/esoui/art/buttons/minus_over.dds"
+									/>
+								</Button>
+
+								<Button name="$(parent)_TemplateLarge" hidden="true">
+									<Anchor point="TOPRIGHT" relativeTo="$(parent)_Reload" relativePoint="TOPLEFT" offsetX="-15" offsetY="-2"/>
+
+									<OnMouseEnter>FurC.GuiShowTooltip(self, "change template")</OnMouseEnter>
+									<OnMouseExit>FurC.GuiHideTooltip(self)</OnMouseExit>
+									<OnMouseUp>FurC.ChangeTemplateFromButton(false)</OnMouseUp>
+
+									<Dimensions x="35" y="35" />
+									<Textures
+										normal		="/esoui/art/buttons/plus_up.dds"
+										pressed		="/esoui/art/buttons/plus_down.dds"
+										mouseOver	="/esoui/art/buttons/plus_over.dds"
+									/>
+								</Button>
+
+							</Controls>
+						</Control>
+						<Control name="$(parent)_Bar2">
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar1" relativePoint="BOTTOMLEFT" offsetX="20"/>
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Bar1" relativePoint="BOTTOMRIGHT" offsetX="-20" />
+							<Dimensions y="35" />
+
+							<Controls>
+								<Control name="FurC_DropdownSource" inherits="ZO_ComboBox" mouseEnabled="true" >
+									<Anchor point="TOPLEFT" 	relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="9" offsetY="10"/>
+									<Dimensions x="230" y="28" />
+									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
+									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: Knowledge and source", true)</OnMouseEnter>
+									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
+								</Control>
+
+								<Control name="FurC_QualityFilter" mouseEnabled="true">
+									<Anchor point="TOPLEFT" 	relativeTo="FurC_DropdownSource" relativePoint="TOPRIGHT" offsetX = "38" offsetY="3"/>
+									<Anchor point="BOTTOMRIGHT" relativeTo="FurC_DropdownSource"  relativePoint="BOTTOMRIGHT" offsetX = "300" />
+								</Control>
+
+								<Control name="FurC_DropdownVersion" inherits="ZO_ComboBox" mouseEnabled="true" >
+									<Anchor point="TOPLEFT" 	relativeTo="FurC_QualityFilter" relativePoint="TOPRIGHT" offsetX="10"/>
+									<Dimensions x="235" y="28" />
+									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
+									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: game version", true)</OnMouseEnter>
+									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
+								</Control>
+							</Controls>
+						</Control>
+						<!-- 3rd bar -->
+						<Control name="$(parent)_Bar3" mouseEnabled="true">
+
+							<Dimensions y="55" />
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar2" relativePoint="BOTTOMLEFT" offsetY="10"/>
+							<Anchor point="TOPRIGHT" relativeTo="$(parent)_Bar2" relativePoint="BOTTOMRIGHT"/>
+							<Dimensions y="45" />
+							<Controls>
+								<!-- control above: FurC_DropdownSource -->
+								<Control name="FurC_DropdownCharacter" inherits="ZO_ComboBox" mouseEnabled="true" >
+									<Anchor point="TOPLEFT" 	relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="9" offsetY="10"/>
+									<Dimensions x="230" y="28" />
+									<OnShow>		FurC.GuiSetupDropdown(self)</OnShow>
+									<OnMouseEnter>	FurC.GuiShowTooltip(self, "Filter: Character", true)</OnMouseEnter>
+									<OnMouseExit>	FurC.GuiHideTooltip(self)</OnMouseExit>
+								</Control>
+
+								<!-- Crafting type filter -->
+								<Control name="FurC_TypeFilter" mouseEnabled="true" resizeToFitDescendents="true">
+									<Anchor point="TOPLEFT" relativeTo="FurC_DropdownCharacter" relativePoint="TOPRIGHT" offsetX="17" offsetY="-5" />
+									<Anchor point="BOTTOMRIGHT" relativeTo="FurC_DropdownCharacter" relativePoint="BOTTOMRIGHT" offsetX="340"/>
+
+								</Control>
+
+								<!-- control above: FurC_DropdownVersion -->
+								<Control name="FurC_Search" mouseEnabled="true">
+
+									<Anchor point="TOPLEFT" 	relativeTo="FurC_TypeFilter" relativePoint="TOPRIGHT" offsetX="9" offsetY="10"/>
+									<Anchor point="BOTTOMLEFT" 	relativeTo="FurC_TypeFilter" relativePoint="BOTTOMRIGHT" offsetX="9" />
+									<Dimensions x="215" />
+									<Controls>
+
+										<EditBox name="$(parent)Box"  inherits="ZO_InventorySearchBox" >
+
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-40" offsetY="-10"/>
+											<Anchor point="TOPRIGHT" relativeTo="$(parent)" relativePoint="TOPRIGHT" offsetX="-20" offsetY="0"/>
+
+											<OnTextChanged>FurC.GuiSetSearchboxTextFrom(self)</OnTextChanged>
+											<OnMouseUp>FurC.GuiOnSearchBoxClick(self, button)</OnMouseUp>
+											<OnMouseDoubleClick>FurC.GuiOnSearchBoxClick(self, nil, true)</OnMouseDoubleClick>
+											<OnFocusLost>FurC.GuiOnSearchBoxFocusOut(self)</OnFocusLost>
+
+										</EditBox>
+									</Controls>
+								</Control>
+
+
+
+
+
+							</Controls>
+						</Control>
+
+
+						<!-- #4, sorts the list holder -->
+						<Control name="$(parent)_SortBar" mouseEnabled="true">
+
+							<Anchor point="TOPLEFT" relativeTo="$(parent)_Bar3" relativePoint="BOTTOMLEFT" offsetX="25" offsetY="20"/>
+							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)_Bar3" relativePoint="BOTTOMRIGHT" offsetY="40"/>
+							<Dimensions y="20" />
+
+							<Controls>
+								<Label name="$(parent)_Name" mouseEnabled="true" font="ZoFontGameSmall" text="Name" >
+									<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" />
+									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMLEFT" offsetX="330"/>
+									<OnMouseUp>FurC.GuiOnSort("itemName")</OnMouseUp>
+									<Controls>
+										<Button name="$(parent)_Button" verticalAlignment="LEFT"  mouseEnabled="true">
+											<Dimensions y="20"  x="20"/>
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-25" />
+											<Textures
+												normal="esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
+												mouseOver="esoui/art/miscellaneous/list_sortheader_icon_over.dds"
+											/>
+											</Button>
+									</Controls>
+								</Label>
+
+								<Label name="$(parent)_Quality" mouseEnabled="true" font="ZoFontGameSmall" text="Quality" >
+									<Anchor point="TOPLEFT" relativeTo="$(parent)_Name" relativePoint="TOPRIGHT" />
+									<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT"/>
+									<OnMouseUp>FurC.GuiOnSort("itemQuality")</OnMouseUp>
+									<Controls>
+										<Button name="$(parent)_Button" verticalAlignment="LEFT"  mouseEnabled="true">
+											<Dimensions y="20"  x="20"/>
+											<Anchor point="TOPLEFT" relativeTo="$(parent)" relativePoint="TOPLEFT" offsetX="-25" />
+											<Textures
+												normal="esoui/art/miscellaneous/list_sortheader_icon_neutral.dds"
+												mouseOver="esoui/art/miscellaneous/list_sortheader_icon_over.dds"
+											/>
+										</Button>
+									</Controls>
+								</Label>
+
+
+							</Controls>
+
+						</Control>
+
+					</Controls>
+				<!-- $(parent)_Header -->
+				</Control>
+
+				<Label name="$(parent)_Wait" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="Please wait... loading data" >
+					<Anchor point="TOP" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOM" 	offsetY="35" />
+				</Label>
+				<Label name="$(parent)_Empty" font="$(STONE_TABLET_FONT)|28|soft-shadow-thick" text="No results, please check filter" hidden="true" >
+					<Anchor point="TOP" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOM" 	offsetY="35" />
+				</Label>
+
+				<Control name="$(parent)_ListHolder" mouseEnabled="true">
+
+					<DimensionConstraints  minY="52"/>
+					<Anchor point="TOPLEFT" 	relativeTo="$(parent)_Header" 	relativePoint="BOTTOMLEFT" 	offsetX="25" />
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" 			relativePoint="BOTTOMRIGHT" offsetX="-35" offsetY="-20"/>
+
+					<OnMouseWheel>FurC.GuiOnScroll(self, delta)</OnMouseWheel>
+
+					<Controls>
+						<Slider name="$(parent)_Slider" mouseEnabled="true" step="1" inherits="ZO_VerticalScrollbarBase">
+							<Anchor point="TOPRIGHT" 	relativeTo="$(parent)" 	relativePoint="TOPRIGHT" 	offsetX="20"	/>
+							<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" 	relativePoint="BOTTOMRIGHT" offsetX="20" offsetY="-25"	/>
+
+							<OnMouseDown>self.locked = false</OnMouseDown>
+							<OnMouseUp>self.locked = true</OnMouseUp>
+							<OnValueChanged>FurC.GuiOnSliderUpdate(self, value)</OnValueChanged>
+						</Slider>
+					</Controls>
+
+				</Control>
+			</Controls>
+
+		</TopLevelControl>
+
+		<Button name="FurC_QualityFilterButton" virtual="true">
+			<Dimensions x="35" y="35" />
+			<OnMouseEnter>	FurC.GuiVirtualMouseOver(self)	</OnMouseEnter>
+			<OnMouseExit>	FurC.GuiVirtualMouseOut(self)	</OnMouseExit>
+			<OnMouseUp>		FurC.GuiQualityMouseUp(self, button)	</OnMouseUp>
+		</Button>
+		<Button name="FurC_CraftingTypeFilterButton" virtual="true">
+			<Dimensions x="40" y="40" />
+			<OnMouseEnter>	FurC.GuiVirtualMouseOver(self)	</OnMouseEnter>
+			<OnMouseExit>	FurC.GuiVirtualMouseOut(self)	</OnMouseExit>
+			<OnMouseUp>		FurC.GuiCraftingTypeMouseUp(self)	</OnMouseUp>
+		</Button>
+
+		<Control name="FurC_SlotTemplate" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
+			<Dimensions x="300"/>
+			<OnMouseEnter>			FurC.GuiLineOnMouseEnter(self)				</OnMouseEnter>
+			<OnMouseExit>			FurC.GuiLineOnMouseExit(self)				</OnMouseExit>
+			<OnMouseUp>				FurC.OnControlMouseUp(self, button)			</OnMouseUp>
+			<OnMouseDoubleClick>	FurC.OnControlDoubleClick(self) 			</OnMouseDoubleClick>
+
+			<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" hidden="false">
+					<Dimensions x="40" y="40" />
+					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="-10" offsetY="3" />
+				</Button>
+
+				<Label name="$(parent)Name" font="ZoFontGameShadow" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
+					<Dimensions y="50"  x="280"/>
+					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Button" relativePoint="TOPRIGHT" 		offsetX="18"/>
+					<Anchor point="BOTTOMLEFT" 	relativeTo="$(parent)Button" relativePoint="BOTTOMRIGHT" 	offsetX="0"/>
+				</Label>
+				<Label name="$(parent)Mats" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="LEFT">
+					<Dimensions y="50" />
+					<Anchor point="TOPLEFT" relativeTo="$(parent)Name" relativePoint="TOPRIGHT" offsetX="18"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="0" offsetY="-10"/>
+				</Label>
+
+			</Controls>
+		</Control>
+
+		<Control name="FurC_SlotTemplateTiny" inherits="ZO_ListInventorySlotBehavior" virtual="true" mouseEnabled="true">
+			<Dimensions x="300" />
+			<OnMouseEnter>			FurC.GuiLineOnMouseEnter(self)				</OnMouseEnter>
+			<OnMouseExit>			FurC.GuiLineOnMouseExit(self)				</OnMouseExit>
+			<OnMouseUp>				FurC.OnControlMouseUp(self, button)			</OnMouseUp>
+			<OnMouseDoubleClick>	FurC.OnControlDoubleClick(self) 			</OnMouseDoubleClick>
+
+			<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" hidden="true">
+					<Dimensions x="1"/>
+					<Anchor point="TOPLEFT" relativePoint="TOPLEFT" offsetX="0" offsetY="3" />
+				</Button>
+				<Label name="$(parent)Name" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="CENTER">
+					<Dimensions y="50"  x="230"/>
+					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Button" relativePoint="TOPRIGHT" />
+					<Anchor point="BOTTOMLEFT" 	relativeTo="$(parent)Button" relativePoint="BOTTOMRIGHT" />
+				</Label>
+				<Label name="$(parent)Mats" font="ZoFontGame" wrapMode="ELLIPSIS" verticalAlignment="LEFT">
+					<Dimensions y="50"  />
+					<Anchor point="TOPLEFT" 	relativeTo="$(parent)Name" relativePoint="TOPRIGHT" offsetX="18"/>
+					<Anchor point="BOTTOMRIGHT" relativeTo="$(parent)" relativePoint="BOTTOMRIGHT" offsetX="0" offsetY="-10"/>
+				</Label>
+
+			</Controls>
+		</Control>
+
+		<Texture name="FurC_SlotIconKnownNo" color="FF0000" textureFile="esoui/art/buttons/decline_up.dds" virtual="true">
+			<Dimensions x="24" y="24" />
+		</Texture>
+		<Texture name="FurC_SlotIconKnownYes" color="00FF00" textureFile="esoui/art/cadwell/check.dds" virtual="true">
+			<Dimensions x="24" y="24" />
+		</Texture>
+<!--
+		<Texture name="FurC_SlotIconKnownNo" color="FF0000" textureFile="esoui/art/miscellaneous/search_icon.dds" virtual="true">
+			<Dimensions x="30" y="30" />
+		</Texture>
+		<Texture name="FurC_SlotIconKnownNo" color="00FF00" textureFile="esoui/art/cadwell/check.dds" virtual="true">
+			<Dimensions x="30" y="30" />
+		</Texture>
+-->
+	</Controls>
+</GuiXml>