2.85 luxury furnisher

git [11-03-18 - 16:27]
2.85 luxury furnisher
Filename
FurnitureCatalogue.txt
FurnitureCatalogue_DevUtility/FurnitureCatalogue_DevUtility.txt
FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
data/04_Clockwork/CC_LuxuryFurnisher.lua
data/100025.lua
data/AchievementVendors.lua
data/LuxuryFurnisher.lua
data/MiscItemSources.lua
data/Recipes.lua
libs/LibCustomMenu/LibCustomMenu.lua
libs/LibCustomMenu/LibCustomMenu.txt
libs/LibCustomMenu/LibStub/LibStub.lua
libs/LibCustomMenu/LibStub/LibStub.txt
libs/LibCustomTitles/LibCustomTitles.lua
libs/LibStub/LibStub.lua
libs/LibStub/LibStub.txt
libs/LibStub/LibStub/LibStub.lua
startup.lua
diff --git a/FurnitureCatalogue.txt b/FurnitureCatalogue.txt
index 3042a9c..e66228c 100644
--- a/FurnitureCatalogue.txt
+++ b/FurnitureCatalogue.txt
@@ -1,8 +1,9 @@
- ## Title: FurnitureCatalogue
+## Title: FurnitureCatalogue
 ## Author: manavortex
-## Version: 2.82
-## APIVersion: 100024 10025
+## Version: 2.85
+## APIVersion: 10025
 ## SavedVariables: FurnitureCatalogue_Settings
+## DependsOn: LibCustomMenu LibAddonMenu-2.0
 ## OptionalDependsOn: pChat

 libs\LibStub\LibStub.lua
diff --git a/FurnitureCatalogue_DevUtility/FurnitureCatalogue_DevUtility.txt b/FurnitureCatalogue_DevUtility/FurnitureCatalogue_DevUtility.txt
index 8eb4dd7..e2e0a45 100644
--- a/FurnitureCatalogue_DevUtility/FurnitureCatalogue_DevUtility.txt
+++ b/FurnitureCatalogue_DevUtility/FurnitureCatalogue_DevUtility.txt
@@ -2,7 +2,7 @@
 ## Author: manavortex
 ## Description: This is a utility addon that helps me generate text entries for the data files. It won't do anything if you're not me, so feel free to unload it.\nYou're welcome to get in touch if you want to use this, then I can add you to the list.
 ## Version: 1.0.0
-## APIVersion: 100023
+## APIVersion: 10025 10026
 ## DependsOn: FurnitureCatalogue

 Bindings.xml
diff --git a/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt b/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
index 6a08b2b..cb6ec80 100644
--- a/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
+++ b/FurnitureCatalogue_Export/FurnitureCatalogue_Export.txt
@@ -1,7 +1,7 @@
 ## Title: FurnitureCatalogue_Export
 ## Author: manavortex
 ## Version: 1.0.1
-## APIVersion: 100023
+## APIVersion: 10025 10026
 ## SavedVariables: FurnitureCatalogue_Export
 ## DependsOn: FurnitureCatalogue

diff --git a/data/04_Clockwork/CC_LuxuryFurnisher.lua b/data/04_Clockwork/CC_LuxuryFurnisher.lua
index 9e7fd96..73a8608 100644
--- a/data/04_Clockwork/CC_LuxuryFurnisher.lua
+++ b/data/04_Clockwork/CC_LuxuryFurnisher.lua
@@ -193,34 +193,4 @@ FurC.LuxuryFurnisher[FURC_CLOCKWORK] = {
     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",
-  },
 }
