Quantcast

- Libraries update.

HonorGoG [07-24-19 - 03:56]
- Libraries update.
- Updated TOC for update.
Filename
Titan/Titan.toc
Titan/libs/Ace3.lua
Titan/libs/Ace3.toc
Titan/libs/AceAddon-3.0/AceAddon-3.0.lua
Titan/libs/AceConfig-3.0/AceConfig-3.0.lua
Titan/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
Titan/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
Titan/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets.toc
Titan/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
Titan/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
Titan/libs/AceGUI-3.0/AceGUI-3.0.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
Titan/libs/AceHook-3.0/AceHook-3.0.lua
Titan/libs/AceTimer-3.0/AceTimer-3.0.lua
Titan/libs/CHANGES.txt
Titan/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Titan/libs/LibSharedMedia-3.0/CHANGES.txt
Titan/libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
Titan/libs/LibSharedMedia-3.0/Changelog-LibSharedMedia-3.0-7.0.3.txt
Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml
Titan/libs/LibSharedMedia-3.0/LibStub/LibStub.lua
Titan/libs/LibSharedMedia-3.0/lib.xml
Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.lua
Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.xml
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
Titan/libs/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
Titan/libs/Libs/LibSharedMedia-3.0/lib.xml
Titan/libs/Libs/LibStub/LibStub.lua
Titan/libs/Libs/LibStub/LibStub.toc
Titan/libs/changelog.txt
Titan/libs/widget.xml
TitanBag/TitanBag.toc
TitanClock/TitanClock.toc
TitanGold/TitanGold.toc
TitanLocation/TitanLocation.toc
TitanLootType/TitanLootType.toc
TitanPerformance/TitanPerformance.toc
TitanRepair/TitanRepair.toc
TitanVolume/TitanVolume.toc
TitanXP/TitanXP.toc
diff --git a/Titan/Titan.toc b/Titan/Titan.toc
index 690755d..aa9b4f3 100644
--- a/Titan/Titan.toc
+++ b/Titan/Titan.toc
@@ -1,7 +1,7 @@
 ## Interface: 80200
-## Title: Titan Panel |cff00aa005.17.5.80200|r
+## Title: Titan Panel |cff00aa005.18.0.80200|r
 ## Author: Titan Panel Development Team
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## SavedVariables: TitanAll, TitanSettings, TitanSkins, ServerTimeOffsets, ServerHourFormat
 ## OptionalDeps: Ace3, AceGUI-3.0-SharedMediaWidgets, LibSharedMedia-3.0, LibQTip-1.0, !LibUIDropDownMenu
 ## Notes: Adds a display bar on the top and/or bottom of the screen. Allows users to show and control information/launcher plugins.
diff --git a/Titan/libs/Ace3.lua b/Titan/libs/Ace3.lua
index fb0a3fa..aef37e7 100755
--- a/Titan/libs/Ace3.lua
+++ b/Titan/libs/Ace3.lua
@@ -60,14 +60,14 @@ function Ace3:Open()
 		self:Print("No Configs are Registered")
 		return
 	end
-
+
 	if not frame then
 		frame = gui:Create("Frame")
 		frame:ReleaseChildren()
 		frame:SetTitle("Ace3 Options")
 		frame:SetLayout("FILL")
 		frame:SetCallback("OnClose", frameOnClose)
-
+
 		select = gui:Create("DropdownGroup")
 		select:SetGroupList(configs)
 		select:SetCallback("OnGroupSelected", ConfigSelected)
diff --git a/Titan/libs/Ace3.toc b/Titan/libs/Ace3.toc
index 0d3e5ce..6faf538 100755
--- a/Titan/libs/Ace3.toc
+++ b/Titan/libs/Ace3.toc
@@ -1,4 +1,4 @@
-## Interface: 80100
+## Interface: 80200

 ## Title: Lib: Ace3
 ## Notes: AddOn development framework
diff --git a/Titan/libs/AceAddon-3.0/AceAddon-3.0.lua b/Titan/libs/AceAddon-3.0/AceAddon-3.0.lua
index b338695..791bc77 100755
--- a/Titan/libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Titan/libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -6,29 +6,29 @@
 -- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
 -- * **OnDisable**, which is only called when your addon is manually being disabled.
 -- @usage
--- -- A small (but complete) addon, that doesn't do anything,
+-- -- A small (but complete) addon, that doesn't do anything,
 -- -- but shows usage of the callbacks.
 -- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
---
+--
 -- function MyAddon:OnInitialize()
---   -- do init tasks here, like loading the Saved Variables,
+--   -- do init tasks here, like loading the Saved Variables,
 --   -- or setting up slash commands.
 -- end
---
+--
 -- function MyAddon:OnEnable()
 --   -- Do more initialization here, that really enables the use of your addon.
---   -- Register Events, Hook functions, Create Frames, Get information from
+--   -- Register Events, Hook functions, Create Frames, Get information from
 --   -- the game that wasn't available in OnInitialize
 -- end
 --
 -- function MyAddon:OnDisable()
 --   -- Unhook, Unregister Events, Hide frames that you created.
---   -- You would probably only use an OnDisable if you want to
+--   -- You would probably only use an OnDisable if you want to
 --   -- build a "standby" mode, or be able to toggle modules on/off.
 -- end
 -- @class file
 -- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1084 2013-04-27 20:14:11Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local MAJOR, MINOR = "AceAddon-3.0", 12
 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -62,43 +62,12 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			 method = func
-			 if not method then return end
-			 ARGS = ...
-			 return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
 local function safecall(func, ...)
 	-- we check to see if the func is passed is actually a function here and don't error when it isn't
 	-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
 	-- present execution should continue without hinderance
 	if type(func) == "function" then
-		return Dispatchers[select('#', ...)](func, ...)
+		return xpcall(func, errorhandler, ...)
 	end
 end

@@ -106,7 +75,7 @@ end
 local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype

 -- used in the addon metatable
-local function addontostring( self ) return self.name end
+local function addontostring( self ) return self.name end

 -- Check if the addon is queued for initialization
 local function queuedForInitialization(addon)
@@ -119,14 +88,14 @@ local function queuedForInitialization(addon)
 end

 --- Create a new AceAddon-3.0 addon.
--- Any libraries you specified will be embeded, and the addon will be scheduled for
+-- Any libraries you specified will be embeded, and the addon will be scheduled for
 -- its OnInitialize and OnEnable callbacks.
 -- The final addon object, with all libraries embeded, will be returned.
 -- @paramsig [object ,]name[, lib, ...]
 -- @param object Table to use as a base for the addon (optional)
 -- @param name Name of the addon object to create
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a simple addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
 --
@@ -146,10 +115,10 @@ function AceAddon:NewAddon(objectorname, ...)
 	if type(name)~="string" then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
 	end
-	if self.addons[name] then
+	if self.addons[name] then
 		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
 	end
-
+
 	object = object or {}
 	object.name = name

@@ -159,7 +128,7 @@ function AceAddon:NewAddon(objectorname, ...)
 		for k, v in pairs(oldmeta) do addonmeta[k] = v end
 	end
 	addonmeta.__tostring = addontostring
-
+
 	setmetatable( object, addonmeta )
 	self.addons[name] = object
 	object.modules = {}
@@ -167,7 +136,7 @@ function AceAddon:NewAddon(objectorname, ...)
 	object.defaultModuleLibraries = {}
 	Embed( object ) -- embed NewModule, GetModule methods
 	self:EmbedLibraries(object, select(i,...))
-
+
 	-- add to queue of addons to be initialized upon ADDON_LOADED
 	tinsert(self.initializequeue, object)
 	return object
@@ -178,7 +147,7 @@ end
 -- Throws an error if the addon object cannot be found (except if silent is set).
 -- @param name unique name of the addon object
 -- @param silent if true, the addon is optional, silently return nil if its not found
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 function AceAddon:GetAddon(name, silent)
@@ -233,7 +202,7 @@ end
 -- @paramsig name[, silent]
 -- @param name unique name of the module
 -- @param silent if true, the module is optional, silently return nil if its not found (optional)
--- @usage
+-- @usage
 -- -- Get the Addon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- -- Get the Module
@@ -256,23 +225,23 @@ local function IsModuleTrue(self) return true end
 -- @param name unique name of the module
 -- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create a module with some embeded libraries
 -- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
---
+--
 -- -- Create a module with a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
 function NewModule(self, name, prototype, ...)
 	if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
 	if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
-
+
 	if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
-
+
 	-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
 	-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
 	local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
-
+
 	module.IsModule = IsModuleTrue
 	module:SetEnabledState(self.defaultModuleState)
 	module.moduleName = name
@@ -287,24 +256,24 @@ function NewModule(self, name, prototype, ...)
 	if not prototype or type(prototype) == "string" then
 		prototype = self.defaultModulePrototype or nil
 	end
-
+
 	if type(prototype) == "table" then
 		local mt = getmetatable(module)
 		mt.__index = prototype
 		setmetatable(module, mt)  -- More of a Base class type feel.
 	end
-
+
 	safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
 	self.modules[name] = module
 	tinsert(self.orderedModules, module)
-
+
 	return module
 end

 --- Returns the real name of the addon or module, without any prefix.
 -- @name //addon//:GetName
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- print(MyAddon:GetName())
 -- -- prints "MyAddon"
 function GetName(self)
@@ -316,8 +285,8 @@ end
 -- and enabling all modules of the addon (unless explicitly disabled).\\
 -- :Enable() also sets the internal `enableState` variable to true
 -- @name //addon//:Enable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable MyModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -337,8 +306,8 @@ end
 -- and disabling all modules of the addon.\\
 -- :Disable() also sets the internal `enableState` variable to false
 -- @name //addon//:Disable
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Disable MyAddon
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyAddon:Disable()
@@ -351,7 +320,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
 -- @name //addon//:EnableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Enable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -369,7 +338,7 @@ end
 -- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
 -- @name //addon//:DisableModule
 -- @paramsig name
--- @usage
+-- @usage
 -- -- Disable MyModule using :GetModule
 -- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
 -- MyModule = MyAddon:GetModule("MyModule")
@@ -388,7 +357,7 @@ end
 -- @name //addon//:SetDefaultModuleLibraries
 -- @paramsig lib[, lib, ...]
 -- @param lib List of libraries to embed into the addon
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Configure default libraries for modules (all modules need AceEvent-3.0)
@@ -407,7 +376,7 @@ end
 -- @name //addon//:SetDefaultModuleState
 -- @paramsig state
 -- @param state Default state for new modules, true for enabled, false for disabled
--- @usage
+-- @usage
 -- -- Create the addon object
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
 -- -- Set the default state to "disabled"
@@ -427,7 +396,7 @@ end
 -- @name //addon//:SetDefaultModulePrototype
 -- @paramsig prototype
 -- @param prototype Default prototype for the new modules (table)
--- @usage
+-- @usage
 -- -- Define a prototype
 -- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
 -- -- Set the default prototype
@@ -459,8 +428,8 @@ end

 --- Return an iterator of all modules associated to the addon.
 -- @name //addon//:IterateModules
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- -- Enable all modules
 -- for name, module in MyAddon:IterateModules() do
 --    module:Enable()
@@ -469,13 +438,13 @@ local function IterateModules(self) return pairs(self.modules) end

 -- Returns an iterator of all embeds in the addon
 -- @name //addon//:IterateEmbeds
--- @paramsig
+-- @paramsig
 local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end

 --- Query the enabledState of an addon.
 -- @name //addon//:IsEnabled
--- @paramsig
--- @usage
+-- @paramsig
+-- @usage
 -- if MyAddon:IsEnabled() then
 --     MyAddon:Disable()
 -- end
@@ -520,20 +489,20 @@ end

 -- - Initialize the addon after creation.
 -- This function is only used internally during the ADDON_LOADED event
--- It will call the **OnInitialize** function on the addon object (if present),
+-- It will call the **OnInitialize** function on the addon object (if present),
 -- and the **OnEmbedInitialize** function on all embeded libraries.
---
+--
 -- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- @param addon addon object to intialize
 function AceAddon:InitializeAddon(addon)
 	safecall(addon.OnInitialize, addon)
-
+
 	local embeds = self.embeds[addon]
 	for i = 1, #embeds do
 		local lib = LibStub:GetLibrary(embeds[i], true)
 		if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
 	end
-
+
 	-- we don't call InitializeAddon on modules specifically, this is handled
 	-- from the event handler and only done _once_
 end
@@ -541,7 +510,7 @@ end
 -- - Enable the addon after creation.
 -- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
 -- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
--- It will call the **OnEnable** function on the addon object (if present),
+-- It will call the **OnEnable** function on the addon object (if present),
 -- and the **OnEmbedEnable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
 --
@@ -551,12 +520,12 @@ end
 function AceAddon:EnableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if self.statuses[addon.name] or not addon.enabledState then return false end
-
+
 	-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
 	self.statuses[addon.name] = true
-
+
 	safecall(addon.OnEnable, addon)
-
+
 	-- make sure we're still enabled before continueing
 	if self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
@@ -564,7 +533,7 @@ function AceAddon:EnableAddon(addon)
 			local lib = LibStub:GetLibrary(embeds[i], true)
 			if lib then safecall(lib.OnEmbedEnable, lib, addon) end
 		end
-
+
 		-- enable possible modules.
 		local modules = addon.orderedModules
 		for i = 1, #modules do
@@ -576,24 +545,24 @@ end

 -- - Disable the addon
 -- Note: This function is only used internally.
--- It will call the **OnDisable** function on the addon object (if present),
+-- It will call the **OnDisable** function on the addon object (if present),
 -- and the **OnEmbedDisable** function on all embeded libraries.\\
 -- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
 --
--- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
 -- Use :Disable on the addon itself instead.
 -- @param addon addon object to enable
 function AceAddon:DisableAddon(addon)
 	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
 	if not self.statuses[addon.name] then return false end
-
+
 	-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
 	self.statuses[addon.name] = false
-
+
 	safecall( addon.OnDisable, addon )
-
+
 	-- make sure we're still disabling...
-	if not self.statuses[addon.name] then
+	if not self.statuses[addon.name] then
 		local embeds = self.embeds[addon]
 		for i = 1, #embeds do
 			local lib = LibStub:GetLibrary(embeds[i], true)
@@ -605,12 +574,12 @@ function AceAddon:DisableAddon(addon)
 			self:DisableAddon(modules[i])
 		end
 	end
-
+
 	return not self.statuses[addon.name] -- return true if we're disabled
 end

 --- Get an iterator over all registered addons.
--- @usage
+-- @usage
 -- -- Print a list of all installed AceAddon's
 -- for name, addon in AceAddon:IterateAddons() do
 --   print("Addon: " .. name)
@@ -618,7 +587,7 @@ end
 function AceAddon:IterateAddons() return pairs(self.addons) end

 --- Get an iterator over the internal status registry.
--- @usage
+-- @usage
 -- -- Print a list of all enabled addons
 -- for name, status in AceAddon:IterateAddonStatus() do
 --   if status then
@@ -644,7 +613,7 @@ local function onEvent(this, event, arg1)
 			AceAddon:InitializeAddon(addon)
 			tinsert(AceAddon.enablequeue, addon)
 		end