diff --git a/data/100025.lua b/data/100025.lua
deleted file mode 100644
index c2bf35c..0000000
--- a/data/100025.lua
+++ /dev/null
@@ -1,345 +0,0 @@
-local function getCrownPrice(price)
-    return string.format("%s (PTS, %u)", GetString(SI_FURC_CROWNSTORESOURCE), price)
-end
-
-FurC.MiscItemSources[FURC_SLAVES]  = {
-    [FURC_RUMOUR]   = {
-    [146048] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Festive Fir
-    [146049] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Festival Hearth
-    [146050] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Festival Hearthfire
-    [145923] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Lies of the Dread-Father
-    [146052] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Vvardvark Ice Sculpture
-    [146053] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Guar Ice Sculpture
-    [145926] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- That of Void
-    [145927] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Acts of Honoring
-    [145928] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Speakers of Nothing
-    [146057] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Human
-    [146058] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Argonian
-    [146060] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Ladle
-    [146062] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Ouroboros Wreath
-    [145553] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Small Glyphed
-    [145426] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Felucca, Canopied
-    [145427] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Serpent Skull, Colossal
-    [145428] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Lantern Post, Covered
-    [145429] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant Cluster, Cardinal Flower Large
-    [145430] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Star Blossom
-    [145431] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Nigella
-    [145432] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Canna Lily
-    [146061] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Triptych Banner
-    [145434] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Large Lantern Flower
-    [145435] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Mani Flower
-    [145436] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Canopied Felucca, Double Hulled
-    [145437] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Reed Felucca, Double Hulled
-    [145438] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Glyphed
-    [145439] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Fearsome
-    [145440] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Skull
-    [145441] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Serpent
-    [145442] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Twinned
-    [145443] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Shrine, Sithis Looming
-    [145444] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Totem, Hist Guardian
-    [145445] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- The Sharper Tongue: A Jel Primer
-    [145446] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Sithis, the Hungering Dark
-    [145447] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Dais, Engraved
-    [145448] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Throne, Engraved
-    [145449] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Stele, Hist Guardians
-    [145450] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Stele, Hist Cultivation
-    [145451] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Shrine, Sithis Figure Anointed
-    [145452] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Shrine, Sithis Looming Anointed
-    [145453] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Aloe
-    [145454] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Aloe Pod
-    [145455] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Dendritic Hist Bulb
-    [145456] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Hist Bulb
-    [145457] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Banyan
-    [145458] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Ancient Banyan
-    [141875] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Witches Festival Scarecrow
-    [145462] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Cardinal Flower
-    [146059] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Khajiit
-    [146051] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Mudcrab Ice Sculpture
-    [146054] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Garland
-    [145467] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- The Way of Shadow
-    [145468] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Wedding Lantern, Hanging
-    [145469] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Gazebo, Palatial Domed
-    [145470] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Vase, Golden
-    [145471] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Raincatcher, Golden
-    [145472] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Antler Coral, Crimson
-    [145473] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Antler Coral, Stout Crimson
-    [145474] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Flytrap
-    [145475] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Soulsplinter Weed
-    [145476] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Shrine, Trinimac
-    [145477] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Pedestal, Shrine
-    [145478] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Shrine, Y'ffre
-    [145479] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Iron Maiden, Occupied
-    [145480] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Corpse, Burned Seated
-    [145481] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Corpse, Burned Sprawled
-    [145482] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Wheelbarrow, Bones
-    [145483] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Column, Ossuary
-    [145484] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Dark Elf Statue, Ordinator
-    [145485] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Dark Elf Statue, Knight
-    [145486] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Door, Sweet Mother
-    [145487] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Banner, Order of the Hour
-    [145488] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Banner, Jewelry Crafting
-    [146055] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Garland Wreath
-    [146056] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Cookies and Ale
-    [145491] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Static Pitcher
-    [145492] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gas Blossom
-    [145493] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Lantern Mantis
-    [141854] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Flame-Skull
-    [145554] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Towering Snowy Fir
-    [145555] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Snowy Fir
-    [145597] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Scales of Shadow
-    [145595] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Scuttlebloom
-    [145322] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Music Box, Blood and Glory
-    [145576] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Timid Vine-Tongue
-    [145318] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gravestone, Small Broken
-    [145317] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gravestone, Broken
-    [145550] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Hunting Lure, Grisly
-    [145549] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Totem, Stone Head
-    [141870] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Raven-Perch Cemetery Wreath
-    [142235] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Music Box, Flickering Shadows
-    [141856] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Daedra-Skull
-    [141855] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Wraith-Lantern
-    [145556] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Tall Snowy Fir
-    [145396] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Tapestry, Hist Gathering Worn
-    [145397] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Hist Gathering Worn
-    [145398] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Supine Turtle Worn
-    [145399] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Crawling Serpents Worn
-    [145400] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Lurking Lizard Worn
-    [145401] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Tapestry, Xanmeer Worn
-    [145402] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Fish, Black Marsh
-    [145403] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Jel Parchment
-    [146047] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- From Old Life To New
-    },
-
-
-    [FURC_CROWN]  = {
-    [145433] = getCrownPrice(1), -- Plant, Rafflesia
-    [145459] = getCrownPrice(1), -- Murkmire Kiln, Ancient Stone
-    [145460] = getCrownPrice(1), -- Plant, Canna Leaves
-    [145461] = getCrownPrice(1), -- Plant Cluster, Cardinal Flower Small
-    [145463] = getCrownPrice(1), -- Plant Cluster, Red Sister Ti
-    [145464] = getCrownPrice(1), -- Plant, Red Sister Ti
-    [145465] = getCrownPrice(1), -- Plant Cluster, Wilted Hist Bulb
-    [145466] = getCrownPrice(1), -- Plant, Wilted Hist Bulb
-    [141939] = getCrownPrice(1), -- Grave, Grasping
-    [145411] = getCrownPrice(1), -- Plant, Lantern Flower
-    [141965] = getCrownPrice(1), -- Hollowjack Lantern, Soaring Dragon
-    [141966] = getCrownPrice(1), -- Hollowjack Lantern, Toothy Grin
-    [141967] = getCrownPrice(1), -- Hollowjack Lantern, Ouroboros
-    [142004] = getCrownPrice(1), -- Specimen Jar, Spare Brain
-    [142005] = getCrownPrice(1), -- Specimen Jar, Monstrous Remains
-    [142003] = getCrownPrice(1), -- Specimen Jar, Eyes
-    [141869] = getCrownPrice(1), -- Alinor Potted Plant, Cypress
-    [141976] = getCrownPrice(1), -- Pumpkin Patch, Display
-    [141853] = getCrownPrice(1), -- Statue of Hircine's Bitter Mercy
-
-    },
-    [FURC_FISHING]   = {
-        -- fishing
-        -- [118902] = GetString(SI_FURC_CANBEFISHED),     -- Coral, Sun
-    },
-    [FURC_DROP]    = {
-        -- [121058] = FURC_DB_SNEAKY,             -- Candles of Silence
-    },
-
-}
-
-
-FurC.Recipes[FURC_SLAVES] = {
-
-  145944, -- Praxis: Murkmire Chair, Engraved
-  145945, -- Praxis: Murkmire Bench, Wide
-  145946, -- Praxis: Murkmire Bench, Armless
-  145947, -- Praxis: Murkmire Bed, Enclosed
-  145948, -- Praxis: Murkmire Pedestal, Low
-  145949, -- Praxis: Murkmire Table, Engraved
-  145950, -- Praxis: Murkmire Brazier, Engraved
-  145951, -- Praxis: Murkmire Bookshelf, Grand
-  145952, -- Praxis: Murkmire Bookshelf, Grand Full
-  145953, -- Praxis: Murkmire Sarcophagus, Empty
-  145954, -- Praxis: Murkmire Sarcophagus Lid
-  145955, -- Praxis: Murkmire Bookshelf
-  145956, -- Praxis: Murkmire Bookshelf, Full
-  145957, -- Praxis: Murkmire Platform, Sectioned
-  145958, -- Praxis: Murkmire Pedestal, Winged
-  145959, -- Praxis: Murkmire Totem, Beacon
-  145960, -- Diagram: Murkmire Brazier, Bowl
-  145961, -- Praxis: Murkmire Hearth Shrine, Sithis Rearing
-  145962, -- Praxis: Murkmire Hearth Shrine, Sithis Coiled
-  145963, -- Praxis: Murkmire Hearth Shrine, Sithis Looming
-  145964, -- Praxis: Murkmire Shrine, Sithis Relief
-  145965, -- Praxis: Murkmire Shrine, Sithis Rearing
-  145966, -- Praxis: Murkmire Shrine, Sithis Figure
-  145967, -- Praxis: Murkmire Shrine, Sithis Coiled
-  145968, -- Design: Murkmire Pot, Large Carved
-  145969, -- Design: Bowl of Worms
-  145970, -- Design: Bowl of Guts
-  145971, -- Design: Bowl of Worms, Large
-  145972, -- Design: Grub Kebabs
-  145973, -- Design: Murkmire Berry Strand
-  145974, -- Design: Murkmire Pot, Handmade
-  145975, -- Design: Melon, Wax
-  145976, -- Design: Dragonfruit, Wax
-  145977, -- Blueprint: Murkmire Platter, Large
-  145978, -- Blueprint: Murkmire Plate, Charger
-  145979, -- Praxis: Murkmire Wall, Stone
-  145980, -- Blueprint: Murkmire Bonding Chimes, Domed
-  145981, -- Formula: Murkmire Lantern, Covered
-  145982, -- Formula: Murkmire Lamp, Hanging Bottle
-  145983, -- Formula: Murkmire Lamp, Hanging Conch
-  145984, -- Formula: Murkmire Sconce, Shell
-  145985, -- Formula: Murkmire Brazier, Shell
-  145986, -- Formula: Murkmire Lamp, Shell
-  145987, -- Design: Murkmire Candlepost, Timber
-  145988, -- Design: Murkmire Candlepost, Driftwood
-  145989, -- Design: Murkmire Candles, Bone Group
-  145990, -- Design: Murkmire Candle, Bone Tall
-  145991, -- Design: Murkmire Candle, Bone Squat
-  145992, -- Blueprint: Murkmire Bed, Carved
-  145993, -- Blueprint: Murkmire Wardrobe, Woven
-  145994, -- Blueprint: Murkmire Chair, Woven
-  141899, -- Praxis: Sacrificial Altar, Hircine
-  141900, -- Blueprint: Ritual Fetish, Hircine
-  146004, -- Blueprint: Murkmire Ramp, Reed
-  146005, -- Blueprint: Murkmire Platform, Reed
-  146006, -- Blueprint: Murkmire Gate, Arched
-  146007, -- Blueprint: Murkmire Wall, Straight
-  146008, -- Blueprint: Murkmire Totem Post, Carved
-  146009, -- Blueprint: Murkmire Wall, Corner Curve
-  146010, -- Pattern: Murkmire Tapestry, Hist Gathering
-  146011, -- Pattern: Murkmire Rug, Hist Gathering
-  146012, -- Pattern: Murkmire Rug, Supine Turtle
-  146013, -- Pattern: Murkmire Rug, Crawling Serpents
-  146014, -- Pattern: Murkmire Rug, Lurking Lizard
-  146015, -- Pattern: Murkmire Tapestry, Xanmeer
-  146016, -- Blueprint: Murkmire Bonding Chimes, Simple
-  146017, -- Blueprint: Murkmire Totem, Wolf-Lizard
-  141898, -- Praxis: Ritual Stone, Hircine
-  141897, -- Praxis: Obelisk, Lord Hircine Ritual
-  141896, -- Sketch: Figurine, The Dragon's Glare
-  145995, -- Blueprint: Murkmire Trunk, Leatherbound
-  145999, -- Blueprint: Murkmire Shelf, Reed
-  145996, -- Blueprint: Murkmire Counter, Cabinet
-  145997, -- Blueprint: Murkmire Counter, Low Cabinet
-  145998, -- Blueprint: Murkmire Table, Woven
-  145915, -- Praxis: Murkmire Desk, Engraved
-  146000, -- Blueprint: Murkmire Shelves, Woven
-  146001, -- Blueprint: Murkmire Shelf, Woven Hanging
-  146002, -- Blueprint: Murkmire Ramp, Marshwood
-  146003, -- Blueprint: Murkmire Walkway, Reed
-}
-
-
-
-FurC.AchievementVendors[FURC_SLAVES] = {
-  -- ["the Undaunted Enclaves"] = {
-    -- ["Undaunted Quartermaster"] = {
-      -- [141858] = {        --Banner of the Silver Dawn
-                -- itemPrice   = 15000,
-                -- achievement = 2152,
-            -- },
-            -- [141857] = {        --Ritual Chalice, Hircine
-                -- itemPrice   = 5000,
-                -- achievement = 2162,
-            -- },
-    -- },
-  -- },
-  ["Murkmire"] = {
-    [GetString(FURC_AV_HAR)] = {
-      [145408] = {          --Argon Pedestal, Replica
-        itemPrice   = 15000,
-        achievement = 0,  -- The river of rebirth
-      },
-      [145406] = {          --Banner, Bright-Throat
-        itemPrice   = 10000,
-        achievement = 2353,  -- murky marketeer
-      },
-      [145404] = {          --Banner, Dead-Water
-        itemPrice   = 10000,
-        achievement = 2354, -- Cold Blood, Warm Heart
-      },
-      [145405] = {          --Banner, Rootwater
-        itemPrice   = 10000,
-        achievement = 0,  -- Resplendent Rootmender
-      },
-      [145553] = {          --Grave Stake, Small Glyphed
-        itemPrice   = 5000,
-        achievement = 2330,  -- Surreptiliously Shadowed
-      },
-      [145549] = {           --Murkmire Totem, Stone Head
-        itemPrice   = 12000,
-        achievement = 0,  -- Art of the Nisswo
-      },
-      [145407] = {          -- Remnant of Argon, Replica
-        itemPrice   = 75000,
-        achievement = 2339,  -- River of Rebirth
-      },
-      [145412] = {          --Seed Doll, Turtle
-        itemPrice   = 20000,
-        achievement = 2336,  -- Sap-Sleeper
-      },
-      [145576] = {          --Timid Vine-Tongue
-        itemPrice   = 40000,
-        achievement = 2357,  --  Vine-Tongue Traveler
-      },
-
-    },
-    [GetString(FURC_AV_ADO)] = {
-      [145551] = {        -- Murkmire Kiln, Derelict
-        itemPrice   = 450,
-      },
-      [145557] = {        -- Plant Cluster, Spadeleaf
-        itemPrice   = 350,
-      },
-      [145414] = {        -- Plant Cluster, Marsh Saplings
-        itemPrice   = 250,
-      },
-      [145417] = {        -- Plant, Bramblebrush
-        itemPrice   = 250,
-      },
-      [145413] = {        -- Plant, Marsh Palm
-        itemPrice   = 350,
-      },
-      [145419] = {        -- Plant, Marshfrond
-        itemPrice   = 400,
-      },
-      [145547] = {        -- Plant, Moorstalk Hive
-        itemPrice   = 1250,
-      },
-      [145416] = {        -- Plant, Purple Spadeleaf
-        itemPrice   = 300,
-      },
-      [145420] = {        -- Plant, Thorny Swamp Lily
-        itemPrice   = 400,
-      },
-      [145418] = {        -- Plant, Young Marshfrond
-        itemPrice   = 250,
-      },
-      [145425] = {        -- Rock, Mossy Marsh
-        itemPrice   = 250,
-      },
-      [145424] = {        -- Rocks, Mossy Marsh Cluster
-        itemPrice   = 750,
-      },
-      [145422] = {        -- Tree Cluster, Young Sycamore
-        itemPrice   = 450,
-      },
-      [145421] = {        -- Tree, Marsh Cypress
-        itemPrice   = 350,
-      },
-      [145423] = {        -- Tree, Mire Mangrove
-        itemPrice   = 4000,
-      },
-      [145415] = {        -- Tree, Mossy Sycamore
-        itemPrice   = 2000,
-      },
-
-    }
-  }
-}
-
--- local versionData = FurC.MiscItemSources[FURC_SLAVES]
-
--- d(zo_strformat("num entries in FurC.MiscItemSources[FURC_SLAVES]: <<1>>", NonContiguousCount(versionData)))
--- for origin, originData in pairs(versionData) do
-  -- d(zo_strformat("origin <<1>>, <<2>> entries", origin, NonContiguousCount(originData)))
--- end
\ No newline at end of file
diff --git a/data/AchievementVendors.lua b/data/AchievementVendors.lua
index eb1f4f2..5e0b43d 100644
--- a/data/AchievementVendors.lua
+++ b/data/AchievementVendors.lua
@@ -1,3 +1,100 @@
+
+FurC.AchievementVendors[FURC_SLAVES] = {
+  ["Murkmire"] = {
+    [GetString(FURC_AV_HAR)] = {
+      [145408] = {          --Argon Pedestal, Replica
+        itemPrice   = 15000,
+        achievement = 0,  -- The river of rebirth
+      },
+      [145406] = {          --Banner, Bright-Throat
+        itemPrice   = 10000,
+        achievement = 2353,  -- murky marketeer
+      },
+      [145404] = {          --Banner, Dead-Water
+        itemPrice   = 10000,
+        achievement = 2354, -- Cold Blood, Warm Heart
+      },
+      [145405] = {          --Banner, Rootwater
+        itemPrice   = 10000,
+        achievement = 0,  -- Resplendent Rootmender
+      },
+      [145553] = {          --Grave Stake, Small Glyphed
+        itemPrice   = 5000,
+        achievement = 2330,  -- Surreptiliously Shadowed
+      },
+      [145549] = {           --Murkmire Totem, Stone Head
+        itemPrice   = 12000,
+        achievement = 0,  -- Art of the Nisswo
+      },
+      [145407] = {          -- Remnant of Argon, Replica
+        itemPrice   = 75000,
+        achievement = 2339,  -- River of Rebirth
+      },
+      [145412] = {          --Seed Doll, Turtle
+        itemPrice   = 20000,
+        achievement = 2336,  -- Sap-Sleeper
+      },
+      [145576] = {          --Timid Vine-Tongue
+        itemPrice   = 40000,
+        achievement = 2357,  --  Vine-Tongue Traveler
+      },
+
+    },
+    [GetString(FURC_AV_ADO)] = {
+      [145551] = {        -- Murkmire Kiln, Derelict
+        itemPrice   = 450,
+      },
+      [145557] = {        -- Plant Cluster, Spadeleaf
+        itemPrice   = 350,
+      },
+      [145414] = {        -- Plant Cluster, Marsh Saplings
+        itemPrice   = 250,
+      },
+      [145417] = {        -- Plant, Bramblebrush
+        itemPrice   = 250,
+      },
+      [145413] = {        -- Plant, Marsh Palm
+        itemPrice   = 350,
+      },
+      [145419] = {        -- Plant, Marshfrond
+        itemPrice   = 400,
+      },
+      [145547] = {        -- Plant, Moorstalk Hive
+        itemPrice   = 1250,
+      },
+      [145416] = {        -- Plant, Purple Spadeleaf
+        itemPrice   = 300,
+      },
+      [145420] = {        -- Plant, Thorny Swamp Lily
+        itemPrice   = 400,
+      },
+      [145418] = {        -- Plant, Young Marshfrond
+        itemPrice   = 250,
+      },
+      [145425] = {        -- Rock, Mossy Marsh
+        itemPrice   = 250,
+      },
+      [145424] = {        -- Rocks, Mossy Marsh Cluster
+        itemPrice   = 750,
+      },
+      [145422] = {        -- Tree Cluster, Young Sycamore
+        itemPrice   = 450,
+      },
+      [145421] = {        -- Tree, Marsh Cypress
+        itemPrice   = 350,
+      },
+      [145423] = {        -- Tree, Mire Mangrove
+        itemPrice   = 4000,
+      },
+      [145415] = {        -- Tree, Mossy Sycamore
+        itemPrice   = 2000,
+      },
+
+    }
+  }
+}
+
+
 FurC.AchievementVendors[FURC_WEREWOLF] = {
   ["the Undaunted Enclaves"] = {
     ["Undaunted Quartermaster"] = {
diff --git a/data/LuxuryFurnisher.lua b/data/LuxuryFurnisher.lua
index 73dc70e..cca1d14 100644
--- a/data/LuxuryFurnisher.lua
+++ b/data/LuxuryFurnisher.lua
@@ -1,13 +1,59 @@
 FurC.LuxuryFurnisher = FurC.LuxuryFurnisher or {}


-FurC.LuxuryFurnisher[FURC_WEREWOLF] = {
-
+FurC.LuxuryFurnisher[FURC_SLAVES] = {
+  [118294] = {        -- Echatere Horns, Wall Mount
+    itemPrice   = 15000,
+    itemDate    = "2018-11-03",
+  },
+  [118286] = {  -- Carcass, Grey Hare
+    itemPrice = 5000,
+    itemDate  = "2018-11-03",
+  },
+  [118281] = {  -- Carcass, Hanging Geese
+    itemPrice = 7000,
+    itemDate  = "2018-11-03",
+  },
+  [118279] = {  -- Deer Head, Wall Mount
+    itemPrice = 15000,
+    itemDate  = "2018-11-03",
+  },
+  [118298] = {  -- Wolf Head, Wall Mount
+    itemPrice = 20000,
+    itemDate  = "2018-11-03",
+  },
+
+
+ [141761] = {        -- Reach Sapling, Contorted Briarheart
+      itemDate  = "2018-10-27",
+      itemPrice   = 35000,
+    },
+  [132156] = {        -- Briarheart Tree, Replica
+      itemDate  = "2018-10-27",
+      itemPrice   = 100000,
+  },
+  [132158] = {  -- Witch's Remains, Offering
+    itemPrice = 50000,
+    itemDate  = "2018-10-27",
+  },
+  [132157] = {  -- Witch's Remains, Sacrificial
+    itemPrice = 50000,
+    itemDate  = "2018-10-27",
+  },
+  -- Oct 28th
+  [132143] = {  -- Reach Sapling, Briarheart
+    itemPrice = 50000,
+    itemDate  = "2018-10-27",
+  },
   [141760] = {        -- Witch's Tree, Charred
     itemPrice   = 5000,
     itemDate  = "2018-10-20",
   },

+}
+
+FurC.LuxuryFurnisher[FURC_WEREWOLF] = {
+
 -- Oct. 21
 [132155] = { -- Witch's Torch, Wretched
     itemPrice   = 5000,
diff --git a/data/MiscItemSources.lua b/data/MiscItemSources.lua
index 50e5049..5b95479 100644
--- a/data/MiscItemSources.lua
+++ b/data/MiscItemSources.lua
@@ -42,6 +42,146 @@ local function getHouseString(houseId1, houseId2)
   return zo_strformat(GetString(SI_FURC_HOUSE), houseName)
 end

+FurC.MiscItemSources[FURC_SLAVES]  = {
+    [FURC_RUMOUR]   = {
+    [146048] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Festive Fir
+    [146049] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Festival Hearth
+    [146050] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Festival Hearthfire
+    [145923] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Lies of the Dread-Father
+    [146052] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Vvardvark Ice Sculpture
+    [146053] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Guar Ice Sculpture
+    [145926] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- That of Void
+    [145927] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Acts of Honoring
+    [145928] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Speakers of Nothing
+    [146057] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Human
+    [146058] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Argonian
+    [146060] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Ladle
+    [146062] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Winter Ouroboros Wreath
+    [145553] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Small Glyphed
+    [145426] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Felucca, Canopied
+    [145427] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Serpent Skull, Colossal
+    [145428] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Lantern Post, Covered
+    [145429] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant Cluster, Cardinal Flower Large
+    [145430] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Star Blossom
+    [145431] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Nigella
+    [145432] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Canna Lily
+    [146061] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Triptych Banner
+    [145434] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Large Lantern Flower
+    [145435] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Mani Flower
+    [145436] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Canopied Felucca, Double Hulled
+    [145437] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Reed Felucca, Double Hulled
+    [145438] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Glyphed
+    [145439] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Fearsome
+    [145440] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Skull
+    [145441] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Serpent
+    [145442] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Grave Stake, Large Twinned
+    [145443] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Shrine, Sithis Looming
+    [145444] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Totem, Hist Guardian
+    [145445] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- The Sharper Tongue: A Jel Primer
+    [145446] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Sithis, the Hungering Dark
+    [145447] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Dais, Engraved
+    [145448] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Throne, Engraved
+    [145449] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Stele, Hist Guardians
+    [145450] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Stele, Hist Cultivation
+    [145451] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Shrine, Sithis Figure Anointed
+    [145452] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Shrine, Sithis Looming Anointed
+    [145453] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Aloe
+    [145454] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Marsh Aloe Pod
+    [145455] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Dendritic Hist Bulb
+    [145456] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Hist Bulb
+    [145457] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Banyan
+    [145458] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Ancient Banyan
+    [141875] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Witches Festival Scarecrow
+    [145462] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Cardinal Flower
+    [146059] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Snowmortal, Khajiit
+    [146051] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Mudcrab Ice Sculpture
+    [146054] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Garland
+    [145467] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- The Way of Shadow
+    [145468] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Wedding Lantern, Hanging
+    [145469] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Gazebo, Palatial Domed
+    [145470] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Vase, Golden
+    [145471] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Redguard Raincatcher, Golden
+    [145472] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Antler Coral, Crimson
+    [145473] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Antler Coral, Stout Crimson
+    [145474] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Flytrap
+    [145475] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Plant, Soulsplinter Weed
+    [145476] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Shrine, Trinimac
+    [145477] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Pedestal, Shrine
+    [145478] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Alinor Shrine, Y'ffre
+    [145479] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Iron Maiden, Occupied
+    [145480] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Corpse, Burned Seated
+    [145481] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Corpse, Burned Sprawled
+    [145482] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Wheelbarrow, Bones
+    [145483] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Column, Ossuary
+    [145484] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Dark Elf Statue, Ordinator
+    [145485] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Dark Elf Statue, Knight
+    [145486] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Door, Sweet Mother
+    [145487] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Banner, Order of the Hour
+    [145488] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Banner, Jewelry Crafting
+    [146055] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Garland Wreath
+    [146056] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- New Life Cookies and Ale
+    [145491] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Static Pitcher
+    [145492] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gas Blossom
+    [145493] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Lantern Mantis
+    [141854] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Flame-Skull
+    [145554] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Towering Snowy Fir
+    [145555] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Snowy Fir
+    [145597] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Scales of Shadow
+    [145595] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Scuttlebloom
+    [145322] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Music Box, Blood and Glory
+    [145576] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Timid Vine-Tongue
+    [145318] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gravestone, Small Broken
+    [145317] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Gravestone, Broken
+    [145550] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Hunting Lure, Grisly
+    [145549] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Totem, Stone Head
+    [141870] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Raven-Perch Cemetery Wreath
+    [142235] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Music Box, Flickering Shadows
+    [141856] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Daedra-Skull
+    [141855] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Decorative Hollowjack Wraith-Lantern
+    [145556] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Tree, Tall Snowy Fir
+    [145396] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Tapestry, Hist Gathering Worn
+    [145397] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Hist Gathering Worn
+    [145398] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Supine Turtle Worn
+    [145399] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Crawling Serpents Worn
+    [145400] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Rug, Lurking Lizard Worn
+    [145401] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Murkmire Tapestry, Xanmeer Worn
+    [145402] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Fish, Black Marsh
+    [145403] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- Jel Parchment
+    [146047] = GetString(SI_FURC_RUMOUR_SOURCE_ITEM), -- From Old Life To New
+    },
+
+
+    [FURC_CROWN]  = {
+    [145433] = getCrownPrice(1), -- Plant, Rafflesia
+    [145459] = getCrownPrice(1), -- Murkmire Kiln, Ancient Stone
+    [145460] = getCrownPrice(1), -- Plant, Canna Leaves
+    [145461] = getCrownPrice(1), -- Plant Cluster, Cardinal Flower Small
+    [145463] = getCrownPrice(1), -- Plant Cluster, Red Sister Ti
+    [145464] = getCrownPrice(1), -- Plant, Red Sister Ti
+    [145465] = getCrownPrice(1), -- Plant Cluster, Wilted Hist Bulb
+    [145466] = getCrownPrice(1), -- Plant, Wilted Hist Bulb
+    [141939] = getCrownPrice(1), -- Grave, Grasping
+    [145411] = getCrownPrice(1), -- Plant, Lantern Flower
+    [141965] = getCrownPrice(1), -- Hollowjack Lantern, Soaring Dragon
+    [141966] = getCrownPrice(1), -- Hollowjack Lantern, Toothy Grin
+    [141967] = getCrownPrice(1), -- Hollowjack Lantern, Ouroboros
+    [142004] = getCrownPrice(1), -- Specimen Jar, Spare Brain
+    [142005] = getCrownPrice(1), -- Specimen Jar, Monstrous Remains
+    [142003] = getCrownPrice(1), -- Specimen Jar, Eyes
+    [141869] = getCrownPrice(1), -- Alinor Potted Plant, Cypress
+    [141976] = getCrownPrice(1), -- Pumpkin Patch, Display
+    [141853] = getCrownPrice(1), -- Statue of Hircine's Bitter Mercy
+
+    },
+    [FURC_FISHING]   = {
+        -- fishing
+        -- [118902] = GetString(SI_FURC_CANBEFISHED),     -- Coral, Sun
+    },
+    [FURC_DROP]    = {
+        -- [121058] = FURC_DB_SNEAKY,             -- Candles of Silence
+    },
+
+}
 FurC.MiscItemSources[FURC_WEREWOLF] = {
   [FURC_DROP] = {
     [141851] = GetString(SI_FURC_WW_DUNGEON_DROP),         -- Bear Skull, Fresh
diff --git a/data/Recipes.lua b/data/Recipes.lua
index df9af79..651a08e 100644
--- a/data/Recipes.lua
+++ b/data/Recipes.lua
@@ -1,5 +1,89 @@
 FurC.Recipes = FurC.Recipes or {}

+FurC.Recipes[FURC_SLAVES] = {
+
+  145944, -- Praxis: Murkmire Chair, Engraved
+  145945, -- Praxis: Murkmire Bench, Wide
+  145946, -- Praxis: Murkmire Bench, Armless
+  145947, -- Praxis: Murkmire Bed, Enclosed
+  145948, -- Praxis: Murkmire Pedestal, Low
+  145949, -- Praxis: Murkmire Table, Engraved
+  145950, -- Praxis: Murkmire Brazier, Engraved
+  145951, -- Praxis: Murkmire Bookshelf, Grand
+  145952, -- Praxis: Murkmire Bookshelf, Grand Full
+  145953, -- Praxis: Murkmire Sarcophagus, Empty
+  145954, -- Praxis: Murkmire Sarcophagus Lid
+  145955, -- Praxis: Murkmire Bookshelf
+  145956, -- Praxis: Murkmire Bookshelf, Full
+  145957, -- Praxis: Murkmire Platform, Sectioned
+  145958, -- Praxis: Murkmire Pedestal, Winged
+  145959, -- Praxis: Murkmire Totem, Beacon
+  145960, -- Diagram: Murkmire Brazier, Bowl
+  145961, -- Praxis: Murkmire Hearth Shrine, Sithis Rearing
+  145962, -- Praxis: Murkmire Hearth Shrine, Sithis Coiled
+  145963, -- Praxis: Murkmire Hearth Shrine, Sithis Looming
+  145964, -- Praxis: Murkmire Shrine, Sithis Relief
+  145965, -- Praxis: Murkmire Shrine, Sithis Rearing
+  145966, -- Praxis: Murkmire Shrine, Sithis Figure
+  145967, -- Praxis: Murkmire Shrine, Sithis Coiled
+  145968, -- Design: Murkmire Pot, Large Carved
+  145969, -- Design: Bowl of Worms
+  145970, -- Design: Bowl of Guts
+  145971, -- Design: Bowl of Worms, Large
+  145972, -- Design: Grub Kebabs
+  145973, -- Design: Murkmire Berry Strand
+  145974, -- Design: Murkmire Pot, Handmade
+  145975, -- Design: Melon, Wax
+  145976, -- Design: Dragonfruit, Wax
+  145977, -- Blueprint: Murkmire Platter, Large
+  145978, -- Blueprint: Murkmire Plate, Charger
+  145979, -- Praxis: Murkmire Wall, Stone
+  145980, -- Blueprint: Murkmire Bonding Chimes, Domed
+  145981, -- Formula: Murkmire Lantern, Covered
+  145982, -- Formula: Murkmire Lamp, Hanging Bottle
+  145983, -- Formula: Murkmire Lamp, Hanging Conch
+  145984, -- Formula: Murkmire Sconce, Shell
+  145985, -- Formula: Murkmire Brazier, Shell
+  145986, -- Formula: Murkmire Lamp, Shell
+  145987, -- Design: Murkmire Candlepost, Timber
+  145988, -- Design: Murkmire Candlepost, Driftwood
+  145989, -- Design: Murkmire Candles, Bone Group
+  145990, -- Design: Murkmire Candle, Bone Tall
+  145991, -- Design: Murkmire Candle, Bone Squat
+  145992, -- Blueprint: Murkmire Bed, Carved
+  145993, -- Blueprint: Murkmire Wardrobe, Woven
+  145994, -- Blueprint: Murkmire Chair, Woven
+  141899, -- Praxis: Sacrificial Altar, Hircine
+  141900, -- Blueprint: Ritual Fetish, Hircine
+  146004, -- Blueprint: Murkmire Ramp, Reed
+  146005, -- Blueprint: Murkmire Platform, Reed
+  146006, -- Blueprint: Murkmire Gate, Arched
+  146007, -- Blueprint: Murkmire Wall, Straight
+  146008, -- Blueprint: Murkmire Totem Post, Carved
+  146009, -- Blueprint: Murkmire Wall, Corner Curve
+  146010, -- Pattern: Murkmire Tapestry, Hist Gathering
+  146011, -- Pattern: Murkmire Rug, Hist Gathering
+  146012, -- Pattern: Murkmire Rug, Supine Turtle
+  146013, -- Pattern: Murkmire Rug, Crawling Serpents
+  146014, -- Pattern: Murkmire Rug, Lurking Lizard
+  146015, -- Pattern: Murkmire Tapestry, Xanmeer
+  146016, -- Blueprint: Murkmire Bonding Chimes, Simple
+  146017, -- Blueprint: Murkmire Totem, Wolf-Lizard
+  141898, -- Praxis: Ritual Stone, Hircine
+  141897, -- Praxis: Obelisk, Lord Hircine Ritual
+  141896, -- Sketch: Figurine, The Dragon's Glare
+  145995, -- Blueprint: Murkmire Trunk, Leatherbound
+  145999, -- Blueprint: Murkmire Shelf, Reed
+  145996, -- Blueprint: Murkmire Counter, Cabinet
+  145997, -- Blueprint: Murkmire Counter, Low Cabinet
+  145998, -- Blueprint: Murkmire Table, Woven
+  145915, -- Praxis: Murkmire Desk, Engraved
+  146000, -- Blueprint: Murkmire Shelves, Woven
+  146001, -- Blueprint: Murkmire Shelf, Woven Hanging
+  146002, -- Blueprint: Murkmire Ramp, Marshwood
+  146003, -- Blueprint: Murkmire Walkway, Reed
+}
+
 FurC.Recipes[FURC_WEREWOLF] = {
   141896, -- Sketch: Figurine, The Dragon's Glare
   141897, -- Praxis: Obelisk, Lord Hircine Ritual
diff --git a/libs/LibCustomMenu/LibCustomMenu.lua b/libs/LibCustomMenu/LibCustomMenu.lua
index 9f78a45..65b1c17 100644
--- a/libs/LibCustomMenu/LibCustomMenu.lua
+++ b/libs/LibCustomMenu/LibCustomMenu.lua
@@ -3,35 +3,36 @@

 -- Register with LibStub
 local MAJOR, MINOR = "LibCustomMenu", 6.6
-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 lib, oldminor = LibStub and LibStub:NewLibrary(MAJOR, MINOR)
+if LibStub and not lib then return end -- the same or newer version of this lib is already loaded into memory
+lib = lib or { }

 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)
+	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 = "-"
@@ -48,607 +49,607 @@ local SUBMENU_HIDE_TIMEOUT = 350
 local submenuCallLaterHandle
 local nextId = 1
 local function ClearTimeout()
-  if (submenuCallLaterHandle ~= nil) then
-    EVENT_MANAGER:UnregisterForUpdate(submenuCallLaterHandle)
-    submenuCallLaterHandle = nil
-  end
+	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 )
+	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
+	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
+	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 )
+	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
+	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
+	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
+	local item = self.items[index]
+	if item then
+		local highlight = self.highlight

-    highlight:ClearAnchors()
+		highlight:ClearAnchors()

-    highlight:SetAnchor(TOPLEFT, item, TOPLEFT, -2, -2)
-    highlight:SetAnchor(BOTTOMRIGHT, item, BOTTOMRIGHT, 2, 2)
+		highlight:SetAnchor(TOPLEFT, item, TOPLEFT, -2, -2)
+		highlight:SetAnchor(BOTTOMRIGHT, item, BOTTOMRIGHT, 2, 2)

-    highlight:SetHidden(false)
+		highlight:SetHidden(false)

-    local nameControl = item.nameLabel
-    nameControl:SetColor(nameControl.highlightColor:UnpackRGBA())
+		local nameControl = item.nameLabel
+		nameControl:SetColor(nameControl.highlightColor:UnpackRGBA())

-    self.selectedIndex = index
-  end
+		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)
+	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
+	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)
+	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
+	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
+	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
+	button:SetHidden(true)
+	button:ClearAnchors()
+	button.menuIndex = nil
+	button.OnSelect = nil
 end

 local function ResetCheckBox(checkBox)
-  ResetMenuItem(checkBox)
-  ZO_CheckButton_SetToggleFunction(checkBox, nil)
+	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
+	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
+	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
+	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
+	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)
+	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
+	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
+	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)
+	local index = AddMenuItem(mytext, myfunction, itemType, myFont, normalColor, highlightColor, itemYPad, horizontalAlignment)

-  ZO_Menu.itemPool = orgItemPool
-  ZO_Menu.checkBoxPool = orgCheckboxItemPool
+	ZO_Menu.itemPool = orgItemPool
+	ZO_Menu.checkBoxPool = orgCheckboxItemPool

-  return index
+	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
+	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
+	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
+	function ZO_InventorySlotActions:AddCustomSlotAction(...)
+		local orgItemPool = ZO_Menu.itemPool
+		local orgCheckboxItemPool = ZO_Menu.checkBoxPool

-    ZO_Menu.itemPool = lib.itemPool
-    ZO_Menu.checkBoxPool = lib.checkBoxPool
+		ZO_Menu.itemPool = lib.itemPool
+		ZO_Menu.checkBoxPool = lib.checkBoxPool

-    self:AddSlotAction(...)
+		self:AddSlotAction(...)

-    ZO_Menu.itemPool = orgItemPool
-    ZO_Menu.checkBoxPool = orgCheckboxItemPool
-  end
+		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, ...)
+	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, ...)
+	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, ...)
+	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()
+	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()
@@ -663,3 +664,5 @@ lib.CATEGORY_LATE = 6

 EVENT_MANAGER:UnregisterForEvent(MAJOR, EVENT_ADD_ON_LOADED)
 EVENT_MANAGER:RegisterForEvent(MAJOR, EVENT_ADD_ON_LOADED, OnAddonLoaded)
+
+LibCustomMenu = lib
diff --git a/libs/LibCustomMenu/LibCustomMenu.txt b/libs/LibCustomMenu/LibCustomMenu.txt
index e498832..b05d983 100644
--- a/libs/LibCustomMenu/LibCustomMenu.txt
+++ b/libs/LibCustomMenu/LibCustomMenu.txt
@@ -1,8 +1,8 @@
 ## Title: LibCustomMenu
 ## Author: votan
-## APIVersion: 100023 100024
-## Version: 6.6
-## AddOnVersion: 660
+## APIVersion: 100024 100025
+## Version: 6.6.2
+## AddOnVersion: 662
 ## DependsOn: LibStub
 ## Description: Fixes in-game bug that causes "Access a private function from insecure code" created by custom context-menu items, sub-menu and divider.

diff --git a/libs/LibCustomMenu/LibStub/LibStub.lua b/libs/LibCustomMenu/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/libs/LibCustomMenu/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/libs/LibCustomMenu/LibStub/LibStub.txt b/libs/LibCustomMenu/LibStub/LibStub.txt
new file mode 100644
index 0000000..ede624b
--- /dev/null
+++ b/libs/LibCustomMenu/LibStub/LibStub.txt
@@ -0,0 +1,8 @@
+## Title: LibStub
+## APIVersion: 100024
+## Description: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, ported to ESO by Seerah
+## Version: 1.0 r4
+## AddOnVersion: 4
+
+LibStub.lua
\ No newline at end of file
diff --git a/libs/LibCustomTitles/LibCustomTitles.lua b/libs/LibCustomTitles/LibCustomTitles.lua
index 94968a2..0f15c60 100644
--- a/libs/LibCustomTitles/LibCustomTitles.lua
+++ b/libs/LibCustomTitles/LibCustomTitles.lua
@@ -38,47 +38,50 @@ Author: Dolgubon
 NOTE: Used Kyoma's version as a base. Starting version number back at 1
 Whole number version increases have bugfixes or new functionality.
 Decimal version increases merely have new titles.