-
+
 		if IsLoggedIn() then
 			while(#AceAddon.enablequeue > 0) do
 				local addon = tremove(AceAddon.enablequeue, 1)
diff --git a/Titan/libs/AceConfig-3.0/AceConfig-3.0.lua b/Titan/libs/AceConfig-3.0/AceConfig-3.0.lua
index c2ac7cc..aae348b 100755
--- a/Titan/libs/AceConfig-3.0/AceConfig-3.0.lua
+++ b/Titan/libs/AceConfig-3.0/AceConfig-3.0.lua
@@ -3,7 +3,7 @@
 -- as well as associate it with a slash command.
 -- @class file
 -- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfig-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfig-3.0
@@ -45,7 +45,7 @@ local pcall, error, type, pairs = pcall, error, type, pairs
 function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
 	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
 	if not ok then error(msg, 2) end
-
+
 	if slashcmd then
 		if type(slashcmd) == "table" then
 			for _,cmd in pairs(slashcmd) do
diff --git a/Titan/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/Titan/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
index 7902fd1..8bac7e3 100755
--- a/Titan/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ b/Titan/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
@@ -1,7 +1,7 @@
 --- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
 -- @class file
 -- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1161 2017-08-12 14:30:16Z funkydude $
+-- @release $Id: AceConfigCmd-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 --[[
 AceConfigCmd-3.0
@@ -63,7 +63,7 @@ local funcmsg = "expected function or member name"

 -- pickfirstset() - picks the first non-nil value and returns it

-local function pickfirstset(...)
+local function pickfirstset(...)
 	for i=1,select("#",...) do
 		if select(i,...)~=nil then
 			return select(i,...)
@@ -120,7 +120,7 @@ local function callfunction(info, tab, methodtype, ...)
 	info.arg = tab.arg
 	info.option = tab
 	info.type = tab.type
-
+
 	if type(method)=="function" then
 		return method(info, ...)
 	else
@@ -131,7 +131,7 @@ end
 -- do_final() - do the final step (set/execute) along with validation and confirmation

 local function do_final(info, inputpos, tab, methodtype, ...)
-	if info.validate then
+	if info.validate then
 		local res = callmethod(info,inputpos,tab,"validate",...)
 		if type(res)=="string" then
 			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
@@ -139,7 +139,7 @@ local function do_final(info, inputpos, tab, methodtype, ...)
 		end
 	end
 	-- console ignores .confirm
-
+
 	callmethod(info,inputpos,tab,methodtype, ...)
 end

@@ -152,8 +152,8 @@ local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
 	if val~=nil then
 		if val==false then
 			val=nil
-		elseif not types[type(val)] then
-			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
+		elseif not types[type(val)] then
+			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
 		end
 		info[paramname] = val
 		info[paramname.."_at"] = depth
@@ -166,13 +166,13 @@ end
 local dummytable={}

 local function iterateargs(tab)
-	if not tab.plugins then
-		return pairs(tab.args)
+	if not tab.plugins then
+		return pairs(tab.args)
 	end
-
+
 	local argtabkey,argtab=next(tab.plugins)
 	local v
-
+
 	return function(_, k)
 		while argtab do
 			k,v = next(argtab, k)
@@ -206,18 +206,18 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 	if not noHead then
 		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
 	end
-
+
 	local sortTbl = {}	-- [1..n]=name
 	local refTbl = {}   -- [name]=tableref
-
+
 	for k,v in iterateargs(tab) do
 		if not refTbl[k] then	-- a plugin overriding something in .args
 			tinsert(sortTbl, k)
 			refTbl[k] = v
 		end
 	end
-
-	tsort(sortTbl, function(one, two)
+
+	tsort(sortTbl, function(one, two)
 		local o1 = refTbl[one].order or 100
 		local o2 = refTbl[two].order or 100
 		if type(o1) == "function" or type(o1) == "string" then
@@ -240,7 +240,7 @@ local function showhelp(info, inputpos, tab, depth, noHead)
 		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names
 		return o1<o2
 	end)
-
+
 	for i = 1, #sortTbl do
 		local k = sortTbl[i]
 		local v = refTbl[k]
@@ -327,7 +327,7 @@ local function keybindingValidateFunc(text)
 	return s
 end

--- handle() - selfrecursing function that processes input->optiontable
+-- handle() - selfrecursing function that processes input->optiontable
 -- - depth - starts at 0
 -- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)

@@ -346,16 +346,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
 	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
 	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
+
 	-------------------------------------------------------------------
 	-- Act according to .type of this table
-
+
 	if tab.type=="group" then
 		------------ group --------------------------------------------
-
+
 		if type(tab.args)~="table" then err(info, inputpos) end
 		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
+
 		-- grab next arg from input
 		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
 		if not arg then
@@ -363,11 +363,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			return
 		end
 		nextpos=nextpos+1
-
+
 		-- loop .args and try to find a key with a matching name
 		for k,v in iterateargs(tab) do
 			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
+
 			-- is this child an inline group? if so, traverse into it
 			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
 				info[depth+1] = k
@@ -383,8 +383,8 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return handle(info,nextpos,v,depth+1)
 			end
 		end
-
-		-- no match
+
+		-- no match
 		if retfalse then
 			-- restore old infotable members and return false to indicate failure
 			info.handler,info.handler_at = oldhandler,oldhandler_at
@@ -395,23 +395,23 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
 			return false
 		end
-
+
 		-- couldn't find the command, display error
 		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
 		return
 	end
-
+
 	local str = strsub(info.input,inputpos);
-
+
 	if tab.type=="execute" then
 		------------ execute --------------------------------------------
 		do_final(info, inputpos, tab, "func")
-

-
+
+
 	elseif tab.type=="input" then
 		------------ input --------------------------------------------
-
+
 		local res = true
 		if tab.pattern then
 			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
@@ -420,11 +420,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				return
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-

-
+
+
 	elseif tab.type=="toggle" then
 		------------ toggle --------------------------------------------
 		local b
@@ -444,7 +444,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			else
 				b = not b
 			end
-
+
 		elseif str==L["on"] then
 			b = true
 		elseif str==L["off"] then
@@ -459,9 +459,9 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", b)
-
+

 	elseif tab.type=="range" then
 		------------ range --------------------------------------------
@@ -481,21 +481,21 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", val)

-
+
 	elseif tab.type=="select" then
 		------------ select ------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local b = callmethod(info, inputpos, tab, "get")
 			local fmt = "|cffffff78- [%s]|r %s"
@@ -512,7 +512,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 		end

 		local ok
-		for k,v in pairs(values) do
+		for k,v in pairs(values) do
 			if strlower(k)==str then
 				str = k	-- overwrite with key (in case of case mismatches)
 				ok = true
@@ -523,20 +523,20 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
 			return
 		end
-
+
 		do_final(info, inputpos, tab, "set", str)
-
+
 	elseif tab.type=="multiselect" then
 		------------ multiselect -------------------------------------------
 		local str = strtrim(strlower(str))
-
+
 		local values = tab.values
 		if type(values) == "function" or type(values) == "string" then
 			info.values = values
 			values = callmethod(info, inputpos, tab, "values")
 			info.values = nil
 		end
-
+
 		if str == "" then
 			local fmt = "|cffffff78- [%s]|r %s"
 			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
@@ -550,7 +550,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			end
 			return
 		end
-
+
 		--build a table of the selections, checking that they exist
 		--parse for =on =off =default in the process
 		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
@@ -559,25 +559,25 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--parse option=on etc
 			local opt, val = v:match('(.+)=(.+)')
 			--get option if toggling
-			if not opt then
-				opt = v
+			if not opt then
+				opt = v
 			end
-
+
 			--check that the opt is valid
 			local ok
-			for k,v in pairs(values) do
+			for k,v in pairs(values) do
 				if strlower(k)==opt then
 					opt = k	-- overwrite with key (in case of case mismatches)
 					ok = true
 					break
 				end
 			end
-
+
 			if not ok then
 				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
 				return
 			end
-
+
 			--check that if val was supplied it is valid
 			if val then
 				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
@@ -596,14 +596,14 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				sels[opt] = true
 			end
 		end
-
+
 		for opt, val in pairs(sels) do
 			local newval
-
+
 			if (val == true) then
 				--toggle the option
 				local b = callmethod(info, inputpos, tab, "get", opt)
-
+
 				if tab.tristate then
 					--cycle in true, nil, false order
 					if b then
@@ -627,11 +627,11 @@ local function handle(info, inputpos, tab, depth, retfalse)
 					newval = nil
 				end
 			end
-
+
 			do_final(info, inputpos, tab, "set", opt, newval)
 		end
-
-
+
+
 	elseif tab.type=="color" then
 		------------ color --------------------------------------------
 		local str = strtrim(strlower(str))
@@ -639,16 +639,16 @@ local function handle(info, inputpos, tab, depth, retfalse)
 			--TODO: Show current value
 			return
 		end
-
+
 		local r, g, b, a
-
+
 		local hasAlpha = tab.hasAlpha
 		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
 			info.hasAlpha = hasAlpha
 			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
 			info.hasAlpha = nil
 		end
-
+
 		if hasAlpha then
 			if str:len() == 8 and str:find("^%x*$")  then
 				--parse a hex string
@@ -662,7 +662,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
 				return
 			end
-
+
 			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
 				--values are valid
 			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
@@ -701,7 +701,7 @@ local function handle(info, inputpos, tab, depth, retfalse)
 				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
 			end
 		end
-
+
 		do_final(info, inputpos, tab, "set", r,g,b,a)

 	elseif tab.type=="keybinding" then
@@ -737,7 +737,7 @@ end
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
 -- -- Use AceConsole-3.0 to register a Chat Command
 -- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
+--
 -- -- Show the GUI if no input is supplied, otherwise handle the chat input.
 -- function MyAddon:ChatCommand(input)
 --   -- Assuming "MyOptions" is the appName of a valid options table
@@ -754,7 +754,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
 	end
 	local options = assert( optgetter("cmd", MAJOR) )
-
+
 	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot
 		[0] = slashcmd,
 		appName = appName,
@@ -765,7 +765,7 @@ function AceConfigCmd:HandleCommand(slashcmd, appName, input)
 		uiType = "cmd",
 		uiName = MAJOR,
 	}
-
+
 	handle(info, 1, options, 0)  -- (info, inputpos, table, depth)
 end

diff --git a/Titan/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Titan/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 81885ae..3e3d878 100755
--- a/Titan/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Titan/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,13 +1,13 @@
 --- AceConfigDialog-3.0 generates AceGUI-3.0 based windows based on option tables.
 -- @class file
 -- @name AceConfigDialog-3.0
--- @release $Id: AceConfigDialog-3.0.lua 1197 2019-01-21 23:41:10Z nevcairiel $
+-- @release $Id: AceConfigDialog-3.0.lua 1212 2019-06-26 05:53:51Z nevcairiel $

 local LibStub = LibStub
 local gui = LibStub("AceGUI-3.0")
 local reg = LibStub("AceConfigRegistry-3.0")

-local MAJOR, MINOR = "AceConfigDialog-3.0", 69
+local MAJOR, MINOR = "AceConfigDialog-3.0", 73
 local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigDialog then return end
@@ -56,18 +56,18 @@ local width_multiplier = 170
 --[[
 Group Types
   Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
-  		- Descendant Groups with inline=true and thier children will not become nodes
+        - Descendant Groups with inline=true and thier children will not become nodes

   Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control
-  		- Grandchild groups will default to inline unless specified otherwise
+        - Grandchild groups will default to inline unless specified otherwise

   Select- Same as Tab but with entries in a dropdown rather than tabs


   Inline Groups
-  	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
-  	- If declared on a direct child of a root node of a select group, they will appear above the group container control
-  	- When a group is displayed inline, all descendants will also be inline members of the group
+    - Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
+    - If declared on a direct child of a root node of a select group, they will appear above the group container control
+    - When a group is displayed inline, all descendants will also be inline members of the group

 ]]

@@ -168,11 +168,11 @@ local allIsLiteral = {
 local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
 	--get definition for the member
 	local inherits = isInherited[membername]
-
+

 	--get the member of the option, traversing the tree if it can be inherited
 	local member
-
+
 	if inherits then
 		local group = options
 		if group[membername] ~= nil then
@@ -187,7 +187,7 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 	else
 		member = option[membername]
 	end
-
+
 	--check if we need to call a functon, or if we have a literal value
 	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
 		--We have a function to call
@@ -196,13 +196,13 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		local handler
 		local group = options
 		handler = group.handler or handler
-
+
 		for i = 1, #path do
 			group = GetSubOption(group, path[i])
 			info[i] = path[i]
 			handler = group.handler or handler
 		end
-
+
 		info.options = options
 		info.appName = appName
 		info[0] = appName
@@ -212,8 +212,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		info.type = option.type
 		info.uiType = "dialog"
 		info.uiName = MAJOR
-
-		local a, b, c ,d
+
+		local a, b, c ,d
 		--using 4 returns for the get of a color type, increase if a type needs more
 		if type(member) == "function" then
 			--Call the function
@@ -230,8 +230,8 @@ local function GetOptionsMemberValue(membername, option, options, path, appName,
 		return a,b,c,d
 	else
 		--The value isnt a function to call, return it
-		return member
-	end
+		return member
+	end
 end

 --[[calls an options function that could be inherited, method name or function ref
@@ -296,7 +296,7 @@ local function compareOptions(a,b)
 		return NameA:upper() < NameB:upper()
 	end
 	if OrderA < 0 then
-		if OrderB > 0 then
+		if OrderB >= 0 then
 			return false
 		end
 	else
@@ -315,7 +315,7 @@ end
 local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
 	tempOrders = new()
 	tempNames = new()
-
+
 	if group.plugins then
 		for plugin, t in pairs(group.plugins) do
 			for k, v in pairs(t) do
@@ -331,7 +331,7 @@ local function BuildSortedOptionsTable(group, keySort, opts, options, path, appN
 			end
 		end
 	end
-
+
 	for k, v in pairs(group.args) do
 		if not opts[k] then
 			tinsert(keySort, k)
@@ -362,7 +362,7 @@ local function DelTree(tree)
 end

 local function CleanUserData(widget, event)
-
+
 	local user = widget:GetUserDataTable()

 	if user.path then
@@ -402,7 +402,7 @@ end
 -- - Gets a status table for the given appname and options path.
 -- @param appName The application name as given to `:RegisterOptionsTable()`
 -- @param path The path to the options (a table with all group keys)
--- @return
+-- @return
 function AceConfigDialog:GetStatusTable(appName, path)
 	local status = self.Status

@@ -436,7 +436,7 @@ end
 function AceConfigDialog:SelectGroup(appName, ...)
 	local path = new()

-
+
 	local app = reg:GetOptionsTable(appName)
 	if not app then
 		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
@@ -448,9 +448,9 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		status.groups = {}
 	end
 	status = status.groups
-	local treevalue
-	local treestatus
-
+	local treevalue
+	local treestatus
+
 	for n = 1, select("#",...) do
 		local key = select(n, ...)

@@ -477,12 +477,12 @@ function AceConfigDialog:SelectGroup(appName, ...)
 			--the selected group will be overwritten if a child is the final target but still needs to be open
 			treestatus.selected = treevalue
 			treestatus.groups[treevalue] = true
-
+
 		end
-
+
 		--move to the next group in the path
 		group = GetSubOption(group, key)
-		if not group then
+		if not group then
 			break
 		end
 		tinsert(path, key)
@@ -492,10 +492,10 @@ function AceConfigDialog:SelectGroup(appName, ...)
 		end
 		status = status.groups
 	end
-
+
 	del(path)
 	reg:NotifyChange(appName)
-end
+end

 local function OptionOnMouseOver(widget, event)
 	--show a tooltip/set the status bar to the desc text
@@ -510,14 +510,14 @@ local function OptionOnMouseOver(widget, event)
 	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
 	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
 	local descStyle = opt.descStyle
-
+
 	if descStyle and descStyle ~= "tooltip" then return end
-
+
 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if opt.type == "multiselect" then
 		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
-	end
+	end
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
@@ -675,7 +675,7 @@ local function ActivateControl(widget, event, ...)
 			end
 		end
 	end
-
+
 	local success
 	if validated and option.type ~= "execute" then
 		if type(validate) == "string" then
@@ -690,7 +690,7 @@ local function ActivateControl(widget, event, ...)
 			if not success then validated = false end
 		end
 	end
-
+
 	local rootframe = user.rootframe
 	if not validated or type(validated) == "string" then
 		if not validated then
@@ -715,7 +715,7 @@ local function ActivateControl(widget, event, ...)
 		del(info)
 		return true
 	else
-
+
 		local confirmText = option.confirmText
 		--call confirm func/method
 		if type(confirm) == "string" then
@@ -756,10 +756,10 @@ local function ActivateControl(widget, event, ...)
 						confirmText = confirmText.." - "..desc
 					end
 				end
-
+
 				local iscustom = user.rootframe:GetUserData("iscustom")
 				local rootframe
-
+
 				if iscustom then
 					rootframe = user.rootframe
 				end
@@ -796,7 +796,7 @@ local function ActivateControl(widget, event, ...)
 		--full refresh of the frame, some controls dont cause this on all events
 		if option.type == "color" then
 			if event == "OnValueConfirmed" then
-
+
 				if iscustom then
 					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
 				else
@@ -1049,6 +1049,10 @@ local function CreateControl(userControlType, fallbackControlType)
 	return control
 end

+local function sortTblAsStrings(x,y)
+	return tostring(x) < tostring(y) -- Support numbers as keys
+end
+
 --[[
 	options - root of the options table being fed
 	container - widget that controls will be placed in
@@ -1079,7 +1083,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else
 						GroupContainer = gui:Create("SimpleGroup")
 					end
-
+
 					GroupContainer.width = "fill"
 					GroupContainer:SetLayout("flow")
 					container:AddChild(GroupContainer)
@@ -1088,14 +1092,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 			else
 				--Control to feed
 				local control
-
+
 				local name = GetOptionsMemberValue("name", v, options, path, appName)
-
+
 				if v.type == "execute" then
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					local iconControl = type(image) == "string" or type(image) == "number"
 					control = CreateControl(v.dialogControl or v.control, iconControl and "Icon" or "Button")
 					if iconControl then
@@ -1125,7 +1129,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "input" then
 					control = CreateControl(v.dialogControl or v.control, v.multiline and "MultiLineEditBox" or "EditBox")
-
+
 					if v.multiline and control.SetNumLines then
 						control:SetNumLines(tonumber(v.multiline) or 4)
 					end
@@ -1144,15 +1148,15 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local value = GetOptionsMemberValue("get",v, options, path, appName)
 					control:SetValue(value)
 					control:SetCallback("OnValueChanged",ActivateControl)
-
+
 					if v.descStyle == "inline" then
 						local desc = GetOptionsMemberValue("desc", v, options, path, appName)
 						control:SetDescription(desc)
 					end
-
+
 					local image = GetOptionsMemberValue("image", v, options, path, appName)
 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if type(imageCoords) == "table" then
 							control:SetImage(image, unpack(imageCoords))
@@ -1175,6 +1179,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 				elseif v.type == "select" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
+					local sorting = GetOptionsMemberValue("sorting", v, options, path, appName)
 					if v.style == "radio" then
 						local disabled = CheckOptionDisabled(v, options, path, appName)
 						local width = GetOptionsMemberValue("width",v,options,path,appName)
@@ -1185,12 +1190,14 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin

 						control:PauseLayout()
 						local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
-						local t = {}
-						for value, text in pairs(values) do
-							t[#t+1]=value
+						if not sorting then
+							sorting = {}
+							for value, text in pairs(values) do
+								sorting[#sorting+1]=value
+							end
+							tsort(sorting, sortTblAsStrings)
 						end
-						tsort(t)
-						for k, value in ipairs(t) do
+						for k, value in ipairs(sorting) do
 							local text = values[value]
 							local radio = gui:Create("CheckBox")
 							radio:SetLabel(text)
@@ -1224,7 +1231,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 							itemType = nil
 						end
 						control:SetLabel(name)
-						control:SetList(values, nil, itemType)
+						control:SetList(values, sorting, itemType)
 						local value = GetOptionsMemberValue("get",v, options, path, appName)
 						if not values[value] then
 							value = nil
@@ -1236,7 +1243,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "multiselect" then
 					local values = GetOptionsMemberValue("values", v, options, path, appName)
 					local disabled = CheckOptionDisabled(v, options, path, appName)
-
+
 					local valuesort = new()
 					if values then
 						for value, text in pairs(values) do
@@ -1244,7 +1251,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						end
 					end
 					tsort(valuesort)
-
+
 					local controlType = v.dialogControl or v.control
 					if controlType then
 						control = gui:Create(controlType)
@@ -1313,9 +1320,9 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 						control:ResumeLayout()
 						control:DoLayout()

-
+
 					end
-
+
 					del(valuesort)

 				elseif v.type == "color" then
@@ -1340,7 +1347,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 				elseif v.type == "description" then
 					control = CreateControl(v.dialogControl or v.control, "Label")
 					control:SetText(name)
-
+
 					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
 					if fontSize == "medium" then
 						control:SetFontObject(GameFontHighlight)
@@ -1349,10 +1356,10 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					else -- small or invalid
 						control:SetFontObject(GameFontHighlightSmall)
 					end
-
+
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
+
 					if type(image) == "string" or type(image) == "number" then
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
@@ -1401,7 +1408,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					InjectInfo(control, options, v, path, rootframe, appName)
 					container:AddChild(control)
 				end
-
+
 			end
 		end
 		tremove(path)
@@ -1426,7 +1433,7 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	local option = user.option
 	local path = user.path
 	local appName = user.appName
-
+
 	local feedpath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
@@ -1441,8 +1448,9 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)

 	local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
 	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
+
 	GameTooltip:SetOwner(button, "ANCHOR_NONE")
+	GameTooltip:ClearAllPoints()
 	if widget.type == "TabGroup" then
 		GameTooltip:SetPoint("BOTTOM",button,"TOP")
 	else
@@ -1450,11 +1458,11 @@ local function TreeOnButtonEnter(widget, event, uniquevalue, button)
 	end

 	GameTooltip:SetText(name, 1, .82, 0, true)
-
+
 	if type(desc) == "string" then
 		GameTooltip:AddLine(desc, 1, 1, 1, true)
 	end
-
+
 	GameTooltip:Show()
 end

@@ -1465,25 +1473,25 @@ end

 local function GroupExists(appName, options, path, uniquevalue)
 	if not uniquevalue then return false end
-
+
 	local feedpath = new()
 	local temppath = new()
 	for i = 1, #path do
 		feedpath[i] = path[i]
 	end
-
+
 	BuildPath(feedpath, ("\001"):split(uniquevalue))
-
+
 	local group = options
 	for i = 1, #feedpath do
 		local v = feedpath[i]
 		temppath[i] = v
 		group = GetSubOption(group, v)
-
-		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
+
+		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
 			del(feedpath)
 			del(temppath)
-			return false
+			return false
 		end
 	end
 	del(feedpath)
@@ -1602,7 +1610,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			tab:SetCallback("OnGroupSelected", GroupSelected)
 			tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
 			tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1622,7 +1630,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 					break
 				end
 			end
-
+
 			container:AddChild(tab)

 		elseif grouptype == "select" then
@@ -1645,7 +1653,7 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			if firstgroup then
 				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
 			end
-
+
 			select.width = "fill"
 			select.height = "fill"

@@ -1657,14 +1665,14 @@ function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isR
 			local tree = gui:Create("TreeGroup")
 			InjectInfo(tree, options, group, path, rootframe, appName)
 			tree:EnableButtonTooltips(false)
-
+
 			tree.width = "fill"
 			tree.height = "fill"

 			tree:SetCallback("OnGroupSelected", GroupSelected)
 			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
 			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
+
 			local status = AceConfigDialog:GetStatusTable(appName, path)
 			if not status.groups then
 				status.groups = {}
@@ -1705,7 +1713,7 @@ local function RefreshOnUpdate(this)
 		end
 		this.closing[appName] = nil
 	end
-
+
 	if this.closeAll then
 		for k, v in pairs(AceConfigDialog.OpenFrames) do
 			if not this.closeAllOverride[k] then
@@ -1715,7 +1723,7 @@ local function RefreshOnUpdate(this)
 		this.closeAll = nil
 		wipe(this.closeAllOverride)
 	end
-
+
 	for appName in pairs(this.apps) do
 		if AceConfigDialog.OpenFrames[appName] then
 			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
@@ -1800,10 +1808,10 @@ function AceConfigDialog:Open(appName, container, ...)
 	local options = app("dialog", MAJOR)

 	local f
-
+
 	local path = new()
 	local name = GetOptionsMemberValue("name", options, options, path, appName)
-
+
 	--If an optional path is specified add it to the path table before feeding the options
 	--as container is optional as well it may contain the first element of the path
 	if type(container) == "string" then
@@ -1813,7 +1821,7 @@ function AceConfigDialog:Open(appName, container, ...)
 	for n = 1, select("#",...) do
 		tinsert(path, (select(n, ...)))
 	end
-
+
 	local option = options
 	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
 		for i = 1, #path do
@@ -1821,7 +1829,7 @@ function AceConfigDialog:Open(appName, container, ...)
 		end
 		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
 	end
-
+
 	--if a container is given feed into that
 	if container then
 		f = container
@@ -1915,19 +1923,19 @@ end
 -- @param name A descriptive name to display in the options tree (defaults to appName)
 -- @param parent The parent to use in the interface options tree.
 -- @param ... The path in the options table to feed into the interface options panel.
--- @return The reference to the frame registered into the Interface Options.
+-- @return The reference to the frame registered into the Interface Options.
 function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
 	local BlizOptions = AceConfigDialog.BlizOptions
-
+
 	local key = appName
 	for n = 1, select("#", ...) do
 		key = key.."\001"..select(n, ...)
 	end
-
+
 	if not BlizOptions[appName] then
 		BlizOptions[appName] = {}
 	end
-
+
 	if not BlizOptions[appName][key] then
 		local group = gui:Create("BlizOptionsGroup")
 		BlizOptions[appName][key] = group
diff --git a/Titan/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Titan/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index e7a6d76..e563392 100755
--- a/Titan/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/Titan/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -4,14 +4,14 @@
 -- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
 -- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
 -- * The **appName** field is the options table name as given at registration time \\
---
+--
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1169 2018-02-27 16:18:28Z nevcairiel $
+-- @release $Id: AceConfigRegistry-3.0.lua 1207 2019-06-23 12:08:33Z nevcairiel $
 local CallbackHandler = LibStub("CallbackHandler-1.0")

-local MAJOR, MINOR = "AceConfigRegistry-3.0", 18
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 20
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -33,7 +33,7 @@ local error, assert = error, assert


 AceConfigRegistry.validated = {
-	-- list of options table names ran through :ValidateOptionsTable automatically.
+	-- list of options table names ran through :ValidateOptionsTable automatically.
 	-- CLEARED ON PURPOSE, since newer versions may have newer validators
 	cmd = {},
 	dropdown = {},
@@ -59,7 +59,6 @@ local optstring={["nil"]=true,["string"]=true, _="string"}
 local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
 local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"}
 local optnumber={["nil"]=true,["number"]=true, _="number"}
-local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
 local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"}
 local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"}
 local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"}
@@ -95,13 +94,20 @@ local basekeys={
 }

 local typedkeys={
-	header={},
+	header={
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
+	},
 	description={
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
 		fontSize=optstringfunc,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	group={
 		args=istable,
@@ -118,6 +124,9 @@ local typedkeys={
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	input={
 		pattern=optstring,
@@ -131,6 +140,9 @@ local typedkeys={
 		tristate=optbool,
 		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	tristate={
 	},
@@ -142,12 +154,16 @@ local typedkeys={
 		step=optnumber,
 		bigStep=optnumber,
 		isPercent=optbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	select={
 		values=ismethodtable,
+		sorting=optmethodtable,
 		style={
-			["nil"]=true,
-			["string"]={dropdown=true,radio=true},
+			["nil"]=true,
+			["string"]={dropdown=true,radio=true},
 			_="string: 'dropdown' or 'radio'"
 		},
 		control=optstring,
@@ -165,9 +181,14 @@ local typedkeys={
 	},
 	color={
 		hasAlpha=optmethodbool,
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 	keybinding={
-		-- TODO
+		control=optstring,
+		dialogControl=optstring,
+		dropdownControl=optstring,
 	},
 }

@@ -204,13 +225,13 @@ local function validate(options,errlvl,...)
 	if type(options.type)~="string" then
 		err(".type: expected a string, got a "..type(options.type), errlvl,...)
 	end
-
+
 	-- get type and 'typedkeys' member
 	local tk = typedkeys[options.type]
 	if not tk then
 		err(".type: unknown type '"..options.type.."'", errlvl,...)
 	end
-
+
 	-- make sure that all options[] are known parameters
 	for k,v in pairs(options) do
 		if not (tk[k] or basekeys[k]) then
@@ -303,7 +324,7 @@ function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation
 				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable
 				AceConfigRegistry.validated[uiType][appName] = true
 			end
-			return options
+			return options
 		end
 	elseif type(options)=="function" then
 		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
@@ -341,7 +362,7 @@ function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
 	if not f then
 		return nil
 	end
-
+
 	if uiType then
 		return f(uiType,uiName,1)	-- get the table for us
 	else
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets.toc b/Titan/libs/AceGUI-3.0-SharedMediaWidgets.toc
old mode 100644
new mode 100755
index 3c55ea5..ae23f78
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets.toc
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets.toc
@@ -1,8 +1,4 @@
-## Interface: 70000
-## X-Curse-Packaged-Version: r57-release
-## X-Curse-Project-Name: AceGUI-3.0-SharedMediaWidgets
-## X-Curse-Project-ID: ace-gui-3-0-shared-media-widgets
-## X-Curse-Repository-ID: wow/ace-gui-3-0-shared-media-widgets/mainline
+## Interface: 80100

 ## Title: Lib: AceGUI-3.0-SharedMediaWidgets
 ## Notes: Enables AceGUI-3.0 widgets for the 5 basic SharedMedia-3.0 types
@@ -17,4 +13,4 @@ Libs\AceGUI-3.0\AceGUI-3.0.xml
 Libs\LibSharedMedia-3.0\lib.xml
 #@end-no-lib-strip@

-widget.xml
\ No newline at end of file
+widget.xml
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
old mode 100644
new mode 100755
index 1601747..3758c72
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Background"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
old mode 100644
new mode 100755
index b4f31c6..a0afecb
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Border"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
old mode 100644
new mode 100755
index cd2b5db..2f38dc3
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Font"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
old mode 100644
new mode 100755
index 60904a7..80996a9
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Sound"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
old mode 100644
new mode 100755
index 98b85f5..b1ba19f
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
@@ -8,7 +8,7 @@ local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")

 do
 	local widgetType = "LSM30_Statusbar"
-	local widgetVersion = 11
+	local widgetVersion = 12

 	local contentFrameCache = {}
 	local function ReturnSelf(self)
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
old mode 100644
new mode 100755
index cd7faf9..0fc2d29
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
@@ -1,10 +1,5 @@
 -- Widget created by Yssaril
---[===[@debug@
-local DataVersion = 9001 -- dev version always overwrites everything else :)
---@end-debug@]===]
---@non-debug@
-local DataVersion = 56
---@end-non-debug@
+local DataVersion = 9003
 local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion)

 if not AGSMW then
@@ -182,14 +177,12 @@ do
 			self:SetHeight(UIParent:GetHeight()*2/5)
 			self.slider:Show()
 			self:SetScript("OnMouseWheel", OnMouseWheel)
-			self.scrollframe:UpdateScrollChildRect()
 			self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
 		else
 			self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12)
 			self:SetHeight(self.contentframe:GetHeight()+25)
 			self.slider:Hide()
 			self:SetScript("OnMouseWheel", nil)
-			self.scrollframe:UpdateScrollChildRect()
 			self.slider:SetMinMaxValues(0, 0)
 		end
 		self.contentframe:SetWidth(self.scrollframe:GetWidth())
diff --git a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
old mode 100644
new mode 100755
index 798546f..de89805
--- a/Titan/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ b/Titan/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
@@ -6,4 +6,4 @@
 	<Script file="StatusbarWidget.lua" />
 	<Script file="BorderWidget.lua" />
 	<Script file="BackgroundWidget.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Titan/libs/AceGUI-3.0/AceGUI-3.0.lua b/Titan/libs/AceGUI-3.0/AceGUI-3.0.lua
index fcc4e94..efdb6cb 100755
--- a/Titan/libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Titan/libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -1,6 +1,6 @@
 --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
 -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
+-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
 -- stand-alone distribution.
 --
 -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -24,17 +24,17 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1177 2018-06-25 12:12:48Z nevcairiel $
+-- @release $Id: AceGUI-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

 if not AceGUI then return end -- No upgrade needed

 -- Lua APIs
-local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
+local tinsert = table.insert
 local select, pairs, next, type = select, pairs, next, type
-local error, assert, loadstring = error, assert, loadstring
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
+local error, assert = error, assert
+local setmetatable, rawget = setmetatable, rawget
 local math_max = math.max

 -- WoW APIs
@@ -51,7 +51,7 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
 AceGUI.WidgetBase = AceGUI.WidgetBase or {}
 AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
 AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
+
 -- local upvalues
 local WidgetRegistry = AceGUI.WidgetRegistry
 local LayoutRegistry = AceGUI.LayoutRegistry
@@ -66,39 +66,10 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			method = func
-			if not method then return end
-			ARGS = ...
-			return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
 local function safecall(func, ...)
-	return Dispatchers[select("#", ...)](func, ...)
+	if func then
+		return xpcall(func, errorhandler, ...)
+	end
 end

 -- Recycling functions
@@ -108,7 +79,7 @@ do
 	-- Internal Storage of the objects changed, from an array table
 	-- to a hash table, and additionally we introduced versioning on
 	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
+	-- anyway, so we just clear the storage now, and don't try to
 	-- convert the storage tables to the new format.
 	-- This should generally not cause *many* widgets to end up in trash,
 	-- since once dialogs are opened, all addons should be loaded already
@@ -118,7 +89,7 @@ do
 	if oldminor and oldminor < 29 and AceGUI.objPools then
 		AceGUI.objPools = nil
 	end
-
+
 	AceGUI.objPools = AceGUI.objPools or {}
 	local objPools = AceGUI.objPools
 	--Returns a new instance, if none are available either returns a new table or calls the given contructor
@@ -126,11 +97,11 @@ do
 		if not WidgetRegistry[type] then
 			error("Attempt to instantiate unknown widget type", 2)
 		end
-
+
 		if not objPools[type] then
 			objPools[type] = {}
 		end
-
+
 		local newObj = next(objPools[type])
 		if not newObj then
 			newObj = WidgetRegistry[type]()
@@ -180,12 +151,12 @@ function AceGUI:Create(type)
 			widget.OnAcquire = widget.Aquire
 			widget.Aquire = nil
 		end
-
+
 		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
+			widget.OnRelease = rawget(widget, "Release")
 			widget.Release = nil
 		end
-
+
 		if widget.OnAcquire then
 			widget:OnAcquire()
 		else
@@ -267,18 +238,18 @@ end
 --[[
 	Widgets must provide the following functions
 		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
+
 	And the following members
 		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
 		type - the type of the object, same as the name given to :RegisterWidget()
-
+
 	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
 	It will be cleared automatically when a widget is released
 	Placing values directly into a widget object should be avoided
-
+
 	If the Widget can act as a container for other Widgets the following
 		content - frame or derivitive that children will be anchored to
-
+
 	The Widget can supply the following Optional Members
 		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
 		:OnWidthSet(width) - Called when the width of the widget is changed
@@ -294,21 +265,21 @@ end
 -- Widget Base Template --
 --------------------------
 do
-	local WidgetBase = AceGUI.WidgetBase
-
+	local WidgetBase = AceGUI.WidgetBase
+
 	WidgetBase.SetParent = function(self, parent)
 		local frame = self.frame
 		frame:SetParent(nil)
 		frame:SetParent(parent.content)
 		self.parent = parent
 	end
-
+
 	WidgetBase.SetCallback = function(self, name, func)
 		if type(func) == "function" then
 			self.events[name] = func
 		end
 	end
-
+
 	WidgetBase.Fire = function(self, name, ...)
 		if self.events[name] then
 			local success, ret = safecall(self.events[name], self, name, ...)
@@ -317,7 +288,7 @@ do
 			end
 		end
 	end
-
+
 	WidgetBase.SetWidth = function(self, width)
 		self.frame:SetWidth(width)
 		self.frame.width = width
@@ -325,7 +296,7 @@ do
 			self:OnWidthSet(width)
 		end
 	end
-
+
 	WidgetBase.SetRelativeWidth = function(self, width)
 		if width <= 0 or width > 1 then
 			error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -333,7 +304,7 @@ do
 		self.relWidth = width
 		self.width = "relative"
 	end
-
+
 	WidgetBase.SetHeight = function(self, height)
 		self.frame:SetHeight(height)
 		self.frame.height = height
@@ -341,7 +312,7 @@ do
 			self:OnHeightSet(height)
 		end
 	end
-
+
 	--[[ WidgetBase.SetRelativeHeight = function(self, height)
 		if height <= 0 or height > 1 then
 			error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -353,47 +324,47 @@ do
 	WidgetBase.IsVisible = function(self)
 		return self.frame:IsVisible()
 	end
-
+
 	WidgetBase.IsShown= function(self)
 		return self.frame:IsShown()
 	end
-
+
 	WidgetBase.Release = function(self)
 		AceGUI:Release(self)
 	end
-
+
 	WidgetBase.SetPoint = function(self, ...)
 		return self.frame:SetPoint(...)
 	end
-
+
 	WidgetBase.ClearAllPoints = function(self)
 		return self.frame:ClearAllPoints()
 	end
-
+
 	WidgetBase.GetNumPoints = function(self)
 		return self.frame:GetNumPoints()
 	end
-
+
 	WidgetBase.GetPoint = function(self, ...)
 		return self.frame:GetPoint(...)
-	end
-
+	end
+
 	WidgetBase.GetUserDataTable = function(self)
 		return self.userdata
 	end
-
+
 	WidgetBase.SetUserData = function(self, key, value)
 		self.userdata[key] = value
 	end
-
+
 	WidgetBase.GetUserData = function(self, key)
 		return self.userdata[key]
 	end
-
+
 	WidgetBase.IsFullHeight = function(self)
 		return self.height == "fill"
 	end
-
+
 	WidgetBase.SetFullHeight = function(self, isFull)
 		if isFull then
 			self.height = "fill"
@@ -401,11 +372,11 @@ do
 			self.height = nil
 		end
 	end
-
+
 	WidgetBase.IsFullWidth = function(self)
 		return self.width == "fill"
 	end
-
+
 	WidgetBase.SetFullWidth = function(self, isFull)
 		if isFull then
 			self.width = "fill"
@@ -413,29 +384,29 @@ do
 			self.width = nil
 		end
 	end
-
+
 --	local function LayoutOnUpdate(this)
 --		this:SetScript("OnUpdate",nil)
 --		this.obj:PerformLayout()
 --	end
-
+
 	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
+
 	WidgetContainerBase.PauseLayout = function(self)
 		self.LayoutPaused = true
 	end
-
+
 	WidgetContainerBase.ResumeLayout = function(self)
 		self.LayoutPaused = nil
 	end
-
+
 	WidgetContainerBase.PerformLayout = function(self)
 		if self.LayoutPaused then
 			return
 		end
 		safecall(self.LayoutFunc, self.content, self.children)
 	end
-
+
 	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
 	WidgetContainerBase.DoLayout = function(self)
 		self:PerformLayout()
@@ -443,7 +414,7 @@ do
 --			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
 --		end
 	end
-
+
 	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
 		if beforeWidget then
 			local siblingIndex = 1
@@ -451,7 +422,7 @@ do
 				if widget == beforeWidget then
 					break
 				end
-				siblingIndex = siblingIndex + 1
+				siblingIndex = siblingIndex + 1
 			end
 			tinsert(self.children, siblingIndex, child)
 		else
@@ -461,7 +432,7 @@ do
 		child.frame:Show()
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.AddChildren = function(self, ...)
 		for i = 1, select("#", ...) do
 			local child = select(i, ...)
@@ -471,7 +442,7 @@ do
 		end
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.ReleaseChildren = function(self)
 		local children = self.children
 		for i = 1,#children do
@@ -479,7 +450,7 @@ do
 			children[i] = nil
 		end
 	end
-
+
 	WidgetContainerBase.SetLayout = function(self, Layout)
 		self.LayoutFunc = AceGUI:GetLayout(Layout)
 	end
@@ -503,7 +474,7 @@ do
 			end
 		end
 	end
-
+
 	local function ContentResize(this)
 		if this:GetWidth() and this:GetHeight() then
 			this.width = this:GetWidth()
@@ -515,7 +486,7 @@ do
 	setmetatable(WidgetContainerBase, {__index=WidgetBase})

 	--One of these function should be called on each Widget Instance as part of its creation process
-
+
 	--- Register a widget-class as a container for newly created widgets.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsContainer(widget)
@@ -531,7 +502,7 @@ do
 		widget:SetLayout("List")
 		return widget
 	end
-
+
 	--- Register a widget-class as a widget.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsWidget(widget)
@@ -558,11 +529,11 @@ end
 -- @param Version The version of the widget
 function AceGUI:RegisterWidgetType(Name, Constructor, Version)
 	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
+	assert(type(Version) == "number")
+
 	local oldVersion = WidgetVersions[Name]
 	if oldVersion and oldVersion >= Version then return end
-
+
 	WidgetVersions[Name] = Version
 	WidgetRegistry[Name] = Constructor
 end
@@ -631,7 +602,7 @@ AceGUI:RegisterLayout("List",
 		local width = content.width or content:GetWidth() or 0
 		for i = 1, #children do
 			local child = children[i]
-
+
 			local frame = child.frame
 			frame:ClearAllPoints()
 			frame:Show()
@@ -640,22 +611,22 @@ AceGUI:RegisterLayout("List",
 			else
 				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
 			end
-
+
 			if child.width == "fill" then
 				child:SetWidth(width)
 				frame:SetPoint("RIGHT", content)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			elseif child.width == "relative" then
 				child:SetWidth(width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			end
-
+
 			height = height + (frame.height or frame:GetHeight() or 0)
 		end
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
@@ -690,19 +661,17 @@ AceGUI:RegisterLayout("Flow",
 		--height of the current row
 		local rowheight = 0
 		local rowoffset = 0
-		local lastrowoffset
-
+
 		local width = content.width or content:GetWidth() or 0
-
+
 		--control at the start of the row
 		local rowstart
 		local rowstartoffset
-		local lastrowstart
 		local isfullheight
-
+
 		local frameoffset
 		local lastframeoffset
-		local oversize
+		local oversize
 		for i = 1, #children do
 			local child = children[i]
 			oversize = nil
@@ -710,17 +679,17 @@ AceGUI:RegisterLayout("Flow",
 			local frameheight = frame.height or frame:GetHeight() or 0
 			local framewidth = frame.width or frame:GetWidth() or 0
 			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
+			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
 			-- That was moving all widgets half the widgets size down, is that intended?
 			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
 			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
 			-- TODO: Investigate moar!
 			frameoffset = child.alignoffset or (frameheight / 2)
-
+
 			if child.width == "relative" then
 				framewidth = width * child.relWidth
 			end
-
+
 			frame:Show()
 			frame:ClearAllPoints()
 			if i == 1 then
@@ -759,11 +728,11 @@ AceGUI:RegisterLayout("Flow",
 				else
 					--handles cases where the new height is higher than either control because of the offsets
 					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
+
 					--offset is always the larger of the two offsets
 					rowoffset = math_max(rowoffset, frameoffset)
 					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
+
 					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
 					usedwidth = framewidth + usedwidth
 				end
@@ -772,11 +741,11 @@ AceGUI:RegisterLayout("Flow",
 			if child.width == "fill" then
 				safelayoutcall(child, "SetWidth", width)
 				frame:SetPoint("RIGHT", content)
-
+
 				usedwidth = 0
 				rowstart = frame
 				rowstartoffset = frameoffset
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -785,7 +754,7 @@ AceGUI:RegisterLayout("Flow",
 				rowstartoffset = rowoffset
 			elseif child.width == "relative" then
 				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -794,20 +763,20 @@ AceGUI:RegisterLayout("Flow",
 					frame:SetPoint("RIGHT", content)
 				end
 			end
-
+
 			if child.height == "fill" then
 				frame:SetPoint("BOTTOM", content)
 				isfullheight = true
 			end
 		end
-
+
 		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
 		if isfullheight then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
 		elseif rowstart then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
 		end
-
+
 		height = height + rowheight + 3
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
 	end)
@@ -871,7 +840,7 @@ AceGUI:RegisterLayout("Table",
 		local spaceH = tableObj.spaceH or tableObj.space or 0
 		local spaceV = tableObj.spaceV or tableObj.space or 0
 		local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
-
+
 		-- We need to reuse these because layout events can come in very frequently
 		local layoutCache = obj:GetUserData("layoutCache")
 		if not layoutCache then
@@ -879,7 +848,7 @@ AceGUI:RegisterLayout("Table",
 			obj:SetUserData("layoutCache", layoutCache)
 		end
 		local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
-
+
 		-- Create the grid
 		local n, slotFound = 0
 		for i,child in ipairs(children) do
@@ -944,7 +913,7 @@ AceGUI:RegisterLayout("Table",
 							local f = child.frame
 							f:ClearAllPoints()
 							local childH = f:GetWidth() or 0
-
+
 							laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
 						end
 					end
@@ -978,7 +947,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
 					local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
-
+
 					local f = child.frame
 					f:ClearAllPoints()
 					local childH = f:GetWidth() or 0
@@ -988,7 +957,7 @@ AceGUI:RegisterLayout("Table",
 					if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
 						f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
 					end
-
+
 					if child.DoLayout then
 						child:DoLayout()
 					end
@@ -1007,7 +976,7 @@ AceGUI:RegisterLayout("Table",
 					local cellObj = child:GetUserData("cell")
 					local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
 					local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
-
+
 					local f = child.frame
 					local childV = f:GetHeight() or 0

@@ -1022,7 +991,7 @@ AceGUI:RegisterLayout("Table",

 		-- Calculate total height
 		local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
-
+
 		-- Cleanup
 		for _,v in pairs(layoutCache) do wipe(v) end

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index 18e49cb..aacb0fc 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -150,7 +150,7 @@ local function Constructor()
 		widget[method] = func
 	end
 	dropdown.parentgroup = widget
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index d1eb471..aff1416 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -219,7 +219,7 @@ local function Constructor()
 	statustext:SetText("")

 	local titlebg = frame:CreateTexture(nil, "OVERLAY")
-	titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
 	titlebg:SetPoint("TOP", 0, 12)
 	titlebg:SetWidth(100)
@@ -235,14 +235,14 @@ local function Constructor()
 	titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)

 	local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg_l:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
 	titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
 	titlebg_l:SetWidth(30)
 	titlebg_l:SetHeight(40)

 	local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg_r:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
 	titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
 	titlebg_r:SetWidth(30)
@@ -260,7 +260,7 @@ local function Constructor()
 	line1:SetWidth(14)
 	line1:SetHeight(14)
 	line1:SetPoint("BOTTOMRIGHT", -8, 8)
-	line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	local x = 0.1 * 14/17
 	line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -268,7 +268,7 @@ local function Constructor()
 	line2:SetWidth(8)
 	line2:SetHeight(8)
 	line2:SetPoint("BOTTOMRIGHT", -8, 8)
-	line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	local x = 0.1 * 8/17
 	line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
index 81e6e41..be6052f 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -2,13 +2,13 @@
 ScrollFrame Container
 Plain container that scrolls its content and doesn't grow in height.
 -------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 24
+local Type, Version = "ScrollFrame", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

 -- Lua APIs
 local pairs, assert, type = pairs, assert, type
-local min, max, floor, abs = math.min, math.max, math.floor, math.abs
+local min, max, floor = math.min, math.max, math.floor

 -- WoW APIs
 local CreateFrame, UIParent = CreateFrame, UIParent
@@ -40,7 +40,7 @@ end
 Methods
 -------------------------------------------------------------------------------]]
 local methods = {
-	["OnAcquire"] = function(self)
+	["OnAcquire"] = function(self)
 		self:SetScroll(0)
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,
@@ -53,7 +53,7 @@ local methods = {
 		self.scrollframe:SetPoint("BOTTOMRIGHT")
 		self.scrollbar:Hide()
 		self.scrollBarShown = nil
-		self.content.height, self.content.width = nil, nil
+		self.content.height, self.content.width, self.content.original_width = nil, nil, nil
 	end,

 	["SetScroll"] = function(self, value)
@@ -77,7 +77,7 @@ local methods = {
 	["MoveScroll"] = function(self, value)
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
+
 		if self.scrollBarShown then
 			local diff = height - viewheight
 			local delta = 1
@@ -94,7 +94,6 @@ local methods = {
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
 		local offset = status.offset or 0
-		local curvalue = self.scrollbar:GetValue()
 		-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
 		-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
 		if viewheight < height + 2 then
@@ -103,6 +102,9 @@ local methods = {
 				self.scrollbar:Hide()
 				self.scrollbar:SetValue(0)
 				self.scrollframe:SetPoint("BOTTOMRIGHT")
+				if self.content.original_width then
+					self.content.width = self.content.original_width
+				end
 				self:DoLayout()
 			end
 		else
@@ -110,6 +112,9 @@ local methods = {
 				self.scrollBarShown = true
 				self.scrollbar:Show()
 				self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
+				if self.content.original_width then
+					self.content.width = self.content.original_width - 20
+				end
 				self:DoLayout()
 			end
 			local value = (offset / (viewheight - height) * 1000)
@@ -128,6 +133,11 @@ local methods = {

 	["LayoutFinished"] = function(self, width, height)
 		self.content:SetHeight(height or 0 + 20)
+
+		-- update the scrollframe
+		self:FixScroll()
+
+		-- schedule another update when everything has "settled"
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,

@@ -141,7 +151,8 @@ local methods = {

 	["OnWidthSet"] = function(self, width)
 		local content = self.content
-		content.width = width
+		content.width = width - (self.scrollBarShown and 20 or 0)
+		content.original_width = width
 	end,

 	["OnHeightSet"] = function(self, height)
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 1d5b71a..466fbbd 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -161,22 +161,21 @@ local methods = {
 		self.tablist = tabs
 		self:BuildTabs()
 	end,
-
+

 	["BuildTabs"] = function(self)
 		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
-		local status = self.status or self.localstatus
 		local tablist = self.tablist
 		local tabs = self.tabs
-
+
 		if not tablist then return end
-
+
 		local width = self.frame.width or self.frame:GetWidth() or 0
-
+
 		wipe(widths)
 		wipe(rowwidths)
 		wipe(rowends)
-
+
 		--Place Text into tabs and get thier initial width
 		for i, v in ipairs(tablist) do
 			local tab = tabs[i]
@@ -184,19 +183,19 @@ local methods = {
 				tab = self:CreateTab(i)
 				tabs[i] = tab
 			end
-
+
 			tab:Show()
 			tab:SetText(v.text)
 			tab:SetDisabled(v.disabled)
 			tab.value = v.value
-
+
 			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
 		end
-
+
 		for i = (#tablist)+1, #tabs, 1 do
 			tabs[i]:Hide()
 		end
-
+
 		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
 		local numtabs = #tablist
 		local numrows = 1
@@ -214,7 +213,7 @@ local methods = {
 		end
 		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
 		rowends[numrows] = #tablist
-
+
 		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
 		if numrows > 1 then
 			--if the last row has only one tab
@@ -245,22 +244,22 @@ local methods = {
 					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
 				end
 			end
-
+
 			-- equal padding for each tab to fill the available width,
 			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
+			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
 			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
 			local padding = 0
 			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
 				padding = (width - rowwidths[row]) / (endtab - starttab+1)
 			end
-
+
 			for i = starttab, endtab do
 				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
 			end
 			starttab = endtab + 1
 		end
-
+
 		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
 		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
 	end,
@@ -286,7 +285,7 @@ local methods = {
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end,
-
+
 	["LayoutFinished"] = function(self, width, height)
 		if self.noAutoHeight then return end
 		self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -343,7 +342,7 @@ local function Constructor()
 	for method, func in pairs(methods) do
 		widget[method] = func
 	end
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index ca27bfb..48586ef 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,7 +2,7 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 41
+local Type, Version = "TreeGroup", 42
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -36,7 +36,7 @@ do
 	function del(t)
 		for k in pairs(t) do
 			t[k] = nil
-		end
+		end
 		pool[t] = true
 	end
 end
@@ -59,7 +59,6 @@ end
 local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local self = button.obj
 	local toggle = button.toggle
-	local frame = self.frame
 	local text = treeline.text or ""
 	local icon = treeline.icon
 	local iconCoords = treeline.iconCoords
@@ -67,7 +66,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local value = treeline.value
 	local uniquevalue = treeline.uniquevalue
 	local disabled = treeline.disabled
-
+
 	button.treeline = treeline
 	button.value = value
 	button.uniquevalue = uniquevalue
@@ -78,8 +77,6 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:UnlockHighlight()
 		button.selected = false
 	end
-	local normalTexture = button:GetNormalTexture()
-	local line = button.line
 	button.level = level
 	if ( level == 1 ) then
 		button:SetNormalFontObject("GameFontNormal")
@@ -90,7 +87,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:SetHighlightFontObject("GameFontHighlightSmall")
 		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
 	end
-
+
 	if disabled then
 		button:EnableMouse(false)
 		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -98,27 +95,27 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button.text:SetText(text)
 		button:EnableMouse(true)
 	end
-
+
 	if icon then
 		button.icon:SetTexture(icon)
 		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
 	else
 		button.icon:SetTexture(nil)
 	end
-
+
 	if iconCoords then
 		button.icon:SetTexCoord(unpack(iconCoords))
 	else
 		button.icon:SetTexCoord(0, 1, 0, 1)
 	end
-
+
 	if canExpand then
 		if not isExpanded then
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
+			toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
+			toggle:SetPushedTexture(130836) -- Interface\\Buttons\\UI-PlusButton-DOWN
 		else
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
+			toggle:SetNormalTexture(130821) -- Interface\\Buttons\\UI-MinusButton-UP
+			toggle:SetPushedTexture(130820) -- Interface\\Buttons\\UI-MinusButton-DOWN
 		end
 		toggle:Show()
 	else
@@ -201,7 +198,6 @@ end

 local function Button_OnDoubleClick(button)
 	local self = button.obj
-	local status = self.status or self.localstatus
 	local status = (self.status or self.localstatus).groups
 	status[button.uniquevalue] = not status[button.uniquevalue]
 	self:RefreshTree()
@@ -213,6 +209,7 @@ local function Button_OnEnter(frame)

 	if self.enabletooltips then
 		GameTooltip:SetOwner(frame, "ANCHOR_NONE")
+		GameTooltip:ClearAllPoints()
 		GameTooltip:SetPoint("LEFT",frame,"RIGHT")
 		GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)

@@ -279,10 +276,10 @@ local function Dragger_OnMouseUp(frame)
 	treeframe:SetHeight(0)
 	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
 	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
+
 	local status = self.status or self.localstatus
 	status.treewidth = treeframe:GetWidth()
-
+
 	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
 	-- recalculate the content width
 	treeframe.obj:OnWidthSet(status.fullwidth)
@@ -367,8 +364,8 @@ local methods = {
 	--sets the tree to be displayed
 	["SetTree"] = function(self, tree, filter)
 		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
+		if tree then
+			assert(type(tree) == "table")
 		end
 		self.tree = tree
 		self:RefreshTree()
@@ -376,8 +373,7 @@ local methods = {

 	["BuildLevel"] = function(self, tree, level, parent)
 		local groups = (self.status or self.localstatus).groups
-		local hasChildren = self.hasChildren
-
+
 		for i, v in ipairs(tree) do
 			if v.children then
 				if not self.filter or ShouldDisplayLevel(v.children) then
@@ -414,7 +410,7 @@ local methods = {
 		local tree = self.tree

 		local treeframe = self.treeframe
-
+
 		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)

 		self:BuildLevel(tree, 1)
@@ -431,7 +427,7 @@ local methods = {
 		end

 		local first, last
-
+
 		scrollToSelection = status.scrollToSelection
 		status.scrollToSelection = nil

@@ -507,9 +503,9 @@ local methods = {
 			button:Show()
 			buttonnum = buttonnum + 1
 		end
-
+
 	end,
-
+
 	["SetSelected"] = function(self, value)
 		local status = self.status or self.localstatus
 		if status.selected ~= value then
@@ -559,16 +555,16 @@ local methods = {
 		local treeframe = self.treeframe
 		local status = self.status or self.localstatus
 		status.fullwidth = width
-
+
 		local contentwidth = width - status.treewidth - 20
 		if contentwidth < 0 then
 			contentwidth = 0
 		end
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
-
+
 		local maxtreewidth = math_min(400, width - 50)
-
+
 		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
 			self:SetTreeWidth(maxtreewidth, status.treesizable)
 		end
@@ -594,16 +590,16 @@ local methods = {
 				treewidth = DEFAULT_TREE_WIDTH
 			else
 				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
+				treewidth = DEFAULT_TREE_WIDTH
 			end
 		end
 		self.treeframe:SetWidth(treewidth)
 		self.dragger:EnableMouse(resizable)
-
+
 		local status = self.status or self.localstatus
 		status.treewidth = treewidth
 		status.treesizable = resizable
-
+
 		-- recalculate the content width
 		if status.fullwidth then
 			self:OnWidthSet(status.fullwidth)
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
index f572804..a9192b3 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -30,21 +30,21 @@ do
 	local function frameOnClose(this)
 		this.obj:Fire("OnClose")
 	end
-
+
 	local function closeOnClick(this)
 		PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 		this.obj:Hide()
 	end
-
+
 	local function frameOnMouseDown(this)
 		AceGUI:ClearFocus()
 	end
-
+
 	local function titleOnMouseDown(this)
 		this:GetParent():StartMoving()
 		AceGUI:ClearFocus()
 	end
-
+
 	local function frameOnMouseUp(this)
 		local frame = this:GetParent()
 		frame:StopMovingOrSizing()
@@ -55,22 +55,22 @@ do
 		status.top = frame:GetTop()
 		status.left = frame:GetLeft()
 	end
-
+
 	local function sizerseOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOMRIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizersOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOM")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizereOnMouseDown(this)
 		this:GetParent():StartSizing("RIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizerOnMouseUp(this)
 		this:GetParent():StopMovingOrSizing()
 	end
@@ -78,19 +78,19 @@ do
 	local function SetTitle(self,title)
 		self.titletext:SetText(title)
 	end
-
+
 	local function SetStatusText(self,text)
 		-- self.statustext:SetText(text)
 	end
-
+
 	local function Hide(self)
 		self.frame:Hide()
 	end
-
+
 	local function Show(self)
 		self.frame:Show()
 	end
-
+
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -98,21 +98,21 @@ do
 		self:EnableResize(true)
 		self:Show()
 	end
-
+
 	local function OnRelease(self)
 		self.status = nil
 		for k in pairs(self.localstatus) do
 			self.localstatus[k] = nil
 		end
 	end
-
+
 	-- called to set an external table to store status in
 	local function SetStatusTable(self, status)
 		assert(type(status) == "table")
 		self.status = status
 		self:ApplyStatus()
 	end
-
+
 	local function ApplyStatus(self)
 		local status = self.status or self.localstatus
 		local frame = self.frame
@@ -125,7 +125,7 @@ do
 			frame:SetPoint("CENTER",UIParent,"CENTER")
 		end
 	end
-
+
 	local function OnWidthSet(self, width)
 		local content = self.content
 		local contentwidth = width - 34
@@ -135,8 +135,8 @@ do
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
 	end
-
-
+
+
 	local function OnHeightSet(self, height)
 		local content = self.content
 		local contentheight = height - 57
@@ -146,19 +146,19 @@ do
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end
-
+
 	local function EnableResize(self, state)
 		local func = state and "Show" or "Hide"
 		self.sizer_se[func](self.sizer_se)
 		self.sizer_s[func](self.sizer_s)
 		self.sizer_e[func](self.sizer_e)
 	end
-
+
 	local function Constructor()
 		local frame = CreateFrame("Frame",nil,UIParent)
 		local self = {}
 		self.type = "Window"
-
+
 		self.Hide = Hide
 		self.Show = Show
 		self.SetTitle =  SetTitle
@@ -170,9 +170,9 @@ do
 		self.OnWidthSet = OnWidthSet
 		self.OnHeightSet = OnHeightSet
 		self.EnableResize = EnableResize
-
+
 		self.localstatus = {}
-
+
 		self.frame = frame
 		frame.obj = self
 		frame:SetWidth(700)
@@ -183,91 +183,91 @@ do
 		frame:SetResizable(true)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
+
 		frame:SetScript("OnShow",frameOnShow)
 		frame:SetScript("OnHide",frameOnClose)
 		frame:SetMinResize(240,240)
 		frame:SetToplevel(true)

 		local titlebg = frame:CreateTexture(nil, "BACKGROUND")
-		titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
+		titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
 		titlebg:SetPoint("TOPLEFT", 9, -6)
 		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
+
 		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
-		dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
+		dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
 		dialogbg:SetPoint("TOPLEFT", 8, -24)
 		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
 		dialogbg:SetVertexColor(0, 0, 0, .75)
-
+
 		local topleft = frame:CreateTexture(nil, "BORDER")
-		topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topleft:SetWidth(64)
 		topleft:SetHeight(64)
 		topleft:SetPoint("TOPLEFT")
 		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
+
 		local topright = frame:CreateTexture(nil, "BORDER")
-		topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topright:SetWidth(64)
 		topright:SetHeight(64)
 		topright:SetPoint("TOPRIGHT")
 		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
+
 		local top = frame:CreateTexture(nil, "BORDER")
-		top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		top:SetHeight(64)
 		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
 		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
 		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
+
 		local bottomleft = frame:CreateTexture(nil, "BORDER")
-		bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomleft:SetWidth(64)
 		bottomleft:SetHeight(64)
 		bottomleft:SetPoint("BOTTOMLEFT")
 		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
+
 		local bottomright = frame:CreateTexture(nil, "BORDER")
-		bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomright:SetWidth(64)
 		bottomright:SetHeight(64)
 		bottomright:SetPoint("BOTTOMRIGHT")
 		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
+
 		local bottom = frame:CreateTexture(nil, "BORDER")
-		bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottom:SetHeight(64)
 		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
 		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
 		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
+
 		local left = frame:CreateTexture(nil, "BORDER")
-		left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		left:SetWidth(64)
 		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
 		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
 		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
+
 		local right = frame:CreateTexture(nil, "BORDER")
-		right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		right:SetWidth(64)
 		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
 		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
 		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
+
 		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
 		close:SetPoint("TOPRIGHT", 2, 1)
 		close:SetScript("OnClick", closeOnClick)
 		self.closebutton = close
 		close.obj = self
-
+
 		local titletext = frame:CreateFontString(nil, "ARTWORK")
 		titletext:SetFontObject(GameFontNormal)
 		titletext:SetPoint("TOPLEFT", 12, -8)
 		titletext:SetPoint("TOPRIGHT", -32, -8)
 		self.titletext = titletext
-
+
 		local title = CreateFrame("Button", nil, frame)
 		title:SetPoint("TOPLEFT", titlebg)
 		title:SetPoint("BOTTOMRIGHT", titlebg)
@@ -275,7 +275,7 @@ do
 		title:SetScript("OnMouseDown",titleOnMouseDown)
 		title:SetScript("OnMouseUp", frameOnMouseUp)
 		self.title = title
-
+
 		local sizer_se = CreateFrame("Frame",nil,frame)
 		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 		sizer_se:SetWidth(25)
@@ -290,7 +290,7 @@ do
 		line1:SetWidth(14)
 		line1:SetHeight(14)
 		line1:SetPoint("BOTTOMRIGHT", -8, 8)
-		line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+		line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 		local x = 0.1 * 14/17
 		line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -299,7 +299,7 @@ do
 		line2:SetWidth(8)
 		line2:SetHeight(8)
 		line2:SetPoint("BOTTOMRIGHT", -8, 8)
-		line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+		line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 		local x = 0.1 * 8/17
 		line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -311,7 +311,7 @@ do
 		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
 		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_s = sizer_s
-
+
 		local sizer_e = CreateFrame("Frame",nil,frame)
 		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
 		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -320,17 +320,17 @@ do
 		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
 		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_e = sizer_e
-
+
 		--Container Support
 		local content = CreateFrame("Frame",nil,frame)
 		self.content = content
 		content.obj = self
 		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
 		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
+
 		AceGUI:RegisterAsContainer(self)
-		return self
+		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(Type,Constructor,Version)
 end
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
index dfa76a5..8e650ce 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -51,7 +51,7 @@ local methods = {
 			self:SetWidth(self.text:GetStringWidth() + 30)
 		end
 	end,
-
+
 	["SetAutoWidth"] = function(self, autoWidth)
 		self.autoWidth = autoWidth
 		if self.autoWidth then
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
index 345a0e4..d2adb88 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 Checkbox Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "CheckBox", 24
+local Type, Version = "CheckBox", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -26,7 +26,7 @@ local function AlignImage(self)
 		self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
 		self.text:SetPoint("RIGHT")
 	else
-		self.text:SetPoint("LEFT", self.checkbg, "RIGHT", self.image:GetWidth() + 2, 0)
+		self.text:SetPoint("LEFT", self.image, "RIGHT", 1, 0)
 		self.text:SetPoint("RIGHT")
 	end
 end
@@ -91,7 +91,7 @@ local methods = {
 		if self.desc then
 			self.desc:SetWidth(width - 30)
 			if self.desc:GetText() and self.desc:GetText() ~= "" then
-				self:SetHeight(28 + self.desc:GetHeight())
+				self:SetHeight(28 + self.desc:GetStringHeight())
 			end
 		end
 	end,
@@ -119,20 +119,20 @@ local methods = {
 		end
 	end,

-	["SetValue"] = function(self,value)
+	["SetValue"] = function(self, value)
 		local check = self.check
 		self.checked = value
 		if value then
-			SetDesaturation(self.check, false)
-			self.check:Show()
+			SetDesaturation(check, false)
+			check:Show()
 		else
 			--Nil is the unknown tristate value
 			if self.tristate and value == nil then
-				SetDesaturation(self.check, true)
-				self.check:Show()
+				SetDesaturation(check, true)
+				check:Show()
 			else
-				SetDesaturation(self.check, false)
-				self.check:Hide()
+				SetDesaturation(check, false)
+				check:Hide()
 			end
 		end
 		self:SetDisabled(self.disabled)
@@ -155,21 +155,21 @@ local methods = {
 		local size
 		if type == "radio" then
 			size = 16
-			checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			checkbg:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			checkbg:SetTexCoord(0, 0.25, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			check:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			check:SetTexCoord(0.25, 0.5, 0, 1)
 			check:SetBlendMode("ADD")
-			highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			highlight:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			highlight:SetTexCoord(0.5, 0.75, 0, 1)
 		else
 			size = 24
-			checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+			checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up
 			checkbg:SetTexCoord(0, 1, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+			check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
 			check:SetTexCoord(0, 1, 0, 1)
 			check:SetBlendMode("BLEND")
-			highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+			highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
 			highlight:SetTexCoord(0, 1, 0, 1)
 		end
 		checkbg:SetHeight(size)
@@ -211,7 +211,7 @@ local methods = {
 			self.desc:Show()
 			--self.text:SetFontObject(GameFontNormal)
 			self.desc:SetText(desc)
-			self:SetHeight(28 + self.desc:GetHeight())
+			self:SetHeight(28 + self.desc:GetStringHeight())
 		else
 			if self.desc then
 				self.desc:SetText("")
@@ -221,11 +221,11 @@ local methods = {
 			self:SetHeight(24)
 		end
 	end,
-
+
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
@@ -255,11 +255,11 @@ local function Constructor()
 	checkbg:SetWidth(24)
 	checkbg:SetHeight(24)
 	checkbg:SetPoint("TOPLEFT")
-	checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+	checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up

 	local check = frame:CreateTexture(nil, "OVERLAY")
 	check:SetAllPoints(checkbg)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+	check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check

 	local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
 	text:SetJustifyH("LEFT")
@@ -268,7 +268,7 @@ local function Constructor()
 	text:SetPoint("RIGHT")

 	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+	highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
 	highlight:SetBlendMode("ADD")
 	highlight:SetAllPoints(checkbg)

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index 050bb63..f4cab66 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 ColorPicker Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 24
+local Type, Version = "ColorPicker", 25
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -13,7 +13,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent

 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
 -- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
+-- GLOBALS: ColorPickerFrame, OpacitySliderFrame

 --[[-----------------------------------------------------------------------------
 Support functions
@@ -47,7 +47,7 @@ local function Control_OnLeave(frame)
 end

 local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
+	ColorPickerFrame:Hide()
 	local self = frame.obj
 	if not self.disabled then
 		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -77,7 +77,7 @@ local function ColorSwatch_OnClick(frame)
 			ColorCallback(self, r, g, b, a, true)
 		end

-		ShowUIPanel(ColorPickerFrame)
+		ColorPickerFrame:Show()
 	end
 	AceGUI:ClearFocus()
 end
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index b13688c..9dd4b60 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

@@ -33,7 +33,7 @@ end

 -- ItemBase is the base "class" for all dropdown items.
 -- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
+-- create an initial 'self' value.
 -- ItemBase will add common functions and ui event handlers.
 -- Be sure to keep basic usage when you override functions.

@@ -52,7 +52,7 @@ function ItemBase.Frame_OnEnter(this)
 		self.highlight:Show()
 	end
 	self:Fire("OnEnter")
-
+
 	if self.specialOnEnter then
 		self.specialOnEnter(self)
 	end
@@ -60,10 +60,10 @@ end

 function ItemBase.Frame_OnLeave(this)
 	local self = this.obj
-
+
 	self.highlight:Hide()
 	self:Fire("OnLeave")
-
+
 	if self.specialOnLeave then
 		self.specialOnLeave(self)
 	end
@@ -89,7 +89,7 @@ end
 --       Do not call this method directly
 function ItemBase.SetPullout(self, pullout)
 	self.pullout = pullout
-
+
 	self.frame:SetParent(nil)
 	self.frame:SetParent(pullout.itemFrame)
 	self.parent = pullout.itemFrame
@@ -155,12 +155,12 @@ function ItemBase.Create(type)
 	self.frame = frame
 	frame.obj = self
 	self.type = type
-
+
 	self.useHighlight = true
-
+
 	frame:SetHeight(17)
 	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 	text:SetTextColor(1,1,1)
 	text:SetJustifyH("LEFT")
@@ -169,7 +169,7 @@ function ItemBase.Create(type)
 	self.text = text

 	local highlight = frame:CreateTexture(nil, "OVERLAY")
-	highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+	highlight:SetTexture(136810) -- Interface\\QuestFrame\\UI-QuestTitleHighlight
 	highlight:SetBlendMode("ADD")
 	highlight:SetHeight(14)
 	highlight:ClearAllPoints()
@@ -178,11 +178,11 @@ function ItemBase.Create(type)
 	highlight:Hide()
 	self.highlight = highlight

-	local check = frame:CreateTexture("OVERLAY")
+	local check = frame:CreateTexture("OVERLAY")
 	check:SetWidth(16)
 	check:SetHeight(16)
 	check:SetPoint("LEFT",frame,"LEFT",3,-1)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+	check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
 	check:Hide()
 	self.check = check

@@ -190,28 +190,28 @@ function ItemBase.Create(type)
 	sub:SetWidth(16)
 	sub:SetHeight(16)
 	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
-	sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
+	sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
 	sub:Hide()
-	self.sub = sub
-
+	self.sub = sub
+
 	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
 	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
+
 	self.OnAcquire = ItemBase.OnAcquire
 	self.OnRelease = ItemBase.OnRelease
-
+
 	self.SetPullout = ItemBase.SetPullout
 	self.GetText    = ItemBase.GetText
 	self.SetText    = ItemBase.SetText
 	self.SetDisabled = ItemBase.SetDisabled
-
+
 	self.SetPoint   = ItemBase.SetPoint
 	self.Show       = ItemBase.Show
 	self.Hide       = ItemBase.Hide
-
+
 	self.SetOnLeave = ItemBase.SetOnLeave
 	self.SetOnEnter = ItemBase.SetOnEnter
-
+
 	return self
 end

@@ -223,20 +223,20 @@ end

 --[[
 	Template for items:
-
+
 -- Item:
 --
 do
 	local widgetType = "Dropdown-Item-"
 	local widgetVersion = 1
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
 --]]
@@ -247,25 +247,25 @@ end
 do
 	local widgetType = "Dropdown-Item-Header"
 	local widgetVersion = 1
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
 	end
-
+
 	local function OnLeave(this)
 		local self = this.obj
 		self:Fire("OnLeave")
-
+
 		if self.specialOnLeave then
 			self.specialOnLeave(self)
 		end
 	end
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
@@ -273,21 +273,21 @@ do
 			self.text:SetTextColor(1, 1, 0)
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnLeave", OnLeave)
-
+
 		self.text:SetTextColor(1, 1, 0)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -296,7 +296,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Execute"
 	local widgetVersion = 1
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -305,16 +305,16 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -324,7 +324,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Toggle"
 	local widgetVersion = 4
-
+
 	local function UpdateToggle(self)
 		if self.value then
 			self.check:Show()
@@ -332,12 +332,12 @@ do
 			self.check:Hide()
 		end
 	end
-
+
 	local function OnRelease(self)
 		ItemBase.OnRelease(self)
 		self:SetValue(nil)
 	end
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -350,31 +350,31 @@ do
 		UpdateToggle(self)
 		self:Fire("OnValueChanged", self.value)
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		self.value = value
 		UpdateToggle(self)
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		self.SetValue = SetValue
 		self.GetValue = GetValue
 		self.OnRelease = OnRelease
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -384,55 +384,55 @@ end
 do
 	local widgetType = "Dropdown-Item-Menu"
 	local widgetVersion = 2
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
-
+
 		self.highlight:Show()
-
+
 		if not self.disabled and self.submenu then
 			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
 		end
 	end
-
+
 	local function OnHide(this)
 		local self = this.obj
 		if self.submenu then
 			self.submenu:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetMenu(self, menu)
 		assert(menu.type == "Dropdown-Pullout")
 		self.submenu = menu
 	end
-
+
 	-- exported
 	local function CloseMenu(self)
 		self.submenu:Close()
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.sub:Show()
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnHide", OnHide)
-
+
 		self.SetMenu   = SetMenu
 		self.CloseMenu = CloseMenu
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -441,31 +441,31 @@ end
 do
 	local widgetType = "Dropdown-Item-Separator"
 	local widgetVersion = 2
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
 		self.useHighlight = false
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		local line = self.frame:CreateTexture(nil, "OVERLAY")
 		line:SetHeight(1)
 		line:SetColorTexture(.5, .5, .5)
 		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
 		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
+
 		self.text:Hide()
-
+
 		self.useHighlight = false
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index 93c93df..f8a0d1f 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,9 +1,9 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1167 2017-08-29 22:08:48Z funkydude $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
 local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs, type = select, pairs, ipairs, type
+local select, pairs, ipairs, type, tostring = select, pairs, ipairs, type, tostring
 local tsort = table.sort

 -- WoW APIs
@@ -40,9 +40,9 @@ end
 do
 	local widgetType = "Dropdown-Pullout"
 	local widgetVersion = 3
-
+
 	--[[ Static data ]]--
-
+
 	local backdrop = {
 		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
 		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -60,9 +60,9 @@ do

 	local defaultWidth = 200
 	local defaultMaxHeight = 600
-
+
 	--[[ UI Event Handlers ]]--
-
+
 	-- HACK: This should be no part of the pullout, but there
 	--       is no other 'clean' way to response to any item-OnEnter
 	--       Used to close Submenus when an other item is entered
@@ -74,22 +74,22 @@ do
 			end
 		end
 	end
-
+
 	-- See the note in Constructor() for each scroll related function
 	local function OnMouseWheel(this, value)
 		this.obj:MoveScroll(value)
 	end
-
+
 	local function OnScrollValueChanged(this, value)
 		this.obj:SetScroll(value)
 	end
-
+
 	local function OnSizeChanged(this)
 		this.obj:FixScroll()
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported
 	local function SetScroll(self, value)
 		local status = self.scrollStatus
@@ -106,9 +106,9 @@ do
 		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
 		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
 		status.offset = offset
-		status.scrollvalue = value
+		status.scrollvalue = value
 	end
-
+
 	-- exported
 	local function MoveScroll(self, value)
 		local status = self.scrollStatus
@@ -127,7 +127,7 @@ do
 			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
 		end
 	end
-
+
 	-- exported
 	local function FixScroll(self)
 		local status = self.scrollStatus
@@ -140,7 +140,7 @@ do
 			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
 			self.slider:SetValue(0)
 		else
-			self.slider:Show()
+			self.slider:Show()
 			local value = (offset / (viewheight - height) * 1000)
 			if value > 1000 then value = 1000 end
 			self.slider:SetValue(value)
@@ -153,44 +153,44 @@ do
 			end
 		end
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		--self.itemFrame:SetToplevel(true)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		self:Clear()
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function AddItem(self, item)
 		self.items[#self.items + 1] = item
-
+
 		local h = #self.items * 16
 		self.itemFrame:SetHeight(h)
 		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
+
 		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
 		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
+
 		item:SetPullout(self)
 		item:SetOnEnter(OnEnter)
 	end
-
+
 	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
+	local function Open(self, point, relFrame, relPoint, x, y)
 		local items = self.items
 		local frame = self.frame
 		local itemFrame = self.itemFrame
-
+
 		frame:SetPoint(point, relFrame, relPoint, x, y)

-
+
 		local height = 8
 		for i, item in pairs(items) do
 			if i == 1 then
@@ -198,23 +198,23 @@ do
 			else
 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
 			end
-
+
 			item:Show()
-
+
 			height = height + 16
 		end
 		itemFrame:SetHeight(height)
 		fixstrata("TOOLTIP", frame, frame:GetChildren())
 		frame:Show()
 		self:Fire("OnOpen")
-	end
-
+	end
+
 	-- exported
 	local function Close(self)
 		self.frame:Hide()
 		self:Fire("OnClose")
-	end
-
+	end
+
 	-- exported
 	local function Clear(self)
 		local items = self.items
@@ -222,18 +222,18 @@ do
 			AceGUI:Release(item)
 			items[i] = nil
 		end
-	end
-
+	end
+
 	-- exported
 	local function IterateItems(self)
 		return ipairs(self.items)
 	end
-
+
 	-- exported
 	local function SetHideOnLeave(self, val)
 		self.hideOnLeave = val
 	end
-
+
 	-- exported
 	local function SetMaxHeight(self, height)
 		self.maxHeight = height or defaultMaxHeight
@@ -243,19 +243,19 @@ do
 			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
 		end
 	end
-
+
 	-- exported
 	local function GetRightBorderWidth(self)
 		return 6 + (self.slider:IsShown() and 12 or 0)
 	end
-
+
 	-- exported
 	local function GetLeftBorderWidth(self)
 		return 6
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
@@ -264,7 +264,7 @@ do
 		self.type = widgetType
 		self.frame = frame
 		frame.obj = self
-
+
 		self.OnAcquire = OnAcquire
 		self.OnRelease = OnRelease

@@ -278,37 +278,37 @@ do
 		self.SetScroll  = SetScroll
 		self.MoveScroll = MoveScroll
 		self.FixScroll  = FixScroll
-
+
 		self.SetMaxHeight = SetMaxHeight
 		self.GetRightBorderWidth = GetRightBorderWidth
 		self.GetLeftBorderWidth = GetLeftBorderWidth
-
+
 		self.items = {}
-
+
 		self.scrollStatus = {
 			scrollvalue = 0,
 		}
-
+
 		self.maxHeight = defaultMaxHeight
-
+
 		frame:SetBackdrop(backdrop)
 		frame:SetBackdropColor(0, 0, 0)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetClampedToScreen(true)
 		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
+		frame:SetHeight(self.maxHeight)
 		--frame:SetToplevel(true)
-
+
 		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
 		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
 		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
+
 		self.scrollFrame = scrollFrame
 		self.itemFrame = itemFrame
-
+
 		scrollFrame.obj = self
 		itemFrame.obj = self
-
+
 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
@@ -318,7 +318,7 @@ do
 		slider:SetFrameStrata("FULLSCREEN_DIALOG")
 		self.slider = slider
 		slider.obj = self
-
+
 		scrollFrame:SetScrollChild(itemFrame)
 		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
 		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -327,46 +327,46 @@ do
 		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
 		scrollFrame:SetToplevel(true)
 		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
 		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
 		itemFrame:SetHeight(400)
 		itemFrame:SetToplevel(true)
 		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
 		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
 		slider:SetScript("OnValueChanged", OnScrollValueChanged)
 		slider:SetMinMaxValues(0, 1000)
 		slider:SetValueStep(1)
 		slider:SetValue(0)
-
+
 		scrollFrame:Show()
 		itemFrame:Show()
 		slider:Hide()
-
+
 		self:FixScroll()
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
 end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 31
-
+	local widgetVersion = 34
+
 	--[[ Static data ]]--
-
+
 	--[[ UI event handler ]]--
-
+
 	local function Control_OnEnter(this)
 		this.obj.button:LockHighlight()
 		this.obj:Fire("OnEnter")
 	end
-
+
 	local function Control_OnLeave(this)
 		this.obj.button:UnlockHighlight()
 		this.obj:Fire("OnLeave")
@@ -378,7 +378,7 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Dropdown_TogglePullout(this)
 		local self = this.obj
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
@@ -393,17 +393,17 @@ do
 			AceGUI:SetFocus(self)
 		end
 	end
-
+
 	local function OnPulloutOpen(this)
 		local self = this.userdata.obj
 		local value = self.value
-
+
 		if not self.multiselect then
 			for i, item in this:IterateItems() do
 				item:SetValue(item.userdata.value == value)
 			end
 		end
-
+
 		self.open = true
 		self:Fire("OnOpened")
 	end
@@ -413,7 +413,7 @@ do
 		self.open = nil
 		self:Fire("OnClosed")
 	end
-
+
 	local function ShowMultiText(self)
 		local text
 		for i, widget in self.pullout:IterateItems() do
@@ -429,10 +429,10 @@ do
 		end
 		self:SetText(text)
 	end
-
+
 	local function OnItemValueChanged(this, event, checked)
 		local self = this.userdata.obj
-
+
 		if self.multiselect then
 			self:Fire("OnValueChanged", this.userdata.value, checked)
 			ShowMultiText(self)
@@ -443,14 +443,14 @@ do
 			else
 				this:SetValue(true)
 			end
-			if self.open then
+			if self.open then
 				self.pullout:Close()
 			end
 		end
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -460,13 +460,13 @@ do
 		pullout:SetCallback("OnOpen", OnPulloutOpen)
 		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
 		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
+
 		self:SetHeight(44)
 		self:SetWidth(200)
 		self:SetLabel()
 		self:SetPulloutWidth(nil)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		if self.open then
@@ -474,20 +474,20 @@ do
 		end
 		AceGUI:Release(self.pullout)
 		self.pullout = nil
-
+
 		self:SetText("")
 		self:SetDisabled(false)
 		self:SetMultiselect(false)
-
+
 		self.value = nil
 		self.list = nil
 		self.open = nil
 		self.hasClose = nil
-
+
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function SetDisabled(self, disabled)
 		self.disabled = disabled
@@ -503,19 +503,19 @@ do
 			self.text:SetTextColor(1,1,1)
 		end
 	end
-
+
 	-- exported
 	local function ClearFocus(self)
 		if self.open then
 			self.pullout:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetText(self, text)
 		self.text:SetText(text or "")
 	end
-
+
 	-- exported
 	local function SetLabel(self, text)
 		if text and text ~= "" then
@@ -532,7 +532,7 @@ do
 			self.alignoffset = 12
 		end
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		if self.list then
@@ -540,12 +540,12 @@ do
 		end
 		self.value = value
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	-- exported
 	local function SetItemValue(self, item, value)
 		if not self.multiselect then return end
@@ -558,7 +558,7 @@ do
 		end
 		ShowMultiText(self)
 	end
-
+
 	-- exported
 	local function SetItemDisabled(self, item, disabled)
 		for i, widget in self.pullout:IterateItems() do
@@ -567,7 +567,7 @@ do
 			end
 		end
 	end
-
+
 	local function AddListItem(self, value, text, itemType)
 		if not itemType then itemType = "Dropdown-Item-Toggle" end
 		local exists = AceGUI:GetWidgetVersion(itemType)
@@ -580,7 +580,7 @@ do
 		item:SetCallback("OnValueChanged", OnItemValueChanged)
 		self.pullout:AddItem(item)
 	end
-
+
 	local function AddCloseButton(self)
 		if not self.hasClose then
 			local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -589,21 +589,29 @@ do
 			self.hasClose = true
 		end
 	end
-
+
 	-- exported
 	local sortlist = {}
+	local function sortTbl(x,y)
+		local num1, num2 = tonumber(x), tonumber(y)
+		if num1 and num2 then -- numeric comparison, either two numbers or numeric strings
+			return num1 < num2
+		else -- compare everything else tostring'ed
+			return tostring(x) < tostring(y)
+		end
+	end
 	local function SetList(self, list, order, itemType)
 		self.list = list
 		self.pullout:Clear()
 		self.hasClose = nil
 		if not list then return end
-
+
 		if type(order) ~= "table" then
 			for v in pairs(list) do
 				sortlist[#sortlist + 1] = v
 			end
-			tsort(sortlist)
-
+			tsort(sortlist, sortTbl)
+
 			for i, key in ipairs(sortlist) do
 				AddListItem(self, key, list[key], itemType)
 				sortlist[i] = nil
@@ -618,7 +626,7 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function AddItem(self, value, text, itemType)
 		if self.list then
@@ -626,7 +634,7 @@ do
 			AddListItem(self, value, text, itemType)
 		end
 	end
-
+
 	-- exported
 	local function SetMultiselect(self, multi)
 		self.multiselect = multi
@@ -635,23 +643,23 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function GetMultiselect(self)
 		return self.multiselect
 	end
-
+
 	local function SetPulloutWidth(self, width)
 		self.pulloutWidth = width
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", nil, UIParent)
 		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
+
 		local self = {}
 		self.type = widgetType
 		self.frame = frame
@@ -659,10 +667,10 @@ do
 		self.count = count
 		frame.obj = self
 		dropdown.obj = self
-
+
 		self.OnRelease   = OnRelease
 		self.OnAcquire   = OnAcquire
-
+
 		self.ClearFocus  = ClearFocus

 		self.SetText     = SetText
@@ -677,9 +685,9 @@ do
 		self.SetItemValue = SetItemValue
 		self.SetItemDisabled = SetItemDisabled
 		self.SetPulloutWidth = SetPulloutWidth
-
+
 		self.alignoffset = 26
-
+
 		frame:SetScript("OnHide",Dropdown_OnHide)

 		dropdown:ClearAllPoints()
@@ -690,10 +698,10 @@ do
 		local left = _G[dropdown:GetName() .. "Left"]
 		local middle = _G[dropdown:GetName() .. "Middle"]
 		local right = _G[dropdown:GetName() .. "Right"]
-
+
 		middle:ClearAllPoints()
 		right:ClearAllPoints()
-
+
 		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
 		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
 		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -704,7 +712,7 @@ do
 		button:SetScript("OnEnter",Control_OnEnter)
 		button:SetScript("OnLeave",Control_OnLeave)
 		button:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local button_cover = CreateFrame("BUTTON",nil,self.frame)
 		self.button_cover = button_cover
 		button_cover.obj = self
@@ -713,14 +721,14 @@ do
 		button_cover:SetScript("OnEnter",Control_OnEnter)
 		button_cover:SetScript("OnLeave",Control_OnLeave)
 		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local text = _G[dropdown:GetName() .. "Text"]
 		self.text = text
 		text.obj = self
 		text:ClearAllPoints()
 		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
 		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
+
 		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
 		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -732,6 +740,6 @@ do
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
+end
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
index bf8b2c0..670cd4e 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
@@ -51,14 +51,14 @@ local function Constructor()
 	left:SetHeight(8)
 	left:SetPoint("LEFT", 3, 0)
 	left:SetPoint("RIGHT", label, "LEFT", -5, 0)
-	left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	left:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	left:SetTexCoord(0.81, 0.94, 0.5, 1)

 	local right = frame:CreateTexture(nil, "BACKGROUND")
 	right:SetHeight(8)
 	right:SetPoint("RIGHT", -3, 0)
 	right:SetPoint("LEFT", label, "RIGHT", 5, 0)
-	right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	right:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	right:SetTexCoord(0.81, 0.94, 0.5, 1)

 	local widget = {
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
index fdba650..092697e 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -56,7 +56,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
@@ -118,7 +118,7 @@ local function Constructor()

 	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
 	highlight:SetAllPoints(image)
-	highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
+	highlight:SetTexture(136580) -- Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight
 	highlight:SetTexCoord(0, 1, 0.23, 0.77)
 	highlight:SetBlendMode("ADD")

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
index 5ab7fea..76a2cf9 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
@@ -8,13 +8,6 @@ if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 -- Lua APIs
 local select, pairs = select, pairs

--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index cc7c8d5..79fddc4 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -2,7 +2,7 @@
 Label Widget
 Displays text and optionally an icon.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Label", 24
+local Type, Version = "Label", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -39,25 +39,30 @@ local function UpdateImageAnchor(self)
 			label:SetPoint("TOP", image, "BOTTOM")
 			label:SetPoint("LEFT")
 			label:SetWidth(width)
-			height = image:GetHeight() + label:GetHeight()
+			height = image:GetHeight() + label:GetStringHeight()
 		else
 			-- image on the left
 			image:SetPoint("TOPLEFT")
-			if image:GetHeight() > label:GetHeight() then
+			if image:GetHeight() > label:GetStringHeight() then
 				label:SetPoint("LEFT", image, "RIGHT", 4, 0)
 			else
 				label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
 			end
 			label:SetWidth(width - imagewidth - 4)
-			height = max(image:GetHeight(), label:GetHeight())
+			height = max(image:GetHeight(), label:GetStringHeight())
 		end
 	else
 		-- no image shown
 		label:SetPoint("TOPLEFT")
 		label:SetWidth(width)
-		height = label:GetHeight()
+		height = label:GetStringHeight()
 	end
-
+
+	-- avoid zero-height labels, since they can used as spacers
+	if not height or height == 0 then
+		height = 1
+	end
+
 	self.resizing = true
 	frame:SetHeight(height)
 	frame.height = height
@@ -108,7 +113,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			self.imageshown = true
 			local n = select("#", ...)
diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index c9b0d86..46a75b1 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -233,7 +233,7 @@ local methods = {
 		end
 		Layout(self)
 	end,
-
+
 	["ClearFocus"] = function(self)
 		self.editBox:ClearFocus()
 		self.frame:SetScript("OnShow", nil)
@@ -253,12 +253,12 @@ local methods = {
 	["GetCursorPosition"] = function(self)
 		return self.editBox:GetCursorPosition()
 	end,
-
+
 	["SetCursorPosition"] = function(self, ...)
 		return self.editBox:SetCursorPosition(...)
 	end,
-
-
+
+
 }

 --[[-----------------------------------------------------------------------------
@@ -273,7 +273,7 @@ local backdrop = {
 local function Constructor()
 	local frame = CreateFrame("Frame", nil, UIParent)
 	frame:Hide()
-
+
 	local widgetNum = AceGUI:GetNextWidgetNum(Type)

 	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -290,7 +290,7 @@ local function Constructor()
 	button:SetText(ACCEPT)
 	button:SetScript("OnClick", OnClick)
 	button:Disable()
-
+
 	local text = button:GetFontString()
 	text:ClearAllPoints()
 	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
@@ -339,7 +339,7 @@ local function Constructor()
 	editBox:SetScript("OnTextChanged", OnTextChanged)
 	editBox:SetScript("OnTextSet", OnTextSet)
 	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
+

 	scrollFrame:SetScrollChild(editBox)

diff --git a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 7466cb1..79e8628 100755
--- a/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Titan/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -57,10 +57,9 @@ local function Frame_OnMouseDown(frame)
 	AceGUI:ClearFocus()
 end

-local function Slider_OnValueChanged(frame)
+local function Slider_OnValueChanged(frame, newvalue)
 	local self = frame.obj
 	if not frame.setup then
-		local newvalue = frame:GetValue()
 		if self.step and self.step > 0 then
 			local min_value = self.min or 0
 			newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
@@ -106,7 +105,7 @@ local function EditBox_OnEnterPressed(frame)
 	else
 		value = tonumber(value)
 	end
-
+
 	if value then
 		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		self.slider:SetValue(value)
diff --git a/Titan/libs/AceHook-3.0/AceHook-3.0.lua b/Titan/libs/AceHook-3.0/AceHook-3.0.lua
index ad91467..6c75f9e 100755
--- a/Titan/libs/AceHook-3.0/AceHook-3.0.lua
+++ b/Titan/libs/AceHook-3.0/AceHook-3.0.lua
@@ -2,14 +2,14 @@
 -- Using AceHook-3.0 is recommended when you need to unhook your hooks again, so the hook chain isn't broken
 -- when you manually restore the original function.
 --
--- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
+-- **AceHook-3.0** can be embeded into your addon, either explicitly by calling AceHook:Embed(MyAddon) or by
 -- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
 -- and can be accessed directly, without having to explicitly call AceHook itself.\\
 -- It is recommended to embed AceHook, otherwise you'll have to specify a custom `self` on all calls you
 -- make into AceHook.
 -- @class file
 -- @name AceHook-3.0
--- @release $Id: AceHook-3.0.lua 1118 2014-10-12 08:21:54Z nevcairiel $
+-- @release $Id: AceHook-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
 local ACEHOOK_MAJOR, ACEHOOK_MINOR = "AceHook-3.0", 8
 local AceHook, oldminor = LibStub:NewLibrary(ACEHOOK_MAJOR, ACEHOOK_MINOR)

@@ -117,14 +117,14 @@ function donothing() end

 function hook(self, obj, method, handler, script, secure, raw, forceSecure, usage)
 	if not handler then handler = method end
-
+
 	-- These asserts make sure AceHooks's devs play by the rules.
 	assert(not script or type(script) == "boolean")
 	assert(not secure or type(secure) == "boolean")
 	assert(not raw or type(raw) == "boolean")
 	assert(not forceSecure or type(forceSecure) == "boolean")
 	assert(usage)
-
+
 	-- Error checking Battery!
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'object' - nil or table expected got %s", usage, type(obj)), 3)
@@ -146,8 +146,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			error(format("Cannot hook secure script %q; Use SecureHookScript(obj, method, [handler]) instead.", method), 3)
 		end
 	else
-		local issecure
-		if obj then
+		local issecure
+		if obj then
 			issecure = onceSecure[obj] and onceSecure[obj][method] or issecurevariable(obj, method)
 		else
 			issecure = onceSecure[method] or issecurevariable(method)
@@ -165,21 +165,21 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			end
 		end
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if uid then
 		if actives[uid] then
 			-- Only two sane choices exist here.  We either a) error 100% of the time or b) always unhook and then hook
 			-- choice b would likely lead to odd debuging conditions or other mysteries so we're going with a.
 			error(format("Attempting to rehook already active hook %s.", method))
 		end
-
+
 		if handlers[uid] == handler then -- turn on a decative hook, note enclosures break this ability, small memory leak
 			actives[uid] = true
 			return
@@ -197,7 +197,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		handlers[uid], actives[uid], scripts[uid] = nil, nil, nil
 		uid = nil
 	end
-
+
 	local orig
 	if script then
 		orig = obj:GetScript(method) or donothing
@@ -206,13 +206,13 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 	else
 		orig = _G[method]
 	end
-
+
 	if not orig then
 		error(format("%s: Attempting to hook a non existing target", usage), 3)
 	end
-
+
 	uid = createHook(self, handler, orig, secure, not (raw or secure))
-
+
 	if obj then
 		self.hooks[obj] = self.hooks[obj] or {}
 		registry[self][obj] = registry[self][obj] or {}
@@ -221,7 +221,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		if not secure then
 			self.hooks[obj][method] = orig
 		end
-
+
 		if script then
 			if not secure then
 				obj:SetScript(method, uid)
@@ -237,7 +237,7 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 		end
 	else
 		registry[self][method] = uid
-
+
 		if not secure then
 			_G[method] = uid
 			self.hooks[method] = orig
@@ -245,8 +245,8 @@ function hook(self, obj, method, handler, script, secure, raw, forceSecure, usag
 			hooksecurefunc(method, uid)
 		end
 	end
-
-	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
+
+	actives[uid], handlers[uid], scripts[uid] = true, handler, script and true or nil
 end

 --- Hook a function or a method on an object.
@@ -262,7 +262,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:Hook("ActionButton_UpdateHotkeys", true)
@@ -275,12 +275,12 @@ function AceHook:Hook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end

-	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
+	hook(self, object, method, handler, false, false, false, hookSecure or false, "Usage: Hook([object], method, [handler], [hookSecure])")
 end

 --- RawHook a function or a method on an object.
@@ -297,7 +297,7 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
 --   -- Hook ActionButton_UpdateHotkeys, overwriting the secure status
 --   self:RawHook("ActionButton_UpdateHotkeys", true)
@@ -314,11 +314,11 @@ function AceHook:RawHook(object, method, handler, hookSecure)
 	if type(object) == "string" then
 		method, handler, hookSecure, object = object, method, handler, nil
 	end
-
+
 	if handler == true then
 		handler, hookSecure = nil, true
 	end
-
+
 	hook(self, object, method, handler, false, false, true, hookSecure or false,  "Usage: RawHook([object], method, [handler], [hookSecure])")
 end

@@ -337,7 +337,7 @@ function AceHook:SecureHook(object, method, handler)
 	if type(object) == "string" then
 		method, handler, object = object, method, nil
 	end
-
+
 	hook(self, object, method, handler, false, true, false, false,  "Usage: SecureHook([object], method, [handler])")
 end

@@ -354,9 +354,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:HookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -380,9 +380,9 @@ end
 -- @usage
 -- -- create an addon with AceHook embeded
 -- MyAddon = LibStub("AceAddon-3.0"):NewAddon("HookDemo", "AceHook-3.0")
---
+--
 -- function MyAddon:OnEnable()
---   -- Hook the OnShow of FriendsFrame
+--   -- Hook the OnShow of FriendsFrame
 --   self:RawHookScript(FriendsFrame, "OnShow", "FriendsFrameOnShow")
 -- end
 --
@@ -420,54 +420,54 @@ function AceHook:Unhook(obj, method)
 	if type(obj) == "string" then
 		method, obj = obj, nil
 	end
-
+
 	if obj and type(obj) ~= "table" then
 		error(format("%s: 'obj' - expecting nil or table got %s", usage, type(obj)), 2)
 	end
 	if type(method) ~= "string" then
 		error(format("%s: 'method' - expeting string got %s", usage, type(method)), 2)
 	end
-
+
 	local uid
 	if obj then
 		uid = registry[self][obj] and registry[self][obj][method]
 	else
 		uid = registry[self][method]
 	end
-
+
 	if not uid or not actives[uid] then
 		-- Declining to error on an unneeded unhook since the end effect is the same and this would just be annoying.
 		return false
 	end
-
+
 	actives[uid], handlers[uid] = nil, nil
-
+
 	if obj then
 		registry[self][obj][method] = nil
 		registry[self][obj] = next(registry[self][obj]) and registry[self][obj] or nil
-
+
 		-- if the hook reference doesnt exist, then its a secure hook, just bail out and dont do any unhooking
 		if not self.hooks[obj] or not self.hooks[obj][method] then return true end
-
+
 		if scripts[uid] and obj:GetScript(method) == uid then  -- unhooks scripts
-			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
+			obj:SetScript(method, self.hooks[obj][method] ~= donothing and self.hooks[obj][method] or nil)
 			scripts[uid] = nil
 		elseif obj and self.hooks[obj] and self.hooks[obj][method] and obj[method] == uid then -- unhooks methods
 			obj[method] = self.hooks[obj][method]
 		end
-
+
 		self.hooks[obj][method] = nil
 		self.hooks[obj] = next(self.hooks[obj]) and self.hooks[obj] or nil
 	else
 		registry[self][method] = nil
-
+
 		-- if self.hooks[method] doesn't exist, then this is a SecureHook, just bail out
 		if not self.hooks[method] then return true end
-
+
 		if self.hooks[method] and _G[method] == uid then -- unhooks functions
 			_G[method] = self.hooks[method]
 		end
-
+
 		self.hooks[method] = nil
 	end
 	return true
@@ -501,7 +501,7 @@ function AceHook:IsHooked(obj, method)
 			return true, handlers[registry[self][obj][method]]
 		end
 	end
-
+
 	return false, nil
 end

diff --git a/Titan/libs/AceTimer-3.0/AceTimer-3.0.lua b/Titan/libs/AceTimer-3.0/AceTimer-3.0.lua
index 7d89500..f576fe7 100755
--- a/Titan/libs/AceTimer-3.0/AceTimer-3.0.lua
+++ b/Titan/libs/AceTimer-3.0/AceTimer-3.0.lua
@@ -15,7 +15,7 @@
 -- make into AceTimer.
 -- @class file
 -- @name AceTimer-3.0
--- @release $Id: AceTimer-3.0.lua 1170 2018-03-29 17:38:58Z funkydude $
+-- @release $Id: AceTimer-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $

 local MAJOR, MINOR = "AceTimer-3.0", 17 -- Bump minor on changes
 local AceTimer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -47,7 +47,7 @@ local function new(self, loop, func, delay, ...)
 	activeTimers[timer] = timer

 	-- Create new timer closure to wrap the "timer" object
-	timer.callback = function()
+	timer.callback = function()
 		if not timer.cancelled then
 			if type(timer.func) == "string" then
 				-- We manually set the unpack count to prevent issues with an arg set that contains nil and ends with nil
diff --git a/Titan/libs/CHANGES.txt b/Titan/libs/CHANGES.txt
index f709a8c..4dd1447 100755
--- a/Titan/libs/CHANGES.txt
+++ b/Titan/libs/CHANGES.txt
@@ -1,8 +1,25 @@
 ------------------------------------------------------------------------
-r102 | funkydude | 2018-07-17 19:25:42 +0000 (Tue, 17 Jul 2018) | 1 line
+r60 | nevcairiel | 2019-06-14 23:53:41 +0000 (Fri, 14 Jun 2019) | 1 line
 Changed paths:
-   M /trunk/LibSharedMedia-3.0.toc
+   M /trunk/AceGUI-3.0-SharedMediaWidgets.toc

-bump version
+Update TOC
+------------------------------------------------------------------------
+r59 | nevcairiel | 2019-06-14 23:53:15 +0000 (Fri, 14 Jun 2019) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+
+Remove unnecessary UpdateScrollChildRect() calls. The Scroll Child is recomputed when needed automatically, and this improves performance significantly
+------------------------------------------------------------------------
+r58 | nevcairiel | 2018-06-21 23:05:54 +0000 (Thu, 21 Jun 2018) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+
+Hard code a version to avoid issues with the version being populated from the hosting repository
 ------------------------------------------------------------------------

diff --git a/Titan/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Titan/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
index e0fe1af..3bd4a37 100755
--- a/Titan/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Titan/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,5 +1,5 @@
---[[ $Id: CallbackHandler-1.0.lua 14 2010-08-09 00:43:38Z mikk $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 6
+--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 7
 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

 if not CallbackHandler then return end -- No upgrade needed
@@ -22,41 +22,15 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-	local next, xpcall, eh = ...
-
-	local method, ARGS
-	local function call() method(ARGS) end
-
-	local function dispatch(handlers, ...)
-		local index
-		index, method = next(handlers)
-		if not method then return end
-		local OLD_ARGS = ARGS
-		ARGS = ...
-		repeat
-			xpcall(call, eh)
-			index, method = next(handlers, index)
-		until not method
-		ARGS = OLD_ARGS
-	end
-
-	return dispatch
-	]]
-
-	local ARGS, OLD_ARGS = {}, {}
-	for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
-	code = code:gsub("OLD_ARGS", tconcat(OLD_ARGS, ", ")):gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
+local function Dispatch(handlers, ...)
+	local index, method = next(handlers)
+	if not method then return end
+	repeat
+		xpcall(method, errorhandler, ...)
+		index, method = next(handlers, index)
+	until not method
 end

-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-
 --------------------------------------------------------------------------
 -- CallbackHandler:New
 --
@@ -65,9 +39,7 @@ end})
 --   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
 --   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.

-function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, OnUsed, OnUnused)
-	-- TODO: Remove this after beta has gone out
-	assert(not OnUsed and not OnUnused, "ACE-80: OnUsed/OnUnused are deprecated. Callbacks are now done to registry.OnUsed and registry.OnUnused")
+function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)

 	RegisterName = RegisterName or "RegisterCallback"
 	UnregisterName = UnregisterName or "UnregisterCallback"
@@ -89,7 +61,7 @@ function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAll
 		local oldrecurse = registry.recurse
 		registry.recurse = oldrecurse + 1

-		Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
+		Dispatch(events[eventname], eventname, ...)

 		registry.recurse = oldrecurse

diff --git a/Titan/libs/LibSharedMedia-3.0/CHANGES.txt b/Titan/libs/LibSharedMedia-3.0/CHANGES.txt
deleted file mode 100755
index f709a8c..0000000
--- a/Titan/libs/LibSharedMedia-3.0/CHANGES.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-------------------------------------------------------------------------
-r102 | funkydude | 2018-07-17 19:25:42 +0000 (Tue, 17 Jul 2018) | 1 line
-Changed paths:
-   M /trunk/LibSharedMedia-3.0.toc
-
-bump version
-------------------------------------------------------------------------
-
diff --git a/Titan/libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Titan/libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
new file mode 100755
index 0000000..3bd4a37
--- /dev/null
+++ b/Titan/libs/LibSharedMedia-3.0/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -0,0 +1,212 @@
+--[[ $Id: CallbackHandler-1.0.lua 1186 2018-07-21 14:19:18Z nevcairiel $ ]]
+local MAJOR, MINOR = "CallbackHandler-1.0", 7
+local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not CallbackHandler then return end -- No upgrade needed
+
+local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
+
+-- Lua APIs
+local tconcat = table.concat
+local assert, error, loadstring = assert, error, loadstring
+local setmetatable, rawset, rawget = setmetatable, rawset, rawget
+local next, select, pairs, type, tostring = next, select, pairs, type, tostring
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: geterrorhandler
+
+local xpcall = xpcall
+
+local function errorhandler(err)
+	return geterrorhandler()(err)
+end
+
+local function Dispatch(handlers, ...)
+	local index, method = next(handlers)
+	if not method then return end
+	repeat
+		xpcall(method, errorhandler, ...)
+		index, method = next(handlers, index)
+	until not method
+end
+
+--------------------------------------------------------------------------
+-- CallbackHandler:New
+--
+--   target            - target object to embed public APIs in
+--   RegisterName      - name of the callback registration API, default "RegisterCallback"
+--   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
+--   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
+
+function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName)
+
+	RegisterName = RegisterName or "RegisterCallback"
+	UnregisterName = UnregisterName or "UnregisterCallback"
+	if UnregisterAllName==nil then	-- false is used to indicate "don't want this method"
+		UnregisterAllName = "UnregisterAllCallbacks"
+	end
+
+	-- we declare all objects and exported APIs inside this closure to quickly gain access
+	-- to e.g. function names, the "target" parameter, etc
+
+
+	-- Create the registry object
+	local events = setmetatable({}, meta)
+	local registry = { recurse=0, events=events }
+
+	-- registry:Fire() - fires the given event/message into the registry
+	function registry:Fire(eventname, ...)
+		if not rawget(events, eventname) or not next(events[eventname]) then return end
+		local oldrecurse = registry.recurse
+		registry.recurse = oldrecurse + 1
+
+		Dispatch(events[eventname], eventname, ...)
+
+		registry.recurse = oldrecurse
+
+		if registry.insertQueue and oldrecurse==0 then
+			-- Something in one of our callbacks wanted to register more callbacks; they got queued
+			for eventname,callbacks in pairs(registry.insertQueue) do
+				local first = not rawget(events, eventname) or not next(events[eventname])	-- test for empty before. not test for one member after. that one member may have been overwritten.
+				for self,func in pairs(callbacks) do
+					events[eventname][self] = func
+					-- fire OnUsed callback?
+					if first and registry.OnUsed then
+						registry.OnUsed(registry, target, eventname)
+						first = nil
+					end
+				end
+			end
+			registry.insertQueue = nil
+		end
+	end
+
+	-- Registration of a callback, handles:
+	--   self["method"], leads to self["method"](self, ...)
+	--   self with function ref, leads to functionref(...)
+	--   "addonId" (instead of self) with function ref, leads to functionref(...)
+	-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
+	target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
+		if type(eventname) ~= "string" then
+			error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
+		end
+
+		method = method or eventname
+
+		local first = not rawget(events, eventname) or not next(events[eventname])	-- test for empty before. not test for one member after. that one member may have been overwritten.
+
+		if type(method) ~= "string" and type(method) ~= "function" then
+			error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
+		end
+
+		local regfunc
+
+		if type(method) == "string" then
+			-- self["method"] calling style
+			if type(self) ~= "table" then
+				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
+			elseif self==target then
+				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
+			elseif type(self[method]) ~= "function" then
+				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
+			end
+
+			if select("#",...)>=1 then	-- this is not the same as testing for arg==nil!
+				local arg=select(1,...)
+				regfunc = function(...) self[method](self,arg,...) end
+			else
+				regfunc = function(...) self[method](self,...) end
+			end
+		else
+			-- function ref with self=object or self="addonId" or self=thread
+			if type(self)~="table" and type(self)~="string" and type(self)~="thread" then
+				error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2)
+			end
+
+			if select("#",...)>=1 then	-- this is not the same as testing for arg==nil!
+				local arg=select(1,...)
+				regfunc = function(...) method(arg,...) end
+			else
+				regfunc = method
+			end
+		end
+
+
+		if events[eventname][self] or registry.recurse<1 then
+		-- if registry.recurse<1 then
+			-- we're overwriting an existing entry, or not currently recursing. just set it.
+			events[eventname][self] = regfunc
+			-- fire OnUsed callback?
+			if registry.OnUsed and first then
+				registry.OnUsed(registry, target, eventname)
+			end
+		else
+			-- we're currently processing a callback in this registry, so delay the registration of this new entry!
+			-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
+			registry.insertQueue = registry.insertQueue or setmetatable({},meta)
+			registry.insertQueue[eventname][self] = regfunc
+		end
+	end
+
+	-- Unregister a callback
+	target[UnregisterName] = function(self, eventname)
+		if not self or self==target then
+			error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
+		end
+		if type(eventname) ~= "string" then
+			error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
+		end
+		if rawget(events, eventname) and events[eventname][self] then
+			events[eventname][self] = nil
+			-- Fire OnUnused callback?
+			if registry.OnUnused and not next(events[eventname]) then
+				registry.OnUnused(registry, target, eventname)
+			end
+		end
+		if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
+			registry.insertQueue[eventname][self] = nil
+		end
+	end
+
+	-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
+	if UnregisterAllName then
+		target[UnregisterAllName] = function(...)
+			if select("#",...)<1 then
+				error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
+			end
+			if select("#",...)==1 and ...==target then
+				error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
+			end
+
+
+			for i=1,select("#",...) do
+				local self = select(i,...)
+				if registry.insertQueue then
+					for eventname, callbacks in pairs(registry.insertQueue) do
+						if callbacks[self] then
+							callbacks[self] = nil
+						end
+					end
+				end
+				for eventname, callbacks in pairs(events) do
+					if callbacks[self] then
+						callbacks[self] = nil
+						-- Fire OnUnused callback?
+						if registry.OnUnused and not next(callbacks) then
+							registry.OnUnused(registry, target, eventname)
+						end
+					end
+				end
+			end
+		end
+	end
+
+	return registry
+end
+
+
+-- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
+-- try to upgrade old implicit embeds since the system is selfcontained and
+-- relies on closures to work.
+
diff --git a/Titan/libs/LibSharedMedia-3.0/Changelog-LibSharedMedia-3.0-7.0.3.txt b/Titan/libs/LibSharedMedia-3.0/Changelog-LibSharedMedia-3.0-7.0.3.txt
deleted file mode 100644
index 6d2cdc1..0000000
--- a/Titan/libs/LibSharedMedia-3.0/Changelog-LibSharedMedia-3.0-7.0.3.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-------------------------------------------------------------------------
-r96 | funkydude | 2016-08-17 19:17:24 +0000 (Wed, 17 Aug 2016) | 1 line
-Changed paths:
-   A /tags/7.0.3 (from /trunk:95)
-
-Tagging as 7.0.3
-------------------------------------------------------------------------
-r95 | funkydude | 2016-07-19 22:45:58 +0000 (Tue, 19 Jul 2016) | 1 line
-Changed paths:
-   M /trunk/LibSharedMedia-3.0.toc
-
-bump toc
-------------------------------------------------------------------------
diff --git a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
deleted file mode 100755
index 4a31cfe..0000000
--- a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
+++ /dev/null
@@ -1,292 +0,0 @@
---[[
-Name: LibSharedMedia-3.0
-Revision: $Revision: 91 $
-Author: Elkano (elkano@gmx.de)
-Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
-Website: http://www.wowace.com/projects/libsharedmedia-3-0/
-Description: Shared handling of media data (fonts, sounds, textures, ...) between addons.
-Dependencies: LibStub, CallbackHandler-1.0
-License: LGPL v2.1
-]]
-
-local MAJOR, MINOR = "LibSharedMedia-3.0", 6010002 -- 6.1.0 v2 / increase manually on changes
-local lib = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not lib then return end
-
-local _G = getfenv(0)
-
-local pairs		= _G.pairs
-local type		= _G.type
-
-local band			= _G.bit.band
-
-local table_insert	= _G.table.insert
-local table_sort	= _G.table.sort
-
-local locale = GetLocale()
-local locale_is_western
-local LOCALE_MASK = 0
-lib.LOCALE_BIT_koKR		= 1
-lib.LOCALE_BIT_ruRU		= 2
-lib.LOCALE_BIT_zhCN		= 4
-lib.LOCALE_BIT_zhTW		= 8
-lib.LOCALE_BIT_western	= 128
-
-local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
-
-lib.callbacks		= lib.callbacks			or CallbackHandler:New(lib)
-
-lib.DefaultMedia	= lib.DefaultMedia		or {}
-lib.MediaList		= lib.MediaList			or {}
-lib.MediaTable		= lib.MediaTable		or {}
-lib.MediaType		= lib.MediaType			or {}
-lib.OverrideMedia	= lib.OverrideMedia		or {}
-
-local defaultMedia = lib.DefaultMedia
-local mediaList = lib.MediaList
-local mediaTable = lib.MediaTable
-local overrideMedia = lib.OverrideMedia
-
-
--- create mediatype constants
-lib.MediaType.BACKGROUND	= "background"			-- background textures
-lib.MediaType.BORDER		= "border"				-- border textures
-lib.MediaType.FONT			= "font"				-- fonts
-lib.MediaType.STATUSBAR		= "statusbar"			-- statusbar textures
-lib.MediaType.SOUND			= "sound"				-- sound files
-
--- populate lib with default Blizzard data
--- BACKGROUND
-if not lib.MediaTable.background then lib.MediaTable.background = {} end
-lib.MediaTable.background["None"]									= [[]]
-lib.MediaTable.background["Blizzard Collections Background"]		= [[Interface\Collections\CollectionsBackgroundTile]]
-lib.MediaTable.background["Blizzard Dialog Background"]				= [[Interface\DialogFrame\UI-DialogBox-Background]]
-lib.MediaTable.background["Blizzard Dialog Background Dark"]		= [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
-lib.MediaTable.background["Blizzard Dialog Background Gold"]		= [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
-lib.MediaTable.background["Blizzard Garrison Background"]			= [[Interface\Garrison\GarrisonUIBackground]]
-lib.MediaTable.background["Blizzard Garrison Background 2"]			= [[Interface\Garrison\GarrisonUIBackground2]]
-lib.MediaTable.background["Blizzard Garrison Background 3"]			= [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
-lib.MediaTable.background["Blizzard Low Health"]					= [[Interface\FullScreenTextures\LowHealth]]
-lib.MediaTable.background["Blizzard Marble"]						= [[Interface\FrameGeneral\UI-Background-Marble]]
-lib.MediaTable.background["Blizzard Out of Control"]				= [[Interface\FullScreenTextures\OutOfControl]]
-lib.MediaTable.background["Blizzard Parchment"]						= [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
-lib.MediaTable.background["Blizzard Parchment 2"]					= [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]
-lib.MediaTable.background["Blizzard Rock"]							= [[Interface\FrameGeneral\UI-Background-Rock]]
-lib.MediaTable.background["Blizzard Tabard Background"]				= [[Interface\TabardFrame\TabardFrameBackground]]
-lib.MediaTable.background["Blizzard Tooltip"]						= [[Interface\Tooltips\UI-Tooltip-Background]]
-lib.MediaTable.background["Solid"]									= [[Interface\Buttons\WHITE8X8]]
-lib.DefaultMedia.background = "None"
-
--- BORDER
-if not lib.MediaTable.border then lib.MediaTable.border = {} end
-lib.MediaTable.border["None"]								= [[]]
-lib.MediaTable.border["Blizzard Achievement Wood"]			= [[Interface\AchievementFrame\UI-Achievement-WoodBorder]]
-lib.MediaTable.border["Blizzard Chat Bubble"]				= [[Interface\Tooltips\ChatBubble-Backdrop]]
-lib.MediaTable.border["Blizzard Dialog"]					= [[Interface\DialogFrame\UI-DialogBox-Border]]
-lib.MediaTable.border["Blizzard Dialog Gold"]				= [[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
-lib.MediaTable.border["Blizzard Party"]						= [[Interface\CHARACTERFRAME\UI-Party-Border]]
-lib.MediaTable.border["Blizzard Tooltip"]					= [[Interface\Tooltips\UI-Tooltip-Border]]
-lib.DefaultMedia.border = "None"
-
--- FONT
-if not lib.MediaTable.font then lib.MediaTable.font = {} end
-local SML_MT_font = lib.MediaTable.font
---[[
-All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
-Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/)
-latin means check for: de, en, es, fr, it, pt
-
-file				name							latin	koKR	ruRU	zhCN	zhTW
-2002.ttf			2002							X		X		X		-		-
-2002B.ttf			2002 Bold						X		X		X		-		-
-ARHei.ttf			AR CrystalzcuheiGBK Demibold	X		-		X		X		X
-ARIALN.TTF			Arial Narrow					X		-		X		-		-
-ARKai_C.ttf			AR ZhongkaiGBK Medium (Combat)	X		-		X		X		X
-ARKai_T.ttf			AR ZhongkaiGBK Medium			X		-		X		X		X
-bHEI00M.ttf			AR Heiti2 Medium B5				-		-		-		-		X
-bHEI01B.ttf			AR Heiti2 Bold B5				-		-		-		-		X
-bKAI00M.ttf			AR Kaiti Medium B5				-		-		-		-		X
-bLEI00D.ttf			AR Leisu Demi B5				-		-		-		-		X
-FRIZQT__.TTF		Friz Quadrata TT				X		-		-		-		-
-FRIZQT___CYR.TTF	FrizQuadrataCTT					x		-		X		-		-
-K_Damage.TTF		YDIWingsM						-		X		X		-		-
-K_Pagetext.TTF		MoK								X		X		X		-		-
-MORPHEUS.TTF		Morpheus						X		-		-		-		-
-MORPHEUS_CYR.TTF	Morpheus						X		-		X		-		-
-NIM_____.ttf		Nimrod MT						X		-		X		-		-
-SKURRI.TTF			Skurri							X		-		-		-		-
-SKURRI_CYR.TTF		Skurri							X		-		X		-		-
-
-WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
-Due to this, we cannot use it as a replacement for FRIZQT__.TTF
-]]
-
-if locale == "koKR" then
-	LOCALE_MASK = lib.LOCALE_BIT_koKR
---
-	SML_MT_font["굵은 글꼴"]		= [[Fonts\2002B.TTF]]
-	SML_MT_font["기본 글꼴"]		= [[Fonts\2002.TTF]]
-	SML_MT_font["데미지 글꼴"]		= [[Fonts\K_Damage.TTF]]
-	SML_MT_font["퀘스트 글꼴"]		= [[Fonts\K_Pagetext.TTF]]
---
-	lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
---
-elseif locale == "zhCN" then
-	LOCALE_MASK = lib.LOCALE_BIT_zhCN
---
-	SML_MT_font["伤害数字"]		= [[Fonts\ARKai_C.ttf]]
-	SML_MT_font["默认"]			= [[Fonts\ARKai_T.ttf]]
-	SML_MT_font["聊天"]			= [[Fonts\ARHei.ttf]]
---
-	lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
---
-elseif locale == "zhTW" then
-	LOCALE_MASK = lib.LOCALE_BIT_zhTW
---
-	SML_MT_font["提示訊息"]		= [[Fonts\bHEI00M.ttf]]
-	SML_MT_font["聊天"]			= [[Fonts\bHEI01B.ttf]]
-	SML_MT_font["傷害數字"]		= [[Fonts\bKAI00M.ttf]]
-	SML_MT_font["預設"]			= [[Fonts\bLEI00D.ttf]]
---
-	lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
-
-elseif locale == "ruRU" then
-	LOCALE_MASK = lib.LOCALE_BIT_ruRU
---
-	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
-	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
-	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
-	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
-	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
-	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
-	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT___CYR.TTF]]
-	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
-	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
-	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
-	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
---
-	lib.DefaultMedia.font = "Friz Quadrata TT"
---
-else
-	LOCALE_MASK = lib.LOCALE_BIT_western
-	locale_is_western = true
---
-	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
-	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
-	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
-	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
-	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
-	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
-	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT__.TTF]]
-	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
-	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
-	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
-	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
---
-	lib.DefaultMedia.font = "Friz Quadrata TT"
---
-end
-
--- STATUSBAR
-if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
-lib.MediaTable.statusbar["Blizzard"]						= [[Interface\TargetingFrame\UI-StatusBar]]
-lib.MediaTable.statusbar["Blizzard Character Skills Bar"]	= [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
-lib.MediaTable.statusbar["Blizzard Raid Bar"]				= [[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
-lib.DefaultMedia.statusbar = "Blizzard"
-
--- SOUND
-if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
-lib.MediaTable.sound["None"]								= [[Interface\Quiet.ogg]]	-- Relies on the fact that PlaySound[File] doesn't error on non-existing input.
-lib.DefaultMedia.sound = "None"
-
-local function rebuildMediaList(mediatype)
-	local mtable = mediaTable[mediatype]
-	if not mtable then return end
-	if not mediaList[mediatype] then mediaList[mediatype] = {} end
-	local mlist = mediaList[mediatype]
-	-- list can only get larger, so simply overwrite it
-	local i = 0
-	for k in pairs(mtable) do
-		i = i + 1
-		mlist[i] = k
-	end
-	table_sort(mlist)
-end
-
-function lib:Register(mediatype, key, data, langmask)
-	if type(mediatype) ~= "string" then
-		error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
-	end
-	if type(key) ~= "string" then
-		error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
-	end
-	mediatype = mediatype:lower()
-	if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then return false end
-	if mediatype == lib.MediaType.SOUND and type(data) == "string" then
-		local path = data:lower()
-		-- Only ogg and mp3 are valid sounds.
-		if not path:find(".ogg", nil, true) and not path:find(".mp3", nil, true) then
-			return false
-		end
-	end
-	if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
-	local mtable = mediaTable[mediatype]
-	if mtable[key] then return false end
-
-	mtable[key] = data
-	rebuildMediaList(mediatype)
-	self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
-	return true
-end
-
-function lib:Fetch(mediatype, key, noDefault)
-	local mtt = mediaTable[mediatype]
-	local overridekey = overrideMedia[mediatype]
-	local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil
-	return result ~= "" and result or nil
-end
-
-function lib:IsValid(mediatype, key)
-	return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
-end
-
-function lib:HashTable(mediatype)
-	return mediaTable[mediatype]
-end
-
-function lib:List(mediatype)
-	if not mediaTable[mediatype] then
-		return nil
-	end
-	if not mediaList[mediatype] then
-		rebuildMediaList(mediatype)
-	end
-	return mediaList[mediatype]
-end
-
-function lib:GetGlobal(mediatype)
-	return overrideMedia[mediatype]
-end
-
-function lib:SetGlobal(mediatype, key)
-	if not mediaTable[mediatype] then
-		return false
-	end
-	overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
-	self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
-	return true
-end
-
-function lib:GetDefault(mediatype)
-	return defaultMedia[mediatype]
-end
-
-function lib:SetDefault(mediatype, key)
-	if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
-		defaultMedia[mediatype] = key
-		return true
-	else
-		return false
-	end
-end
diff --git a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
index 2a1f890..b6b7865 100755
--- a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
+++ b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0.toc
@@ -1,15 +1,15 @@
-## Interface: 80000
+## Interface: 80200
 ## LoadOnDemand: 1

 ## Title: Lib: SharedMedia-3.0
 ## Notes: Shared handling of media data (fonts, sounds, textures, ...) between addons.
 ## Author: Elkano
-## Version: 3.0-102
+## Version: 3.0-112
 ## X-Website: http://www.wowace.com/projects/libsharedmedia-3-0/
 ## X-Category: Library

-## X-Revision: 102
-## X-Date: 2018-07-17T19:25:42Z
+## X-Revision: 112
+## X-Date: 2019-07-11T16:45:13Z

 LibStub\LibStub.lua
 CallbackHandler-1.0\CallbackHandler-1.0.lua
diff --git a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
new file mode 100755
index 0000000..1f588e8
--- /dev/null
+++ b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
@@ -0,0 +1,298 @@
+--[[
+Name: LibSharedMedia-3.0
+Revision: $Revision: 112 $
+Author: Elkano (elkano@gmx.de)
+Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
+Website: http://www.wowace.com/projects/libsharedmedia-3-0/
+Description: Shared handling of media data (fonts, sounds, textures, ...) between addons.
+Dependencies: LibStub, CallbackHandler-1.0
+License: LGPL v2.1
+]]
+
+local MAJOR, MINOR = "LibSharedMedia-3.0", 8020001 -- 8.2.0 v1 / increase manually on changes
+local lib = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not lib then return end
+
+local _G = getfenv(0)
+
+local pairs		= _G.pairs
+local type		= _G.type
+
+local band			= _G.bit.band
+local table_sort	= _G.table.sort
+
+local locale = GetLocale()
+local locale_is_western
+local LOCALE_MASK = 0
+lib.LOCALE_BIT_koKR		= 1
+lib.LOCALE_BIT_ruRU		= 2
+lib.LOCALE_BIT_zhCN		= 4
+lib.LOCALE_BIT_zhTW		= 8
+lib.LOCALE_BIT_western	= 128
+
+local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
+
+lib.callbacks		= lib.callbacks			or CallbackHandler:New(lib)
+
+lib.DefaultMedia	= lib.DefaultMedia		or {}
+lib.MediaList		= lib.MediaList			or {}
+lib.MediaTable		= lib.MediaTable		or {}
+lib.MediaType		= lib.MediaType			or {}
+lib.OverrideMedia	= lib.OverrideMedia		or {}
+
+local defaultMedia = lib.DefaultMedia
+local mediaList = lib.MediaList
+local mediaTable = lib.MediaTable
+local overrideMedia = lib.OverrideMedia
+
+
+-- create mediatype constants
+lib.MediaType.BACKGROUND	= "background"			-- background textures
+lib.MediaType.BORDER		= "border"				-- border textures
+lib.MediaType.FONT			= "font"				-- fonts
+lib.MediaType.STATUSBAR		= "statusbar"			-- statusbar textures
+lib.MediaType.SOUND			= "sound"				-- sound files
+
+-- populate lib with default Blizzard data
+-- BACKGROUND
+if not lib.MediaTable.background then lib.MediaTable.background = {} end
+lib.MediaTable.background["None"]									= [[]]
+lib.MediaTable.background["Blizzard Collections Background"]		= [[Interface\Collections\CollectionsBackgroundTile]]
+lib.MediaTable.background["Blizzard Dialog Background"]				= [[Interface\DialogFrame\UI-DialogBox-Background]]
+lib.MediaTable.background["Blizzard Dialog Background Dark"]		= [[Interface\DialogFrame\UI-DialogBox-Background-Dark]]
+lib.MediaTable.background["Blizzard Dialog Background Gold"]		= [[Interface\DialogFrame\UI-DialogBox-Gold-Background]]
+lib.MediaTable.background["Blizzard Garrison Background"]			= [[Interface\Garrison\GarrisonUIBackground]]
+lib.MediaTable.background["Blizzard Garrison Background 2"]			= [[Interface\Garrison\GarrisonUIBackground2]]
+lib.MediaTable.background["Blizzard Garrison Background 3"]			= [[Interface\Garrison\GarrisonMissionUIInfoBoxBackgroundTile]]
+lib.MediaTable.background["Blizzard Low Health"]					= [[Interface\FullScreenTextures\LowHealth]]
+lib.MediaTable.background["Blizzard Marble"]						= [[Interface\FrameGeneral\UI-Background-Marble]]
+lib.MediaTable.background["Blizzard Out of Control"]				= [[Interface\FullScreenTextures\OutOfControl]]
+lib.MediaTable.background["Blizzard Parchment"]						= [[Interface\AchievementFrame\UI-Achievement-Parchment-Horizontal]]
+lib.MediaTable.background["Blizzard Parchment 2"]					= [[Interface\AchievementFrame\UI-GuildAchievement-Parchment-Horizontal]]
+lib.MediaTable.background["Blizzard Rock"]							= [[Interface\FrameGeneral\UI-Background-Rock]]
+lib.MediaTable.background["Blizzard Tabard Background"]				= [[Interface\TabardFrame\TabardFrameBackground]]
+lib.MediaTable.background["Blizzard Tooltip"]						= [[Interface\Tooltips\UI-Tooltip-Background]]
+lib.MediaTable.background["Solid"]									= [[Interface\Buttons\WHITE8X8]]
+lib.DefaultMedia.background = "None"
+
+-- BORDER
+if not lib.MediaTable.border then lib.MediaTable.border = {} end
+lib.MediaTable.border["None"]								= [[]]
+lib.MediaTable.border["Blizzard Achievement Wood"]			= [[Interface\AchievementFrame\UI-Achievement-WoodBorder]]
+lib.MediaTable.border["Blizzard Chat Bubble"]				= [[Interface\Tooltips\ChatBubble-Backdrop]]
+lib.MediaTable.border["Blizzard Dialog"]					= [[Interface\DialogFrame\UI-DialogBox-Border]]
+lib.MediaTable.border["Blizzard Dialog Gold"]				= [[Interface\DialogFrame\UI-DialogBox-Gold-Border]]
+lib.MediaTable.border["Blizzard Party"]						= [[Interface\CHARACTERFRAME\UI-Party-Border]]
+lib.MediaTable.border["Blizzard Tooltip"]					= [[Interface\Tooltips\UI-Tooltip-Border]]
+lib.DefaultMedia.border = "None"
+
+-- FONT
+if not lib.MediaTable.font then lib.MediaTable.font = {} end
+local SML_MT_font = lib.MediaTable.font
+--[[
+All font files are currently in all clients, the following table depicts which font supports which charset as of 5.0.4
+Fonts were checked using langcover.pl from DejaVu fonts (http://sourceforge.net/projects/dejavu/) and FontForge (http://fontforge.org/)
+latin means check for: de, en, es, fr, it, pt
+
+file				name							latin	koKR	ruRU	zhCN	zhTW
+2002.ttf			2002							X		X		X		-		-
+2002B.ttf			2002 Bold						X		X		X		-		-
+ARHei.ttf			AR CrystalzcuheiGBK Demibold	X		-		X		X		X
+ARIALN.TTF			Arial Narrow					X		-		X		-		-
+ARKai_C.ttf			AR ZhongkaiGBK Medium (Combat)	X		-		X		X		X
+ARKai_T.ttf			AR ZhongkaiGBK Medium			X		-		X		X		X
+bHEI00M.ttf			AR Heiti2 Medium B5				-		-		-		-		X
+bHEI01B.ttf			AR Heiti2 Bold B5				-		-		-		-		X
+bKAI00M.ttf			AR Kaiti Medium B5				-		-		-		-		X
+bLEI00D.ttf			AR Leisu Demi B5				-		-		-		-		X
+FRIZQT__.TTF		Friz Quadrata TT				X		-		-		-		-
+FRIZQT___CYR.TTF	FrizQuadrataCTT					x		-		X		-		-
+K_Damage.TTF		YDIWingsM						-		X		X		-		-
+K_Pagetext.TTF		MoK								X		X		X		-		-
+MORPHEUS.TTF		Morpheus						X		-		-		-		-
+MORPHEUS_CYR.TTF	Morpheus						X		-		X		-		-
+NIM_____.ttf		Nimrod MT						X		-		X		-		-
+SKURRI.TTF			Skurri							X		-		-		-		-
+SKURRI_CYR.TTF		Skurri							X		-		X		-		-
+
+WARNING: Although FRIZQT___CYR is available on western clients, it doesn't support special European characters e.g. é, ï, ö
+Due to this, we cannot use it as a replacement for FRIZQT__.TTF
+]]
+
+if locale == "koKR" then
+	LOCALE_MASK = lib.LOCALE_BIT_koKR
+--
+	SML_MT_font["굵은 글꼴"]		= [[Fonts\2002B.TTF]]
+	SML_MT_font["기본 글꼴"]		= [[Fonts\2002.TTF]]
+	SML_MT_font["데미지 글꼴"]		= [[Fonts\K_Damage.TTF]]
+	SML_MT_font["퀘스트 글꼴"]		= [[Fonts\K_Pagetext.TTF]]
+--
+	lib.DefaultMedia["font"] = "기본 글꼴" -- someone from koKR please adjust if needed
+--
+elseif locale == "zhCN" then
+	LOCALE_MASK = lib.LOCALE_BIT_zhCN
+--
+	SML_MT_font["伤害数字"]		= [[Fonts\ARKai_C.ttf]]
+	SML_MT_font["默认"]			= [[Fonts\ARKai_T.ttf]]
+	SML_MT_font["聊天"]			= [[Fonts\ARHei.ttf]]
+--
+	lib.DefaultMedia["font"] = "默认" -- someone from zhCN please adjust if needed
+--
+elseif locale == "zhTW" then
+	LOCALE_MASK = lib.LOCALE_BIT_zhTW
+--
+	SML_MT_font["提示訊息"]		= [[Fonts\bHEI00M.ttf]]
+	SML_MT_font["聊天"]			= [[Fonts\bHEI01B.ttf]]
+	SML_MT_font["傷害數字"]		= [[Fonts\bKAI00M.ttf]]
+	SML_MT_font["預設"]			= [[Fonts\bLEI00D.ttf]]
+--
+	lib.DefaultMedia["font"] = "預設" -- someone from zhTW please adjust if needed
+
+elseif locale == "ruRU" then
+	LOCALE_MASK = lib.LOCALE_BIT_ruRU
+--
+	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
+	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
+	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
+	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
+	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT___CYR.TTF]]
+	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
+	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
+	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
+	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
+--
+	lib.DefaultMedia.font = "Friz Quadrata TT"
+--
+else
+	LOCALE_MASK = lib.LOCALE_BIT_western
+	locale_is_western = true
+--
+	SML_MT_font["2002"]								= [[Fonts\2002.TTF]]
+	SML_MT_font["2002 Bold"]						= [[Fonts\2002B.TTF]]
+	SML_MT_font["AR CrystalzcuheiGBK Demibold"]		= [[Fonts\ARHei.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium (Combat)"]	= [[Fonts\ARKai_C.TTF]]
+	SML_MT_font["AR ZhongkaiGBK Medium"]			= [[Fonts\ARKai_T.TTF]]
+	SML_MT_font["Arial Narrow"]						= [[Fonts\ARIALN.TTF]]
+	SML_MT_font["Friz Quadrata TT"]					= [[Fonts\FRIZQT__.TTF]]
+	SML_MT_font["MoK"]								= [[Fonts\K_Pagetext.TTF]]
+	SML_MT_font["Morpheus"]							= [[Fonts\MORPHEUS_CYR.TTF]]
+	SML_MT_font["Nimrod MT"]						= [[Fonts\NIM_____.ttf]]
+	SML_MT_font["Skurri"]							= [[Fonts\SKURRI_CYR.TTF]]
+--
+	lib.DefaultMedia.font = "Friz Quadrata TT"
+--
+end
+
+-- STATUSBAR
+if not lib.MediaTable.statusbar then lib.MediaTable.statusbar = {} end
+lib.MediaTable.statusbar["Blizzard"]						= [[Interface\TargetingFrame\UI-StatusBar]]
+lib.MediaTable.statusbar["Blizzard Character Skills Bar"]	= [[Interface\PaperDollInfoFrame\UI-Character-Skills-Bar]]
+lib.MediaTable.statusbar["Blizzard Raid Bar"]				= [[Interface\RaidFrame\Raid-Bar-Hp-Fill]]
+lib.MediaTable.statusbar["Solid"]							= [[Interface\Buttons\WHITE8X8]]
+lib.DefaultMedia.statusbar = "Blizzard"
+
+-- SOUND
+if not lib.MediaTable.sound then lib.MediaTable.sound = {} end
+lib.MediaTable.sound["None"]		= 1 -- Relies on the fact that PlaySound[File] doesn't error on existing invalid input files.
+lib.DefaultMedia.sound = "None"
+
+local function rebuildMediaList(mediatype)
+	local mtable = mediaTable[mediatype]
+	if not mtable then return end
+	if not mediaList[mediatype] then mediaList[mediatype] = {} end
+	local mlist = mediaList[mediatype]
+	-- list can only get larger, so simply overwrite it
+	local i = 0
+	for k in pairs(mtable) do
+		i = i + 1
+		mlist[i] = k
+	end
+	table_sort(mlist)
+end
+
+function lib:Register(mediatype, key, data, langmask)
+	if type(mediatype) ~= "string" then
+		error(MAJOR..":Register(mediatype, key, data, langmask) - mediatype must be string, got "..type(mediatype))
+	end
+	if type(key) ~= "string" then
+		error(MAJOR..":Register(mediatype, key, data, langmask) - key must be string, got "..type(key))
+	end
+	mediatype = mediatype:lower()
+	if mediatype == lib.MediaType.FONT and ((langmask and band(langmask, LOCALE_MASK) == 0) or not (langmask or locale_is_western)) then
+		-- ignore fonts that aren't flagged as supporting local glyphs on non-western clients
+		return false
+	end
+	if type(data) == "string" and (mediatype == lib.MediaType.BACKGROUND or mediatype == lib.MediaType.BORDER or mediatype == lib.MediaType.STATUSBAR or mediatype == lib.MediaType.SOUND) then
+		local path = data:lower()
+		if not path:find("^interface") then
+			-- files accessed via path only allowed from interface folder
+			return false
+		end
+		if mediatype == lib.MediaType.SOUND and not (path:find(".ogg", nil, true) or not path:find(".mp3", nil, true)) then
+			-- Only ogg and mp3 are valid sounds.
+			return false
+		end
+	end
+	if not mediaTable[mediatype] then mediaTable[mediatype] = {} end
+	local mtable = mediaTable[mediatype]
+	if mtable[key] then return false end
+
+	mtable[key] = data
+	rebuildMediaList(mediatype)
+	self.callbacks:Fire("LibSharedMedia_Registered", mediatype, key)
+	return true
+end
+
+function lib:Fetch(mediatype, key, noDefault)
+	local mtt = mediaTable[mediatype]
+	local overridekey = overrideMedia[mediatype]
+	local result = mtt and ((overridekey and mtt[overridekey] or mtt[key]) or (not noDefault and defaultMedia[mediatype] and mtt[defaultMedia[mediatype]])) or nil
+	return result ~= "" and result or nil
+end
+
+function lib:IsValid(mediatype, key)
+	return mediaTable[mediatype] and (not key or mediaTable[mediatype][key]) and true or false
+end
+
+function lib:HashTable(mediatype)
+	return mediaTable[mediatype]
+end
+
+function lib:List(mediatype)
+	if not mediaTable[mediatype] then
+		return nil
+	end
+	if not mediaList[mediatype] then
+		rebuildMediaList(mediatype)
+	end
+	return mediaList[mediatype]
+end
+
+function lib:GetGlobal(mediatype)
+	return overrideMedia[mediatype]
+end
+
+function lib:SetGlobal(mediatype, key)
+	if not mediaTable[mediatype] then
+		return false
+	end
+	overrideMedia[mediatype] = (key and mediaTable[mediatype][key]) and key or nil
+	self.callbacks:Fire("LibSharedMedia_SetGlobal", mediatype, overrideMedia[mediatype])
+	return true
+end
+
+function lib:GetDefault(mediatype)
+	return defaultMedia[mediatype]
+end
+
+function lib:SetDefault(mediatype, key)
+	if mediaTable[mediatype] and mediaTable[mediatype][key] and not defaultMedia[mediatype] then
+		defaultMedia[mediatype] = key
+		return true
+	else
+		return false
+	end
+end
diff --git a/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml
new file mode 100755
index 0000000..7313228
--- /dev/null
+++ b/Titan/libs/LibSharedMedia-3.0/LibSharedMedia-3.0/lib.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="LibSharedMedia-3.0.lua" />
+</Ui>
diff --git a/Titan/libs/LibSharedMedia-3.0/LibStub/LibStub.lua b/Titan/libs/LibSharedMedia-3.0/LibStub/LibStub.lua
new file mode 100755
index 0000000..f5fc919
--- /dev/null
+++ b/Titan/libs/LibSharedMedia-3.0/LibStub/LibStub.lua
@@ -0,0 +1,51 @@
+-- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $
+-- 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
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
+local LibStub = _G[LIBSTUB_MAJOR]
+
+-- Check to see is this version of the stub is obsolete
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	-- LibStub:NewLibrary(major, minor)
+	-- major (string) - the major version of the library
+	-- minor (string or number ) - the minor version of the library
+	--
+	-- returns nil if a newer or same version of the lib is already present
+	-- returns empty library object or old library object if upgrade is needed
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
+
+		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
+
+	-- LibStub:GetLibrary(major, [silent])
+	-- major (string) - the major version of the library
+	-- silent (boolean) - if true, library is optional, silently return nil if its not found
+	--
+	-- throws an error if the library can not be found (except silent is set)
+	-- returns the library object if found
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	-- LibStub:IterateLibraries()
+	--
+	-- Returns an iterator for the currently registered libraries
+	function LibStub:IterateLibraries()
+		return pairs(self.libs)
+	end
+
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
diff --git a/Titan/libs/LibSharedMedia-3.0/lib.xml b/Titan/libs/LibSharedMedia-3.0/lib.xml
index 7313228..fd1c0cd 100755
--- a/Titan/libs/LibSharedMedia-3.0/lib.xml
+++ b/Titan/libs/LibSharedMedia-3.0/lib.xml
@@ -1,4 +1,5 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
-	<Script file="LibSharedMedia-3.0.lua" />
+	<Include file="LibSharedMedia-3.0\lib.xml"/>
 </Ui>
+
diff --git a/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.lua
old mode 100644
new mode 100755
index 5ebb35d..efdb6cb
--- a/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -1,6 +1,6 @@
 --- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
 -- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
+-- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
 -- stand-alone distribution.
 --
 -- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
@@ -24,17 +24,17 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1102 2013-10-25 14:15:23Z nevcairiel $
-local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 34
+-- @release $Id: AceGUI-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
+local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 36
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

 if not AceGUI then return end -- No upgrade needed

 -- Lua APIs
-local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
+local tinsert = table.insert
 local select, pairs, next, type = select, pairs, next, type
-local error, assert, loadstring = error, assert, loadstring
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
+local error, assert = error, assert
+local setmetatable, rawget = setmetatable, rawget
 local math_max = math.max

 -- WoW APIs
@@ -51,7 +51,7 @@ AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
 AceGUI.WidgetBase = AceGUI.WidgetBase or {}
 AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
 AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
+
 -- local upvalues
 local WidgetRegistry = AceGUI.WidgetRegistry
 local LayoutRegistry = AceGUI.LayoutRegistry
@@ -66,39 +66,10 @@ local function errorhandler(err)
 	return geterrorhandler()(err)
 end

-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			method = func
-			if not method then return end
-			ARGS = ...
-			return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
 local function safecall(func, ...)
-	return Dispatchers[select("#", ...)](func, ...)
+	if func then
+		return xpcall(func, errorhandler, ...)
+	end
 end

 -- Recycling functions
@@ -108,7 +79,7 @@ do
 	-- Internal Storage of the objects changed, from an array table
 	-- to a hash table, and additionally we introduced versioning on
 	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
+	-- anyway, so we just clear the storage now, and don't try to
 	-- convert the storage tables to the new format.
 	-- This should generally not cause *many* widgets to end up in trash,
 	-- since once dialogs are opened, all addons should be loaded already
@@ -118,7 +89,7 @@ do
 	if oldminor and oldminor < 29 and AceGUI.objPools then
 		AceGUI.objPools = nil
 	end
-
+
 	AceGUI.objPools = AceGUI.objPools or {}
 	local objPools = AceGUI.objPools
 	--Returns a new instance, if none are available either returns a new table or calls the given contructor
@@ -126,11 +97,11 @@ do
 		if not WidgetRegistry[type] then
 			error("Attempt to instantiate unknown widget type", 2)
 		end
-
+
 		if not objPools[type] then
 			objPools[type] = {}
 		end
-
+
 		local newObj = next(objPools[type])
 		if not newObj then
 			newObj = WidgetRegistry[type]()
@@ -180,12 +151,12 @@ function AceGUI:Create(type)
 			widget.OnAcquire = widget.Aquire
 			widget.Aquire = nil
 		end
-
+
 		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
+			widget.OnRelease = rawget(widget, "Release")
 			widget.Release = nil
 		end
-
+
 		if widget.OnAcquire then
 			widget:OnAcquire()
 		else
@@ -267,18 +238,18 @@ end
 --[[
 	Widgets must provide the following functions
 		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
+
 	And the following members
 		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
 		type - the type of the object, same as the name given to :RegisterWidget()
-
+
 	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
 	It will be cleared automatically when a widget is released
 	Placing values directly into a widget object should be avoided
-
+
 	If the Widget can act as a container for other Widgets the following
 		content - frame or derivitive that children will be anchored to
-
+
 	The Widget can supply the following Optional Members
 		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
 		:OnWidthSet(width) - Called when the width of the widget is changed
@@ -294,21 +265,21 @@ end
 -- Widget Base Template --
 --------------------------
 do
-	local WidgetBase = AceGUI.WidgetBase
-
+	local WidgetBase = AceGUI.WidgetBase
+
 	WidgetBase.SetParent = function(self, parent)
 		local frame = self.frame
 		frame:SetParent(nil)
 		frame:SetParent(parent.content)
 		self.parent = parent
 	end
-
+
 	WidgetBase.SetCallback = function(self, name, func)
 		if type(func) == "function" then
 			self.events[name] = func
 		end
 	end
-
+
 	WidgetBase.Fire = function(self, name, ...)
 		if self.events[name] then
 			local success, ret = safecall(self.events[name], self, name, ...)
@@ -317,7 +288,7 @@ do
 			end
 		end
 	end
-
+
 	WidgetBase.SetWidth = function(self, width)
 		self.frame:SetWidth(width)
 		self.frame.width = width
@@ -325,7 +296,7 @@ do
 			self:OnWidthSet(width)
 		end
 	end
-
+
 	WidgetBase.SetRelativeWidth = function(self, width)
 		if width <= 0 or width > 1 then
 			error(":SetRelativeWidth(width): Invalid relative width.", 2)
@@ -333,7 +304,7 @@ do
 		self.relWidth = width
 		self.width = "relative"
 	end
-
+
 	WidgetBase.SetHeight = function(self, height)
 		self.frame:SetHeight(height)
 		self.frame.height = height
@@ -341,7 +312,7 @@ do
 			self:OnHeightSet(height)
 		end
 	end
-
+
 	--[[ WidgetBase.SetRelativeHeight = function(self, height)
 		if height <= 0 or height > 1 then
 			error(":SetRelativeHeight(height): Invalid relative height.", 2)
@@ -353,47 +324,47 @@ do
 	WidgetBase.IsVisible = function(self)
 		return self.frame:IsVisible()
 	end
-
+
 	WidgetBase.IsShown= function(self)
 		return self.frame:IsShown()
 	end
-
+
 	WidgetBase.Release = function(self)
 		AceGUI:Release(self)
 	end
-
+
 	WidgetBase.SetPoint = function(self, ...)
 		return self.frame:SetPoint(...)
 	end
-
+
 	WidgetBase.ClearAllPoints = function(self)
 		return self.frame:ClearAllPoints()
 	end
-
+
 	WidgetBase.GetNumPoints = function(self)
 		return self.frame:GetNumPoints()
 	end
-
+
 	WidgetBase.GetPoint = function(self, ...)
 		return self.frame:GetPoint(...)
-	end
-
+	end
+
 	WidgetBase.GetUserDataTable = function(self)
 		return self.userdata
 	end
-
+
 	WidgetBase.SetUserData = function(self, key, value)
 		self.userdata[key] = value
 	end
-
+
 	WidgetBase.GetUserData = function(self, key)
 		return self.userdata[key]
 	end
-
+
 	WidgetBase.IsFullHeight = function(self)
 		return self.height == "fill"
 	end
-
+
 	WidgetBase.SetFullHeight = function(self, isFull)
 		if isFull then
 			self.height = "fill"
@@ -401,11 +372,11 @@ do
 			self.height = nil
 		end
 	end
-
+
 	WidgetBase.IsFullWidth = function(self)
 		return self.width == "fill"
 	end
-
+
 	WidgetBase.SetFullWidth = function(self, isFull)
 		if isFull then
 			self.width = "fill"
@@ -413,29 +384,29 @@ do
 			self.width = nil
 		end
 	end
-
+
 --	local function LayoutOnUpdate(this)
 --		this:SetScript("OnUpdate",nil)
 --		this.obj:PerformLayout()
 --	end
-
+
 	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
+
 	WidgetContainerBase.PauseLayout = function(self)
 		self.LayoutPaused = true
 	end
-
+
 	WidgetContainerBase.ResumeLayout = function(self)
 		self.LayoutPaused = nil
 	end
-
+
 	WidgetContainerBase.PerformLayout = function(self)
 		if self.LayoutPaused then
 			return
 		end
 		safecall(self.LayoutFunc, self.content, self.children)
 	end
-
+
 	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
 	WidgetContainerBase.DoLayout = function(self)
 		self:PerformLayout()
@@ -443,7 +414,7 @@ do
 --			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
 --		end
 	end
-
+
 	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
 		if beforeWidget then
 			local siblingIndex = 1
@@ -451,7 +422,7 @@ do
 				if widget == beforeWidget then
 					break
 				end
-				siblingIndex = siblingIndex + 1
+				siblingIndex = siblingIndex + 1
 			end
 			tinsert(self.children, siblingIndex, child)
 		else
@@ -461,7 +432,7 @@ do
 		child.frame:Show()
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.AddChildren = function(self, ...)
 		for i = 1, select("#", ...) do
 			local child = select(i, ...)
@@ -471,7 +442,7 @@ do
 		end
 		self:DoLayout()
 	end
-
+
 	WidgetContainerBase.ReleaseChildren = function(self)
 		local children = self.children
 		for i = 1,#children do
@@ -479,7 +450,7 @@ do
 			children[i] = nil
 		end
 	end
-
+
 	WidgetContainerBase.SetLayout = function(self, Layout)
 		self.LayoutFunc = AceGUI:GetLayout(Layout)
 	end
@@ -503,7 +474,7 @@ do
 			end
 		end
 	end
-
+
 	local function ContentResize(this)
 		if this:GetWidth() and this:GetHeight() then
 			this.width = this:GetWidth()
@@ -515,7 +486,7 @@ do
 	setmetatable(WidgetContainerBase, {__index=WidgetBase})

 	--One of these function should be called on each Widget Instance as part of its creation process
-
+
 	--- Register a widget-class as a container for newly created widgets.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsContainer(widget)
@@ -531,7 +502,7 @@ do
 		widget:SetLayout("List")
 		return widget
 	end
-
+
 	--- Register a widget-class as a widget.
 	-- @param widget The widget class
 	function AceGUI:RegisterAsWidget(widget)
@@ -558,11 +529,11 @@ end
 -- @param Version The version of the widget
 function AceGUI:RegisterWidgetType(Name, Constructor, Version)
 	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
+	assert(type(Version) == "number")
+
 	local oldVersion = WidgetVersions[Name]
 	if oldVersion and oldVersion >= Version then return end
-
+
 	WidgetVersions[Name] = Version
 	WidgetRegistry[Name] = Constructor
 end
@@ -631,7 +602,7 @@ AceGUI:RegisterLayout("List",
 		local width = content.width or content:GetWidth() or 0
 		for i = 1, #children do
 			local child = children[i]
-
+
 			local frame = child.frame
 			frame:ClearAllPoints()
 			frame:Show()
@@ -640,22 +611,22 @@ AceGUI:RegisterLayout("List",
 			else
 				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
 			end
-
+
 			if child.width == "fill" then
 				child:SetWidth(width)
 				frame:SetPoint("RIGHT", content)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			elseif child.width == "relative" then
 				child:SetWidth(width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
 			end
-
+
 			height = height + (frame.height or frame:GetHeight() or 0)
 		end
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
@@ -690,19 +661,17 @@ AceGUI:RegisterLayout("Flow",
 		--height of the current row
 		local rowheight = 0
 		local rowoffset = 0
-		local lastrowoffset
-
+
 		local width = content.width or content:GetWidth() or 0
-
+
 		--control at the start of the row
 		local rowstart
 		local rowstartoffset
-		local lastrowstart
 		local isfullheight
-
+
 		local frameoffset
 		local lastframeoffset
-		local oversize
+		local oversize
 		for i = 1, #children do
 			local child = children[i]
 			oversize = nil
@@ -710,17 +679,17 @@ AceGUI:RegisterLayout("Flow",
 			local frameheight = frame.height or frame:GetHeight() or 0
 			local framewidth = frame.width or frame:GetWidth() or 0
 			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
+			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
 			-- That was moving all widgets half the widgets size down, is that intended?
 			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
 			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
 			-- TODO: Investigate moar!
 			frameoffset = child.alignoffset or (frameheight / 2)
-
+
 			if child.width == "relative" then
 				framewidth = width * child.relWidth
 			end
-
+
 			frame:Show()
 			frame:ClearAllPoints()
 			if i == 1 then
@@ -759,11 +728,11 @@ AceGUI:RegisterLayout("Flow",
 				else
 					--handles cases where the new height is higher than either control because of the offsets
 					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
+
 					--offset is always the larger of the two offsets
 					rowoffset = math_max(rowoffset, frameoffset)
 					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
+
 					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
 					usedwidth = framewidth + usedwidth
 				end
@@ -772,11 +741,11 @@ AceGUI:RegisterLayout("Flow",
 			if child.width == "fill" then
 				safelayoutcall(child, "SetWidth", width)
 				frame:SetPoint("RIGHT", content)
-
+
 				usedwidth = 0
 				rowstart = frame
 				rowstartoffset = frameoffset
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -785,7 +754,7 @@ AceGUI:RegisterLayout("Flow",
 				rowstartoffset = rowoffset
 			elseif child.width == "relative" then
 				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
+
 				if child.DoLayout then
 					child:DoLayout()
 				end
@@ -794,20 +763,238 @@ AceGUI:RegisterLayout("Flow",
 					frame:SetPoint("RIGHT", content)
 				end
 			end
-
+
 			if child.height == "fill" then
 				frame:SetPoint("BOTTOM", content)
 				isfullheight = true
 			end
 		end
-
+
 		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
 		if isfullheight then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
 		elseif rowstart then
 			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
 		end
-
+
 		height = height + rowheight + 3
 		safecall(content.obj.LayoutFinished, content.obj, nil, height)
 	end)
+
+-- Get alignment method and value. Possible alignment methods are a callback, a number, "start", "middle", "end", "fill" or "TOPLEFT", "BOTTOMRIGHT" etc.
+local GetCellAlign = function (dir, tableObj, colObj, cellObj, cell, child)
+	local fn = cellObj and (cellObj["align" .. dir] or cellObj.align)
+			or colObj and (colObj["align" .. dir] or colObj.align)
+			or tableObj["align" .. dir] or tableObj.align
+			or "CENTERLEFT"
+	local child, cell, val = child or 0, cell or 0, nil
+
+	if type(fn) == "string" then
+		fn = fn:lower()
+		fn = dir == "V" and (fn:sub(1, 3) == "top" and "start" or fn:sub(1, 6) == "bottom" and "end" or fn:sub(1, 6) == "center" and "middle")
+		  or dir == "H" and (fn:sub(-4) == "left" and "start" or fn:sub(-5) == "right" and "end" or fn:sub(-6) == "center" and "middle")
+		  or fn
+		val = (fn == "start" or fn == "fill") and 0 or fn == "end" and cell - child or (cell - child) / 2
+	elseif type(fn) == "function" then
+		val = fn(child or 0, cell, dir)
+	else
+		val = fn
+	end
+
+	return fn, max(0, min(val, cell))
+end
+
+-- Get width or height for multiple cells combined
+local GetCellDimension = function (dir, laneDim, from, to, space)
+	local dim = 0
+	for cell=from,to do
+		dim = dim + (laneDim[cell] or 0)
+	end
+	return dim + max(0, to - from) * (space or 0)
+end
+
+--[[ Options
+============
+Container:
+ - columns ({col, col, ...}): Column settings. "col" can be a number (<= 0: content width, <1: rel. width, <10: weight, >=10: abs. width) or a table with column setting.
+ - space, spaceH, spaceV: Overall, horizontal and vertical spacing between cells.
+ - align, alignH, alignV: Overall, horizontal and vertical cell alignment. See GetCellAlign() for possible values.
+Columns:
+ - width: Fixed column width (nil or <=0: content width, <1: rel. width, >=1: abs. width).
+ - min or 1: Min width for content based width
+ - max or 2: Max width for content based width
+ - weight: Flexible column width. The leftover width after accounting for fixed-width columns is distributed to weighted columns according to their weights.
+ - align, alignH, alignV: Overwrites the container setting for alignment.
+Cell:
+ - colspan: Makes a cell span multiple columns.
+ - rowspan: Makes a cell span multiple rows.
+ - align, alignH, alignV: Overwrites the container and column setting for alignment.
+]]
+AceGUI:RegisterLayout("Table",
+	function (content, children)
+		local obj = content.obj
+		obj:PauseLayout()
+
+		local tableObj = obj:GetUserData("table")
+		local cols = tableObj.columns
+		local spaceH = tableObj.spaceH or tableObj.space or 0
+		local spaceV = tableObj.spaceV or tableObj.space or 0
+		local totalH = (content:GetWidth() or content.width or 0) - spaceH * (#cols - 1)
+
+		-- We need to reuse these because layout events can come in very frequently
+		local layoutCache = obj:GetUserData("layoutCache")
+		if not layoutCache then
+			layoutCache = {{}, {}, {}, {}, {}, {}}
+			obj:SetUserData("layoutCache", layoutCache)
+		end
+		local t, laneH, laneV, rowspans, rowStart, colStart = unpack(layoutCache)
+
+		-- Create the grid
+		local n, slotFound = 0
+		for i,child in ipairs(children) do
+			if child:IsShown() then
+				repeat
+					n = n + 1
+					local col = (n - 1) % #cols + 1
+					local row = ceil(n / #cols)
+					local rowspan = rowspans[col]
+					local cell = rowspan and rowspan.child or child
+					local cellObj = cell:GetUserData("cell")
+					slotFound = not rowspan
+
+					-- Rowspan
+					if not rowspan and cellObj and cellObj.rowspan then
+						rowspan = {child = child, from = row, to = row + cellObj.rowspan - 1}
+						rowspans[col] = rowspan
+					end
+					if rowspan and i == #children then
+						rowspan.to = row
+					end
+
+					-- Colspan
+					local colspan = max(0, min((cellObj and cellObj.colspan or 1) - 1, #cols - col))
+					n = n + colspan
+
+					-- Place the cell
+					if not rowspan or rowspan.to == row then
+						t[n] = cell
+						rowStart[cell] = rowspan and rowspan.from or row
+						colStart[cell] = col
+
+						if rowspan then
+							rowspans[col] = nil
+						end
+					end
+				until slotFound
+			end
+		end
+
+		local rows = ceil(n / #cols)
+
+		-- Determine fixed size cols and collect weights
+		local extantH, totalWeight = totalH, 0
+		for col,colObj in ipairs(cols) do
+			laneH[col] = 0
+
+			if type(colObj) == "number" then
+				colObj = {[colObj >= 1 and colObj < 10 and "weight" or "width"] = colObj}
+				cols[col] = colObj
+			end
+
+			if colObj.weight then
+				-- Weight
+				totalWeight = totalWeight + (colObj.weight or 1)
+			else
+				if not colObj.width or colObj.width <= 0 then
+					-- Content width
+					for row=1,rows do
+						local child = t[(row - 1) * #cols + col]
+						if child then
+							local f = child.frame
+							f:ClearAllPoints()
+							local childH = f:GetWidth() or 0
+
+							laneH[col] = max(laneH[col], childH - GetCellDimension("H", laneH, colStart[child], col - 1, spaceH))
+						end
+					end
+
+					laneH[col] = max(colObj.min or colObj[1] or 0, min(laneH[col], colObj.max or colObj[2] or laneH[col]))
+				else
+					-- Rel./Abs. width
+					laneH[col] = colObj.width < 1 and colObj.width * totalH or colObj.width
+				end
+				extantH = max(0, extantH - laneH[col])
+			end
+		end
+
+		-- Determine sizes based on weight
+		local scale = totalWeight > 0 and extantH / totalWeight or 0
+		for col,colObj in pairs(cols) do
+			if colObj.weight then
+				laneH[col] = scale * colObj.weight
+			end
+		end
+
+		-- Arrange children
+		for row=1,rows do
+			local rowV = 0
+
+			-- Horizontal placement and sizing
+			for col=1,#cols do
+				local child = t[(row - 1) * #cols + col]
+				if child then
+					local colObj = cols[colStart[child]]
+					local cellObj = child:GetUserData("cell")
+					local offsetH = GetCellDimension("H", laneH, 1, colStart[child] - 1, spaceH) + (colStart[child] == 1 and 0 or spaceH)
+					local cellH = GetCellDimension("H", laneH, colStart[child], col, spaceH)
+
+					local f = child.frame
+					f:ClearAllPoints()
+					local childH = f:GetWidth() or 0
+
+					local alignFn, align = GetCellAlign("H", tableObj, colObj, cellObj, cellH, childH)
+					f:SetPoint("LEFT", content, offsetH + align, 0)
+					if child:IsFullWidth() or alignFn == "fill" or childH > cellH then
+						f:SetPoint("RIGHT", content, "LEFT", offsetH + align + cellH, 0)
+					end
+
+					if child.DoLayout then
+						child:DoLayout()
+					end
+
+					rowV = max(rowV, (f:GetHeight() or 0) - GetCellDimension("V", laneV, rowStart[child], row - 1, spaceV))
+				end
+			end
+
+			laneV[row] = rowV
+
+			-- Vertical placement and sizing
+			for col=1,#cols do
+				local child = t[(row - 1) * #cols + col]
+				if child then
+					local colObj = cols[colStart[child]]
+					local cellObj = child:GetUserData("cell")
+					local offsetV = GetCellDimension("V", laneV, 1, rowStart[child] - 1, spaceV) + (rowStart[child] == 1 and 0 or spaceV)
+					local cellV = GetCellDimension("V", laneV, rowStart[child], row, spaceV)
+
+					local f = child.frame
+					local childV = f:GetHeight() or 0
+
+					local alignFn, align = GetCellAlign("V", tableObj, colObj, cellObj, cellV, childV)
+					if child:IsFullHeight() or alignFn == "fill" then
+						f:SetHeight(cellV)
+					end
+					f:SetPoint("TOP", content, 0, -(offsetV + align))
+				end
+			end
+		end
+
+		-- Calculate total height
+		local totalV = GetCellDimension("V", laneV, 1, #laneV, spaceV)
+
+		-- Cleanup
+		for _,v in pairs(layoutCache) do wipe(v) end
+
+		safecall(obj.LayoutFinished, obj, nil, totalV)
+		obj:ResumeLayout()
+	end)
diff --git a/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.xml b/Titan/libs/Libs/AceGUI-3.0/AceGUI-3.0.xml
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
old mode 100644
new mode 100755
index 18e49cb..aacb0fc
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -150,7 +150,7 @@ local function Constructor()
 		widget[method] = func
 	end
 	dropdown.parentgroup = widget
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
old mode 100644
new mode 100755
index bb93cc5..aff1416
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 Frame Container
 -------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 24
+local Type, Version = "Frame", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -21,10 +21,14 @@ local CreateFrame, UIParent = CreateFrame, UIParent
 Scripts
 -------------------------------------------------------------------------------]]
 local function Button_OnClick(frame)
-	PlaySound("gsTitleOptionExit")
+	PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 	frame.obj:Hide()
 end

+local function Frame_OnShow(frame)
+	frame.obj:Fire("OnShow")
+end
+
 local function Frame_OnClose(frame)
 	frame.obj:Fire("OnClose")
 end
@@ -186,6 +190,7 @@ local function Constructor()
 	frame:SetBackdropColor(0, 0, 0, 1)
 	frame:SetMinResize(400, 200)
 	frame:SetToplevel(true)
+	frame:SetScript("OnShow", Frame_OnShow)
 	frame:SetScript("OnHide", Frame_OnClose)
 	frame:SetScript("OnMouseDown", Frame_OnMouseDown)

@@ -214,7 +219,7 @@ local function Constructor()
 	statustext:SetText("")

 	local titlebg = frame:CreateTexture(nil, "OVERLAY")
-	titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
 	titlebg:SetPoint("TOP", 0, 12)
 	titlebg:SetWidth(100)
@@ -230,14 +235,14 @@ local function Constructor()
 	titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)

 	local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg_l:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
 	titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
 	titlebg_l:SetWidth(30)
 	titlebg_l:SetHeight(40)

 	local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+	titlebg_r:SetTexture(131080) -- Interface\\DialogFrame\\UI-DialogBox-Header
 	titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
 	titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
 	titlebg_r:SetWidth(30)
@@ -255,7 +260,7 @@ local function Constructor()
 	line1:SetWidth(14)
 	line1:SetHeight(14)
 	line1:SetPoint("BOTTOMRIGHT", -8, 8)
-	line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	local x = 0.1 * 14/17
 	line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -263,7 +268,7 @@ local function Constructor()
 	line2:SetWidth(8)
 	line2:SetHeight(8)
 	line2:SetPoint("BOTTOMRIGHT", -8, 8)
-	line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	local x = 0.1 * 8/17
 	line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
old mode 100644
new mode 100755
index 1695f48..be6052f
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -2,15 +2,13 @@
 ScrollFrame Container
 Plain container that scrolls its content and doesn't grow in height.
 -------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 24
+local Type, Version = "ScrollFrame", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

-local IsLegion = select(4, GetBuildInfo()) >= 70000
-
 -- Lua APIs
 local pairs, assert, type = pairs, assert, type
-local min, max, floor, abs = math.min, math.max, math.floor, math.abs
+local min, max, floor = math.min, math.max, math.floor

 -- WoW APIs
 local CreateFrame, UIParent = CreateFrame, UIParent
@@ -42,7 +40,7 @@ end
 Methods
 -------------------------------------------------------------------------------]]
 local methods = {
-	["OnAcquire"] = function(self)
+	["OnAcquire"] = function(self)
 		self:SetScroll(0)
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,
@@ -55,7 +53,7 @@ local methods = {
 		self.scrollframe:SetPoint("BOTTOMRIGHT")
 		self.scrollbar:Hide()
 		self.scrollBarShown = nil
-		self.content.height, self.content.width = nil, nil
+		self.content.height, self.content.width, self.content.original_width = nil, nil, nil
 	end,

 	["SetScroll"] = function(self, value)
@@ -79,7 +77,7 @@ local methods = {
 	["MoveScroll"] = function(self, value)
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
+
 		if self.scrollBarShown then
 			local diff = height - viewheight
 			local delta = 1
@@ -96,7 +94,6 @@ local methods = {
 		local status = self.status or self.localstatus
 		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
 		local offset = status.offset or 0
-		local curvalue = self.scrollbar:GetValue()
 		-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
 		-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
 		if viewheight < height + 2 then
@@ -105,6 +102,9 @@ local methods = {
 				self.scrollbar:Hide()
 				self.scrollbar:SetValue(0)
 				self.scrollframe:SetPoint("BOTTOMRIGHT")
+				if self.content.original_width then
+					self.content.width = self.content.original_width
+				end
 				self:DoLayout()
 			end
 		else
@@ -112,6 +112,9 @@ local methods = {
 				self.scrollBarShown = true
 				self.scrollbar:Show()
 				self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
+				if self.content.original_width then
+					self.content.width = self.content.original_width - 20
+				end
 				self:DoLayout()
 			end
 			local value = (offset / (viewheight - height) * 1000)
@@ -130,6 +133,11 @@ local methods = {

 	["LayoutFinished"] = function(self, width, height)
 		self.content:SetHeight(height or 0 + 20)
+
+		-- update the scrollframe
+		self:FixScroll()
+
+		-- schedule another update when everything has "settled"
 		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
 	end,

@@ -143,7 +151,8 @@ local methods = {

 	["OnWidthSet"] = function(self, width)
 		local content = self.content
-		content.width = width
+		content.width = width - (self.scrollBarShown and 20 or 0)
+		content.original_width = width
 	end,

 	["OnHeightSet"] = function(self, height)
@@ -178,11 +187,7 @@ local function Constructor()

 	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
 	scrollbg:SetAllPoints(scrollbar)
-	if IsLegion then
-		scrollbg:SetColorTexture(0, 0, 0, 0.4)
-	else
-		scrollbg:SetTexture(0, 0, 0, 0.4)
-	end
+	scrollbg:SetColorTexture(0, 0, 0, 0.4)

 	--Container Support
 	local content = CreateFrame("Frame", nil, scrollframe)
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
old mode 100644
new mode 100755
index ab63f31..466fbbd
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
@@ -2,7 +2,7 @@
 TabGroup Container
 Container that uses tabs on top to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 35
+local Type, Version = "TabGroup", 36
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -63,7 +63,7 @@ Scripts
 -------------------------------------------------------------------------------]]
 local function Tab_OnClick(frame)
 	if not (frame.selected or frame.disabled) then
-		PlaySound("igCharacterInfoTab")
+		PlaySound(841) -- SOUNDKIT.IG_CHARACTER_INFO_TAB
 		frame.obj:SelectTab(frame.value)
 	end
 end
@@ -161,22 +161,21 @@ local methods = {
 		self.tablist = tabs
 		self:BuildTabs()
 	end,
-
+

 	["BuildTabs"] = function(self)
 		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
-		local status = self.status or self.localstatus
 		local tablist = self.tablist
 		local tabs = self.tabs
-
+
 		if not tablist then return end
-
+
 		local width = self.frame.width or self.frame:GetWidth() or 0
-
+
 		wipe(widths)
 		wipe(rowwidths)
 		wipe(rowends)
-
+
 		--Place Text into tabs and get thier initial width
 		for i, v in ipairs(tablist) do
 			local tab = tabs[i]
@@ -184,19 +183,19 @@ local methods = {
 				tab = self:CreateTab(i)
 				tabs[i] = tab
 			end
-
+
 			tab:Show()
 			tab:SetText(v.text)
 			tab:SetDisabled(v.disabled)
 			tab.value = v.value
-
+
 			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
 		end
-
+
 		for i = (#tablist)+1, #tabs, 1 do
 			tabs[i]:Hide()
 		end
-
+
 		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
 		local numtabs = #tablist
 		local numrows = 1
@@ -214,7 +213,7 @@ local methods = {
 		end
 		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
 		rowends[numrows] = #tablist
-
+
 		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
 		if numrows > 1 then
 			--if the last row has only one tab
@@ -245,22 +244,22 @@ local methods = {
 					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
 				end
 			end
-
+
 			-- equal padding for each tab to fill the available width,
 			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
+			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
 			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
 			local padding = 0
 			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
 				padding = (width - rowwidths[row]) / (endtab - starttab+1)
 			end
-
+
 			for i = starttab, endtab do
 				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
 			end
 			starttab = endtab + 1
 		end
-
+
 		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
 		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
 	end,
@@ -286,7 +285,7 @@ local methods = {
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end,
-
+
 	["LayoutFinished"] = function(self, width, height)
 		if self.noAutoHeight then return end
 		self:SetHeight((height or 0) + (self.borderoffset + 23))
@@ -343,7 +342,7 @@ local function Constructor()
 	for method, func in pairs(methods) do
 		widget[method] = func
 	end
-
+
 	return AceGUI:RegisterAsContainer(widget)
 end

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
old mode 100644
new mode 100755
index 98a2080..039c997
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,11 +2,11 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 40
+local Type, Version = "TreeGroup", 41
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

-local IsLegion = select(4, GetBuildInfo()) >= 70000
+local WoW80 = select(4, GetBuildInfo()) >= 80000

 -- Lua APIs
 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
@@ -36,7 +36,7 @@ do
 	function del(t)
 		for k in pairs(t) do
 			t[k] = nil
-		end
+		end
 		pool[t] = true
 	end
 end
@@ -59,7 +59,6 @@ end
 local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local self = button.obj
 	local toggle = button.toggle
-	local frame = self.frame
 	local text = treeline.text or ""
 	local icon = treeline.icon
 	local iconCoords = treeline.iconCoords
@@ -67,7 +66,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 	local value = treeline.value
 	local uniquevalue = treeline.uniquevalue
 	local disabled = treeline.disabled
-
+
 	button.treeline = treeline
 	button.value = value
 	button.uniquevalue = uniquevalue
@@ -78,8 +77,6 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:UnlockHighlight()
 		button.selected = false
 	end
-	local normalTexture = button:GetNormalTexture()
-	local line = button.line
 	button.level = level
 	if ( level == 1 ) then
 		button:SetNormalFontObject("GameFontNormal")
@@ -90,7 +87,7 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button:SetHighlightFontObject("GameFontHighlightSmall")
 		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
 	end
-
+
 	if disabled then
 		button:EnableMouse(false)
 		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
@@ -98,27 +95,27 @@ local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
 		button.text:SetText(text)
 		button:EnableMouse(true)
 	end
-
+
 	if icon then
 		button.icon:SetTexture(icon)
 		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
 	else
 		button.icon:SetTexture(nil)
 	end
-
+
 	if iconCoords then
 		button.icon:SetTexCoord(unpack(iconCoords))
 	else
 		button.icon:SetTexCoord(0, 1, 0, 1)
 	end
-
+
 	if canExpand then
 		if not isExpanded then
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
+			toggle:SetNormalTexture(130838) -- Interface\\Buttons\\UI-PlusButton-UP
+			toggle:SetPushedTexture(130836) -- Interface\\Buttons\\UI-PlusButton-DOWN
 		else
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
+			toggle:SetNormalTexture(130821) -- Interface\\Buttons\\UI-MinusButton-UP
+			toggle:SetPushedTexture(130820) -- Interface\\Buttons\\UI-MinusButton-DOWN
 		end
 		toggle:Show()
 	else
@@ -164,7 +161,7 @@ end
 local function FirstFrameUpdate(frame)
 	local self = frame.obj
 	frame:SetScript("OnUpdate", nil)
-	self:RefreshTree()
+	self:RefreshTree(nil, true)
 end

 local function BuildUniqueValue(...)
@@ -201,7 +198,6 @@ end

 local function Button_OnDoubleClick(button)
 	local self = button.obj
-	local status = self.status or self.localstatus
 	local status = (self.status or self.localstatus).groups
 	status[button.uniquevalue] = not status[button.uniquevalue]
 	self:RefreshTree()
@@ -279,10 +275,10 @@ local function Dragger_OnMouseUp(frame)
 	treeframe:SetHeight(0)
 	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
 	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
+
 	local status = self.status or self.localstatus
 	status.treewidth = treeframe:GetWidth()
-
+
 	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
 	-- recalculate the content width
 	treeframe.obj:OnWidthSet(status.fullwidth)
@@ -302,6 +298,8 @@ local methods = {

 	["OnRelease"] = function(self)
 		self.status = nil
+		self.tree = nil
+		self.frame:SetScript("OnUpdate", nil)
 		for k, v in pairs(self.localstatus) do
 			if k == "groups" then
 				for k2 in pairs(v) do
@@ -365,8 +363,8 @@ local methods = {
 	--sets the tree to be displayed
 	["SetTree"] = function(self, tree, filter)
 		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
+		if tree then
+			assert(type(tree) == "table")
 		end
 		self.tree = tree
 		self:RefreshTree()
@@ -374,8 +372,7 @@ local methods = {

 	["BuildLevel"] = function(self, tree, level, parent)
 		local groups = (self.status or self.localstatus).groups
-		local hasChildren = self.hasChildren
-
+
 		for i, v in ipairs(tree) do
 			if v.children then
 				if not self.filter or ShouldDisplayLevel(v.children) then
@@ -390,8 +387,8 @@ local methods = {
 		end
 	end,

-	["RefreshTree"] = function(self,scrollToSelection)
-		local buttons = self.buttons
+	["RefreshTree"] = function(self,scrollToSelection,fromOnUpdate)
+		local buttons = self.buttons
 		local lines = self.lines

 		for i, v in ipairs(buttons) do
@@ -412,7 +409,7 @@ local methods = {
 		local tree = self.tree

 		local treeframe = self.treeframe
-
+
 		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)

 		self:BuildLevel(tree, 1)
@@ -422,8 +419,14 @@ local methods = {
 		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
 		if maxlines <= 0 then return end

+		-- workaround for lag spikes on WoW 8.0
+		if WoW80 and self.frame:GetParent() == UIParent and not fromOnUpdate then
+			self.frame:SetScript("OnUpdate", FirstFrameUpdate)
+			return
+		end
+
 		local first, last
-
+
 		scrollToSelection = status.scrollToSelection
 		status.scrollToSelection = nil

@@ -499,9 +502,9 @@ local methods = {
 			button:Show()
 			buttonnum = buttonnum + 1
 		end
-
+
 	end,
-
+
 	["SetSelected"] = function(self, value)
 		local status = self.status or self.localstatus
 		if status.selected ~= value then
@@ -551,16 +554,16 @@ local methods = {
 		local treeframe = self.treeframe
 		local status = self.status or self.localstatus
 		status.fullwidth = width
-
+
 		local contentwidth = width - status.treewidth - 20
 		if contentwidth < 0 then
 			contentwidth = 0
 		end
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
-
+
 		local maxtreewidth = math_min(400, width - 50)
-
+
 		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
 			self:SetTreeWidth(maxtreewidth, status.treesizable)
 		end
@@ -586,16 +589,16 @@ local methods = {
 				treewidth = DEFAULT_TREE_WIDTH
 			else
 				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
+				treewidth = DEFAULT_TREE_WIDTH
 			end
 		end
 		self.treeframe:SetWidth(treewidth)
 		self.dragger:EnableMouse(resizable)
-
+
 		local status = self.status or self.localstatus
 		status.treewidth = treewidth
 		status.treesizable = resizable
-
+
 		-- recalculate the content width
 		if status.fullwidth then
 			self:OnWidthSet(status.fullwidth)
@@ -672,12 +675,7 @@ local function Constructor()

 	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
 	scrollbg:SetAllPoints(scrollbar)
-
-	if IsLegion then
-		scrollbg:SetColorTexture(0,0,0,0.4)
-	else
-		scrollbg:SetTexture(0,0,0,0.4)
-	end
+	scrollbg:SetColorTexture(0,0,0,0.4)

 	local border = CreateFrame("Frame",nil,frame)
 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
old mode 100644
new mode 100755
index 33ed7d8..a9192b3
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
@@ -21,26 +21,30 @@ local CreateFrame, UIParent = CreateFrame, UIParent
 ]]
 do
 	local Type = "Window"
-	local Version = 4
+	local Version = 6
+
+	local function frameOnShow(this)
+		this.obj:Fire("OnShow")
+	end

 	local function frameOnClose(this)
 		this.obj:Fire("OnClose")
 	end
-
+
 	local function closeOnClick(this)
-		PlaySound("gsTitleOptionExit")
+		PlaySound(799) -- SOUNDKIT.GS_TITLE_OPTION_EXIT
 		this.obj:Hide()
 	end
-
+
 	local function frameOnMouseDown(this)
 		AceGUI:ClearFocus()
 	end
-
+
 	local function titleOnMouseDown(this)
 		this:GetParent():StartMoving()
 		AceGUI:ClearFocus()
 	end
-
+
 	local function frameOnMouseUp(this)
 		local frame = this:GetParent()
 		frame:StopMovingOrSizing()
@@ -51,22 +55,22 @@ do
 		status.top = frame:GetTop()
 		status.left = frame:GetLeft()
 	end
-
+
 	local function sizerseOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOMRIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizersOnMouseDown(this)
 		this:GetParent():StartSizing("BOTTOM")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizereOnMouseDown(this)
 		this:GetParent():StartSizing("RIGHT")
 		AceGUI:ClearFocus()
 	end
-
+
 	local function sizerOnMouseUp(this)
 		this:GetParent():StopMovingOrSizing()
 	end
@@ -74,19 +78,19 @@ do
 	local function SetTitle(self,title)
 		self.titletext:SetText(title)
 	end
-
+
 	local function SetStatusText(self,text)
 		-- self.statustext:SetText(text)
 	end
-
+
 	local function Hide(self)
 		self.frame:Hide()
 	end
-
+
 	local function Show(self)
 		self.frame:Show()
 	end
-
+
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -94,21 +98,21 @@ do
 		self:EnableResize(true)
 		self:Show()
 	end
-
+
 	local function OnRelease(self)
 		self.status = nil
 		for k in pairs(self.localstatus) do
 			self.localstatus[k] = nil
 		end
 	end
-
+
 	-- called to set an external table to store status in
 	local function SetStatusTable(self, status)
 		assert(type(status) == "table")
 		self.status = status
 		self:ApplyStatus()
 	end
-
+
 	local function ApplyStatus(self)
 		local status = self.status or self.localstatus
 		local frame = self.frame
@@ -121,7 +125,7 @@ do
 			frame:SetPoint("CENTER",UIParent,"CENTER")
 		end
 	end
-
+
 	local function OnWidthSet(self, width)
 		local content = self.content
 		local contentwidth = width - 34
@@ -131,8 +135,8 @@ do
 		content:SetWidth(contentwidth)
 		content.width = contentwidth
 	end
-
-
+
+
 	local function OnHeightSet(self, height)
 		local content = self.content
 		local contentheight = height - 57
@@ -142,19 +146,19 @@ do
 		content:SetHeight(contentheight)
 		content.height = contentheight
 	end
-
+
 	local function EnableResize(self, state)
 		local func = state and "Show" or "Hide"
 		self.sizer_se[func](self.sizer_se)
 		self.sizer_s[func](self.sizer_s)
 		self.sizer_e[func](self.sizer_e)
 	end
-
+
 	local function Constructor()
 		local frame = CreateFrame("Frame",nil,UIParent)
 		local self = {}
 		self.type = "Window"
-
+
 		self.Hide = Hide
 		self.Show = Show
 		self.SetTitle =  SetTitle
@@ -166,9 +170,9 @@ do
 		self.OnWidthSet = OnWidthSet
 		self.OnHeightSet = OnHeightSet
 		self.EnableResize = EnableResize
-
+
 		self.localstatus = {}
-
+
 		self.frame = frame
 		frame.obj = self
 		frame:SetWidth(700)
@@ -179,90 +183,91 @@ do
 		frame:SetResizable(true)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
+
+		frame:SetScript("OnShow",frameOnShow)
 		frame:SetScript("OnHide",frameOnClose)
 		frame:SetMinResize(240,240)
 		frame:SetToplevel(true)

 		local titlebg = frame:CreateTexture(nil, "BACKGROUND")
-		titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
+		titlebg:SetTexture(251966) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Title-Background
 		titlebg:SetPoint("TOPLEFT", 9, -6)
 		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
+
 		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
-		dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
+		dialogbg:SetTexture(137056) -- Interface\\Tooltips\\UI-Tooltip-Background
 		dialogbg:SetPoint("TOPLEFT", 8, -24)
 		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
 		dialogbg:SetVertexColor(0, 0, 0, .75)
-
+
 		local topleft = frame:CreateTexture(nil, "BORDER")
-		topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		topleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topleft:SetWidth(64)
 		topleft:SetHeight(64)
 		topleft:SetPoint("TOPLEFT")
 		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
+
 		local topright = frame:CreateTexture(nil, "BORDER")
-		topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		topright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		topright:SetWidth(64)
 		topright:SetHeight(64)
 		topright:SetPoint("TOPRIGHT")
 		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
+
 		local top = frame:CreateTexture(nil, "BORDER")
-		top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		top:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		top:SetHeight(64)
 		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
 		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
 		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
+
 		local bottomleft = frame:CreateTexture(nil, "BORDER")
-		bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottomleft:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomleft:SetWidth(64)
 		bottomleft:SetHeight(64)
 		bottomleft:SetPoint("BOTTOMLEFT")
 		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
+
 		local bottomright = frame:CreateTexture(nil, "BORDER")
-		bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottomright:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottomright:SetWidth(64)
 		bottomright:SetHeight(64)
 		bottomright:SetPoint("BOTTOMRIGHT")
 		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
+
 		local bottom = frame:CreateTexture(nil, "BORDER")
-		bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		bottom:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		bottom:SetHeight(64)
 		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
 		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
 		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
+
 		local left = frame:CreateTexture(nil, "BORDER")
-		left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		left:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		left:SetWidth(64)
 		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
 		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
 		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
+
 		local right = frame:CreateTexture(nil, "BORDER")
-		right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
+		right:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
 		right:SetWidth(64)
 		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
 		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
 		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
+
 		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
 		close:SetPoint("TOPRIGHT", 2, 1)
 		close:SetScript("OnClick", closeOnClick)
 		self.closebutton = close
 		close.obj = self
-
+
 		local titletext = frame:CreateFontString(nil, "ARTWORK")
 		titletext:SetFontObject(GameFontNormal)
 		titletext:SetPoint("TOPLEFT", 12, -8)
 		titletext:SetPoint("TOPRIGHT", -32, -8)
 		self.titletext = titletext
-
+
 		local title = CreateFrame("Button", nil, frame)
 		title:SetPoint("TOPLEFT", titlebg)
 		title:SetPoint("BOTTOMRIGHT", titlebg)
@@ -270,7 +275,7 @@ do
 		title:SetScript("OnMouseDown",titleOnMouseDown)
 		title:SetScript("OnMouseUp", frameOnMouseUp)
 		self.title = title
-
+
 		local sizer_se = CreateFrame("Frame",nil,frame)
 		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
 		sizer_se:SetWidth(25)
@@ -285,7 +290,7 @@ do
 		line1:SetWidth(14)
 		line1:SetHeight(14)
 		line1:SetPoint("BOTTOMRIGHT", -8, 8)
-		line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+		line1:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 		local x = 0.1 * 14/17
 		line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -294,7 +299,7 @@ do
 		line2:SetWidth(8)
 		line2:SetHeight(8)
 		line2:SetPoint("BOTTOMRIGHT", -8, 8)
-		line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+		line2:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 		local x = 0.1 * 8/17
 		line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)

@@ -306,7 +311,7 @@ do
 		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
 		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_s = sizer_s
-
+
 		local sizer_e = CreateFrame("Frame",nil,frame)
 		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
 		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -315,17 +320,17 @@ do
 		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
 		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
 		self.sizer_e = sizer_e
-
+
 		--Container Support
 		local content = CreateFrame("Frame",nil,frame)
 		self.content = content
 		content.obj = self
 		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
 		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
+
 		AceGUI:RegisterAsContainer(self)
-		return self
+		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(Type,Constructor,Version)
 end
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
old mode 100644
new mode 100755
index dbcad18..8e650ce
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -2,7 +2,7 @@
 Button Widget
 Graphical Button.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Button", 23
+local Type, Version = "Button", 24
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -18,7 +18,7 @@ Scripts
 -------------------------------------------------------------------------------]]
 local function Button_OnClick(frame, ...)
 	AceGUI:ClearFocus()
-	PlaySound("igMainMenuOption")
+	PlaySound(852) -- SOUNDKIT.IG_MAINMENU_OPTION
 	frame.obj:Fire("OnClick", ...)
 end

@@ -51,7 +51,7 @@ local methods = {
 			self:SetWidth(self.text:GetStringWidth() + 30)
 		end
 	end,
-
+
 	["SetAutoWidth"] = function(self, autoWidth)
 		self.autoWidth = autoWidth
 		if self.autoWidth then
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
old mode 100644
new mode 100755
index 284ea8c..d2adb88
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 Checkbox Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "CheckBox", 22
+local Type, Version = "CheckBox", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -26,7 +26,7 @@ local function AlignImage(self)
 		self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
 		self.text:SetPoint("RIGHT")
 	else
-		self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
+		self.text:SetPoint("LEFT", self.image, "RIGHT", 1, 0)
 		self.text:SetPoint("RIGHT")
 	end
 end
@@ -60,9 +60,9 @@ local function CheckBox_OnMouseUp(frame)
 		self:ToggleChecked()

 		if self.checked then
-			PlaySound("igMainMenuOptionCheckBoxOn")
+			PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		else -- for both nil and false (tristate)
-			PlaySound("igMainMenuOptionCheckBoxOff")
+			PlaySound(857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
 		end

 		self:Fire("OnValueChanged", self.checked)
@@ -91,7 +91,7 @@ local methods = {
 		if self.desc then
 			self.desc:SetWidth(width - 30)
 			if self.desc:GetText() and self.desc:GetText() ~= "" then
-				self:SetHeight(28 + self.desc:GetHeight())
+				self:SetHeight(28 + self.desc:GetStringHeight())
 			end
 		end
 	end,
@@ -119,20 +119,20 @@ local methods = {
 		end
 	end,

-	["SetValue"] = function(self,value)
+	["SetValue"] = function(self, value)
 		local check = self.check
 		self.checked = value
 		if value then
-			SetDesaturation(self.check, false)
-			self.check:Show()
+			SetDesaturation(check, false)
+			check:Show()
 		else
 			--Nil is the unknown tristate value
 			if self.tristate and value == nil then
-				SetDesaturation(self.check, true)
-				self.check:Show()
+				SetDesaturation(check, true)
+				check:Show()
 			else
-				SetDesaturation(self.check, false)
-				self.check:Hide()
+				SetDesaturation(check, false)
+				check:Hide()
 			end
 		end
 		self:SetDisabled(self.disabled)
@@ -155,21 +155,21 @@ local methods = {
 		local size
 		if type == "radio" then
 			size = 16
-			checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			checkbg:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			checkbg:SetTexCoord(0, 0.25, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			check:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			check:SetTexCoord(0.25, 0.5, 0, 1)
 			check:SetBlendMode("ADD")
-			highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
+			highlight:SetTexture(130843) -- Interface\\Buttons\\UI-RadioButton
 			highlight:SetTexCoord(0.5, 0.75, 0, 1)
 		else
 			size = 24
-			checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+			checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up
 			checkbg:SetTexCoord(0, 1, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+			check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
 			check:SetTexCoord(0, 1, 0, 1)
 			check:SetBlendMode("BLEND")
-			highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+			highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
 			highlight:SetTexCoord(0, 1, 0, 1)
 		end
 		checkbg:SetHeight(size)
@@ -203,6 +203,7 @@ local methods = {
 				desc:ClearAllPoints()
 				desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
 				desc:SetWidth(self.frame.width - 30)
+				desc:SetPoint("RIGHT", self.frame, "RIGHT", -30, 0)
 				desc:SetJustifyH("LEFT")
 				desc:SetJustifyV("TOP")
 				self.desc = desc
@@ -210,7 +211,7 @@ local methods = {
 			self.desc:Show()
 			--self.text:SetFontObject(GameFontNormal)
 			self.desc:SetText(desc)
-			self:SetHeight(28 + self.desc:GetHeight())
+			self:SetHeight(28 + self.desc:GetStringHeight())
 		else
 			if self.desc then
 				self.desc:SetText("")
@@ -220,11 +221,11 @@ local methods = {
 			self:SetHeight(24)
 		end
 	end,
-
+
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
@@ -254,11 +255,11 @@ local function Constructor()
 	checkbg:SetWidth(24)
 	checkbg:SetHeight(24)
 	checkbg:SetPoint("TOPLEFT")
-	checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
+	checkbg:SetTexture(130755) -- Interface\\Buttons\\UI-CheckBox-Up

 	local check = frame:CreateTexture(nil, "OVERLAY")
 	check:SetAllPoints(checkbg)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+	check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check

 	local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
 	text:SetJustifyH("LEFT")
@@ -267,7 +268,7 @@ local function Constructor()
 	text:SetPoint("RIGHT")

 	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
+	highlight:SetTexture(130753) -- Interface\\Buttons\\UI-CheckBox-Highlight
 	highlight:SetBlendMode("ADD")
 	highlight:SetAllPoints(checkbg)

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
old mode 100644
new mode 100755
index 8e5f3ae..f4cab66
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,12 +1,10 @@
 --[[-----------------------------------------------------------------------------
 ColorPicker Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 23
+local Type, Version = "ColorPicker", 25
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

-local IsLegion = select(4, GetBuildInfo()) >= 70000
-
 -- Lua APIs
 local pairs = pairs

@@ -15,7 +13,7 @@ local CreateFrame, UIParent = CreateFrame, UIParent

 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
 -- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
+-- GLOBALS: ColorPickerFrame, OpacitySliderFrame

 --[[-----------------------------------------------------------------------------
 Support functions
@@ -49,7 +47,7 @@ local function Control_OnLeave(frame)
 end

 local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
+	ColorPickerFrame:Hide()
 	local self = frame.obj
 	if not self.disabled then
 		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
@@ -79,7 +77,7 @@ local function ColorSwatch_OnClick(frame)
 			ColorCallback(self, r, g, b, a, true)
 		end

-		ShowUIPanel(ColorPickerFrame)
+		ColorPickerFrame:Show()
 	end
 	AceGUI:ClearFocus()
 end
@@ -142,24 +140,22 @@ local function Constructor()
 	local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
 	colorSwatch:SetWidth(19)
 	colorSwatch:SetHeight(19)
-	colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
+	colorSwatch:SetTexture(130939) -- Interface\\ChatFrame\\ChatFrameColorSwatch
 	colorSwatch:SetPoint("LEFT")

 	local texture = frame:CreateTexture(nil, "BACKGROUND")
+	colorSwatch.background = texture
 	texture:SetWidth(16)
 	texture:SetHeight(16)
-	if IsLegion then
-		texture:SetColorTexture(1, 1, 1)
-	else
-		texture:SetTexture(1, 1, 1)
-	end
+	texture:SetColorTexture(1, 1, 1)
 	texture:SetPoint("CENTER", colorSwatch)
 	texture:Show()

 	local checkers = frame:CreateTexture(nil, "BACKGROUND")
+	colorSwatch.checkers = checkers
 	checkers:SetWidth(14)
 	checkers:SetHeight(14)
-	checkers:SetTexture("Tileset\\Generic\\Checkers")
+	checkers:SetTexture(188523) -- Tileset\\Generic\\Checkers
 	checkers:SetTexCoord(.25, 0, 0.5, .25)
 	checkers:SetDesaturated(true)
 	checkers:SetVertexColor(1, 1, 1, 0.75)
@@ -174,7 +170,7 @@ local function Constructor()
 	text:SetPoint("RIGHT")

 	--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+	--highlight:SetTexture(136810) -- Interface\\QuestFrame\\UI-QuestTitleHighlight
 	--highlight:SetBlendMode("ADD")
 	--highlight:SetAllPoints(frame)

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
old mode 100644
new mode 100755
index 9e5e4f5..9dd4b60
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,9 +1,7 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 1137 2016-05-15 10:57:36Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

-local IsLegion = select(4, GetBuildInfo()) >= 70000
-
 -- Lua APIs
 local select, assert = select, assert

@@ -35,7 +33,7 @@ end

 -- ItemBase is the base "class" for all dropdown items.
 -- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
+-- create an initial 'self' value.
 -- ItemBase will add common functions and ui event handlers.
 -- Be sure to keep basic usage when you override functions.

@@ -54,7 +52,7 @@ function ItemBase.Frame_OnEnter(this)
 		self.highlight:Show()
 	end
 	self:Fire("OnEnter")
-
+
 	if self.specialOnEnter then
 		self.specialOnEnter(self)
 	end
@@ -62,10 +60,10 @@ end

 function ItemBase.Frame_OnLeave(this)
 	local self = this.obj
-
+
 	self.highlight:Hide()
 	self:Fire("OnLeave")
-
+
 	if self.specialOnLeave then
 		self.specialOnLeave(self)
 	end
@@ -91,7 +89,7 @@ end
 --       Do not call this method directly
 function ItemBase.SetPullout(self, pullout)
 	self.pullout = pullout
-
+
 	self.frame:SetParent(nil)
 	self.frame:SetParent(pullout.itemFrame)
 	self.parent = pullout.itemFrame
@@ -157,12 +155,12 @@ function ItemBase.Create(type)
 	self.frame = frame
 	frame.obj = self
 	self.type = type
-
+
 	self.useHighlight = true
-
+
 	frame:SetHeight(17)
 	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 	text:SetTextColor(1,1,1)
 	text:SetJustifyH("LEFT")
@@ -171,7 +169,7 @@ function ItemBase.Create(type)
 	self.text = text

 	local highlight = frame:CreateTexture(nil, "OVERLAY")
-	highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
+	highlight:SetTexture(136810) -- Interface\\QuestFrame\\UI-QuestTitleHighlight
 	highlight:SetBlendMode("ADD")
 	highlight:SetHeight(14)
 	highlight:ClearAllPoints()
@@ -180,11 +178,11 @@ function ItemBase.Create(type)
 	highlight:Hide()
 	self.highlight = highlight

-	local check = frame:CreateTexture("OVERLAY")
+	local check = frame:CreateTexture("OVERLAY")
 	check:SetWidth(16)
 	check:SetHeight(16)
 	check:SetPoint("LEFT",frame,"LEFT",3,-1)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
+	check:SetTexture(130751) -- Interface\\Buttons\\UI-CheckBox-Check
 	check:Hide()
 	self.check = check

@@ -192,28 +190,28 @@ function ItemBase.Create(type)
 	sub:SetWidth(16)
 	sub:SetHeight(16)
 	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
-	sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
+	sub:SetTexture(130940) -- Interface\\ChatFrame\\ChatFrameExpandArrow
 	sub:Hide()
-	self.sub = sub
-
+	self.sub = sub
+
 	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
 	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
+
 	self.OnAcquire = ItemBase.OnAcquire
 	self.OnRelease = ItemBase.OnRelease
-
+
 	self.SetPullout = ItemBase.SetPullout
 	self.GetText    = ItemBase.GetText
 	self.SetText    = ItemBase.SetText
 	self.SetDisabled = ItemBase.SetDisabled
-
+
 	self.SetPoint   = ItemBase.SetPoint
 	self.Show       = ItemBase.Show
 	self.Hide       = ItemBase.Hide
-
+
 	self.SetOnLeave = ItemBase.SetOnLeave
 	self.SetOnEnter = ItemBase.SetOnEnter
-
+
 	return self
 end

@@ -225,20 +223,20 @@ end

 --[[
 	Template for items:
-
+
 -- Item:
 --
 do
 	local widgetType = "Dropdown-Item-"
 	local widgetVersion = 1
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
 --]]
@@ -249,25 +247,25 @@ end
 do
 	local widgetType = "Dropdown-Item-Header"
 	local widgetVersion = 1
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
 	end
-
+
 	local function OnLeave(this)
 		local self = this.obj
 		self:Fire("OnLeave")
-
+
 		if self.specialOnLeave then
 			self.specialOnLeave(self)
 		end
 	end
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
@@ -275,21 +273,21 @@ do
 			self.text:SetTextColor(1, 1, 0)
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnLeave", OnLeave)
-
+
 		self.text:SetTextColor(1, 1, 0)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -298,7 +296,7 @@ end
 do
 	local widgetType = "Dropdown-Item-Execute"
 	local widgetVersion = 1
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
@@ -307,16 +305,16 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -325,8 +323,8 @@ end
 -- Does not close the pullout on click.
 do
 	local widgetType = "Dropdown-Item-Toggle"
-	local widgetVersion = 3
-
+	local widgetVersion = 4
+
 	local function UpdateToggle(self)
 		if self.value then
 			self.check:Show()
@@ -334,49 +332,49 @@ do
 			self.check:Hide()
 		end
 	end
-
+
 	local function OnRelease(self)
 		ItemBase.OnRelease(self)
 		self:SetValue(nil)
 	end
-
+
 	local function Frame_OnClick(this, button)
 		local self = this.obj
 		if self.disabled then return end
 		self.value = not self.value
 		if self.value then
-			PlaySound("igMainMenuOptionCheckBoxOn")
+			PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		else
-			PlaySound("igMainMenuOptionCheckBoxOff")
+			PlaySound(857) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_OFF
 		end
 		UpdateToggle(self)
 		self:Fire("OnValueChanged", self.value)
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		self.value = value
 		UpdateToggle(self)
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.frame:SetScript("OnClick", Frame_OnClick)
-
+
 		self.SetValue = SetValue
 		self.GetValue = GetValue
 		self.OnRelease = OnRelease
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -386,55 +384,55 @@ end
 do
 	local widgetType = "Dropdown-Item-Menu"
 	local widgetVersion = 2
-
+
 	local function OnEnter(this)
 		local self = this.obj
 		self:Fire("OnEnter")
-
+
 		if self.specialOnEnter then
 			self.specialOnEnter(self)
 		end
-
+
 		self.highlight:Show()
-
+
 		if not self.disabled and self.submenu then
 			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
 		end
 	end
-
+
 	local function OnHide(this)
 		local self = this.obj
 		if self.submenu then
 			self.submenu:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetMenu(self, menu)
 		assert(menu.type == "Dropdown-Pullout")
 		self.submenu = menu
 	end
-
+
 	-- exported
 	local function CloseMenu(self)
 		self.submenu:Close()
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.sub:Show()
-
+
 		self.frame:SetScript("OnEnter", OnEnter)
 		self.frame:SetScript("OnHide", OnHide)
-
+
 		self.SetMenu   = SetMenu
 		self.CloseMenu = CloseMenu
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end

@@ -443,35 +441,31 @@ end
 do
 	local widgetType = "Dropdown-Item-Separator"
 	local widgetVersion = 2
-
+
 	-- exported, override
 	local function SetDisabled(self, disabled)
 		ItemBase.SetDisabled(self, disabled)
 		self.useHighlight = false
 	end
-
+
 	local function Constructor()
 		local self = ItemBase.Create(widgetType)
-
+
 		self.SetDisabled = SetDisabled
-
+
 		local line = self.frame:CreateTexture(nil, "OVERLAY")
 		line:SetHeight(1)
-		if IsLegion then
-			line:SetColorTexture(.5, .5, .5)
-		else
-			line:SetTexture(.5, .5, .5)
-		end
+		line:SetColorTexture(.5, .5, .5)
 		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
 		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
+
 		self.text:Hide()
-
+
 		self.useHighlight = false
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
 end
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
old mode 100644
new mode 100755
index d2b0f15..2242b78
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1116 2014-10-12 08:15:46Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1202 2019-05-15 23:11:22Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
@@ -40,9 +40,9 @@ end
 do
 	local widgetType = "Dropdown-Pullout"
 	local widgetVersion = 3
-
+
 	--[[ Static data ]]--
-
+
 	local backdrop = {
 		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
 		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -60,9 +60,9 @@ do

 	local defaultWidth = 200
 	local defaultMaxHeight = 600
-
+
 	--[[ UI Event Handlers ]]--
-
+
 	-- HACK: This should be no part of the pullout, but there
 	--       is no other 'clean' way to response to any item-OnEnter
 	--       Used to close Submenus when an other item is entered
@@ -74,22 +74,22 @@ do
 			end
 		end
 	end
-
+
 	-- See the note in Constructor() for each scroll related function
 	local function OnMouseWheel(this, value)
 		this.obj:MoveScroll(value)
 	end
-
+
 	local function OnScrollValueChanged(this, value)
 		this.obj:SetScroll(value)
 	end
-
+
 	local function OnSizeChanged(this)
 		this.obj:FixScroll()
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported
 	local function SetScroll(self, value)
 		local status = self.scrollStatus
@@ -106,9 +106,9 @@ do
 		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
 		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
 		status.offset = offset
-		status.scrollvalue = value
+		status.scrollvalue = value
 	end
-
+
 	-- exported
 	local function MoveScroll(self, value)
 		local status = self.scrollStatus
@@ -127,7 +127,7 @@ do
 			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
 		end
 	end
-
+
 	-- exported
 	local function FixScroll(self)
 		local status = self.scrollStatus
@@ -140,7 +140,7 @@ do
 			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
 			self.slider:SetValue(0)
 		else
-			self.slider:Show()
+			self.slider:Show()
 			local value = (offset / (viewheight - height) * 1000)
 			if value > 1000 then value = 1000 end
 			self.slider:SetValue(value)
@@ -153,44 +153,44 @@ do
 			end
 		end
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		self.frame:SetParent(UIParent)
 		--self.itemFrame:SetToplevel(true)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		self:Clear()
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function AddItem(self, item)
 		self.items[#self.items + 1] = item
-
+
 		local h = #self.items * 16
 		self.itemFrame:SetHeight(h)
 		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
+
 		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
 		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
+
 		item:SetPullout(self)
 		item:SetOnEnter(OnEnter)
 	end
-
+
 	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
+	local function Open(self, point, relFrame, relPoint, x, y)
 		local items = self.items
 		local frame = self.frame
 		local itemFrame = self.itemFrame
-
+
 		frame:SetPoint(point, relFrame, relPoint, x, y)

-
+
 		local height = 8
 		for i, item in pairs(items) do
 			if i == 1 then
@@ -198,23 +198,23 @@ do
 			else
 				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
 			end
-
+
 			item:Show()
-
+
 			height = height + 16
 		end
 		itemFrame:SetHeight(height)
 		fixstrata("TOOLTIP", frame, frame:GetChildren())
 		frame:Show()
 		self:Fire("OnOpen")
-	end
-
+	end
+
 	-- exported
 	local function Close(self)
 		self.frame:Hide()
 		self:Fire("OnClose")
-	end
-
+	end
+
 	-- exported
 	local function Clear(self)
 		local items = self.items
@@ -222,18 +222,18 @@ do
 			AceGUI:Release(item)
 			items[i] = nil
 		end
-	end
-
+	end
+
 	-- exported
 	local function IterateItems(self)
 		return ipairs(self.items)
 	end
-
+
 	-- exported
 	local function SetHideOnLeave(self, val)
 		self.hideOnLeave = val
 	end
-
+
 	-- exported
 	local function SetMaxHeight(self, height)
 		self.maxHeight = height or defaultMaxHeight
@@ -243,19 +243,19 @@ do
 			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
 		end
 	end
-
+
 	-- exported
 	local function GetRightBorderWidth(self)
 		return 6 + (self.slider:IsShown() and 12 or 0)
 	end
-
+
 	-- exported
 	local function GetLeftBorderWidth(self)
 		return 6
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
@@ -264,7 +264,7 @@ do
 		self.type = widgetType
 		self.frame = frame
 		frame.obj = self
-
+
 		self.OnAcquire = OnAcquire
 		self.OnRelease = OnRelease

@@ -278,37 +278,37 @@ do
 		self.SetScroll  = SetScroll
 		self.MoveScroll = MoveScroll
 		self.FixScroll  = FixScroll
-
+
 		self.SetMaxHeight = SetMaxHeight
 		self.GetRightBorderWidth = GetRightBorderWidth
 		self.GetLeftBorderWidth = GetLeftBorderWidth
-
+
 		self.items = {}
-
+
 		self.scrollStatus = {
 			scrollvalue = 0,
 		}
-
+
 		self.maxHeight = defaultMaxHeight
-
+
 		frame:SetBackdrop(backdrop)
 		frame:SetBackdropColor(0, 0, 0)
 		frame:SetFrameStrata("FULLSCREEN_DIALOG")
 		frame:SetClampedToScreen(true)
 		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
+		frame:SetHeight(self.maxHeight)
 		--frame:SetToplevel(true)
-
+
 		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
 		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
 		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
+
 		self.scrollFrame = scrollFrame
 		self.itemFrame = itemFrame
-
+
 		scrollFrame.obj = self
 		itemFrame.obj = self
-
+
 		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
@@ -318,7 +318,7 @@ do
 		slider:SetFrameStrata("FULLSCREEN_DIALOG")
 		self.slider = slider
 		slider.obj = self
-
+
 		scrollFrame:SetScrollChild(itemFrame)
 		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
 		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
@@ -327,46 +327,46 @@ do
 		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
 		scrollFrame:SetToplevel(true)
 		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
 		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
 		itemFrame:SetHeight(400)
 		itemFrame:SetToplevel(true)
 		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
+
 		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
 		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
 		slider:SetScript("OnValueChanged", OnScrollValueChanged)
 		slider:SetMinMaxValues(0, 1000)
 		slider:SetValueStep(1)
 		slider:SetValue(0)
-
+
 		scrollFrame:Show()
 		itemFrame:Show()
 		slider:Hide()
-
+
 		self:FixScroll()
-
+
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
 end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 30
-
+	local widgetVersion = 31
+
 	--[[ Static data ]]--
-
+
 	--[[ UI event handler ]]--
-
+
 	local function Control_OnEnter(this)
 		this.obj.button:LockHighlight()
 		this.obj:Fire("OnEnter")
 	end
-
+
 	local function Control_OnLeave(this)
 		this.obj.button:UnlockHighlight()
 		this.obj:Fire("OnLeave")
@@ -378,10 +378,10 @@ do
 			self.pullout:Close()
 		end
 	end
-
+
 	local function Dropdown_TogglePullout(this)
 		local self = this.obj
-		PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
+		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		if self.open then
 			self.open = nil
 			self.pullout:Close()
@@ -393,17 +393,17 @@ do
 			AceGUI:SetFocus(self)
 		end
 	end
-
+
 	local function OnPulloutOpen(this)
 		local self = this.userdata.obj
 		local value = self.value
-
+
 		if not self.multiselect then
 			for i, item in this:IterateItems() do
 				item:SetValue(item.userdata.value == value)
 			end
 		end
-
+
 		self.open = true
 		self:Fire("OnOpened")
 	end
@@ -413,7 +413,7 @@ do
 		self.open = nil
 		self:Fire("OnClosed")
 	end
-
+
 	local function ShowMultiText(self)
 		local text
 		for i, widget in self.pullout:IterateItems() do
@@ -429,10 +429,10 @@ do
 		end
 		self:SetText(text)
 	end
-
+
 	local function OnItemValueChanged(this, event, checked)
 		local self = this.userdata.obj
-
+
 		if self.multiselect then
 			self:Fire("OnValueChanged", this.userdata.value, checked)
 			ShowMultiText(self)
@@ -443,14 +443,14 @@ do
 			else
 				this:SetValue(true)
 			end
-			if self.open then
+			if self.open then
 				self.pullout:Close()
 			end
 		end
 	end
-
+
 	--[[ Exported methods ]]--
-
+
 	-- exported, AceGUI callback
 	local function OnAcquire(self)
 		local pullout = AceGUI:Create("Dropdown-Pullout")
@@ -460,13 +460,13 @@ do
 		pullout:SetCallback("OnOpen", OnPulloutOpen)
 		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
 		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
+
 		self:SetHeight(44)
 		self:SetWidth(200)
 		self:SetLabel()
 		self:SetPulloutWidth(nil)
 	end
-
+
 	-- exported, AceGUI callback
 	local function OnRelease(self)
 		if self.open then
@@ -474,20 +474,20 @@ do
 		end
 		AceGUI:Release(self.pullout)
 		self.pullout = nil
-
+
 		self:SetText("")
 		self:SetDisabled(false)
 		self:SetMultiselect(false)
-
+
 		self.value = nil
 		self.list = nil
 		self.open = nil
 		self.hasClose = nil
-
+
 		self.frame:ClearAllPoints()
 		self.frame:Hide()
 	end
-
+
 	-- exported
 	local function SetDisabled(self, disabled)
 		self.disabled = disabled
@@ -503,19 +503,19 @@ do
 			self.text:SetTextColor(1,1,1)
 		end
 	end
-
+
 	-- exported
 	local function ClearFocus(self)
 		if self.open then
 			self.pullout:Close()
 		end
 	end
-
+
 	-- exported
 	local function SetText(self, text)
 		self.text:SetText(text or "")
 	end
-
+
 	-- exported
 	local function SetLabel(self, text)
 		if text and text ~= "" then
@@ -532,7 +532,7 @@ do
 			self.alignoffset = 12
 		end
 	end
-
+
 	-- exported
 	local function SetValue(self, value)
 		if self.list then
@@ -540,12 +540,12 @@ do
 		end
 		self.value = value
 	end
-
+
 	-- exported
 	local function GetValue(self)
 		return self.value
 	end
-
+
 	-- exported
 	local function SetItemValue(self, item, value)
 		if not self.multiselect then return end
@@ -558,7 +558,7 @@ do
 		end
 		ShowMultiText(self)
 	end
-
+
 	-- exported
 	local function SetItemDisabled(self, item, disabled)
 		for i, widget in self.pullout:IterateItems() do
@@ -567,7 +567,7 @@ do
 			end
 		end
 	end
-
+
 	local function AddListItem(self, value, text, itemType)
 		if not itemType then itemType = "Dropdown-Item-Toggle" end
 		local exists = AceGUI:GetWidgetVersion(itemType)
@@ -580,7 +580,7 @@ do
 		item:SetCallback("OnValueChanged", OnItemValueChanged)
 		self.pullout:AddItem(item)
 	end
-
+
 	local function AddCloseButton(self)
 		if not self.hasClose then
 			local close = AceGUI:Create("Dropdown-Item-Execute")
@@ -589,7 +589,7 @@ do
 			self.hasClose = true
 		end
 	end
-
+
 	-- exported
 	local sortlist = {}
 	local function SetList(self, list, order, itemType)
@@ -597,13 +597,13 @@ do
 		self.pullout:Clear()
 		self.hasClose = nil
 		if not list then return end
-
+
 		if type(order) ~= "table" then
 			for v in pairs(list) do
 				sortlist[#sortlist + 1] = v
 			end
 			tsort(sortlist)
-
+
 			for i, key in ipairs(sortlist) do
 				AddListItem(self, key, list[key], itemType)
 				sortlist[i] = nil
@@ -618,7 +618,7 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function AddItem(self, value, text, itemType)
 		if self.list then
@@ -626,7 +626,7 @@ do
 			AddListItem(self, value, text, itemType)
 		end
 	end
-
+
 	-- exported
 	local function SetMultiselect(self, multi)
 		self.multiselect = multi
@@ -635,23 +635,23 @@ do
 			AddCloseButton(self)
 		end
 	end
-
+
 	-- exported
 	local function GetMultiselect(self)
 		return self.multiselect
 	end
-
+
 	local function SetPulloutWidth(self, width)
 		self.pulloutWidth = width
 	end
-
+
 	--[[ Constructor ]]--
-
+
 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
 		local frame = CreateFrame("Frame", nil, UIParent)
 		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
+
 		local self = {}
 		self.type = widgetType
 		self.frame = frame
@@ -659,10 +659,10 @@ do
 		self.count = count
 		frame.obj = self
 		dropdown.obj = self
-
+
 		self.OnRelease   = OnRelease
 		self.OnAcquire   = OnAcquire
-
+
 		self.ClearFocus  = ClearFocus

 		self.SetText     = SetText
@@ -677,9 +677,9 @@ do
 		self.SetItemValue = SetItemValue
 		self.SetItemDisabled = SetItemDisabled
 		self.SetPulloutWidth = SetPulloutWidth
-
+
 		self.alignoffset = 26
-
+
 		frame:SetScript("OnHide",Dropdown_OnHide)

 		dropdown:ClearAllPoints()
@@ -690,10 +690,10 @@ do
 		local left = _G[dropdown:GetName() .. "Left"]
 		local middle = _G[dropdown:GetName() .. "Middle"]
 		local right = _G[dropdown:GetName() .. "Right"]
-
+
 		middle:ClearAllPoints()
 		right:ClearAllPoints()
-
+
 		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
 		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
 		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
@@ -704,7 +704,7 @@ do
 		button:SetScript("OnEnter",Control_OnEnter)
 		button:SetScript("OnLeave",Control_OnLeave)
 		button:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local button_cover = CreateFrame("BUTTON",nil,self.frame)
 		self.button_cover = button_cover
 		button_cover.obj = self
@@ -713,14 +713,14 @@ do
 		button_cover:SetScript("OnEnter",Control_OnEnter)
 		button_cover:SetScript("OnLeave",Control_OnLeave)
 		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
+
 		local text = _G[dropdown:GetName() .. "Text"]
 		self.text = text
 		text.obj = self
 		text:ClearAllPoints()
 		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
 		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
+
 		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
 		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
 		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
@@ -732,6 +732,6 @@ do
 		AceGUI:RegisterAsWidget(self)
 		return self
 	end
-
+
 	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
+end
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
old mode 100644
new mode 100755
index 6d16f37..cc1b6a3
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 EditBox Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "EditBox", 26
+local Type, Version = "EditBox", 28
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -73,7 +73,7 @@ local function EditBox_OnEnterPressed(frame)
 	local value = frame:GetText()
 	local cancel = self:Fire("OnEnterPressed", value)
 	if not cancel then
-		PlaySound("igMainMenuOptionCheckBoxOn")
+		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		HideButton(self)
 	end
 end
@@ -81,23 +81,21 @@ end
 local function EditBox_OnReceiveDrag(frame)
 	local self = frame.obj
 	local type, id, info = GetCursorInfo()
+	local name
 	if type == "item" then
-		self:SetText(info)
-		self:Fire("OnEnterPressed", info)
-		ClearCursor()
+		name = info
 	elseif type == "spell" then
-		local name = GetSpellInfo(id, info)
-		self:SetText(name)
-		self:Fire("OnEnterPressed", name)
-		ClearCursor()
+		name = GetSpellInfo(id, info)
 	elseif type == "macro" then
-		local name = GetMacroInfo(id)
+		name = GetMacroInfo(id)
+	end
+	if name then
 		self:SetText(name)
 		self:Fire("OnEnterPressed", name)
 		ClearCursor()
+		HideButton(self)
+		AceGUI:ClearFocus()
 	end
-	HideButton(self)
-	AceGUI:ClearFocus()
 end

 local function EditBox_OnTextChanged(frame)
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
old mode 100644
new mode 100755
index bf8b2c0..670cd4e
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
@@ -51,14 +51,14 @@ local function Constructor()
 	left:SetHeight(8)
 	left:SetPoint("LEFT", 3, 0)
 	left:SetPoint("RIGHT", label, "LEFT", -5, 0)
-	left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	left:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	left:SetTexCoord(0.81, 0.94, 0.5, 1)

 	local right = frame:CreateTexture(nil, "BACKGROUND")
 	right:SetHeight(8)
 	right:SetPoint("RIGHT", -3, 0)
 	right:SetPoint("LEFT", label, "RIGHT", 5, 0)
-	right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	right:SetTexture(137057) -- Interface\\Tooltips\\UI-Tooltip-Border
 	right:SetTexCoord(0.81, 0.94, 0.5, 1)

 	local widget = {
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
old mode 100644
new mode 100755
index fdba650..092697e
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -56,7 +56,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			local n = select("#", ...)
 			if n == 4 or n == 8 then
@@ -118,7 +118,7 @@ local function Constructor()

 	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
 	highlight:SetAllPoints(image)
-	highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
+	highlight:SetTexture(136580) -- Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight
 	highlight:SetTexCoord(0, 1, 0.23, 0.77)
 	highlight:SetBlendMode("ADD")

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
old mode 100644
new mode 100755
index e1388a1..76a2cf9
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
@@ -1,20 +1,13 @@
 --[[-----------------------------------------------------------------------------
 InteractiveLabel Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "InteractiveLabel", 20
+local Type, Version = "InteractiveLabel", 21
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

 -- Lua APIs
 local select, pairs = select, pairs

--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
old mode 100644
new mode 100755
index 9a181c5..79fddc4
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -2,7 +2,7 @@
 Label Widget
 Displays text and optionally an icon.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Label", 23
+local Type, Version = "Label", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -39,25 +39,30 @@ local function UpdateImageAnchor(self)
 			label:SetPoint("TOP", image, "BOTTOM")
 			label:SetPoint("LEFT")
 			label:SetWidth(width)
-			height = image:GetHeight() + label:GetHeight()
+			height = image:GetHeight() + label:GetStringHeight()
 		else
 			-- image on the left
 			image:SetPoint("TOPLEFT")
-			if image:GetHeight() > label:GetHeight() then
+			if image:GetHeight() > label:GetStringHeight() then
 				label:SetPoint("LEFT", image, "RIGHT", 4, 0)
 			else
 				label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
 			end
 			label:SetWidth(width - imagewidth - 4)
-			height = max(image:GetHeight(), label:GetHeight())
+			height = max(image:GetHeight(), label:GetStringHeight())
 		end
 	else
 		-- no image shown
 		label:SetPoint("TOPLEFT")
 		label:SetWidth(width)
-		height = label:GetHeight()
+		height = label:GetStringHeight()
 	end
-
+
+	-- avoid zero-height labels, since they can used as spacers
+	if not height or height == 0 then
+		height = 1
+	end
+
 	self.resizing = true
 	frame:SetHeight(height)
 	frame.height = height
@@ -78,6 +83,8 @@ local methods = {
 		self:SetImageSize(16, 16)
 		self:SetColor()
 		self:SetFontObject()
+		self:SetJustifyH("LEFT")
+		self:SetJustifyV("TOP")

 		-- reset the flag
 		self.resizing = nil
@@ -106,7 +113,7 @@ local methods = {
 	["SetImage"] = function(self, path, ...)
 		local image = self.image
 		image:SetTexture(path)
-
+
 		if image:GetTexture() then
 			self.imageshown = true
 			local n = select("#", ...)
@@ -134,6 +141,14 @@ local methods = {
 		self.image:SetHeight(height)
 		UpdateImageAnchor(self)
 	end,
+
+	["SetJustifyH"] = function(self, justifyH)
+		self.label:SetJustifyH(justifyH)
+	end,
+
+	["SetJustifyV"] = function(self, justifyV)
+		self.label:SetJustifyV(justifyV)
+	end,
 }

 --[[-----------------------------------------------------------------------------
@@ -144,9 +159,6 @@ local function Constructor()
 	frame:Hide()

 	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
-	label:SetJustifyH("LEFT")
-	label:SetJustifyV("TOP")
-
 	local image = frame:CreateTexture(nil, "BACKGROUND")

 	-- create widget
diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
old mode 100644
new mode 100755
index c9b0d86..46a75b1
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -233,7 +233,7 @@ local methods = {
 		end
 		Layout(self)
 	end,
-
+
 	["ClearFocus"] = function(self)
 		self.editBox:ClearFocus()
 		self.frame:SetScript("OnShow", nil)
@@ -253,12 +253,12 @@ local methods = {
 	["GetCursorPosition"] = function(self)
 		return self.editBox:GetCursorPosition()
 	end,
-
+
 	["SetCursorPosition"] = function(self, ...)
 		return self.editBox:SetCursorPosition(...)
 	end,
-
-
+
+
 }

 --[[-----------------------------------------------------------------------------
@@ -273,7 +273,7 @@ local backdrop = {
 local function Constructor()
 	local frame = CreateFrame("Frame", nil, UIParent)
 	frame:Hide()
-
+
 	local widgetNum = AceGUI:GetNextWidgetNum(Type)

 	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
@@ -290,7 +290,7 @@ local function Constructor()
 	button:SetText(ACCEPT)
 	button:SetScript("OnClick", OnClick)
 	button:Disable()
-
+
 	local text = button:GetFontString()
 	text:ClearAllPoints()
 	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
@@ -339,7 +339,7 @@ local function Constructor()
 	editBox:SetScript("OnTextChanged", OnTextChanged)
 	editBox:SetScript("OnTextSet", OnTextSet)
 	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
+

 	scrollFrame:SetScrollChild(editBox)

diff --git a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
old mode 100644
new mode 100755
index 4a17767..79e8628
--- a/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Titan/libs/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -2,7 +2,7 @@
 Slider Widget
 Graphical Slider, like, for Range values.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Slider", 21
+local Type, Version = "Slider", 22
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -57,10 +57,9 @@ local function Frame_OnMouseDown(frame)
 	AceGUI:ClearFocus()
 end

-local function Slider_OnValueChanged(frame)
+local function Slider_OnValueChanged(frame, newvalue)
 	local self = frame.obj
 	if not frame.setup then
-		local newvalue = frame:GetValue()
 		if self.step and self.step > 0 then
 			local min_value = self.min or 0
 			newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
@@ -106,9 +105,9 @@ local function EditBox_OnEnterPressed(frame)
 	else
 		value = tonumber(value)
 	end
-
+
 	if value then
-		PlaySound("igMainMenuOptionCheckBoxOn")
+		PlaySound(856) -- SOUNDKIT.IG_MAINMENU_OPTION_CHECKBOX_ON
 		self.slider:SetValue(value)
 		self:Fire("OnMouseUp", value)
 	end
diff --git a/Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/Titan/libs/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua b/Titan/libs/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
old mode 100644
new mode 100755
index 4a31cfe..1e1e25f
--- a/Titan/libs/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
+++ b/Titan/libs/Libs/LibSharedMedia-3.0/LibSharedMedia-3.0.lua
@@ -1,6 +1,6 @@
 --[[
 Name: LibSharedMedia-3.0
-Revision: $Revision: 91 $
+Revision: $Revision: 106 $
 Author: Elkano (elkano@gmx.de)
 Inspired By: SurfaceLib by Haste/Otravi (troeks@gmail.com)
 Website: http://www.wowace.com/projects/libsharedmedia-3-0/
@@ -20,8 +20,6 @@ local pairs		= _G.pairs
 local type		= _G.type

 local band			= _G.bit.band
-
-local table_insert	= _G.table.insert
 local table_sort	= _G.table.sort

 local locale = GetLocale()
diff --git a/Titan/libs/Libs/LibSharedMedia-3.0/lib.xml b/Titan/libs/Libs/LibSharedMedia-3.0/lib.xml
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/LibStub/LibStub.lua b/Titan/libs/Libs/LibStub/LibStub.lua
old mode 100644
new mode 100755
diff --git a/Titan/libs/Libs/LibStub/LibStub.toc b/Titan/libs/Libs/LibStub/LibStub.toc
old mode 100644
new mode 100755
index b43e20c..fb3de08
--- a/Titan/libs/Libs/LibStub/LibStub.toc
+++ b/Titan/libs/Libs/LibStub/LibStub.toc
@@ -5,9 +5,5 @@
 ## X-Website: http://jira.wowace.com/browse/LS
 ## X-Category: Library
 ## X-License: Public Domain
-## X-Curse-Packaged-Version: 1.0
-## X-Curse-Project-Name: LibStub
-## X-Curse-Project-ID: libstub
-## X-Curse-Repository-ID: wow/libstub/mainline

 LibStub.lua
diff --git a/Titan/libs/changelog.txt b/Titan/libs/changelog.txt
index 3a7599d..9e28255 100755
--- a/Titan/libs/changelog.txt
+++ b/Titan/libs/changelog.txt
@@ -1,3 +1,12 @@
+Ace3 Release - Revision r1214 (June 26th, 2019)
+-----------------------------------------------
+- AceConfigDialog-3.0: Exposed "select" type sorting control through a new "sorting" config table member
+- AceConfigDialog-3.0: Clear existing anchors on the GameTooltip before re-anchoring it for 8.2 compatibility
+- AceConfigDialog-3.0: Improved options table sorting algorithm to produce a stable result in certain edge cases (Ticket #501)
+- AceConfigRegistry-3.0: Added missing custom controls entries for all types added in the last release (Ticket  #494)
+- AceGUI-3.0: ColorPicker: Removed usage of Show/HideUIPanel for WoW 8.2 compatibiliy
+- AceGUI-3.0: DropDown: Improved dropdown sorting algorithm to support tables with mixed string and numeric keys
+
 Ace3 Release - Revision r1200 (January 24th, 2019)
 --------------------------------------------------
 - Cleanup for WoW 8.0 improvements
diff --git a/Titan/libs/widget.xml b/Titan/libs/widget.xml
old mode 100644
new mode 100755
index 7e4a4c7..ca8847a
--- a/Titan/libs/widget.xml
+++ b/Titan/libs/widget.xml
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Include file="AceGUI-3.0-SharedMediaWidgets\widget.xml" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/TitanBag/TitanBag.toc b/TitanBag/TitanBag.toc
index 05580cf..8a3686c 100644
--- a/TitanBag/TitanBag.toc
+++ b/TitanBag/TitanBag.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fBag|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fBag|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds bag and free slot information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanBag.xml
diff --git a/TitanClock/TitanClock.toc b/TitanClock/TitanClock.toc
index d609df6..443a797 100644
--- a/TitanClock/TitanClock.toc
+++ b/TitanClock/TitanClock.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fClock|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fClock|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds a clock to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanClock.xml
diff --git a/TitanGold/TitanGold.toc b/TitanGold/TitanGold.toc
index f6953c9..2bc728e 100644
--- a/TitanGold/TitanGold.toc
+++ b/TitanGold/TitanGold.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fGold|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fGold|r] |cff00aa005.18.0.80200|r
 ## Notes: Keeps track of all gold held by a player's toons on a per server/faction basis.
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables: GoldSave
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanGold.xml
diff --git a/TitanLocation/TitanLocation.toc b/TitanLocation/TitanLocation.toc
index c93c9dd..8113afb 100644
--- a/TitanLocation/TitanLocation.toc
+++ b/TitanLocation/TitanLocation.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fLocation|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fLocation|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds coordinates and location information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanLocation.xml
diff --git a/TitanLootType/TitanLootType.toc b/TitanLootType/TitanLootType.toc
index 40a42c2..ac50842 100644
--- a/TitanLootType/TitanLootType.toc
+++ b/TitanLootType/TitanLootType.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fLootType|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fLootType|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds group loot and instance difficulty information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanLootType.xml
diff --git a/TitanPerformance/TitanPerformance.toc b/TitanPerformance/TitanPerformance.toc
index aeef877..ba32972 100644
--- a/TitanPerformance/TitanPerformance.toc
+++ b/TitanPerformance/TitanPerformance.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fPerformance|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fPerformance|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds FPS and Garbage collection information to Titan Panel
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanPerformance.xml
diff --git a/TitanRepair/TitanRepair.toc b/TitanRepair/TitanRepair.toc
index 0f079f2..a66ef32 100644
--- a/TitanRepair/TitanRepair.toc
+++ b/TitanRepair/TitanRepair.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fRepair|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fRepair|r] |cff00aa005.18.0.80200|r
 ## Notes: Provides a configurable durability display. Also adds the ability to auto repair items and inventory at vendors
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanRepair.xml
diff --git a/TitanVolume/TitanVolume.toc b/TitanVolume/TitanVolume.toc
index 953bb03..c8095d1 100644
--- a/TitanVolume/TitanVolume.toc
+++ b/TitanVolume/TitanVolume.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fVolume|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fVolume|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds a volume control icon on your Titan Bar
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanVolume.xml
diff --git a/TitanXP/TitanXP.toc b/TitanXP/TitanXP.toc
index 1b6f67b..00b2652 100644
--- a/TitanXP/TitanXP.toc
+++ b/TitanXP/TitanXP.toc
@@ -1,10 +1,10 @@
 ## Interface: 80200
-## Title: Titan Panel [|cffeda55fXP|r] |cff00aa005.17.5.80200|r
+## Title: Titan Panel [|cffeda55fXP|r] |cff00aa005.18.0.80200|r
 ## Notes: Adds information to Titan Panel about XP earned and time to level
 ## Author: Titan Panel Development Team (http://www.titanpanel.org)
 ## SavedVariables:
 ## OptionalDeps:
 ## Dependencies: Titan
-## Version: 5.17.5.80200
+## Version: 5.18.0.80200
 ## X-Child-Of: Titan
 TitanXP.xml