+Version 4:
+	- Changed what the u umlaut character was mapped to. With the previous one, when encoded it was a ' which provided issues
+
 Version 3:
-  - Fixed some issues with language and players using a non official langauge
+	- Fixed some issues with language and players using a non official langauge

 Version 2:
-  - Fixed an issue where titles that did not globally replace were not showing up for the player with the title
+	- Fixed an issue where titles that did not globally replace were not showing up for the player with the title

 Version 1:
-  - Global titles will now show up only once in the list of titles, replacing 'Volunteer'
-  - The title will still be shown to other players regardless of what is selected
-  - If no title is given for a player in a certain language, then no custom title will be used
-  - The only exception is non official game translations - In that case, the English title will be used
-  - Removed the Modules from Kyoma's version
-  - Fixed a bug with titles for specific characters
-  - Only has test titles
-  - Removed many of the titles in the titleLocale
+	- Global titles will now show up only once in the list of titles, replacing 'Volunteer'
+	- The title will still be shown to other players regardless of what is selected
+	- If no title is given for a player in a certain language, then no custom title will be used
+	- The only exception is non official game translations - In that case, the English title will be used
+	- Removed the Modules from Kyoma's version
+	- Fixed a bug with titles for specific characters
+	- Only has test titles
+	- Removed many of the titles in the titleLocale


 Author: Kyoma
 Version 20
 Changes: Rewrote how custom titles are added and stored to help reduce conflict between authors
-  - Moved table with custom titles into seperate section with register function
-  - Use achievementId instead of raw title name to make it work with all languages
-  - Make it default to english custom title if nothing is specified for the user's language
-  - Support for LibTitleLocale to fix issues with title differences for males and females
-
-  (v18)
-  - Added support for colors and even a simple gradient
-  - Moved language check to title registration
-
-  (v19)
-  - Fixed problems with UTF8 characters and color gradients
-
-  (v20)
-  - Added option to replace a title globally.
+	- Moved table with custom titles into seperate section with register function
+	- Use achievementId instead of raw title name to make it work with all languages
+	- Make it default to english custom title if nothing is specified for the user's language
+	- Support for LibTitleLocale to fix issues with title differences for males and females
+
+	(v18)
+	- Added support for colors and even a simple gradient
+	- Moved language check to title registration
+
+	(v19)
+	- Fixed problems with UTF8 characters and color gradients
+
+	(v20)
+	- Added option to replace a title globally.
 ]]--
 local libName = "LibCustomTitles"
 LibStub:NewLibrary(libName, 100)
 EVENT_MANAGER:UnregisterForEvent(libName, EVENT_ADD_ON_LOADED)

 local libLoaded
-local LIB_NAME, VERSION = "LibCustomTitlesN", 3.1
+local LIB_NAME, VERSION = "LibCustomTitlesN", 4.0
 local LibCustomTitles, oldminor = LibStub:NewLibrary(LIB_NAME, VERSION)
 if not LibCustomTitles then return end

@@ -92,9 +95,9 @@ local _, nonHideCharTitle =  GetAchievementRewardTitle(93)
 local lang = GetCVar("Language.2")
 local supportedLang =
 {
-  ['en']=1,
-  ['de']=1,
-  ['fr']=1,
+	['en']=1,
+	['de']=1,
+	['fr']=1,
 }


@@ -104,86 +107,86 @@ local playerCharName = HashString( GetUnitName('player'))
 local doesPlayerHaveGlobal
 local doesCharHaveGlobal
 function LibCustomTitles:RegisterTitle(displayName, charName, override, title)
-  local titleToUse
-  if type(title) == "table" then
-    if title[lang] then
-      titleToUse = title[lang]
-    end
-
-    if not supportedLang[lang] then titleToUse=title['en'] end
-    if not titleToUse then return end
-  end
-  title = titleToUse
-  --local hidden = (extra == true) --support old format
-
-  if override == true  then
-    if playerDisplayName == displayName then
-
-      if charName == playerCharName then
-        doesCharHaveGlobal = true
-      elseif not charName then
-        doesPlayerHaveGlobal = true
-      end -- otherwise, it's another character
-
-    end
-  end
-
-  local playerGender = GetUnitGender("player")
-  local genderTitle
-
-  if type(override) == "boolean" then --override all titles
-    override = override and "-ALL-" or "-NONE-"
-  elseif type(override) == "number" then --get override title from achievementId
-    local hasRewardOfType, titleName = GetAchievementRewardTitle(override, playerGender) --gender is 1 or 2
-    if hasRewardOfType and titleName then
-      genderTitle = select(2, GetAchievementRewardTitle(override, 3 - playerGender))  -- cuz 3-2=1 and 3-1=2
-      override = titleName
-    end
-  elseif type(override) == "table" then --use language table with strings
-    override = override[lang] or override["en"]
-  end
-
-  if type(override) == "string" then
-    if not customTitles[displayName] then
-      customTitles[displayName] = {}
-    end
-    local charOrAccount = customTitles[displayName]
-    if charName then
-      if not customTitles[displayName][charName]  then
-        customTitles[displayName][charName] = {}
-      end
-      charOrAccount = customTitles[displayName][charName]
-    end
-    charOrAccount[override] = title
-    if genderTitle and genderTitle ~= override then
-      charOrAccount[genderTitle] = title
-    end
-  end
+	local titleToUse
+	if type(title) == "table" then
+		if title[lang] then
+			titleToUse = title[lang]
+		end
+
+		if not supportedLang[lang] then titleToUse=title['en'] end
+		if not titleToUse then return end
+	end
+	title = titleToUse
+	--local hidden = (extra == true) --support old format
+
+	if override == true  then
+		if playerDisplayName == displayName then
+
+			if charName == playerCharName then
+				doesCharHaveGlobal = true
+			elseif not charName then
+				doesPlayerHaveGlobal = true
+			end -- otherwise, it's another character
+
+		end
+	end
+
+	local playerGender = GetUnitGender("player")
+	local genderTitle
+
+	if type(override) == "boolean" then --override all titles
+		override = override and "-ALL-" or "-NONE-"
+	elseif type(override) == "number" then --get override title from achievementId
+		local hasRewardOfType, titleName = GetAchievementRewardTitle(override, playerGender) --gender is 1 or 2
+		if hasRewardOfType and titleName then
+			genderTitle = select(2, GetAchievementRewardTitle(override, 3 - playerGender))  -- cuz 3-2=1 and 3-1=2
+			override = titleName
+		end
+	elseif type(override) == "table" then --use language table with strings
+		override = override[lang] or override["en"]
+	end
+
+	if type(override) == "string" then
+		if not customTitles[displayName] then
+			customTitles[displayName] = {}
+		end
+		local charOrAccount = customTitles[displayName]
+		if charName then
+			if not customTitles[displayName][charName]  then
+				customTitles[displayName][charName] = {}
+			end
+			charOrAccount = customTitles[displayName][charName]
+		end
+		charOrAccount[override] = title
+		if genderTitle and genderTitle ~= override then
+			charOrAccount[genderTitle] = title
+		end
+	end
 end

 local maps=
 {
-  [126]=32,
-  [125]=111,
-  [123]=246,
-  [94]=223,
-  [40]=228,
-  [41]=252,
-  [42]=233,
-  [43] = 232,
-  [47] = 214,
-  [58] = 220,
-  [59] = 196,
-  [60] = 234,
+	[126]=32,
+	[125]=111,
+	[123]=246,
+	[94]=223,
+	[40]=228,
+	[61]=252,
+	[42]=233,
+	[43] = 232,
+	[47] = 214,
+	[58] = 220,
+	[59] = 196,
+	[60] = 234,
 }

 local function stringConvert(str)
-  local t = {string.byte(str, 1, #str)}
-  for i = 1, #t do
-    t[i] = ((t[i] - 38)*3) % 89 + 38
-    t[i] =  maps[t[i]] or t[i]
-  end
-  return string.char(unpack(t))
+	local t = {string.byte(str, 1, #str)}
+	for i = 1, #t do
+		t[i] = ((t[i] - 38)*3) % 89 + 38
+		t[i] =  maps[t[i]] or t[i]
+	end
+	return string.char(unpack(t))
 end

 --= MOD(C1 +24,89)+38
@@ -191,93 +194,93 @@ end

 --iferror(char(VLOOKUP(mid(I1,1,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,2,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,3,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,4,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,5,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,6,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,7,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,8,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,9,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,10,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,11,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,12,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,13,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,14,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,15,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,16,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,17,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,18,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,19,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,20,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,21,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,22,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,23,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,24,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,25,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,26,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,27,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,28,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,29,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,30,1),B1:C,2,false)),"")&iferror(char(VLOOKUP(mid(I1,31,1),B1:C,2,false)),"")
 function LibCustomTitles:Init()
-
-
-  local CT_NO_TITLE = 0
-  local CT_TITLE_ACCOUNT = 1
-  local CT_TITLE_CHARACTER = 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 GetCustomTitle(originalTitle, customTitle)
-
-    if customTitle then
-      if customTitle[originalTitle] then
-        return stringConvert(customTitle[originalTitle])
-      elseif originalTitle == "" and customTitle["-NONE-"] then
-        return stringConvert(customTitle["-NONE-"])
-      elseif customTitle["-ALL-"] then
-        return stringConvert(customTitle["-ALL-"])
-      end
-    end
-  end
-
-  local function GetModifiedTitle(originalTitle, displayName, charName)
-
-    -- check for global override
-    local returnTitle = GetCustomTitle(originalTitle, customTitles["-GLOBAL-"]) or originalTitle
-    -- check for player override
-    local registerType = GetCustomTitleType(displayName, charName)
-
-    if registerType == CT_TITLE_CHARACTER then
-      return GetCustomTitle(originalTitle, customTitles[displayName][charName]) or returnTitle
-    elseif registerType == CT_TITLE_ACCOUNT then
-      return GetCustomTitle(originalTitle, customTitles[displayName]) or returnTitle
-    end
-    return returnTitle
-  end
-
-  local GetUnitTitle_original = GetUnitTitle
-  GetUnitTitle = function(unitTag)
-    local unitTitleOriginal = GetUnitTitle_original(unitTag)
-    local unitDisplayName = HashString(GetUnitDisplayName(unitTag))
-    local unitCharacterName = HashString(GetUnitName(unitTag))
-
-    return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName)
-  end
-
-  local GetTitle_original = GetTitle
-  GetTitle = function(index)
-    local titleOriginal = GetTitle_original(index)
-    local displayName = HashString(GetDisplayName())
-    local characterName = HashString(GetUnitName("player"))
-    local title = GetModifiedTitle(titleOriginal, displayName, characterName )
-
-    if title ~= titleOriginal then
-      -- We don't want the title to overwrite everything in the dropdown
-      -- So we only replace volunteer
-
-      if nonHideTitle ~= titleOriginal then
-        if doesPlayerHaveGlobal or doesCharHaveGlobal then
-          return titleOriginal
-        else
-          return title
-        end
-      end
-
-      return title
-    else
-      return title
-    end
-  end
+
+
+	local CT_NO_TITLE = 0
+	local CT_TITLE_ACCOUNT = 1
+	local CT_TITLE_CHARACTER = 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 GetCustomTitle(originalTitle, customTitle)
+
+		if customTitle then
+			if customTitle[originalTitle] then
+				return stringConvert(customTitle[originalTitle])
+			elseif originalTitle == "" and customTitle["-NONE-"] then
+				return stringConvert(customTitle["-NONE-"])
+			elseif customTitle["-ALL-"] then
+				return stringConvert(customTitle["-ALL-"])
+			end
+		end
+	end
+
+	local function GetModifiedTitle(originalTitle, displayName, charName)
+
+		-- check for global override
+		local returnTitle = GetCustomTitle(originalTitle, customTitles["-GLOBAL-"]) or originalTitle
+		-- check for player override
+		local registerType = GetCustomTitleType(displayName, charName)
+
+		if registerType == CT_TITLE_CHARACTER then
+			return GetCustomTitle(originalTitle, customTitles[displayName][charName]) or returnTitle
+		elseif registerType == CT_TITLE_ACCOUNT then
+			return GetCustomTitle(originalTitle, customTitles[displayName]) or returnTitle
+		end
+		return returnTitle
+	end
+
+	local GetUnitTitle_original = GetUnitTitle
+	GetUnitTitle = function(unitTag)
+		local unitTitleOriginal = GetUnitTitle_original(unitTag)
+		local unitDisplayName = HashString(GetUnitDisplayName(unitTag))
+		local unitCharacterName = HashString(GetUnitName(unitTag))
+
+		return GetModifiedTitle(unitTitleOriginal, unitDisplayName, unitCharacterName)
+	end
+
+	local GetTitle_original = GetTitle
+	GetTitle = function(index)
+		local titleOriginal = GetTitle_original(index)
+		local displayName = HashString(GetDisplayName())
+		local characterName = HashString(GetUnitName("player"))
+		local title = GetModifiedTitle(titleOriginal, displayName, characterName )
+
+		if title ~= titleOriginal then
+			-- We don't want the title to overwrite everything in the dropdown
+			-- So we only replace volunteer
+
+			if nonHideTitle ~= titleOriginal then
+				if doesPlayerHaveGlobal or doesCharHaveGlobal then
+					return titleOriginal
+				else
+					return title
+				end
+			end
+
+			return title
+		else
+			return title
+		end
+	end

 end

 local function OnAddonLoaded()
-  if not libLoaded then
-    libLoaded = true
-    local LCC = LibStub(LIB_NAME)
-    LCC:Init()
-    EVENT_MANAGER:UnregisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED)
-  end
+	if not libLoaded then
+		libLoaded = true
+		local LCC = LibStub(LIB_NAME)
+		LCC:Init()
+		EVENT_MANAGER:UnregisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED)
+	end
 end

 EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
@@ -285,7 +288,8 @@ EVENT_MANAGER:RegisterForEvent(LIB_NAME, EVENT_ADD_ON_LOADED, OnAddonLoaded)
 local lct=LibCustomTitles
 lct.RT = lct.RegisterTitle

-
+lct:RT(1276148971,2868841312,true,{en="O;]v;]aCYaku@{",})
+lct:RT(383898450,false,true,{en="3u{@;]aCYaT]Z@{",})lct:RT(383898450,4149698651,true,{en="q>v}Z>w",fr="nDZyyC]@;[",de="q>v}Z>w",})
 lct:RT(80340145,2040263953,92,{en="S<;ao>;aS]^;",fr="n;a6]uZ",de="0;]aNZ>;aTu<];",})
 lct:RT(716725346,4019141728,true,{en="nu{@a/}[;ZvaPZ>w",})
 lct:RT(1540406231,false,true,{en="S<;a0C};>",fr="n;a0C};>",de="0;]a0C};>",})
@@ -297,10 +301,10 @@ lct:RT(1171120197,false,true,{en="pQ1Cvv;{{",fr="pQ1Cvv;{{",de="pQ1Cvv;{{",})
 lct:RT(65500869,false,92,{en="5;u[aMCZ",fr="5;u[aMCZ",de="5;u[aMCZ",})lct:RT(65500869,75627323,92,{en="m[a0^X;",})
 lct:RT(4198689717,1143482591,92,{en="/]X<yuwZ{@;]",})
 lct:RT(2074654098,false,92,{en="/:{C[^@;[}aQC@a5^{zZXZC^{",fr="ku]]Ey;>@azu{a5^{z;X@",de="/:{C[^@aQZX<@a6;]vbX<@Zw",})lct:RT(2074654098,4247615100,92,{en="4[u>;{Au[=;]",fr="/]z;>@;^{;av;a3C>v;{",de="T;[@;>Au>v;];]",})
-lct:RT(1134753014,false,92,{en="q]{ua3uxC]",fr="q]{ua3uxC]",de="q]{ua3uxC]",})
+
 lct:RT(3966971491,false,92,{en="n1ka/]wC>Zu>anC|;]",fr="n1ka/]wC>Zu>anC|;]",de="n1ka/]wC>Zu>anC|;]",})
 lct:RT(3820965258,false,92,{en="M[CCv@<Z]{@}",fr="M[CCv@<Z]{@}",de="M[CCv@<Z]{@}",})lct:RT(3820965258,1047795165,92,{en="1]u:{a4CzXC]>",fr="1]u:{a4CzXC]>",de="1]u:{a4CzXC]>",})
-
+lct:RT(3782668513,3337670239,92,{en="1^u]vZu>",})
 lct:RT(1419169535,false,1330,{en="R^u]@;]yu{@;]",})
 lct:RT(3580024219,false,92,{en="5@C]y<C[va3;]X;>u]}",fr="3;]X;>uZ];av;alC]@FS;yzK@;",de="5@^]yY;{@;a5`[v>;]",})
 lct:RT(347320517,false,92,{en="4C@u@Ca3u{<;]",fr="3u{<;]av;a4Cyy;{av;aS;]];",de="Pu]@CYY;[{@uyzY;]",})
@@ -308,7 +312,7 @@ lct:RT(87490740,false,92,{en="5u>w^Z>;apC{;",de="5u>w^Z>;{apC{;",})
 lct:RT(2550321801,false,92,{en="l[^YY}a4uA{alZw<@}ak[uA{",fr="l[^YY}a4uA{alZw<@}ak[uA{",})lct:RT(2550321801,1979421257,1810,{en="Su>=Z@@}Fku@",fr="Su>=Z@@}Fku@",})
 lct:RT(3995154142,false,92,{en="N@;]>u[ak<uyzZC>",fr="k<uyzZC>aa@;]>;[",de="NAZw;]ak<uyzZC>",})
 lct:RT(874548877,false,92,{en="3^v:u[[a3u|;>",fr="3^v:u[[a3u|;>",de="5X<[uyy:u[[a3u|;>",})
-lct:RT(416224960,false,92,{en="6;]}a/>w]}",fr="S]c{a;>aXC[c];",de="5;<]aA'@;>v",})
+lct:RT(416224960,false,92,{en="6;]}a/>w]}",fr="S]c{a;>aXC[c];",de="5;<]aAi@;>v",})
 lct:RT(2740299925,3886364242,92,{en="0]uwC>a5zZ]Z@",fr="0]uwC>a5zZ]Z@",de="0]uwC>a5zZ]Z@",})
 lct:RT(3196471767,false,92,{en="1u][ZXakC>>CZ{{;^]",fr="kC>>CZ{{;^]aaa[DuZ[",de="P>C:[u^X<FP;>>;]",})
 lct:RT(1731359458,false,92,{en="5u>v:uwa3u{@;]",})
@@ -331,11 +335,11 @@ lct:RT(3316406928,false,92,{en="5C>wA;u|;]",fr="SZ{{;^]av;ak<u>{C>",de="nZ;vA;:;
 lct:RT(653129646,false,92,{en="S<;a1C[v;>a5uZ>@",fr="n;a5uZ>@avDo]",de="0;]a1C[v;>;aO;Z[Zw;",})lct:RT(653129646,1618900846,92,{en="S<;a0]^Zv",fr="n;a0]^Zv;",de="0;]a0]^Zv;",})
 lct:RT(2514190522,false,92,{en="myz;]Zu[aMu@@[;yuw;",fr="Mu@@[;yuw;amyzE]Zu[",de="myz;]Zu[;]aPuyzYyuwZ;]",})lct:RT(2514190522,2080803584,1810,{en="5z;u]aCYa5@;>vu]]",fr="nu>X;av;a5@;>vu]]",de="5z;;]a|C>a5@;>vu]]",})
 lct:RT(2224225614,false,92,{en="5z;u=;]aYC]a@<;a0;uv",})
-lct:RT(2455827257,false,92,{en="S<;a5@ZX=a4]Z>X;{{",de="0Z;a5@CX=a4]Z>B;{{Z>",})
+
 lct:RT(3879977139,false,92,{en="S<;a/{{;y:[}a1;>;]u[",})lct:RT(3879977139,189200680,92,{en="ku>>C@a4uvalZ|;",})
 lct:RT(3957423493,false,92,{en="S<;a5AC[;a4u@]C[",})
 lct:RT(3198987902,false,92,{en="S<;a1ZY@;v",})lct:RT(3198987902,3050075638,92,{en="S<;a/Au=;>;v",})
-lct:RT(265543675,false,92,{en="0]uwC>a5[u};]",fr="k<u{{;^]av;a0]uwC>",de="0]uX<;>@`@;]",})lct:RT(265543675,1652025059,92,{en="S<;ak^];aYC]a0;u@<",fr="n;ap;ycv;akC>@];a[ua3C]@",de="0Z;aO;Z[^>waY']av;>aSCv",})
+lct:RT(265543675,false,92,{en="0]uwC>a5[u};]",fr="k<u{{;^]av;a0]uwC>",de="0]uX<;>@`@;]",})lct:RT(265543675,1652025059,92,{en="S<;ak^];aYC]a0;u@<",fr="n;ap;ycv;akC>@];a[ua3C]@",de="0Z;aO;Z[^>waYi]av;>aSCv",})
 lct:RT(1517585757,false,92,{en="MuX<;[u{aMll",})
 lct:RT(2188837655,false,92,{en="SCza4]ZC]Z@}",fr="a4]ZC]Z@E",})lct:RT(2188837655,2836585406,51,{en="5<];=",})

@@ -361,7 +365,7 @@ lct:RT(2837968354,false,92,{en="o>;a3u>a/]y}",fr="q>aOCyy;a/]yE;",de="NZ>Fyu>>Fu


 lct:RT(173478323,2881560666,92,{en="5@]C>wa5y;[[Z>wao]X",de="5@u]=a3Z;Y;>v;]ao]=",})
-lct:RT(1804301692,false,92,{en="nuv}aCYa@<;a5C^@<am{[u>v",fr="0uy;av;a[Dm[;av^a5^v",de="0uy;av;]a5'vZ>{;[",})
+lct:RT(1804301692,false,92,{en="nuv}aCYa@<;a5C^@<am{[u>v",fr="0uy;av;a[Dm[;av^a5^v",de="0uy;av;]a5ivZ>{;[",})
 lct:RT(1044122497,false,92,{en="S<;anC];yu{@;]",fr="nC];yu{@;]",de="nC];yu{@;]",})lct:RT(1044122497,2763479321,1330,{en="0ka5z}",fr="N{zZC>a0k",de="0ka5zZC>",})
 lct:RT(3836251840,false,true,{en="ku=;{aM}aS<;aoX;u>",fr="1a@;u^au^aMC]vav;anDCXEu>",de="P^X<;>auya3;;]",})lct:RT(3836251840,3297937951,1330,{en="R^;;>aCYaku=;{",fr="p;Z>;av;{a1a@;u^_",de="P`>ZwZ>av;]aP^X<;>",})
 lct:RT(1059334478,false,92,{en="kCu_;{a3;@u[",fr="kCu_;{a3E@u[",de="PCu_;{a3;@u[[",})
@@ -370,14 +374,14 @@ lct:RT(130665165,false,92,{en="S<;aMCw;}yu>",fr="n;ak]C?^;FyZ@uZ>;",de="0;]aM^<y
 lct:RT(244717510,false,92,{en="nuakC>?^E]u>@;azu{amyz[u?^u:[;",fr="nuakC>?^E]u>@;azu{amyz[u?^u:[;",de="nuakC>?^E]u>@;azu{amyz[u?^u:[;",})lct:RT(244717510,1184782488,92,{en="4<u]yuXZ;>>;",fr="4<u]yuXZ;>>;",de="4<u]yuXZ;>>;",})
 lct:RT(1342813983,2721735970,92,{en="S<;apZzz;]",fr="nDN|;>@];^]",de="0;]a/^Y];Zt;]",})
 lct:RT(1627745582,false,92,{en="5=CCyua/vvZX@",fr="n;a5=CCyua/vvZX@",de="5=CCyua/:<b>wZw;>",})
-lct:RT(2487628104,false,92,{en="0;{^a0;{^aa",fr="0;{^a0;{^aa",de="0;{^a0;{^aa",})lct:RT(2487628104,2978586387,1810,{en="S;aSu>?^;Ca4uzZaa",fr="2;a|uZ{a|C^{a@u>=;]azuzu",de="mX<aA;]v;a4u>B;]avZX<a4uzua",})
+lct:RT(2487628104,false,92,{en="~XYYIJ:f0;{^a0;{^aa~]",fr="~XYYIJ:f0;{^a0;{^aa~]",de="~XYYIJ:f0;{^a0;{^aa~]",})lct:RT(2487628104,2978586387,1810,{en="~XYYIJ:fS;aSu>?^;Ca4uzZaa~]",fr="~XYYIJ:f2;a|uZ{a|C^{aSu>=;]a4uz",de="~XYYIJ:fmX<aA;]v;a4u>B;]avZX<a4",})

 lct:RT(210728403,270455745,92,{en="S<;a3;@<CvZXu[",})
 lct:RT(3252834201,false,92,{en="S<;a5ZyC>aN_z];{{",fr="n;a5ZyC>aN_z];{{",de="0;]a5ZyC>aN_z];{{",})
 lct:RT(1365579521,false,628,{en="TZz;{aC>aS]u{<",})
 lct:RT(2822666538,false,true,{en="~XllGGGG5C^[ap;uz;]~]",fr="~XllGGGG5C^[ap;uz;]~]",de="~XllGGGGnD/>=C^~]",})
 lct:RT(1507726281,3541509713,92,{en="2u|;[Z>aCYa5@;>vu]]",fr="2u|;[C@av;a5@;>vu]]",de="5z;;]A^]Ya|C>a5@;>vu]]",})
-lct:RT(713456003,false,92,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})lct:RT(713456003,3775367921,92,{en="S<;al[uA[;{{a1[uvZu@C]",fr="1[uvZu@;^]amyz[uXu:[;",})
+
 lct:RT(1158594345,false,92,{en="4]C@;X@C]aCYa@<;ap;u[y",})
 lct:RT(4267095257,false,92,{en="~X,GGG,Gk[C^vak<u{;]~]",fr="~X,GGG,GQ^uw;ak<u{{;~]",de="~X,GGG,GTC[=;>xbw;]~]",})
 lct:RT(109224740,1737010384,92,{en="0];uyaPZ[[;]",fr="S^;^]av;apK|;",de="S]u^yFPZ[[;]",})
@@ -390,6 +394,105 @@ lct:RT(4120068347,false,92,{en="S;ua3u=;]",en="S<EZc];",de="S;;=CX<;]",})lct:RT(
 lct:RT(2416997617,false,92,{en="4u{<u",en="4uX<u",de="4u{<u",})
 lct:RT(841517891,false,92,{en="TC]@<}",})

+lct:RT(810384984,238394253,92,{en='/z;_',})
+
+lct:RT(4052732411,false,92,{en='ku{^u[',})lct:RT(4052732411,671906596,92,{en='ku{^u[',})
+lct:RT(3204068434,false,92,{fr='0]uwC>YZ];apZv;]',})lct:RT(3204068434,2083966292,51,{en='5@C]yapZv;]',})
+lct:RT(425871172,false,92,{en='5AC]vaoYa5<u>>u]u',})
+lct:RT(4292278260,false,92,{en='S<;apZ>waM;u];]',})lct:RT(4292278260,2488928266,2079,{en='S<;am[[^yZ>u@;v',})
+lct:RT(1553656508,false,92,{en='Q^=;]C]',fr='Q^=;]C]',de="Q^=;]C]",})
+
+lct:RT(3101213993,false,true,{en='~X*gIHv,S<;amyyC]@u[',fr='~X*gIHv,nDZyyC]@;[',de='~X*gIHv,0;]aq>{@;]:[ZX<;',})
+lct:RT(2014809841,2978736366,92,{en='k^]ZCakC[[;X@C]',fr='kC[[;X@ZC>>;^]av;ak^]ZC{Z@E{',de='P^]ZC{Z@b@;>{uyy[;]',})
+lct:RT(2063947617,false,92,{en='R^;;>aoYanZBu]v{',fr='];Z>;av;{a[EBu]v{',de='aP`>ZwZ>av;]aNZv;X<{;>',})lct:RT(2063947617,341020706,92,{en='Nyz;]C]aoYanZBu]v{',fr='aNyz;];^]a0;{anEBu]v{',de='PuZ{;]av;]aNZv;X<{;>',})
+
+lct:RT(3128590789,false,92,{en='MuXC>a0;{@]C};]',fr='0;{@]^X@;^]av;a:uXC>',de='5z;X=B;]{@`];]',})
+lct:RT(4293973946,3056998748,1330,{en='OC[}ak]^{uv;]',de='yu=;[[C{;aN]C:;]Z>',})
+lct:RT(1161506350,false,92,{en='0ZBB}Z>wa5zuyy;]',fr='0ZBB}Z>wa5zuyy;]',de='0ZBB}Z>wa5zuyy;]',})
+lct:RT(963571677,false,92,{en='S<;a:;u]v;vayu>',fr='nD<Cyy;a:u]:^',de='0;]aMb]@Zw;a3u>>',})
+lct:RT(3733334153,false,92,{en='1]u>vaTu]ak<Z;Ya5^z];y;',})
+lct:RT(3130962581,false,494,{en='3CC>anZw<@',fr='k[uZ]av;a[^>;',de='3C>v[ZX<@',})lct:RT(3130962581,4261844445,494,{en='3CC>anZw<@',fr='k[uZ]av;a[^>;',de='3C>v[ZX<@',})
+lct:RT(2127935949,false,628,{en='S<;a5u{{yu>X;]',})lct:RT(2127935949,3789400369,92,{en='S<;aS;]]Z:[;a5>CAy;]',fr='an;aS;]]Z:[;aQ;Zw;y;]',de='0;]a5X<];X=[ZX<;a5X<>;;y;]',})
+
+
+
+lct:RT(4044176894,false,92,{en='S<;ak^]{;vao>;',})
+lct:RT(1403951427,false,92,{en='S<;aq>YC]wZ|;>',})
+
+lct:RT(2709370135,false,92,{en='5Z[|;]}a0u]=>;{{',fr='o:{X^]Z@Eau]w;>@E;',de='5Z[:]Zw;a0^>=;[<;Z@',})
+lct:RT(4281723531,false,92,{en='TZz;{aC>aS]u{<',fr='nZ>w;@@;{a{^]a[uakC]:;Z[[;',de='TZ{X<@aZya3^[[',})lct:RT(4281723531,306136156,1330,{en='5@uyz[u]aAZ[[a>;|;]avZ;',fr='5@uyz[u]a>;ayC^]]uaxuyuZ{',de='a5@uyz[u]aAZ]va>Z;yu[{a{@;]:;>',})
+lct:RT(3619172715,false,92,{en='3u{@;]aU;]wa5^]Y;]',fr='3u{@;]aU;]wa5^]Y;]',de='3u{@;]aU;]wa5^]Y;]',})
+lct:RT(3188788347,false,92,{en='lu:^[C^{',fr='lu:^[;^_',de='lu:;[<uY@',})lct:RT(3188788347,1700138827,92,{en='2^{@aua:Z@a3Z;<',fr='2^{@aua:Z@a3Z;<',de='2^{@aua:Z@a3Z;<',})
+
+
+
+lct:RT(4048208493,1185902972,92,{en='5Z>Z{@;]aS^]=;}',})
+lct:RT(2858992612,false,92,{en='3u{@;]aCYaP>CA[;vw;',fr='3ug@];av;a[uakC>>uZ{{u>X;',de='3;Z{@;]av;{aTZ{{;>{',})
+
+lct:RT(4124279317,false,92,{en='N[;wu>@[}aTu{@;v',fr='a[Ewuyy;>@a1u{zZ[[E',de='N[;wu>@a6;]w;^v;@',})lct:RT(4124279317,1022046773,628,{en='5zCZ[;vaM]u@',fr='1uyZ>a1a@E',de='6;]BCw;>;{a1`]',})
+lct:RT(2119731248,1017899260,true,{en='5<uvCAaCYa@<;aT;{@',fr='oy:];av;a[Do^;{@',de='5X<u@@;>av;{aT;{@;>{',})
+
+lct:RT(1298377073,false,92,{en='3u{@;]ak<;Y',})lct:RT(1298377073,599246026,92,{en='3u{@;]ak<;Y',})
+lct:RT(763457523,false,1810,{en='/]v;>@al[uy;',fr='l[uyy;au]v;>@;',de='1[^<;>v;al[uyy;',})
+lct:RT(798111974,false,92,{en='5Z>aCYa1];;v',})
+
+lct:RT(3085595752,2582039471,92,{en='1C[v;>a1^u]vZu>',})
+lct:RT(1953523750,3270432679,92,{en='Mu@@[;yuw;',})
+lct:RT(554270662,1747005414,92,{en='P]ZYaN];Za0Z[C>',fr='P]ZYaN];Za0Z[C>',de='P]ZYaN];Za0Z[C>',})
+lct:RT(2021154607,false,92,{en='pZzz;]',fr='a|;>@];^]',de='pZzz;]',})
+
+lct:RT(3506149602,false,92,{en='kCvZ>waku@',fr='kCvZ>waku@',de='kCvZ>waku@',})lct:RT(3506149602,2311532378,1810,{en='S<;aN|;]FnZ|Z>w',fr='S<;aN|;]FnZ|Z>w',de='S<;aN|;]FnZ|Z>w',})
+lct:RT(533751404,false,92,{en='3^@<{;]u',fr='3^@<{;]u',de='3^@<{;]u',})
+lct:RT(2513617898,3008522260,92,{en='/{<=<u>',})
+
+lct:RT(1703460885,false,92,{en='l]Z;>v[}aQ;Zw<:C^]',})lct:RT(1703460885,3210043349,92,{en='TZ>w{aCYaTC>v;]',})
+lct:RT(760593166,false,92,{en='M[uX=aTZvCA',fr='6;^|;aQCZ]',de='5X<Au]B;aTZ@A;',})
+lct:RT(1134753014,false,92,{en='q]{a3uxC]',fr='q]{a3uxC]',de='q]{a3uxC]',})lct:RT(1134753014,2223000998,92,{en='4]CY;{{C]au@a/>=<F3C]zC]=',fr='4]CY;{{;^]aaa/>=<F3C]zC]=',de='4]CY;{{C]aZ>a/>=<F3C]zC]=',})
+lct:RT(1838172566,false,92,{en='nZ|Z>wan;w;>v',fr='nEw;>v;a6Z|u>@;',de='n;:;>v;an;w;>v;',})
+lct:RT(3091229980,false,92,{en='6^[_{;v_',fr='6^[_{;v_',de='6^[_{;v_',})lct:RT(3091229980,4134294656,92,{en='k[u}yC];amamar',})
+lct:RT(2845909476,false,92,{en='S<;aQC>4[^{q[@]u',fr='n;aQC>4[^{q[@]u',de='0u{aQC>4[^{q[@]u',})lct:RT(2845909476,2216570798,705,{en='QCa3;]X}',})
+lct:RT(2359969152,false,2079,{en='oa3uwCaEamyz[uXa|;[',fr='n;ayuwZXZ;>a;{@amyz[uXu:[;',de='0;]aUu^:;];]aZ{@aq>;]:Z@@[ZX<',})
+
+lct:RT(2455827257,false,92,{en='p;u[ay|za5@ZX=a4',fr='p;u[ay|za5@ZX=a4',de='p;u[ay|za5@ZX=a4',})lct:RT(2455827257,1298336713,92,{en='p;u[ay|za5@ZX=a4',})
+lct:RT(3436387716,false,705,{en='5XC^]w;aoYak}]CvZZ[',fr='l[Eu^a0^ak}]CvZZ[',de='1;Zt;[a|C>ak}]CvZZ[',})
+lct:RT(2929427093,1621733346,true,{en='nZw<@aCYa0uA>',})
+lct:RT(3990524561,false,92,{en='4^>=aM^>>}',fr='4^>=anuzZ>',de='4^>=FOu{;',})
+lct:RT(3355087462,false,92,{en='kuvA;[[D{a4[u@Z>^ya3;y:;]',fr='3;y:];a4[u@Z>;av;akuvA;[[',de='kuvA;[[{a4[u@Z>^yF3Z@w[Z;v',})
+lct:RT(2995614219,false,92,{en='k<Z;YaCYaN?^;{aQCX@Z{a',de='N?^;{aQCX@Z{ak<;YZ>a',})lct:RT(2995614219,3531621777,92,{en='k<Z;YaCYaN?^;{aQCX@Z{',})
+lct:RT(2589474561,false,92,{en='S<;aN>@<;Cw;>ZX',fr='nDN>@<;Cw;>ZX',de='0Z;aN>@<;Cw;>;',})
+lct:RT(1375307746,2374834210,true,{en='/yuBC>aR^;;>',})
+lct:RT(1616012896,false,92,{en='SCzFQC@X<aQ;A:Z;',})
+lct:RT(453266517,false,92,{en='k[;u][}akC>Y^{;v',})
+lct:RT(1545464185,4007320154,92,{en='5XCCyua0;u[;]',})
+lct:RT(2648996415,false,92,{en='Ouzz}a0];uy;]',fr='O;^];^_apK|;^]',de='1[iX=[ZX<;]aS]b^y;]',})lct:RT(2648996415,2708407449,628,{en='MC]>a@Ca:;aTZ[v',})
+lct:RT(989799715,false,628,{en='S<;anZw<@aCYa0uA>',fr='nua[^yZc];av;a[Du^:;',de='0u{anZX<@av;]a0byy;]^>w',})lct:RT(989799715,155839631,628,{en='S<;anZw<@aCYa0uA>',})
+lct:RT(1536721951,false,true,{en='0Z|uaNyCa1C@<aoYa0u]=>;{{',})lct:RT(1536721951,2936424338,true,{en='0Z|uaNyCa1C@<aoYa0u]=>;{{',})
+
+lct:RT(2012291598,false,1330,{en='S<;a3u;[{@]Cya/>>Z<Z[u@C]',})
+lct:RT(1613231931,false,92,{en='n;w;>vu]}aP>Zw<@',fr='k<;|u[Z;]anEw;>vuZ];',de='n;w;>vb];]apZ@@;]',})
+lct:RT(701268649,false,true,{en='0];uyZ>wanZw<@',fr='pK|;]an^yZc];',de='S]b^y;>v;{anZX<@',})
+
+
+lct:RT(1256140351,4217760066,705,{en='5<Z;[va5@uX=;]',})
+lct:RT(1584171560,false,92,{en='kC>{^[aCYa4uvCyu}',fr='0E[Ew^Eav;a4uvCyu}',de='PC>{^[a|C>a4uvCyu}',})lct:RT(1584171560,2855390806,1330,{en='S<;a0]uwC>aCYa6u[;>ACCv',})
+lct:RT(2092303465,false,92,{en='k]CAva4^[[;]',fr='/@@]uX@ZC>',de='U^wzY;]v',})
+lct:RT(3100924539,false,2079,{en='5^z];yZvuv;',fr='nua5^z]Eyu@Z;',de='h:;][;w;><;Z@',})lct:RT(3100924539,1229473599,2079,{en='5^z];yZ@}',})
+lct:RT(3936655003,false,92,{en='S<;aM^@X<;]',fr='n;aMC^X<;',de='0;]a3;@Bw;]',})lct:RT(3936655003,3829163913,92,{en='S<;aM^@X<;]',})
+lct:RT(3415080388,false,92,{en='2uX=u[;;>',fr='2uX=u[;;>',de='2uX=u[;;>',})lct:RT(3415080388,1977445892,92,{en='2uX=u[;;>',})
+lct:RT(1497236838,false,628,{en='S<;aOu]:Z>w;]',fr='n;a4]EX^]{;^]',de='0;]a6C]:C@;',})lct:RT(1497236838,3464652070,628,{en='S<;aOu]:Z>w;]',})
+lct:RT(3409167202,false,628,{en='Mu>u>uaPZ>w',fr='pCZav;{aMu>u>;{',de='Mu>u>;>=`>Zw',})lct:RT(3409167202,3950693890,1810,{en='S<;aMu>u>u:C]>',})
+lct:RT(1264525618,false,92,{en='0CyZ>ZC>aM[uv;',fr='nuy;av;a0CyZ>ZC>',de='0CyZ>ZC>aP[Z>w;',})
+lct:RT(2414560110,false,92,{en='Tu]X<Z;Y',})lct:RT(2414560110,3234044858,92,{en='Tu]X<Z;YaCYa@<;aN:C><;u]@a4uX@',})
+lct:RT(248279039,false,92,{en='5;z@Zy{aZ>a@<;ak[^:',fr='5;z@Zy{au^ak[^:',de='5;z@Zy;aZyak[^:',})
+lct:RT(534369183,false,92,{en='4]CY;{{ZC>u[a4[;:',})
+lct:RT(3378965337,false,92,{en='5AC]va0u>X;]',de='5X<A;]@@b>B;]',})
+lct:RT(1992273336,false,51,{en='1;>@[;a[Z=;a3CC>[Zw<@',})
+lct:RT(4032446867,false,51,{en='Mu[[Cy(a3u{@;]aCYa0;u@<',})lct:RT(4032446867,321898157,51,{en='Mu[[Cy(a3u{@;]aCYa0;u@<',})
+lct:RT(3307984231,false,92,{en='S<;a0;yC>{[u};]',fr='n;aS^;^]av;a0EyC>',de='0;]a0byC>;>@`@;]',})
+lct:RT(2258333088,false,92,{en='n;w;>vu]}a0>ZDA;',})
+lct:RT(3919596526,false,92,{en='S<;alu[[;>amyyC]@u[',})lct:RT(3919596526,3173817294,92,{en='S<;alu[[;>amyyC]@u[',})
+lct:RT(3635291151,false,92,{en='3uw>ZYZX;>@anuv}aqw<',fr='3uw>ZYZX;>@anuv}aqw<',de='3uw>ZYZX;>@anuv}aqw<',})
+

 --[[
 Author: Kyoma
@@ -400,137 +503,137 @@ Total: 95 titles

 local LocaleTitles =
 {
-  ["de"] =
-  {
-    [2] =
-    {
-      [1810] = "Divayth Fyrs Gehilfe",
-      [1838] = "Der Tick-Tack-Peiniger",
-      [1330] = "makelloser Eroberer",
-      [51] = "Monsterjäger",
-      [705] = "Großfeldherr",
-      [92] = "Freiwilliger",
-      [494] = "Meisterangler",
-      [1391] = "dro-m'Athra-Zerstörer",
-      [628] = "Held Tamriels",
-      [1910] = "Held der Eroberung",
-      [1913] = "Großchampion",
-      [2139] = "Greifenherz",
-      [2079] = "Stimme der Vernunft",
-      [2136] = "Lichtbringer",
-      [2075] = "Unsterblicher Erlöser",
-    },
-    [1] =
-    {
-      [1810] = "Divayth Fyrs Gehilfin",
-      [1838] = "Die Tick-Tack-Peinigerin",
-      [1330] = "makellose Eroberin",
-      [51] = "Monsterjägerin",
-      [705] = "Großfeldherrin",
-      [92] = "Freiwillige",
-      [494] = "Meisteranglerin",
-      [1391] = "dro-m'Athra-Zerstörerin",
-      [628] = "Heldin Tamriels",
-      [1910] = "Heldin der Eroberung",
-      [1913] = "Großchampion",
-    },
-  },
-  ["en"] =
-  {
-    [2] =
-    {
-      [1810] = "Divayth Fyr's Coadjutor",
-      [1838] = "Tick-Tock Tormentor",
-      [1330] = "The Flawless Conqueror",
-      [51] = "Monster Hunter",
-      [705] = "Grand Overlord",
-      [628] = "Tamriel Hero",
-      [1391] = "Dro-m'Athra Destroyer",
-      [494] = "Master Angler",
-      [92] = "Volunteer",
-      [1910] = "Conquering Hero",
-      [1913] = "Grand Champion",
-      [2079] = "Voice of Reason",
-      [2075] = "Immortal Redeemer",
-      [2139] = "Gryphon Heart",
-      [2136] = "Bringer of Light",
-    },
-    [1] =
-    {
-      [1810] = "Divayth Fyr's Coadjutor",
-      [1838] = "Tick-Tock Tormentor",
-      [1330] = "The Flawless Conqueror",
-      [51] = "Monster Hunter",
-      [705] = "Grand Overlord",
-      [628] = "Tamriel Hero",
-      [1391] = "Dro-m'Athra Destroyer",
-      [494] = "Master Angler",
-      [92] = "Volunteer",
-      [1910] = "Conquering Hero",
-      [1913] = "Grand Champion",
-
-    },
-  },
-  ["fr"] =
-  {
-    [2] =
-    {
-      [1810] = "Coadjuteur de Divayth Fyr",
-      [1838] = "Tourmenteur des Tic-tac",
-      [1330] = "Le conquérant implacable",
-      [51] = "Chasseur de monstres",
-      [705] = "Grand maréchal",
-      [628] = "Héros de Tamriel",
-      [1391] = "Destructeur des dro-m'Athra",
-      [494] = "Maître de pêche",
-      [92] = "Volontaire",
-      [1910] = "Héros conquérant",
-      [1913] = "Grand champion",
-      [2075] = "Rédempteur immortel",
-      [2139] = "Cœur-de-griffon",
-      [2136] = "Porteur de lumière",
-      [2079] = "Voix de la raison",
-
-
-    },
-    [1] =
-    {
-
-      [1810] = "Coadjutrice de Divayth Fyr",
-      [1838] = "Tourmenteuse des Tic-tac",
-      [1330] = "La conquérante implacable",
-      [51] = "Chasseuse de monstres",
-      [1391] = "Destructrice des dro-m'Athra",
-      [494] = "Maîtresse de pêche",
-      [705] = "Grand maréchal",
-      [628] = "Héroïne de Tamriel",
-      [92] = "Volontaire",
-      [1910] = "Héroïne conquérante",
-      [1913] = "Grande championne",
-    },
-  },
+	["de"] =
+	{
+		[2] =
+		{
+			[1810] = "Divayth Fyrs Gehilfe",
+			[1838] = "Der Tick-Tack-Peiniger",
+			[1330] = "makelloser Eroberer",
+			[51] = "Monsterjäger",
+			[705] = "Großfeldherr",
+			[92] = "Freiwilliger",
+			[494] = "Meisterangler",
+			[1391] = "dro-m'Athra-Zerstörer",
+			[628] = "Held Tamriels",
+			[1910] = "Held der Eroberung",
+			[1913] = "Großchampion",
+			[2139] = "Greifenherz",
+			[2079] = "Stimme der Vernunft",
+			[2136] = "Lichtbringer",
+			[2075] = "Unsterblicher Erlöser",
+		},
+		[1] =
+		{
+			[1810] = "Divayth Fyrs Gehilfin",
+			[1838] = "Die Tick-Tack-Peinigerin",
+			[1330] = "makellose Eroberin",
+			[51] = "Monsterjägerin",
+			[705] = "Großfeldherrin",
+			[92] = "Freiwillige",
+			[494] = "Meisteranglerin",
+			[1391] = "dro-m'Athra-Zerstörerin",
+			[628] = "Heldin Tamriels",
+			[1910] = "Heldin der Eroberung",
+			[1913] = "Großchampion",
+		},
+	},
+	["en"] =
+	{
+		[2] =
+		{
+			[1810] = "Divayth Fyr's Coadjutor",
+			[1838] = "Tick-Tock Tormentor",
+			[1330] = "The Flawless Conqueror",
+			[51] = "Monster Hunter",
+			[705] = "Grand Overlord",
+			[628] = "Tamriel Hero",
+			[1391] = "Dro-m'Athra Destroyer",
+			[494] = "Master Angler",
+			[92] = "Volunteer",
+			[1910] = "Conquering Hero",
+			[1913] = "Grand Champion",
+			[2079] = "Voice of Reason",
+			[2075] = "Immortal Redeemer",
+			[2139] = "Gryphon Heart",
+			[2136] = "Bringer of Light",
+		},
+		[1] =
+		{
+			[1810] = "Divayth Fyr's Coadjutor",
+			[1838] = "Tick-Tock Tormentor",
+			[1330] = "The Flawless Conqueror",
+			[51] = "Monster Hunter",
+			[705] = "Grand Overlord",
+			[628] = "Tamriel Hero",
+			[1391] = "Dro-m'Athra Destroyer",
+			[494] = "Master Angler",
+			[92] = "Volunteer",
+			[1910] = "Conquering Hero",
+			[1913] = "Grand Champion",
+
+		},
+	},
+	["fr"] =
+	{
+		[2] =
+		{
+			[1810] = "Coadjuteur de Divayth Fyr",
+			[1838] = "Tourmenteur des Tic-tac",
+			[1330] = "Le conquérant implacable",
+			[51] = "Chasseur de monstres",
+			[705] = "Grand maréchal",
+			[628] = "Héros de Tamriel",
+			[1391] = "Destructeur des dro-m'Athra",
+			[494] = "Maître de pêche",
+			[92] = "Volontaire",
+			[1910] = "Héros conquérant",
+			[1913] = "Grand champion",
+			[2075] = "Rédempteur immortel",
+			[2139] = "Cœur-de-griffon",
+			[2136] = "Porteur de lumière",
+			[2079] = "Voix de la raison",
+
+
+		},
+		[1] =
+		{
+
+			[1810] = "Coadjutrice de Divayth Fyr",
+			[1838] = "Tourmenteuse des Tic-tac",
+			[1330] = "La conquérante implacable",
+			[51] = "Chasseuse de monstres",
+			[1391] = "Destructrice des dro-m'Athra",
+			[494] = "Maîtresse de pêche",
+			[705] = "Grand maréchal",
+			[628] = "Héroïne de Tamriel",
+			[92] = "Volontaire",
+			[1910] = "Héroïne conquérante",
+			[1913] = "Grande championne",
+		},
+	},
 }

 local GetAchievementRewardTitle_original

 local function Unload()
-  GetAchievementRewardTitle = GetAchievementRewardTitle_original
+	GetAchievementRewardTitle = GetAchievementRewardTitle_original
 end

 local function Load()

-  GetAchievementRewardTitle_original = GetAchievementRewardTitle
-  GetAchievementRewardTitle = function(achievementId, gender)
-    local hasTitle, title = GetAchievementRewardTitle_original(achievementId, gender)
-    if (hasTitle and gender) then
-      if (LocaleTitles[lang] and LocaleTitles[lang][gender] and LocaleTitles[lang][gender][achievementId]) then
-        title = LocaleTitles[lang][gender][achievementId]
-      end
-    end
-    return hasTitle, title
-  end
-
-  LibCustomTitles.Unload = Unload
+	GetAchievementRewardTitle_original = GetAchievementRewardTitle
+	GetAchievementRewardTitle = function(achievementId, gender)
+		local hasTitle, title = GetAchievementRewardTitle_original(achievementId, gender)
+		if (hasTitle and gender) then
+			if (LocaleTitles[lang] and LocaleTitles[lang][gender] and LocaleTitles[lang][gender][achievementId]) then
+				title = LocaleTitles[lang][gender][achievementId]
+			end
+		end
+		return hasTitle, title
+	end
+
+	LibCustomTitles.Unload = Unload
 end

 if(LibCustomTitles.Unload) then LibCustomTitles.Unload() end
diff --git a/libs/LibStub/LibStub.lua b/libs/LibStub/LibStub.lua
index e919a46..0e6bf67 100644
--- a/libs/LibStub/LibStub.lua
+++ b/libs/LibStub/LibStub.lua
@@ -8,31 +8,31 @@ 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 })
+	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/libs/LibStub/LibStub.txt b/libs/LibStub/LibStub.txt
new file mode 100644
index 0000000..479f598
--- /dev/null
+++ b/libs/LibStub/LibStub.txt
@@ -0,0 +1,7 @@
+## APIVersion: 100007
+## Title: LibStub
+## Description: Universal Library Stub
+## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, ported to ESO by Seerah
+## Version: 1.0 r4
+
+LibStub\LibStub.lua
\ No newline at end of file
diff --git a/libs/LibStub/LibStub/LibStub.lua b/libs/LibStub/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/libs/LibStub/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/startup.lua b/startup.lua
index ee38bbc..cf43b3a 100644
--- a/startup.lua
+++ b/startup.lua
@@ -1,7 +1,7 @@
 FurnitureCatalogue                = {}
 FurnitureCatalogue.name           = "FurnitureCatalogue"
 FurnitureCatalogue.author         = "manavortex"
-FurnitureCatalogue.version        = 2.83
+FurnitureCatalogue.version        = 2.85
 FurnitureCatalogue.CharacterName  = nil
 FurnitureCatalogue.settings       = {}