Quantcast

v9.0.1-Release-v3.0(0153)

Jennifer [10-13-20 - 17:27]
v9.0.1-Release-v3.0(0153)
Filename
CHANGELOG.txt
Core/Communications.lua
Core/Core.lua
Core/Team.lua
EMA.toc
EbonyUtilities.lua
Embeds.xml
GUI/AceGUIContainer-EMATreeGroup.lua
GUI/AceGUIContainer-EMAWindow.lua
GUI/EMAHelperSettings.lua
Libs/AceAddon-3.0/AceAddon-3.0.lua
Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
Libs/AceGUI-3.0/AceGUI-3.0.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
Libs/Bindings.xml
Libs/CHANGES.txt
Libs/EMALibActionButton-1.0.lua
Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
Libs/LibButtonGlow-1.0/LibButtonGlow-1.0.toc
Libs/LibDeformat-3.0/LibDeformat-3.0.lua
Libs/LibDeformat-3.0/lib.xml
Libs/UTF8/UTF8.toc
Libs/UTF8/utf8.lua
Libs/UTF8/utf8data.lua
Libs/changelog-ACE3-r1237.txt
Libs/changelog-Ace3-r1241.txt
Locales/Core-Locale-enUS.lua
Modules/DisplayTeam.lua
Modules/Follow.lua
Modules/Information.lua
Modules/ItemUse.lua
Modules/Quest.lua
Modules/QuestWatcher.lua
Modules/Toon.lua
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 409b17c..ff9b643 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -2,6 +2,69 @@
 ChangeLogs:
 ---------------------------

+EMA Version: v9.0.0-Release-v3.0(0146-0153)
+Game Version: 9.0.0
+Release Date: 13/10/2020
+
+## 9.0 Initial release
+	-- fixed wow-api chnages.
+
+### Known issues.
+
+##Display-Team
+	--added support to add the party frame from trugcd addon to EMA's.
+
+
+## Toon
+	-- CC warn, Now shows the spell that was casted on the player
+
+
+## ItemBar
+	-- Should Now work with Spells and Toys.
+
+---------------------------
+
+EMA Version: v8.3.0-Release-v2.5(0146)
+Game Version: 8.3.0
+Release Date: 20/07/2020
+
+## Information
+	-- Trying to fix a bug i broke the *.DB so all settings got reset in this module ( sorry :( )
+
+	-- Echoes of Ny'alotha sometimes do not show on a team member and blocks them from being showen in the blizzard UI. ( Issue #107 )
+		- DEV NOTE: This has been making a problem with EMA information generating the Currency List i added a hotfix to stop this blocking the addon
+		- please to no report report it when a character Shows 0 Echoes of Ny'alotha
+		-this is not a EMA problem this a blizzard problem and is well known. A reclient load or deleteing you Cache will fix and they should show again.
+
+
+
+
+
+---------------------------
+
+EMA Version: v8.3.0-Release-v2.5(0145)
+Game Version: 8.3.0
+Release Date: 18/07/2020
+
+##Ebonys Utilities
+	-- Fixed issue #106
+
+
+
+
+---------------------------
+
+EMA Version: v8.3.0-Release-v2.5(0144)
+Game Version: 8.3.0
+Release Date: 18/07/2020
+
+##Follow
+	- Fixed a bug with warn pvp follow not getting truned off.
+
+
+
+---------------------------
+
 EMA Version: v8.3.0-Release-v2.5(0143)
 Game Version: 8.3.0
 Release Date: 17/07/2020
diff --git a/Core/Communications.lua b/Core/Communications.lua
index 2321bb3..dd85fa7 100644
--- a/Core/Communications.lua
+++ b/Core/Communications.lua
@@ -358,9 +358,9 @@ function EMA:CommandReceived( prefix, message, distribution, sender )
 					EMA:DebugMessage( "Sending command on to module: ", sender, moduleName, commandName, unpack( argumentsTable ) )
 					EMAPrivate.Core.OnCommandReceived( sender, moduleName, commandName, unpack( argumentsTable ) )
 				end
-			else
-				EMA:DebugMessage( "Sender is NOT in team list." )
-			end
+		else
+			EMA:DebugMessage( "Sender is NOT in team list." )
+		end
 	end
 end

@@ -462,10 +462,25 @@ end
 function EMA:OnDisable()
 end

+local function isPlayerInMyGuild( playerName)
+	local numGuildMembers, numOnline, numOnlineAndMobile = GetNumGuildMembers()
+	for index = 1, numGuildMembers do
+		local characterName,_,_,_,class,_,_,_,online,status,classFileName,_, _,isMobile = GetGuildRosterInfo(index)
+		--EMA:Print("taaa", characterName, playerName)
+		if characterName == playerName then
+			--EMA:Print("player in my guild 102", characterName)
+			return true
+		end
+	end
+	return false
+end
+
+
 function EMA:GUILD_ROSTER_UPDATE(event, ... )
 	if EMA.db.useGuildComms == false then
 		return
 	end
+	EMA:SetNonGuildMembersOflline()
 	local numGuildMembers, numOnline, numOnlineAndMobile = GetNumGuildMembers()
 	for index = 1, numGuildMembers do
 		characterName,_,_,_,class,_,_,_,online,status,classFileName,_, _,isMobile = GetGuildRosterInfo(index)
@@ -478,9 +493,28 @@ function EMA:GUILD_ROSTER_UPDATE(event, ... )
 				end
 			end
 		end
-	end
+	end
 end

+
+function EMA:SetNonGuildMembersOflline()
+-- If Character is not in guild then auto set it offline as there is no communication for them cross guild!
+	for characterName, position in EMAApi.TeamList() do
+		local isNotInGuild = isPlayerInMyGuild( characterName )
+		--EMA:Print("test", characterName, "is", isNotInGuild )
+
+		if isNotInGuild == false then
+			if EMA.db.autoSetTeamOnlineorOffline == true then
+				if EMAApi.IsCharacterInTeam(characterName) == true and IsCharacterOnline( characterName ) == true then
+					EMAApi.setOffline( characterName, false )
+					--EMA:Print("player is not in my guild 101", characterName )
+				end
+			end
+		end
+	end
+end
+
+
 -------------------------------------------------------------------------------------------------------------
 -- Settings Dialogs.
 -------------------------------------------------------------------------------------------------------------
diff --git a/Core/Core.lua b/Core/Core.lua
index 9052798..f7ef5cf 100644
--- a/Core/Core.lua
+++ b/Core/Core.lua
@@ -73,7 +73,7 @@ function EMA:OnEnable()
 		StaticPopup_Show( "ALL_SETTINGS HAVE BEEN RESET" )
 	end
 	]]
-	if EMA.db.global.showStartupMessage2000 then
+	if EMA.db.global.showStartupMessage3000 then
 		StaticPopup_Show( "UpgradeTo_v2" )
 	end
 end
@@ -111,7 +111,7 @@ local function InitializePopupDialogs()
 		text = L["v2_NEWS"],
 		button1 = OKAY,
 		OnAccept = function()
-			EMA.db.global.showStartupMessage2000 = false
+			EMA.db.global.showStartupMessage3000 = false
 		end,
 		showAlert = 1,
 		timeout = 0,
@@ -233,6 +233,7 @@ EMA.settings = {
 		['**'] = {
 			showStartupMessage8000 = false,
 			showStartupMessage2000 = true,
+			showStartupMessage3000 = true
 		},
 	 },
 	profile = {
diff --git a/Core/Team.lua b/Core/Team.lua
index feb3ed9..950a905 100644
--- a/Core/Team.lua
+++ b/Core/Team.lua
@@ -1158,16 +1158,16 @@ end
 -- Invite team to party.

 function EMA.DoTeamPartyInvite()
-	InviteUnit( EMA.inviteList[EMA.currentInviteCount] )
+	C_PartyInfo.InviteUnit( EMA.inviteList[EMA.currentInviteCount] )
 	EMA.currentInviteCount = EMA.currentInviteCount + 1
 	if EMA.currentInviteCount < EMA.inviteCount then
 		--if GetTeamListMaximumOrderOnline() > 5 and EMA.db.inviteConvertToRaid == true then
 		if EMA.inviteCount > 4 and EMA.db.inviteConvertToRaid == true then
 			if EMA.db.inviteSetAllAssistant == true then
-				ConvertToRaid()
+				C_PartyInfo.ConvertToRaid()
 				SetEveryoneIsAssistant(true)
 			else
-				ConvertToRaid()
+				C_PartyInfo.ConvertToRaid()
 			end
 		end
 		EMA:ScheduleTimer( "DoTeamPartyInvite", 0.5 )
@@ -1318,7 +1318,7 @@ end

 local function LeaveTheParty()
 	if IsInGroup( "player" ) then
-		LeaveParty()
+		C_PartyInfo.LeaveParty()
 	end
 end

diff --git a/EMA.toc b/EMA.toc
index ba05b14..7bc8b36 100644
--- a/EMA.toc
+++ b/EMA.toc
@@ -1,9 +1,9 @@
-## Interface: 80300
+## Interface: 90001
 ## Title: EMA
 ## Notes: Ebony's MultiBoxing Assistant
 ## Author: Jennifer Calladine 'Ebony'
-## Version: v8.3.0-Release-v2.5(0143)
-## SavedVariables: CoreProfileDB, CommunicationsProfileDB, TeamProfileDB, TagProfileDB, MessageProfileDB, CurrProfileDB, DisplayTeamProfileDB, FollowProfileDB, GuildProfileDB, InteractionProfileDB, ItemUseProfileDB, PurchaseProfileDB, QuestProfileDB,  QuestWatcherProfileDB, SellProfileDB, TalkProfileDB, ToonProfileDB, TradeProfileDB, MailProfileDB, BankProfileDB, ISBoxerProfileDB
+## Version: v9.0.1-Release-v3.0(0153)
+## SavedVariables: CoreProfileDB, CommunicationsProfileDB, TeamProfileDB, TagProfileDB, MessageProfileDB, InformationProfileDB, DisplayTeamProfileDB, FollowProfileDB, GuildProfileDB, InteractionProfileDB, ItemUseProfileDB, PurchaseProfileDB, QuestProfileDB,  QuestWatcherProfileDB, SellProfileDB, TalkProfileDB, ToonProfileDB, TradeProfileDB, MailProfileDB, BankProfileDB, ISBoxerProfileDB

 #Libs
 Embeds.xml
diff --git a/EbonyUtilities.lua b/EbonyUtilities.lua
index 54c2fb3..659db19 100644
--- a/EbonyUtilities.lua
+++ b/EbonyUtilities.lua
@@ -128,6 +128,21 @@ function EbonyUtilities:MoneyString( value )
 			silverFormat = ""
 		end
 	end
+	return gold, silver, copper
+end
+
+
+-- A little toy to retun Gold,  silver and copper for formatted use.
+function EbonyUtilities:MoneyStringFormatted( value )
+	local gold = floor( value / ( EbonyUtilities.COPPER_PER_SILVER * EbonyUtilities.SILVER_PER_GOLD ) );
+	local silver = floor( ( value - ( gold * EbonyUtilities.COPPER_PER_SILVER * EbonyUtilities.SILVER_PER_GOLD ) ) / EbonyUtilities.COPPER_PER_SILVER );
+	local copper = mod( value, EbonyUtilities.COPPER_PER_SILVER );
+	if gold <=0 then
+		goldFormat = ""
+		if silver <= 0 then
+			silverFormat = ""
+		end
+	end
 	return BreakUpLargeNumbers(gold), silver, copper
 end

diff --git a/Embeds.xml b/Embeds.xml
index a701de9..81aff14 100644
--- a/Embeds.xml
+++ b/Embeds.xml
@@ -38,4 +38,5 @@
 	<Script file="GUI\AceGUIWidget-EMANormalLabel.lua" />
 	<Script file="GUI\AceGUIWidget-EMAContinueLabel.lua" />
 	<Script file="GUI\AceGUIWidget-EMAKeybinding.lua" />
+
 </Ui>
diff --git a/GUI/AceGUIContainer-EMATreeGroup.lua b/GUI/AceGUIContainer-EMATreeGroup.lua
index 5aeeff6..de9a4ee 100644
--- a/GUI/AceGUIContainer-EMATreeGroup.lua
+++ b/GUI/AceGUIContainer-EMATreeGroup.lua
@@ -282,11 +282,11 @@ local function Tree_OnMouseWheel(frame, delta)
 end

 local function Dragger_OnLeave(frame)
-	frame:SetBackdropColor(1, 1, 1, 0)
+--	frame:SetBackdropColor(1, 1, 1, 0)
 end

 local function Dragger_OnEnter(frame)
-	frame:SetBackdropColor(1, 1, 1, 0.8)
+--	frame:SetBackdropColor(1, 1, 1, 0.8)
 end

 local function Dragger_OnMouseDown(frame)
@@ -662,7 +662,7 @@ local PaneBackdrop  = {
 local DraggerBackdrop  = {
 	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
 	edgeFile = nil,
-	tile = true, tileSize = 16, edgeSize = 0,
+	tile = true, tileSize = 16, edgeSize = 1,
 	insets = { left = 3, right = 3, top = 7, bottom = 7 }
 }

@@ -670,7 +670,7 @@ local function Constructor()
 	local num = AceGUI:GetNextWidgetNum(Type)
 	local frame = CreateFrame("Frame", nil, UIParent)

-	local treeframe = CreateFrame("Frame", nil, frame)
+	local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	treeframe:SetPoint("TOPLEFT")
 	treeframe:SetPoint("BOTTOM")
 	treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@@ -685,7 +685,7 @@ local function Constructor()
 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)

-	local dragger = CreateFrame("Frame", nil, treeframe)
+	local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	dragger:SetWidth(8)
 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOM")
 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOM")
@@ -710,7 +710,7 @@ local function Constructor()
 	scrollbg:SetAllPoints(scrollbar)
 	scrollbg:SetColorTexture(0,0,0,0.4)

-	local border = CreateFrame("Frame",nil,frame)
+	local border = CreateFrame("Frame", nil , frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
 	border:SetPoint("BOTTOMRIGHT")
 	border:SetBackdrop(PaneBackdrop)
diff --git a/GUI/AceGUIContainer-EMAWindow.lua b/GUI/AceGUIContainer-EMAWindow.lua
index 43c5f1e..54e1725 100644
--- a/GUI/AceGUIContainer-EMAWindow.lua
+++ b/GUI/AceGUIContainer-EMAWindow.lua
@@ -189,6 +189,7 @@ local methods = {
 --[[-----------------------------------------------------------------------------
 Constructor
 -------------------------------------------------------------------------------]]
+
 local FrameBackdrop = {
 	bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
 	edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
@@ -203,8 +204,9 @@ local PaneBackdrop  = {
 	insets = { left = 3, right = 3, top = 5, bottom = 3 }
 }

+
 local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
+	local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	frame:Hide()

 	frame:EnableMouse(true)
@@ -212,6 +214,7 @@ local function Constructor()
 	frame:SetResizable(true)
 	--frame:SetFrameStrata("FULLSCREEN_DIALOG")
 	frame:SetFrameStrata("HIGH")
+
 	frame:SetBackdrop(FrameBackdrop)
 	frame:SetBackdropColor(0, 0, 0, 1)
 	frame:SetMinResize(400, 200)
@@ -226,7 +229,7 @@ local function Constructor()
 	closebutton:SetWidth(100)
 	closebutton:SetText(CLOSE)

-	local statusbg = CreateFrame("Button", nil, frame)
+	local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	statusbg:SetPoint("BOTTOMLEFT", 15, 15)
 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
 	statusbg:SetHeight(24)
@@ -235,13 +238,21 @@ local function Constructor()
 	statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
 	statusbg:SetScript("OnEnter", StatusBar_OnEnter)
 	statusbg:SetScript("OnLeave", StatusBar_OnLeave)
-
 	local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
 	statustext:SetPoint("TOPLEFT", 7, -2)
 	statustext:SetPoint("BOTTOMRIGHT", -7, 2)
 	statustext:SetHeight(20)
 	statustext:SetJustifyH("LEFT")
 	statustext:SetText("")
+
+--[[
+	local statusbg = frame:CreateTexture(nil, "BORDER")
+	statusbg:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
+	statusbg:SetPoint("TOPLEFT", 8, -24)
+	statusbg:SetPoint("BOTTOMRIGHT", -6, 8)
+	statusbg:SetVertexColor(0, 0, 0, .75)
+]]
+

 	--Hacky hacky to set a logo then text -- temp logo ChangeMe
 	local titlebg = frame:CreateTexture(nil, "OVERLAY")
@@ -292,7 +303,8 @@ local function Constructor()
 	line1:SetWidth(14)
 	line1:SetHeight(14)
 	line1:SetPoint("BOTTOMRIGHT", -8, 8)
-	line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line1:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
+--	line1:SetTexture("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)

@@ -300,7 +312,8 @@ local function Constructor()
 	line2:SetWidth(8)
 	line2:SetHeight(8)
 	line2:SetPoint("BOTTOMRIGHT", -8, 8)
-	line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
+	line2:SetTexture(251963) -- Interface\\PaperDollInfoFrame\\UI-GearManager-Border
+--	line2:SetTexture("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/GUI/EMAHelperSettings.lua b/GUI/EMAHelperSettings.lua
index 36731db..016e14b 100644
--- a/GUI/EMAHelperSettings.lua
+++ b/GUI/EMAHelperSettings.lua
@@ -546,11 +546,7 @@ function EMAHelperSettings:CreateScrollList( list )
 	local rowWidth = list.listWidth - ( columnSpacing * 2 ) - widthOfScrollBar
 	list.listHeight = list.rowsToDisplay * list.rowHeight + ( rowVerticalSpacing * 2 )
 	-- Create the holder frame.
-	list.listFrame = CreateFrame(
-		"Frame",
-		list.listFrameName,
-		list.parentFrame
-	)
+	list.listFrame = CreateFrame( "Frame", list.listFrameName, list.parentFrame, BackdropTemplateMixin and "BackdropTemplate" or nil )
 	list.listFrame:SetBackdrop( self:CreateBackdrop() )
 	list.listFrame:SetBackdropColor( 0.1, 0.1, 0.1, 0.5 )
 	list.listFrame:SetBackdropBorderColor( 0.4, 0.4, 0.4 )
diff --git a/Libs/AceAddon-3.0/AceAddon-3.0.lua b/Libs/AceAddon-3.0/AceAddon-3.0.lua
index 2b2a00e..1b63bd1 100644
--- a/Libs/AceAddon-3.0/AceAddon-3.0.lua
+++ b/Libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -28,9 +28,9 @@
 -- end
 -- @class file
 -- @name AceAddon-3.0.lua
--- @release $Id: AceAddon-3.0.lua 1202 2019-05-15 23:11:22Z nevcairiel $
+-- @release $Id: AceAddon-3.0.lua 1238 2020-08-28 16:18:42Z nevcairiel $

-local MAJOR, MINOR = "AceAddon-3.0", 12
+local MAJOR, MINOR = "AceAddon-3.0", 13
 local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceAddon then return end -- No Upgrade needed.
@@ -601,10 +601,20 @@ function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
 function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
 function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end

+-- Blizzard AddOns which can load very early in the loading process and mess with Ace3 addon loading
+local BlizzardEarlyLoadAddons = {
+	Blizzard_DebugTools = true,
+	Blizzard_TimeManager = true,
+	Blizzard_BattlefieldMap = true,
+	Blizzard_MapCanvas = true,
+	Blizzard_SharedMapDataProviders = true,
+	Blizzard_CombatLog = true,
+}
+
 -- Event Handling
 local function onEvent(this, event, arg1)
-	-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
-	if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
+	-- 2020-08-28 nevcairiel - ignore the load event of Blizzard addons which occur early in the loading process
+	if (event == "ADDON_LOADED"  and (arg1 == nil or not BlizzardEarlyLoadAddons[arg1])) or event == "PLAYER_LOGIN" then
 		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
 		while(#AceAddon.initializequeue > 0) do
 			local addon = tremove(AceAddon.initializequeue, 1)
diff --git a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 1e36320..a14e07d 100644
--- a/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/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 1222 2019-07-26 22:14:43Z funkydude $
+-- @release $Id: AceConfigDialog-3.0.lua 1232 2020-04-14 22:21:22Z nevcairiel $

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

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

 if not AceConfigDialog then return end
@@ -564,8 +564,19 @@ do
 			end
 		end)

-		local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate")
-		border:SetAllPoints(frame)
+		if WOW_PROJECT_ID == WOW_PROJECT_CLASSIC then
+			frame:SetBackdrop({
+				bgFile = [[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
+				edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
+				tile = true,
+				tileSize = 32,
+				edgeSize = 32,
+				insets = { left = 11, right = 11, top = 11, bottom = 11 },
+			})
+		else
+			local border = CreateFrame("Frame", nil, frame, "DialogBorderDarkTemplate")
+			border:SetAllPoints(frame)
+		end

 		local text = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
 		text:SetSize(290, 0)
@@ -900,7 +911,7 @@ end

 local function MultiControlOnClosed(widget, event, ...)
 	local user = widget:GetUserDataTable()
-	if user.valuechanged then
+	if user.valuechanged and not widget:IsReleasing() then
 		local iscustom = user.rootframe:GetUserData("iscustom")
 		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
 		if iscustom then
diff --git a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
index f77cfa0..121e3b4 100644
--- a/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+++ b/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
@@ -112,7 +112,7 @@ do
 	function AGSMW:GetBaseFrameWithWindow()
 		local frame = self:GetBaseFrame()

-		local displayButton = CreateFrame("Button", nil, frame)
+		local displayButton = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 			displayButton:SetHeight(42)
 			displayButton:SetWidth(42)
 			displayButton:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -2)
diff --git a/Libs/AceGUI-3.0/AceGUI-3.0.lua b/Libs/AceGUI-3.0/AceGUI-3.0.lua
index f59edda..cde61f6 100644
--- a/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ b/Libs/AceGUI-3.0/AceGUI-3.0.lua
@@ -24,8 +24,8 @@
 -- f:AddChild(btn)
 -- @class file
 -- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1221 2019-07-20 18:23:00Z nevcairiel $
-local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 39
+-- @release $Id: AceGUI-3.0.lua 1231 2020-04-14 22:20:36Z nevcairiel $
+local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 41
 local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)

 if not AceGUI then return end -- No upgrade needed
@@ -176,6 +176,8 @@ end
 -- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
 -- @param widget The widget to release
 function AceGUI:Release(widget)
+	if widget.isQueuedForRelease then return end
+	widget.isQueuedForRelease = true
 	safecall(widget.PauseLayout, widget)
 	widget.frame:Hide()
 	widget:Fire("OnRelease")
@@ -206,9 +208,26 @@ function AceGUI:Release(widget)
 		widget.content.width = nil
 		widget.content.height = nil
 	end
+	widget.isQueuedForRelease = nil
 	delWidget(widget, widget.type)
 end

+--- Check if a widget is currently in the process of being released
+-- This function check if this widget, or any of its parents (in which case it'll be released shortly as well)
+-- are currently being released. This allows addon to handle any callbacks accordingly.
+-- @param widget The widget to check
+function AceGUI:IsReleasing(widget)
+	if widget.isQueuedForRelease then
+		return true
+	end
+
+	if widget.parent and widget.parent.AceGUIWidgetVersion then
+		return AceGUI:IsReleasing(widget.parent)
+	end
+
+	return false
+end
+
 -----------
 -- Focus --
 -----------
@@ -335,6 +354,10 @@ do
 		AceGUI:Release(self)
 	end

+	WidgetBase.IsReleasing = function(self)
+		return AceGUI:IsReleasing(self)
+	end
+
 	WidgetBase.SetPoint = function(self, ...)
 		return self.frame:SetPoint(...)
 	end
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
index 4b09d64..379ea25 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
@@ -2,7 +2,7 @@
 DropdownGroup Container
 Container controlled by a dropdown on the top.
 -------------------------------------------------------------------------------]]
-local Type, Version = "DropdownGroup", 21
+local Type, Version = "DropdownGroup", 22
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -125,7 +125,7 @@ local function Constructor()
 	dropdown.frame:Show()
 	dropdown:SetLabel("")

-	local border = CreateFrame("Frame", nil, frame)
+	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	border:SetPoint("TOPLEFT", 0, -26)
 	border:SetPoint("BOTTOMRIGHT", 0, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index ec98f4b..fbd6005 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 Frame Container
 -------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 26
+local Type, Version = "Frame", 27
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -179,7 +179,7 @@ local PaneBackdrop  = {
 }

 local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
+	local frame = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	frame:Hide()

 	frame:EnableMouse(true)
@@ -201,7 +201,7 @@ local function Constructor()
 	closebutton:SetWidth(100)
 	closebutton:SetText(CLOSE)

-	local statusbg = CreateFrame("Button", nil, frame)
+	local statusbg = CreateFrame("Button", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	statusbg:SetPoint("BOTTOMLEFT", 15, 15)
 	statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
 	statusbg:SetHeight(24)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
index f3db7d6..357e843 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
@@ -2,7 +2,7 @@
 InlineGroup Container
 Simple container widget that creates a visible "box" with an optional title.
 -------------------------------------------------------------------------------]]
-local Type, Version = "InlineGroup", 21
+local Type, Version = "InlineGroup", 22
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -75,7 +75,7 @@ local function Constructor()
 	titletext:SetJustifyH("LEFT")
 	titletext:SetHeight(18)

-	local border = CreateFrame("Frame", nil, frame)
+	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	border:SetPoint("TOPLEFT", 0, -17)
 	border:SetPoint("BOTTOMRIGHT", -1, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
index 053e27d..195ab0b 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ b/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", 36
+local Type, Version = "TabGroup", 37
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -316,7 +316,7 @@ local function Constructor()
 	titletext:SetHeight(18)
 	titletext:SetText("")

-	local border = CreateFrame("Frame", nil, frame)
+	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	border:SetPoint("TOPLEFT", 1, -27)
 	border:SetPoint("BOTTOMRIGHT", -1, 3)
 	border:SetBackdrop(PaneBackdrop)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index eb94c04..cdc8051 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,12 +2,10 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 44
+local Type, Version = "TreeGroup", 45
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

-local WoW80 = select(4, GetBuildInfo()) >= 80000
-
 -- Lua APIs
 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
 local math_min, math_max, floor = math.min, math.max, floor
@@ -422,8 +420,7 @@ 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
+		if self.frame:GetParent() == UIParent and not fromOnUpdate then
 			self.frame:SetScript("OnUpdate", FirstFrameUpdate)
 			return
 		end
@@ -632,7 +629,7 @@ local PaneBackdrop  = {
 local DraggerBackdrop  = {
 	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
 	edgeFile = nil,
-	tile = true, tileSize = 16, edgeSize = 0,
+	tile = true, tileSize = 16, edgeSize = 1,
 	insets = { left = 3, right = 3, top = 7, bottom = 7 }
 }

@@ -640,7 +637,7 @@ local function Constructor()
 	local num = AceGUI:GetNextWidgetNum(Type)
 	local frame = CreateFrame("Frame", nil, UIParent)

-	local treeframe = CreateFrame("Frame", nil, frame)
+	local treeframe = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	treeframe:SetPoint("TOPLEFT")
 	treeframe:SetPoint("BOTTOMLEFT")
 	treeframe:SetWidth(DEFAULT_TREE_WIDTH)
@@ -655,7 +652,7 @@ local function Constructor()
 	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
 	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)

-	local dragger = CreateFrame("Frame", nil, treeframe)
+	local dragger = CreateFrame("Frame", nil, treeframe, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	dragger:SetWidth(8)
 	dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
 	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
@@ -680,7 +677,7 @@ local function Constructor()
 	scrollbg:SetAllPoints(scrollbar)
 	scrollbg:SetColorTexture(0,0,0,0.4)

-	local border = CreateFrame("Frame",nil,frame)
+	local border = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
 	border:SetPoint("BOTTOMRIGHT")
 	border:SetBackdrop(PaneBackdrop)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
index 0d6308f..5481630 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
@@ -1,4 +1,4 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1209 2019-06-24 21:01:01Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown.lua 1239 2020-09-20 10:22:02Z nevcairiel $ ]]--
 local AceGUI = LibStub("AceGUI-3.0")

 -- Lua APIs
@@ -39,7 +39,7 @@ end

 do
 	local widgetType = "Dropdown-Pullout"
-	local widgetVersion = 3
+	local widgetVersion = 5

 	--[[ Static data ]]--

@@ -193,12 +193,7 @@ do

 		local height = 8
 		for i, item in pairs(items) do
-			if i == 1 then
-				item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
-			else
-				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
-			end
-
+			item:SetPoint("TOP", itemFrame, "TOP", 0, -2 + (i - 1) * -16)
 			item:Show()

 			height = height + 16
@@ -258,7 +253,7 @@ do

 	local function Constructor()
 		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
+		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
 		local self = {}
 		self.count = count
 		self.type = widgetType
@@ -309,7 +304,7 @@ do
 		scrollFrame.obj = self
 		itemFrame.obj = self

-		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
+		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 		slider:SetOrientation("VERTICAL")
 		slider:SetHitRectInsets(0, 0, -10, 0)
 		slider:SetBackdrop(sliderBackdrop)
@@ -356,7 +351,7 @@ end

 do
 	local widgetType = "Dropdown"
-	local widgetVersion = 34
+	local widgetVersion = 35

 	--[[ Static data ]]--

@@ -465,6 +460,7 @@ do
 		self:SetWidth(200)
 		self:SetLabel()
 		self:SetPulloutWidth(nil)
+		self.list = {}
 	end

 	-- exported, AceGUI callback
@@ -535,9 +531,7 @@ do

 	-- exported
 	local function SetValue(self, value)
-		if self.list then
-			self:SetText(self.list[value] or "")
-		end
+		self:SetText(self.list[value] or "")
 		self.value = value
 	end

@@ -601,7 +595,7 @@ do
 		end
 	end
 	local function SetList(self, list, order, itemType)
-		self.list = list
+		self.list = list or {}
 		self.pullout:Clear()
 		self.hasClose = nil
 		if not list then return end
@@ -629,10 +623,8 @@ do

 	-- exported
 	local function AddItem(self, value, text, itemType)
-		if self.list then
-			self.list[value] = text
-			AddListItem(self, value, text, itemType)
-		end
+		self.list[value] = text
+		AddListItem(self, value, text, itemType)
 	end

 	-- exported
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
index ec4cead..17a3c0b 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
@@ -2,7 +2,7 @@
 Keybinding Widget
 Set Keybindings in the Config UI.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Keybinding", 25
+local Type, Version = "Keybinding", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -214,7 +214,7 @@ local function Constructor()
 	label:SetJustifyH("CENTER")
 	label:SetHeight(18)

-	local msgframe = CreateFrame("Frame", nil, UIParent)
+	local msgframe = CreateFrame("Frame", nil, UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	msgframe:SetHeight(30)
 	msgframe:SetBackdrop(ControlBackdrop)
 	msgframe:SetBackdropColor(0,0,0)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
index eec999e..5c75f3b 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
@@ -2,7 +2,7 @@
 Label Widget
 Displays text and optionally an icon.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Label", 26
+local Type, Version = "Label", 27
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -130,6 +130,7 @@ local methods = {

 	["SetFont"] = function(self, font, height, flags)
 		self.label:SetFont(font, height, flags)
+		UpdateImageAnchor(self)
 	end,

 	["SetFontObject"] = function(self, font)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index f702110..0e953ab 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -1,4 +1,4 @@
-local Type, Version = "MultiLineEditBox", 28
+local Type, Version = "MultiLineEditBox", 29
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -297,7 +297,7 @@ local function Constructor()
 	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
 	text:SetJustifyV("MIDDLE")

-	local scrollBG = CreateFrame("Frame", nil, frame)
+	local scrollBG = CreateFrame("Frame", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	scrollBG:SetBackdrop(backdrop)
 	scrollBG:SetBackdropColor(0, 0, 0)
 	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
diff --git a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
index 019c84e..9f26d2d 100644
--- a/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ b/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
@@ -2,7 +2,7 @@
 Slider Widget
 Graphical Slider, like, for Range values.
 -------------------------------------------------------------------------------]]
-local Type, Version = "Slider", 22
+local Type, Version = "Slider", 23
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -225,7 +225,7 @@ local function Constructor()
 	label:SetJustifyH("CENTER")
 	label:SetHeight(15)

-	local slider = CreateFrame("Slider", nil, frame)
+	local slider = CreateFrame("Slider", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	slider:SetOrientation("HORIZONTAL")
 	slider:SetHeight(15)
 	slider:SetHitRectInsets(0, 0, -10, 0)
@@ -247,7 +247,7 @@ local function Constructor()
 	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
 	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)

-	local editbox = CreateFrame("EditBox", nil, frame)
+	local editbox = CreateFrame("EditBox", nil, frame, BackdropTemplateMixin and "BackdropTemplate" or nil)
 	editbox:SetAutoFocus(false)
 	editbox:SetFontObject(GameFontHighlightSmall)
 	editbox:SetPoint("TOP", slider, "BOTTOM")
diff --git a/Libs/Bindings.xml b/Libs/Bindings.xml
new file mode 100644
index 0000000..77ab8c8
--- /dev/null
+++ b/Libs/Bindings.xml
@@ -0,0 +1,5 @@
+<Bindings>
+	<Binding name="RELOADUI" description="Reloads the UI." header="ACE3" category="ADDONS">
+		ReloadUI()
+	</Binding>
+</Bindings>
diff --git a/Libs/CHANGES.txt b/Libs/CHANGES.txt
new file mode 100644
index 0000000..541e851
--- /dev/null
+++ b/Libs/CHANGES.txt
@@ -0,0 +1,93 @@
+------------------------------------------------------------------------
+r1240 | nevcairiel | 2020-10-13 07:59:32 +0000 (Tue, 13 Oct 2020) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+   M /trunk/changelog.txt
+
+Update changelog and TOC
+------------------------------------------------------------------------
+r1239 | nevcairiel | 2020-09-20 10:22:02 +0000 (Sun, 20 Sep 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+
+AceGUI-3.0: DropDown: Anchor all items to the dropdown frame instead of chaining anchors, fixes anchoring on WoW 9.0 with many items
+------------------------------------------------------------------------
+r1238 | nevcairiel | 2020-08-28 16:18:42 +0000 (Fri, 28 Aug 2020) | 3 lines
+Changed paths:
+   M /trunk/AceAddon-3.0/AceAddon-3.0.lua
+
+AceAddon-3.0: Blacklist more Blizzard addons from triggering Ace3 load events
+
+These addons can be loaded very early by UIParent, which causes issues with loading certain addons
+------------------------------------------------------------------------
+r1237 | nevcairiel | 2020-07-17 22:50:38 +0000 (Fri, 17 Jul 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+
+Use BackdropTemplate in WoW 9.0
+------------------------------------------------------------------------
+r1236 | nevcairiel | 2020-04-16 07:36:45 +0000 (Thu, 16 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+
+AceGUI-3.0: DropDown: Initialize the widget with an empty item list (instead of nil), this allows AddItem to be used right away (Fixes #542)
+------------------------------------------------------------------------
+r1235 | nevcairiel | 2020-04-15 10:27:55 +0000 (Wed, 15 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+
+Cleanup debug
+------------------------------------------------------------------------
+r1234 | nevcairiel | 2020-04-15 10:14:35 +0000 (Wed, 15 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+
+AceGUI-3.0: TreeGroup: Remove pre-8.0 compat
+------------------------------------------------------------------------
+r1233 | nevcairiel | 2020-04-15 10:09:47 +0000 (Wed, 15 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+
+AceGUI-3.0: Label: Refresh anchoring after changing the font (Fixes #540)
+------------------------------------------------------------------------
+r1232 | nevcairiel | 2020-04-14 22:21:22 +0000 (Tue, 14 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+
+AceConfigDialog-3.0: Prevent a dialog refresh when a multiselect control is closed during release (Fixes #539)
+------------------------------------------------------------------------
+r1231 | nevcairiel | 2020-04-14 22:20:36 +0000 (Tue, 14 Apr 2020) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/AceGUI-3.0.lua
+
+AceGUI-3.0: Add a getter to allow callers to check if a widget is currently being released, which can be used as part of some callbacks to alter behavior
+------------------------------------------------------------------------
+r1230 | funkydude | 2020-01-14 17:01:25 +0000 (Tue, 14 Jan 2020) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1229 | funkydude | 2019-10-11 20:48:50 +0000 (Fri, 11 Oct 2019) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+bump toc
+------------------------------------------------------------------------
+r1228 | nevcairiel | 2019-09-06 08:51:17 +0000 (Fri, 06 Sep 2019) | 3 lines
+Changed paths:
+   M /trunk/AceGUI-3.0/AceGUI-3.0.lua
+
+AceGUI-3.0: Avoid re-entrance into the Release function
+
+This can happen if a frame is released in a callback fired in the release process, and may in some cases throw errors.
+------------------------------------------------------------------------
+
diff --git a/Libs/EMALibActionButton-1.0.lua b/Libs/EMALibActionButton-1.0.lua
index bfb67bc..1ba1c07 100644
--- a/Libs/EMALibActionButton-1.0.lua
+++ b/Libs/EMALibActionButton-1.0.lua
@@ -27,11 +27,11 @@ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-the file was edit for Ema by Jennifer cally 2016-2018
+the file was edit for Ema by Jennifer cally 2016-2020 9.0

 ]]
 local MAJOR_VERSION = "EMALibActionButton-1.0"
-local MINOR_VERSION = 74
+local MINOR_VERSION = 75

 if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
 local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
@@ -44,20 +44,17 @@ local setmetatable, wipe, unpack, pairs, next = setmetatable, wipe, unpack, pair
 local str_match, format, tinsert, tremove = string.match, format, tinsert, tremove

 -- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- Note: No WoW API function get upvalued to allow proper interaction with any addons that try to hook them.
--- GLOBALS: LibStub, CreateFrame, InCombatLockdown, ClearCursor, GetCursorInfo, GameTooltip, GameTooltip_SetDefaultAnchor
--- GLOBALS: GetBindingKey, GetBindingText, SetBinding, SetBindingClick, GetCVar, GetMacroInfo
--- GLOBALS: PickupAction, PickupItem, PickupMacro, PickupPetAction, PickupSpell, PickupCompanion, PickupEquipmentSet
--- GLOBALS: CooldownFrame_SetTimer, UIParent, IsSpellOverlayed, SpellFlyout, GetMouseFocus, SetClampedTextureRotation
--- GLOBALS: GetActionInfo, GetActionTexture, HasAction, GetActionText, GetActionCount, GetActionCooldown, IsAttackAction
--- GLOBALS: IsAutoRepeatAction, IsEquippedAction, IsCurrentAction, IsConsumableAction, IsUsableAction, IsStackableAction, IsActionInRange
--- GLOBALS: GetSpellLink, GetMacroSpell, GetSpellTexture, GetSpellCount, GetSpellCooldown, IsAttackSpell, IsCurrentSpell
--- GLOBALS: FindSpellBookSlotBySpellID, IsUsableSpell, IsConsumableSpell, IsSpellInRange, IsAutoRepeatSpell
--- GLOBALS: GetItemIcon, GetItemCount, GetItemCooldown, IsEquippedItem, IsCurrentItem, IsUsableItem, IsConsumableItem, IsItemInRange
--- GLOBALS: GetActionCharges, IsItemAction, GetSpellCharges
--- GLOBALS: RANGE_INDICATOR, ATTACK_BUTTON_FLASH_TIME, TOOLTIP_UPDATE_TIME
--- GLOBALS: ZoneAbilityFrame, HasZoneAbility, GetLastZoneAbilitySpellTexture
+-- GLOBALS: CooldownFrame_Set, CreateFrame, FindSpellBookSlotBySpellID, FlyoutHasSpell, GameTooltip, GameTooltip_SetDefaultAnchor
+-- GLOBALS: GetActionCharges, GetActionCooldown, GetActionCount, GetActionInfo, GetActionLossOfControlCooldown, GetActionText
+-- GLOBALS: GetActionTexture, GetBindingKey, GetBindingText, GetCursorInfo, GetCVar, GetCVarBool, GetItemCooldown, GetItemCount
+-- GLOBALS: GetItemIcon, GetLastZoneAbilitySpellTexture, GetMacroInfo, GetMacroSpell, GetModifiedClick, GetMouseFocus, GetSpellCharges
+-- GLOBALS: GetSpellCooldown, GetSpellCount, GetSpellInfo, GetSpellTexture, HasAction, HasZoneAbility, InCombatLockdown, IsActionInRange
+-- GLOBALS: IsAltKeyDown, IsAttackAction, IsAttackSpell, IsAutoRepeatAction, IsAutoRepeatSpell, IsConsumableAction, IsConsumableItem
+-- GLOBALS: IsConsumableSpell, IsControlKeyDown, IsCurrentAction, IsCurrentItem, IsCurrentSpell, IsEquippedAction, IsEquippedItem
+-- GLOBALS: IsItemAction, IsItemInRange, IsShiftKeyDown, IsSpellInRange, IsSpellOverlayed, IsStackableAction, IsUsableAction, IsUsableItem
+-- GLOBALS: IsUsableSpell, LibStub, PickupAction, PickupCompanion, PickupEquipmentSet, PickupItem, PickupMacro, PickupPetAction, PickupSpell
+-- GLOBALS: RANGE_INDICATOR, SetBinding, SetBindingClick, SetClampedTextureRotation, SpellFlyout, TOOLTIP_UPDATE_TIME, UIParent, ZoneAbilityFrame
+

 local KeyBound = LibStub("LibKeyBound-1.0", true)
 local CBH = LibStub("CallbackHandler-1.0")
@@ -97,6 +94,8 @@ local Item_MT = {__index = Item}
 local Macro = setmetatable({}, {__index = Generic})
 local Macro_MT = {__index = Macro}

+local Toy = setmetatable({}, {__index = Generic})
+local Toy_MT = {__index = Toy}
 local Custom = setmetatable({}, {__index = Generic})
 local Custom_MT = {__index = Custom}

@@ -107,6 +106,7 @@ local type_meta_map = {
 	spell  = Spell_MT,
 	item   = Item_MT,
 	macro  = Macro_MT,
+	toy    = Toy_MT,
 	custom = Custom_MT
 }

@@ -117,6 +117,7 @@ local StartFlash, StopFlash, UpdateFlash, UpdateHotkeys, UpdateRangeTimer, Updat
 local UpdateFlyout, ShowGrid, HideGrid, UpdateGrid, SetupSecureSnippets, WrapOnClick
 local ShowOverlayGlow, HideOverlayGlow
 local EndChargeCooldown
+local UpdateRange

 local InitializeEventHandler, OnEvent, ForAllButtons, OnUpdate

@@ -131,9 +132,12 @@ local DefaultConfig = {
 	outOfRangeColoring = "button",
 	tooltip = "enabled",
 	showGrid = false,
+	useColoring = true,
 	colors = {
 		range = { 0.8, 0.1, 0.1 },
-		mana = { 0.5, 0.5, 1.0 }
+		mana = { 0.5, 0.5, 1.0 },
+		usable = { 1.0, 1.0, 1.0 },
+		notUsable = { 0.4, 0.4, 0.4 },
 	},
 	hideElements = {
 		macro = false,
@@ -143,6 +147,9 @@ local DefaultConfig = {
 	keyBoundTarget = false,
 	clickOnDown = false,
 	flyoutDirection = "UP",
+	disableCountDownNumbers = false,
+	useDrawBling = true,
+	useDrawSwipeOnCharges = true,
 }

 --- Create a new action button.
@@ -511,7 +518,8 @@ local function PickupAny(kind, target, detail, ...)
 	if kind == "clear" then
 		ClearCursor()
 		kind, target, detail = target, detail, ...
-	end
+	end
+
 	if kind == 'action' then
 		PickupAction(target)
 	elseif kind == 'item' then
@@ -529,6 +537,31 @@ local function PickupAny(kind, target, detail, ...)
 	end
 end

+function Generic:OnUpdate(elapsed)
+	if not GetCVarBool('lockActionBars') then return; end
+
+	self.lastupdate = (self.lastupdate or 0) + elapsed;
+	if (self.lastupdate < .2) then return end
+	self.lastupdate = 0
+
+	local isDragKeyDown
+	if GetModifiedClick("PICKUPACTION") == 'ALT' then
+		isDragKeyDown = IsAltKeyDown()
+	elseif GetModifiedClick("PICKUPACTION") == 'CTRL' then
+		isDragKeyDown = IsControlKeyDown()
+	elseif GetModifiedClick("PICKUPACTION") == 'SHIFT' then
+		isDragKeyDown = IsShiftKeyDown()
+	end
+
+	if isDragKeyDown and (self.clickState == 'AnyDown' or self.clickState == nil) then
+		self.clickState = 'AnyUp'
+		self:RegisterForClicks(self.clickState)
+	elseif self.clickState == 'AnyUp' and not isDragKeyDown then
+		self.clickState = 'AnyDown'
+		self:RegisterForClicks(self.clickState)
+	end
+end
+
 function Generic:OnEnter()
 	if self.config.tooltip ~= "disabled" and (self.config.tooltip ~= "nocombat" or not InCombatLockdown()) then
 		UpdateTooltip(self)
@@ -541,11 +574,15 @@ function Generic:OnEnter()
 		ClearNewActionHighlight(self._state_action, false, false)
 		UpdateNewAction(self)
 	end
+	if self.config.clickOnDown then
+		self:SetScript('OnUpdate', Generic.OnUpdate)
+	end
 end

 function Generic:OnLeave()
 	if GameTooltip:IsForbidden() then return end
 	GameTooltip:Hide()
+	self:SetScript('OnUpdate', nil)
 end

 -- Insecure drag handler to allow clicking on the button with an action on the cursor
@@ -623,11 +660,10 @@ function Generic:UpdateConfig(config)
 	if config and type(config) ~= "table" then
 		error("LibActionButton-1.0: UpdateConfig requires a valid configuration!", 2)
 	end
-	local oldconfig = self.config
-	if not self.config then self.config = {} end
+	self.config = {}
 	-- merge the two configs
 	merge(self.config, config, DefaultConfig)
-
+--[[
 	if self.config.outOfRangeColoring == "button" or (oldconfig and oldconfig.outOfRangeColoring == "button") then
 		UpdateUsable(self)
 	end
@@ -636,7 +672,7 @@ function Generic:UpdateConfig(config)
 	elseif oldconfig and oldconfig.outOfRangeColoring == "hotkey" then
 		self.HotKey:SetVertexColor(0.75, 0.75, 0.75)
 	end
-
+]]
 	if self.config.hideElements.macro then
 		self.Name:Hide()
 	else
@@ -647,7 +683,7 @@ function Generic:UpdateConfig(config)

 	UpdateHotkeys(self)
 	UpdateGrid(self)
-	Update(self)
+	Update(self, true)
 	self:RegisterForClicks(self.config.clickOnDown and "AnyDown" or "AnyUp")
 end

@@ -663,9 +699,12 @@ end

 function InitializeEventHandler()
 	lib.eventFrame:SetScript("OnEvent", OnEvent)
+
 	lib.eventFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
 	lib.eventFrame:RegisterEvent("ACTIONBAR_SHOWGRID")
 	lib.eventFrame:RegisterEvent("ACTIONBAR_HIDEGRID")
+	lib.eventFrame:RegisterEvent("PET_BAR_SHOWGRID")
+	lib.eventFrame:RegisterEvent("PET_BAR_HIDEGRID")
 	--lib.eventFrame:RegisterEvent("ACTIONBAR_PAGE_CHANGED")
 	--lib.eventFrame:RegisterEvent("UPDATE_BONUS_ACTIONBAR")
 	lib.eventFrame:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
@@ -727,11 +766,11 @@ function OnEvent(frame, event, arg1, ...)
 	elseif event == "PLAYER_ENTERING_WORLD" or event == "UPDATE_SHAPESHIFT_FORM" or event == "UPDATE_VEHICLE_ACTIONBAR" then
 		ForAllButtons(Update)
 	elseif event == "ACTIONBAR_PAGE_CHANGED" or event == "UPDATE_BONUS_ACTIONBAR" then
-		-- TODO: Are these even needed?
-	elseif event == "ACTIONBAR_SHOWGRID" then
-		ShowGrid()
-	elseif event == "ACTIONBAR_HIDEGRID" then
-		HideGrid()
+		-- TODO: Are these even needed
+	elseif event == "ACTIONBAR_SHOWGRID" or event == "PET_BAR_SHOWGRID" then
+		ShowGrid(event)
+	elseif event == "ACTIONBAR_HIDEGRID" or event == "PET_BAR_SHOWGRID" then
+		HideGrid(event)
 	elseif event == "UPDATE_BINDINGS" then
 		ForAllButtons(UpdateHotkeys)
 	elseif event == "PLAYER_TARGET_CHANGED" then
@@ -755,7 +794,7 @@ function OnEvent(frame, event, arg1, ...)
 	elseif event == "ACTIONBAR_UPDATE_COOLDOWN" then
 		for button in next, ActionButtons do
 			UpdateCooldown(button)
-			if GameTooltip:GetOwner() == button then
+			if GameTooltip_GetOwnerForbidden() == button then
 				UpdateTooltip(button)
 			end
 		end
@@ -883,6 +922,8 @@ function OnUpdate(_, elapsed)

 			-- Range
 			if rangeTimer <= 0 then
+				UpdateRange(button)
+				--[[
 				local inRange = button:IsInRange()
 				local oldRange = button.outOfRange
 				button.outOfRange = (inRange == false)
@@ -905,6 +946,7 @@ function OnUpdate(_, elapsed)
 						end
 					end
 				end
+			]]
 			end
 		end

@@ -919,7 +961,16 @@ function OnUpdate(_, elapsed)
 end

 local gridCounter = 0
-function ShowGrid()
+local isPetGrid = false
+function ShowGrid(event)
+	if event == "PET_BAR_SHOWGRID" then
+		isPetGrid = true
+	elseif isPetGrid then
+		return
+		-- when PET_BAR_SHOWGRID fires then ACTIONBAR_SHOWGRID fires
+		-- ACTIONBAR_HIDEGRID will not get called but PET_BAR_HIDEGRID does
+		-- LIKELY A BLIZZARD ISSUE.
+	end
 	gridCounter = gridCounter + 1
 	if gridCounter >= 1 then
 		for button in next, ButtonRegistry do
@@ -930,7 +981,12 @@ function ShowGrid()
 	end
 end

-function HideGrid()
+function HideGrid(event)
+	if event == "PET_BAR_HIDEGRID" then
+		isPetGrid = false
+	elseif isPetGrid then
+		return --see comment above related to `isPetGrid`
+	end
 	if gridCounter > 0 then
 		gridCounter = gridCounter - 1
 	end
@@ -951,6 +1007,31 @@ function UpdateGrid(self)
 	end
 end

+function UpdateRange(self, force)
+	local inRange = self:IsInRange()
+	local oldRange = self.outOfRange
+	self.outOfRange = (inRange == false)
+	if force or (oldRange ~= self.outOfRange) then
+		if self.config.outOfRangeColoring == "button" then
+			UpdateUsable(self)
+		elseif self.config.outOfRangeColoring == "hotkey" then
+			local hotkey = self.HotKey
+			if hotkey:GetText() == RANGE_INDICATOR then
+				if inRange == false then
+					hotkey:Show()
+				else
+					hotkey:Hide()
+				end
+			end
+
+			if inRange == false then
+				hotkey:SetVertexColor(unpack(self.config.colors.range))
+			else
+				hotkey:SetVertexColor(unpack(self.config.colors.usable))
+			end
+		end
+	end
+end
 -----------------------------------------------------------
 --- KeyBound integration

@@ -1021,9 +1102,9 @@ end

 function Generic:UpdateAction(force)
 	local type, action = self:GetAction()
-	if force or type ~= self._state_type or action ~= self._state_action then
+	if force or (type ~= self._state_type) or (action ~= self._state_action) then
 		-- type changed, update the metatable
-		if force or self._state_type ~= type then
+		if force or (self._state_type ~= type) then
 			local meta = type_meta_map[type] or type_meta_map.empty
 			setmetatable(self, meta)
 			self._state_type = type
@@ -1041,7 +1122,21 @@ function lib:UpdateAllButtons()
 	end
 end

-function Update(self)
+function Generic:UpdateAction(force)
+	local type, action = self:GetAction()
+	if force or (type ~= self._state_type) or (action ~= self._state_action) then
+		-- type changed, update the metatable
+		if force or (self._state_type ~= type) then
+			local meta = type_meta_map[type] or type_meta_map.empty
+			setmetatable(self, meta)
+			self._state_type = type
+		end
+		self._state_action = action
+		Update(self)
+	end
+end
+
+function Update(self, fromUpdateConfig)
 	if self:HasAction() then
 		ActiveButtons[self] = true
 		if self._state_type == "action" then
@@ -1052,7 +1147,6 @@ function Update(self)
 			NonActionButtons[self] = true
 		end
 		self:SetAlpha(1.0)
-		UpdateButtonState(self)
 		UpdateUsable(self)
 		UpdateCooldown(self)
 		UpdateFlash(self)
@@ -1091,7 +1185,9 @@ function Update(self)

 	-- Zone ability button handling
 	self.zoneAbilityDisabled = false
-	self.icon:SetDesaturated(false)
+	if not self.saturationLocked then
+		self.icon:SetDesaturated(false)
+	end
 	if self._state_type == "action" then
 		local action_type, id = GetActionInfo(self._state_action)
 		if ((action_type == "spell" or action_type == "companion") and ZoneAbilityFrame and ZoneAbilityFrame.baseName and not HasZoneAbility()) then
@@ -1100,7 +1196,9 @@ function Update(self)
 			if name == abilityName then
 				texture = GetLastZoneAbilitySpellTexture()
 				self.zoneAbilityDisabled = true
-				self.icon:SetDesaturated(true)
+				if not self.saturationLocked then
+					self.icon:SetDesaturated(true)
+				end
 			end
 		end
 	end
@@ -1110,6 +1208,7 @@ function Update(self)
 		self.icon:Show()
 		self.rangeTimer = - 1
 		self:SetNormalTexture("Interface\\Buttons\\UI-Quickslot2")
+
 		if not self.LBFSkinned and not self.MasqueSkinned then
 			self.NormalTexture:SetTexCoord(0, 0, 0, 0)
 		end
@@ -1118,11 +1217,7 @@ function Update(self)
 		self.cooldown:Hide()
 		self.rangeTimer = nil
 		self:SetNormalTexture("Interface\\Buttons\\UI-Quickslot")
-		if self.HotKey:GetText() == RANGE_INDICATOR then
-			self.HotKey:Hide()
-		else
-			self.HotKey:SetVertexColor(0.75, 0.75, 0.75)
-		end
+
 		if not self.LBFSkinned and not self.MasqueSkinned then
 			self.NormalTexture:SetTexCoord(-0.15, 1.15, -0.15, 1.17)
 		end
@@ -1130,6 +1225,8 @@ function Update(self)

 	self:UpdateLocal()

+	UpdateRange(self, fromUpdateConfig) -- Sezz: update range check on state change
+
 	UpdateCount(self)

 	UpdateFlyout(self)
@@ -1138,6 +1235,8 @@ function Update(self)

 	UpdateNewAction(self)

+	UpdateButtonState(self)
+
 	if GameTooltip_GetOwnerForbidden() == self then
 		UpdateTooltip(self)
 	end
@@ -1170,22 +1269,24 @@ function UpdateButtonState(self)
 end

 function UpdateUsable(self)
-	-- TODO: make the colors configurable
-	-- TODO: allow disabling of the whole recoloring
-	if self.config.outOfRangeColoring == "button" and self.outOfRange then
-		self.icon:SetVertexColor(unpack(self.config.colors.range))
-	else
-		local isUsable, notEnoughMana = self:IsUsable()
-		if isUsable then
-			self.icon:SetVertexColor(1.0, 1.0, 1.0)
-			--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
-		elseif notEnoughMana then
-			self.icon:SetVertexColor(unpack(self.config.colors.mana))
-			--self.NormalTexture:SetVertexColor(0.5, 0.5, 1.0)
+	if self.config.useColoring then
+		if self.config.outOfRangeColoring == "button" and self.outOfRange then
+			self.icon:SetVertexColor(unpack(self.config.colors.range))
 		else
-			self.icon:SetVertexColor(0.4, 0.4, 0.4)
-			--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
+			local isUsable, notEnoughMana = self:IsUsable()
+			if isUsable then
+				self.icon:SetVertexColor(unpack(self.config.colors.usable))
+				--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
+			elseif notEnoughMana then
+				self.icon:SetVertexColor(unpack(self.config.colors.mana))
+				--self.NormalTexture:SetVertexColor(0.5, 0.5, 1.0)
+			else
+				self.icon:SetVertexColor(unpack(self.config.colors.notUsable))
+				--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
+			end
 		end
+	else
+		self.icon:SetVertexColor(unpack(self.config.colors.usable))
 	end
 	lib.callbacks:Fire("OnButtonUsable", self)
 end
@@ -1234,7 +1335,8 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeMo
 			cooldown = CreateFrame("Cooldown", "LAB10ChargeCooldown"..lib.NumChargeCooldowns, parent, "CooldownFrameTemplate");
 			cooldown:SetScript("OnCooldownDone", EndChargeCooldown)
 			cooldown:SetHideCountdownNumbers(true)
-			cooldown:SetDrawSwipe(false)
+			cooldown:SetDrawBling(false)
+			lib.callbacks:Fire("OnChargeCreated", parent, cooldown)
 		end
 		cooldown:SetParent(parent)
 		cooldown:SetAllPoints(parent)
@@ -1244,7 +1346,7 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeMo
 		cooldown.parent = parent
 	end
 	-- set cooldown
-	parent.chargeCooldown:SetDrawBling(parent.chargeCooldown:GetEffectiveAlpha() > 0.5)
+--	parent.chargeCooldown:SetDrawBling(parent.chargeCooldown:GetEffectiveAlpha() > 0.5)
 	CooldownFrame_Set(parent.chargeCooldown, chargeStart, chargeDuration, true, true, chargeModRate)

 	-- update charge cooldown skin when masque is used
@@ -1258,8 +1360,15 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeMo
 end

 local function OnCooldownDone(self)
-	self:SetScript("OnCooldownDone", nil)
-	UpdateCooldown(self:GetParent())
+	--self:SetScript("OnCooldownDone", nil)
+	local button = self:GetParent()
+	if (self.currentCooldownType == COOLDOWN_TYPE_NORMAL) and button.locStart and (button.locStart > 0) then
+		UpdateCooldown(button)
+	elseif button.chargeCooldown then
+		button.chargeCooldown:SetDrawSwipe(button.config.useDrawSwipeOnCharges)
+	end
+
+	lib.callbacks:Fire("OnCooldownDone", button, self)
 end

 function UpdateCooldown(self)
@@ -1267,8 +1376,10 @@ function UpdateCooldown(self)
 	local start, duration, enable, modRate = self:GetCooldown()
 	local charges, maxCharges, chargeStart, chargeDuration, chargeModRate = self:GetCharges()

-	self.cooldown:SetDrawBling(self.cooldown:GetEffectiveAlpha() > 0.5)
-
+	self.cooldown:SetDrawBling(self.config.useDrawBling and (self.cooldown:GetEffectiveAlpha() > 0.5))
+	self.cooldown:SetScript("OnCooldownDone", OnCooldownDone)
+	self.cooldown.locStart = locStart
+	self.cooldown.locDuration = locDuration
 	if (locStart + locDuration) > (start + duration) then
 		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_LOSS_OF_CONTROL then
 			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge-LoC")
@@ -1281,22 +1392,25 @@ function UpdateCooldown(self)
 		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_NORMAL then
 			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
 			self.cooldown:SetSwipeColor(0, 0, 0)
-			self.cooldown:SetHideCountdownNumbers(false)
+			self.cooldown:SetHideCountdownNumbers(self.config.disableCountDownNumbers)
 			self.cooldown.currentCooldownType = COOLDOWN_TYPE_NORMAL
 		end
+		--[[
 		if locStart > 0 then
 			self.cooldown:SetScript("OnCooldownDone", OnCooldownDone)
 		end
-
+		]]
 		if charges and maxCharges and charges > 0 and charges < maxCharges then
 			StartChargeCooldown(self, chargeStart, chargeDuration, chargeModRate)
+			self.chargeCooldown:SetDrawSwipe(duration <= 0 and self.config.useDrawSwipeOnCharges)
 		elseif self.chargeCooldown then
 			EndChargeCooldown(self.chargeCooldown)
 		end
 		CooldownFrame_Set(self.cooldown, start, duration, enable, false, modRate)
 	end
-end
-
+	lib.callbacks:Fire("OnCooldownUpdate", self, start, duration, enable, modRate)
+end
+
 function StartFlash(self)
 	self.flashing = 1
 	flashTime = 0
@@ -1344,6 +1458,10 @@ function UpdateHotkeys(self)
 		self.HotKey:SetPoint("TOPLEFT", self, "TOPLEFT", - 2, - 2)
 		self.HotKey:Show()
 	end
+
+	if self.postKeybind then
+		self.postKeybind(nil, self)
+	end
 end

 function ShowOverlayGlow(self)
@@ -1457,6 +1575,9 @@ function UpdateFlyout(self)
 				SetClampedTextureRotation(self.FlyoutArrow, 0)
 			end

+			if self.FlyoutUpdateFunc then
+				self.FlyoutUpdateFunc(nil, self)
+			end
 			-- return here, otherwise flyout is hidden
 			return
 		end
@@ -1519,7 +1640,7 @@ Action.GetSpellId              = function(self)
 	if actionType == "spell" then
 		return id
 	elseif actionType == "macro" then
-		return (GetMacroSpell(id))
+		return (GetMacroSpell(id))
 	  --[[
 		local _, _, spellId = GetMacroSpell(id)
 		return spellId
@@ -1571,7 +1692,7 @@ Item.IsUsable                = function(self) return IsUsableItem(self._state_ac
 --Item.IsConsumableOrStackable = function(self) return IsConsumableItem(self._state_action) end
 Item.IsConsumableOrStackable = function(self) return true end
 Item.IsUnitInRange           = function(self, unit) return IsItemInRange(self._state_action, unit) end
-Item.SetTooltip              = function(self) return GameTooltip:SetHyperlink(self._state_action)  end
+Item.SetTooltip              = function(self) return GameTooltip:SetHyperlink(self._state_action) end
 Item.GetSpellId              = function(self) return nil end

 -----------------------------------------------------------
@@ -1594,6 +1715,22 @@ Macro.SetTooltip              = function(self) return nil end
 Macro.GetSpellId              = function(self) return nil end

 -----------------------------------------------------------
+--- Toy Button
+Toy.HasAction               = function(self) return true end
+Toy.GetActionText           = function(self) return "" end
+Toy.GetTexture              = function(self) return select(3, C_ToyBox.GetToyInfo(self._state_action)) end
+Toy.GetCharges              = function(self) return nil end
+Toy.GetCount                = function(self) return 0 end
+Toy.GetCooldown             = function(self) return GetItemCooldown(self._state_action) end
+Toy.IsAttack                = function(self) return nil end
+Toy.IsEquipped              = function(self) return nil end
+Toy.IsCurrentlyActive       = function(self) return nil end
+Toy.IsAutoRepeat            = function(self) return nil end
+Toy.IsUsable                = function(self) return nil end
+Toy.IsConsumableOrStackable = function(self) return nil end
+Toy.IsUnitInRange           = function(self, unit) return nil end
+Toy.SetTooltip              = function(self) return GameTooltip:SetToyByItemID(self._state_action) end
+Toy.GetSpellId              = function(self) return nil end
 --- Custom Button
 Custom.HasAction               = function(self) return true end
 Custom.GetActionText           = function(self) return "" end
@@ -1632,4 +1769,4 @@ if oldversion and next(lib.buttonRegistry) then
 			end
 		end
 	end
-end
+end
diff --git a/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml b/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
index 493de1c..67b3140 100644
--- a/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
+++ b/Libs/LibBagUtils-1.0/LibBagUtils-1.0.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">
 	<Script file="LibBagUtils-1.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Libs/LibButtonGlow-1.0/LibButtonGlow-1.0.toc b/Libs/LibButtonGlow-1.0/LibButtonGlow-1.0.toc
index 9a80be3..4e6913f 100644
--- a/Libs/LibButtonGlow-1.0/LibButtonGlow-1.0.toc
+++ b/Libs/LibButtonGlow-1.0/LibButtonGlow-1.0.toc
@@ -6,7 +6,7 @@
 ## X-Category: Library
 ## X-License: BSD
 ## X-Website: http://www.wowace.com/addons/libbuttonglow-1-0/
-## Version: @project-version@
+## Version: v8.3.0-Release-v2.5(0143)
 ## OptionalDeps: Masque

 LibStub\LibStub.lua
diff --git a/Libs/LibDeformat-3.0/LibDeformat-3.0.lua b/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
index 6580517..29f28e2 100644
--- a/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
+++ b/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
@@ -269,4 +269,4 @@ function LibDeformat.Test()
 end
 --@end-debug@]===]

-setmetatable(LibDeformat, { __call = function(self, ...) return self.Deformat(...) end })
\ No newline at end of file
+setmetatable(LibDeformat, { __call = function(self, ...) return self.Deformat(...) end })
diff --git a/Libs/LibDeformat-3.0/lib.xml b/Libs/LibDeformat-3.0/lib.xml
index cf6abae..0f66a4d 100644
--- a/Libs/LibDeformat-3.0/lib.xml
+++ b/Libs/LibDeformat-3.0/lib.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">
 	<Script file="LibDeformat-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Libs/UTF8/UTF8.toc b/Libs/UTF8/UTF8.toc
index e971b12..86efe27 100644
--- a/Libs/UTF8/UTF8.toc
+++ b/Libs/UTF8/UTF8.toc
@@ -12,4 +12,4 @@
 ## X-Website: http://www.wowace.com/addons/utf8/

 utf8data.lua
-utf8.lua
\ No newline at end of file
+utf8.lua
diff --git a/Libs/UTF8/utf8.lua b/Libs/UTF8/utf8.lua
index 485582c..159f7ae 100644
--- a/Libs/UTF8/utf8.lua
+++ b/Libs/UTF8/utf8.lua
@@ -314,4 +314,4 @@ end
 -- install in the string library
 if not string.utf8reverse then
 	string.utf8reverse = utf8reverse
-end
\ No newline at end of file
+end
diff --git a/Libs/UTF8/utf8data.lua b/Libs/UTF8/utf8data.lua
index 655f719..8bcc38f 100644
--- a/Libs/UTF8/utf8data.lua
+++ b/Libs/UTF8/utf8data.lua
@@ -1,4 +1,4 @@
-utf8_lc_uc = {
+utf8_lc_uc = {
 	["a"] = "A",
 	["b"] = "B",
 	["c"] = "C",
diff --git a/Libs/changelog-ACE3-r1237.txt b/Libs/changelog-ACE3-r1237.txt
new file mode 100644
index 0000000..3325a5d
--- /dev/null
+++ b/Libs/changelog-ACE3-r1237.txt
@@ -0,0 +1,427 @@
+Ace3 Release - Revision r1227 (August 12th, 2019)
+-------------------------------------------------
+- AceConfigDialog-3.0: Fixed an issue with a missing template on WoW Classic (Ticket #517)
+
+Ace3 Release - Revision r1224 (August 1st, 2019)
+------------------------------------------------
+- AceConfigDialog-3.0: Replace use of StaticPopup with a custom frame to minimize taint
+- AceGUI-3.0: Ensure the OnLeave callback on various widgets still fires when its being released while visible (Ticket #505)
+- AceGUI-3.0: Various fixes for anchoring problems in WoW 8.2 (Ticket #512, and other reports)
+
+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
+- AceGUI-3.0: Worked around various quirks in the WoW 8.0/8.1 API
+- AceGUI-3.0: ColorPicker: Store references to the background/checkers textures (Ticket #473)
+- AceConfigDialog-3.0: Allow custom controls for almost all option types (Ticket #475)
+
+Ace3 Release - Revision r1182 (July 17th, 2018)
+-----------------------------------------------
+- AceComm-3.0: Support numeric targets for custom channels (Ticket #419)
+- AceComm-3.0/ChatThrottleLib: Updated for WoW 8.0 API changes
+- AceConfig-3.0: Allow number values for the "width" parameter, which acts as a multiplier of the default width
+- AceConfigDialog-3.0: Enable iconCoords for the main level of a tree group (Ticket #417)
+- AceGUI-3.0: Implement a Table Layout (#442)
+- AceGUI-3.0: EditBox: Only try to handle dragging if a valid object is being dragged into the text box
+- AceGUI-3.0: Various fixes and work-arounds for WoW 8.0 changes
+
+Ace3 Release - Revision r1166 (August 29th, 2017)
+-------------------------------------------------
+- Updated any use of PlaySound to the new numeric constants (Fix for WoW 7.3)
+- AceConfigDialog-3.0: implement fallback validation feedback in a StaticPopup (Ticket #2)
+
+Ace3 Release - Revision r1158 (March 28th, 2017)
+------------------------------------------------
+- AceGUI-3.0: Fire OnShow events from Frame and Windows containers (Ticket #396)
+- AceGUI-3.0: Add SetJustifyV/H API to the Label/InteractiveLabel widgets (Ticket #397)
+
+Ace3 Release - Revision r1151 (July 18th, 2016)
+-----------------------------------------------
+- AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+- AceGUI-3.0: Use SetColorTexture in WoW 7.0
+- AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+- AceGUI-3.0: Keybinding: Support MouseWheel Up/Down bindings (Ticket #372)
+- AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation (Fixes missing tree in WoW 7.0)
+- AceSerializer-3.0: Create consistent tokens for infinity, independent of the clients platform
+
+Ace3 Release - Revision r1134 (June 23rd, 2015)
+-----------------------------------------------
+- AceGUI-3.0: TreeGroup: Prevent Word Wrap in tree elements
+
+Ace3 Release - Revision r1128 (February 24th, 2015)
+---------------------------------------------------
+- AceGUI-3.0: Fixed an error in GameTooltip handling causing wrong formatting in some cases
+
+Ace3 Release - Revision r1122 (October 14th, 2014)
+--------------------------------------------------
+- AceDB-3.0: Now using the GetCurrentRegion() API to determine region-based profile keys (fix for WoW 6.0)
+- AceComm-3.0: Update ChatThrottleLib to v23
+- AceConfigDialog-3.0: Show a more meaningful title on Blizzard Options Groups (Ticket #353)
+- AceGUI-3.0: ColorPicker: Frame Level is automatically increased to ensure the color picker frame is above the option panel
+- AceGUI-3.0: DropDown: Properly disable all clickable areas when the dropdown is disabled (Ticket #360)
+- AceHook-3.0: Always use HookScript when hooking scripts in a secure fashion (Ticket #338)
+- AceTimer-3.0: New timer implementation based on C_Timer.After
+
+Ace3 Release - Revision r1109 (February 19th, 2014)
+---------------------------------------------------
+- AceComm-3.0: Ambiguate addon comm messages to restore behavior to be identical to pre-5.4.7
+- AceConfigRegistry-3.0: Added an option to skip options table validation on registering
+
+Ace3 Release - Revision r1104 (October 31st, 2013)
+--------------------------------------------------
+- AceGUI-3.0: Flow Layout: Added a safeguard to prevent an infinite loop in the layout engine
+- AceGUI-3.0: DropDown: Adjust its style slightly to closer resemble the Blizzard DropDown Widget
+- AceGUI-3.0: DropDown: API enhancements to specify the width of the pullout and be notified when its opened
+
+Ace3 Release - Revision r1098 (September 13th, 2013)
+----------------------------------------------------
+- AceDB-3.0: Switch characters to the default profile if their active profile is deleted (Ticket #324)
+- AceConfigDialog-3.0: Try to prevent static popup taint (Ticket #322)
+- AceGUI-3.0: Button: Add a new "Auto Width" option (Ticket #310)
+- AceGUI-3.0: DropDown: Make the entire DropDown widget clickable (Ticket #339)
+- AceGUI-3.0: EditBox: Allow dragging macros to the editbox (which will then contain the macros name) (Ticket #337)
+- AceGUI-3.0: Slider: Add a workaround for the broken slider steps in WoW 5.4 (Ticket #346)
+- AceGUI-3.0: TreeGroup: Fix an issue introduced by 5.4 broken scrollbars (Ticket #345)
+- AceHook-3.0: Allow hooking of AnimationGroup scripts (Ticket #314)
+
+Ace3 Release - Revision r1086 (May 21st, 2013)
+----------------------------------------------
+- AceAddon-3.0: Improved behavior when loading modules during game startup, ensures proper loading order
+
+Ace3 Release - Revision r1083 (March 4th, 2013)
+-----------------------------------------------
+- AceTimer-3.0: Fixed an issue that caused the parameter list passed to the callback to be cut off at nil values
+- AceGUI-3.0: InlineGroup: The title attribute is properly reset for recycled objects
+
+Ace3 Release - Revision r1078 (February 10th, 2013)
+---------------------------------------------------
+- AceTimer-3.0: Re-write based on AnimationTimers
+- AceHook-3.0: Improved checks/error messages when trying to hook a script on a "nil" frame
+- AceDBOptions-3.0: Added Italian locale
+- AceGUI-3.0: BlizOptionsGroup: Fixed the "default" button callback
+- AceGUI-3.0: Colorpicker: The colorpicker is now clamped to the screen
+
+Ace3 Release - Revision r1061 (August 27th, 2012)
+-------------------------------------------------
+- AceConfigDialog-3.0: Try to avoid potential taints in static popup dialogs
+- AceConfigDialog-3.0: Sort multiselects with "radio" style
+- AceGUI-3.0: Support for WoW 5.0
+- AceGUI-3.0: MultiLineEditBox: Support shift-click'ing items/spells/etc. into the editbox
+- AceGUI-3.0: Label: Fix text alignment (Ticket #301)
+- AceGUI-3.0: Checkbox: Description text on a disable checkbox should look disabled (Ticket #304)
+- AceGUI-3.0: Keybinding: Ensure the Keybinding popup is on the top level (Ticket #305)
+
+Ace3 Release - Revision r1041 (November 29th, 2011)
+---------------------------------------------------
+- AceDB-3.0: Added locale and factionrealmregion profile keys
+- AceSerializer-3.0: Removed support for NaN, as WoW 4.3 does no longer allow it.
+- AceGUI-3.0: Frame: Add :EnableResize (Ticket #214)
+
+Ace3 Release - Revision r1032 (June 29th, 2011)
+-----------------------------------------------
+- AceTab-3.0: Improvements to Match handling (Ticket #255 and #256)
+- AceGUI-3.0: DropDown layout fix with hidden labels (Ticket #234)
+
+Ace3 Release - Revision r1025 (April 27th, 2011)
+------------------------------------------------
+- AceComm-3.0: Updated for 4.1 changes - now handles RegisterAddonMessagePrefix internally for you.
+- AceGUI-3.0: TabGroup: Fixed width of tabs in 4.1(Ticket #243)
+
+Ace3 Release - Revision r1009 (February 9th, 2011)
+--------------------------------------------------
+- AceLocale-3.0: Fix erronous assumption that the default locale is always the first to be registered for the :NewLocale() "silent" flag. The flag must now be set on the FIRST locale to be registered.
+- AceLocale-3.0: The :NewLocale() "silent" flag may now be set to the string "raw", meaning nils are returned for unknown translations.
+- AceGUI-3.0: Fix the disabled state of Icon widgets
+- AceGUI-3.0: The header of the Frame widget now dynamically changes size to fit the text (Ticket #171)
+- AceGUI-3.0: Its now possible to define a custom order the elements in a dropdown widget
+- AceGUI-3.0: Improved widget focus behaviour across the board (Ticket #192, #193)
+- AceGUI-3.0: Fixed a bug that made it impossible to block the tree widget from being user resizable (Ticket #163)
+- AceGUI-3.0: Fixed a bug that caused TreeGroups to become unresponsive under certain conditions (Ticket #189, #202)
+- AceGUI-3.0: Enhanced the DropDown widget to allow it to be reused more easily.
+- AceConfigDialog-3.0: Select Groups now have the proper order in the dropdown (Ticket #184)
+- AceConfigDialog-3.0: Implemented "radio" style select boxes (Ticket #149)
+
+Ace3 Release - Revision r981 (October 27th, 2010)
+-------------------------------------------------
+- AceAddon-3.0: Fixed a library upgrading issue
+- AceAddon-3.0: Modules are now enabled in loading order
+- AceGUI-3.0: Keybinding: The widget will no longer steal keybindings even when inactive (Ticket #169)
+- AceGUI-3.0: EditBox: Fixed spell drag'n'drop
+
+
+Ace3 Release - Revision r971 (October 12th, 2010)
+-------------------------------------------------
+- Small fixes and adjustments for the 4.0 Content Patch.
+- AceGUI-3.0: ScrollFrame: Allow for a small margin of error when determining if the scroll bar should be shown.
+- AceGUI-3.0: Added new widget APIs: GetText for EditBox and DisableButton for MultiLineEditBox
+
+Ace3 Release - Revision r960 (July 20th, 2010)
+----------------------------------------------
+- AceGUI-3.0: Label: Reset Image Size and TexCoords on Acquire (Ticket #110)
+- AceGUI-3.0: CheckBox: Re-apply the disabled state after setting a value, so the visuals are correct in either case. (Ticket #107)
+- AceGUI-3.0: Icon: Fix the vertical size. It'll now properly scale with the image size, and not be fixed to about 110px. (Ticket #104)
+- AceGUI-3.0: External Containers (Frame, Window) should always start in a visible state. (Ticket #121)
+- AceGUI-3.0: Added Blizzard sounds to widgets (Ticket #120)
+- AceGUI-3.0: CheckBox: check for self.desc:GetText() being nil as well as "" to prevent setting the wrong height on the checkbox causing bouncing checkboxes.
+- AceGUI-3.0: Rewrite of the MultiLineEditBox (Ticket #68)
+- AceGUI-3.0: CheckBox: Fix alignment of the text in OnMouseDown when an image is set. (Ticket #142)
+- AceGUI-3.0: Add SetMaxLetters APIs to EB and MLEB (Ticket #135)
+- AceGUI-3.0: Frame: Add events for OnEnter/OnLeave of the statusbar (Ticket #139)
+- AceGUI-3.0: Major cleanups and refactoring in nearly all widgets and containers.
+- AceConfigDialog-3.0: Always obey the min/max values on range-type widgets (Ticket #114)
+- AceConfigDialog-3.0: Pass iconCoords set on groups in the options table to the tree widget (Ticket #111)
+- AceConfigDialog-3.0: Implement "softMin" and "softMax", allowing for a UI-specific minimum/maximum for range controls, while allowing manual input of values in the old min/max range. (Ticket #123)
+- AceConfigDialog-3.0: Don't close frames in CloseAll that are being opened after the CloseAll event was dispatched. (Ticket #132).
+- AceSerializer-3.0: Fix encoding & decoding of \030. (Ticket #115)
+- AceDB-3.0: Remove empty sections on logout, keeping the SV clean of more useless informations.
+- AceDBOptions-3.0.lua: Fix a string typo (Ticket #141)
+
+Ace3 Release - Revision r907 (December 16th, 2009)
+---------------------------------------------------
+- AceGUI-3.0: Frame: Properly save the width in the status table.
+- AceConfigCmd-3.0: Properly handle help output of inline groups with a different handler. (Ticket #101)
+- AceConfigDialog-3.0: Don't bail out and error when a dialogControl was invalid, instead show the error and fallback to the default control for that type.
+- AceConfigDialog-3.0: Fix a hickup with the OnUpdate script not getting upgraded properly in some situations.
+
+Ace3 Release - Revision r900 (December 8th, 2009)
+--------------------------------------------------
+- AceGUI-3.0: Alot of visual fixes regarding margins and general widget styles.
+- AceGUI-3.0: Ability to accept links for EditBox Widget (Ticket #21)
+- AceGUI-3.0: ScrollFrame: Hide the scrollbar when there is no overflowing content, and allow the Layout functions to use that space for widgets.
+- AceGUI-3.0: DropDown: Added a GetValue() API to the Widget (Ticket #69)
+- AceGUI-3.0: Button: Pass the arguments of the OnClick handler to the OnClick callback (Ticket #57)
+- AceGUI-3.0: add a Window container, basically a plain window with close button
+- AceGUI-3.0: Add support for inline descriptions to the checkbox widget.
+- AceGUI-3.0: Added an API to the Window container to disable the user-resizing of the same. (Ticket #80)
+- AceGUI-3.0: TreeGroup: Allow iconCoords to be passed for the tree elements. (Ticket #59)
+- AceGUI-3.0: Slider: Add a more visible backdrop/border around the manual input area (Ticket #98, #46)
+- AceGUI-3.0: Allow displaying a image in front of the checkbox label. (Ticket #82)
+- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
+                 Supported values are "tooltip" for the old behaviour, and "inline" for a inline display of the description, pending support in AceGUI-3.0 widgets.
+- AceConfigCmd-3.0: Properly parse functions and methods supplied for the "hidden" option table member. (Ticket #96)
+- AceConfigDialog-3.0: Fix the unpacking of the basepath arguments when internally calling :Open (Ticket #90)
+- AceConfigDialog-3.0: Properly refresh BlizOptions Windows which are registered with a path on NotifyChange. (Ticket #93)
+- AceConfigDialog-3.0: Allow image/imageCoords on toogle elements (Note that the width/height of the image on the toggle cannot be changed) (Ticket #82)
+- AceConfigDialog-3.0: Pass the groups "name" tag to DropDownGroups as the title. (Ticket #79)
+- AceDB-3.0: Remove the metatable from the DB before removing defaults, so we don't accidentally invoke it in the process. (Ticket #66)
+- AceDB-3.0: Don't save the profileKeys for namespaces, since we use the profile of the parent DB anyway. This will cut down on SV complexity when using alot of namespaces.
+- AceDB-3.0: Don't fire the OnProfileReset callback when copying a profile.
+- AceDBOptions-3.0: Show the current profile on the dialog. (Ticket #56)
+- AceComm-3.0: Add callbacks for message chunks going out the wire (via CTL). Useful for displaying progress for very large messages.
+- AceConsole-3.0: Add :Printf() so you don't have to do Print(format())
+
+Ace3 Beta - Revision 820 (August 7th, 2009)
+--------------------------------------------
+- AceComm-3.0: Updated ChatThrottleLib to v21
+- AceGUI-3.0: Fixed a glitch in the TabGroup code that caused tabs to be unresponsive under rare conditions. (Ticket #38)
+- AceGUI-3.0: Consistent "disabled" behaviour of all widgets. (Ticket #47)
+- AceGUI-3.0: Changed the way widgets are handled on release to avoid a crash in the game client. (Ticket #49)
+- AceGUI-3.0: Fixed a glitch in the button graphics. (Ticket #58)
+- AceGUI-3.0: Localized the "Close" Text on the Frame widget.
+
+Ace3 Beta - Revision 803 (April 14th, 2009)
+--------------------------------------------
+- AceConfig-3.0: Allow spaces in the keys of config tables. Spaces will be changed on the fly to underscores in AceConfigCmd-3.0 - there is no collision check in place, yet.
+- AceConfig-3.0: Support a "fontSize" attribute to the description type. Possible values are "small" (default), "medium" and "large".
+- AceConfigDialog-3.0: Fixed an error that would occur when calling InterfaceOptionsFrame_OpenToCategory from within an event handler in a Blizzard Options integrated frame. (Ticket #33)
+- AceConfigDialog-3.0: The "execute" type does now recognize the "image" attributes, and will display a clickable icon instead of the button when an image is supplied. (Ticket #35)
+- AceConfigDialog-3.0: Pass icons defined in the option table to the TreeGroup widget (Ticket #20)
+- AceConfigDialog-3.0: Fixed a bug that caused an empty group widget to be drawn if all groups were hidden.
+- AceConfigCmd-3.0: Improved the behaviour of select and multiselect elements. (Ticket #26)
+- AceDB-3.0: Add a GetNamespace function to the DB Objects which returns an existing namespace from the DB object.
+- AceGUI-3.0 Slider Widget: Properly show percentage values as min/max if isPercent is true. (Ticket #32)
+- AceGUI-3.0: Fixed an error in the TreeGroup Widget that caused execution to stop if no name was provided.
+- AceGUI-3.0: Fixed the behaviour of the MultiLineEditbox Widget (Accept button not clickable). (Ticket #28)
+- AceGUI-3.0: TabGroup: Set a maximum width for tabs based on the size of the widget. (Ticket #34)
+- AceGUI-3.0: Added a new InteractiveLabel with OnEnter/OnLeave/OnClick callbacks and a highlight texture
+- AceGUI-3.0: Add SetFont and SetFontObject functions to the Label widget (and the new InteractiveLabel)
+- AceGUI-3.0: Support icons in the TreeGroup display. (Ticket #20)
+- AceGUI-3.0: Added a new :SetRelativeWidth Widget-API that allows you to set the width of widgets relative to their container.
+- AceGUI-3.0: Alot of fixes, tweaks and consistency changes.
+
+Ace3 Beta - Revision 741 (Feb 15th, 2009)
+--------------------------------------------
+- AceDBOptions-3.0: Disable the "Copy From" and "Delete" dropdowns if there are no profiles to choose from. (Ticket #19)
+- AceGUI-3.0: Improve TabGroup visual style - only stretch them to the full width if they would use more then 75% of the exisiting space.
+- AceGUI-3.0: Added a third optional argument to <container>:AddChild() to specify the position for the new widget. (Ticket #22)
+- AceConfigCmd-3.0: Improve help output when viewing groups.
+- AceConfigDialog-3.0: Refresh the Options Panel after a confirmation is canceled to reset the value to its previous value. (Ticket #23)
+- AceDB-3.0: Fix a data inconsistency when using false as a table key. (Ticket #25)
+
+Ace3 Beta - Revision 722 (Jan 4th, 2009)
+--------------------------------------------
+- AceHook-3.0: Fix :SecureHookScript to not fail on previously empty scripts since frame:HookScript does nothing at all in that case. (Ticket #16)
+- AceLocale-3.0: Implement 'silent' option for :NewLocale to disable the warnings on unknown entrys (Ticket #18)
+- AceTimer-3.0: Implement :TimeLeft(handle) function (Ticket #10)
+- AceGUI-3.0: Fix TabGroup tab resizing to be consistent
+- AceGUI-3.0: Fixed EditBox alignment when the label is disabled (Ticket #13)
+- AceDB-3.0: Implement OnProfileShutdown callback (Ticket #7)
+- AceDBOptions-3.0: Updated esES and ruRU locale
+
+Ace3 Beta - Revision 706 (Oct 18th, 2008)
+--------------------------------------------
+- First Beta release after WoWAce move
+- Removed WoW 2.4.x compat layer
+- AceGUI-3.0: Fix disabling of the Multiline Editbox
+- AceGUI-3.0: Improvements to the Keybinding Widget
+
+Ace3 Beta - Revision 81437 (Sept 6th, 2008)
+--------------------------------------------
+- AceConfigDialog-3.0: the confirm callback will now receive the new value that is being set (same signature as the validate callback)
+- AceConfigDialog-3.0: :Close and :CloseAll are now safe to call from within callbacks.
+- AceGUI-3.0: Added new methods to the widget base table, see ACE-205 for full reference
+- AceGUI-3.0: Various fixes to Widgets and recycling process
+- Now compatible with WoW 3.0 (compat layer is to be removed upon 3.0 release)
+
+
+Ace3 Beta - Revision 76325 (June 9th, 2008)
+--------------------------------------------
+- AceGUI-3.0: Finish Multiselect support for the Dropdown widget (nargiddley)
+- AceGUI-3.0: Re-write TabGroup layouting (nargiddley)
+- AceGUI-3.0: TreeGroup: Add :EnableButtonTooltips(enable) to make the default tooltips on the tree optional, enabled by default. (nargiddley)
+- AceGUI-3.0: TabGroup: Add OnTabEnter and OnTabLeave Callbacks  (nargiddley)
+- AceConfigDialog-3.0: Add :SelectGroup(appName, ...) - Selects the group given by the path specified then refreshes open windows. (nargiddley)
+- AceConfigDialog-3.0: :Open now accepts an optional path, when given will open the window with only the given group and its children visible (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions now accepts an optional path, this will add the config page to display the specified group and its children only. (nargiddley)
+- AceConfigDialog-3.0: ACE-189: allow multiselect to be shown as a dropdown by setting dialogControl = "Dropdown" (nargiddley)
+- AceConfigDialog-3.0: Add Custom tooltips to the TreeGroup and TabGroup, shows both name and desc for the group. (nargiddley)
+- AceConfigCmd-3.0: ACE-195: Remove unneeded references to .confirm, will no longer error when .confirm is a boolean (nargiddley)
+- AceAddon-3.0: Allow for an optional first argument to NewAddon to be a table to be used as the base for the addon. (ammo)
+
+Ace3 Beta - Revision 74633 (May 19th, 2008)
+--------------------------------------------
+- AceTimer-3.0: ACE-173: don't error on nil handle for CancelTimer(), just bail out early. (ammo)
+- AceGUI-3.0: ACE-161, ACE-180, ACE-181: New and improved DropDown widget (originally coded by Borlox) (nargiddley,nevcairiel)
+- AceGUI-3.0: AceGUI will call OnWidthSet and OnHeightSet as frames resize (nargiddley)
+- AceGUI-3.0: TabGroup: Use OptionsFrameTabButtonTemplate for tabs (nargiddley)
+- AceGUI-3.0: TabGroup: Tabs now span multiple lines when there are too many to fit in the width of the frame (nargiddley)
+- AceGUI-3.0: TreeGroup: Tree is now sizable by dragging, orig patch by yssaril (nargiddley)
+- AceGUI-3.0: Flow layout will now reduce widgets width to fit rather than leaving them sticking out the side of container widgets (nargiddley)
+- AceGUI-3.0: Dropdowns will no longer be left open in the background when the frame is clicked or other widgets are activated (nargiddley)
+- AceGUI-3.0: ACE-159: Rename Release to OnRelease and Acquire to OnAcquire for widgets. (nargiddley)
+- AceGUI-3.0: ACE-171: add IsVisible and IsShown methods to the widget metatable (nargiddley)
+- AceGUI-3.0: ACE-164: add tooltips to tree to show full text of childs that got clipped (ammo)
+- AceGUI-3.0: ACE-174: make buttons in AceGUI-3.0 locale independant (ammo)
+- AceGUI-3.0: ACE-166: fix treegroup visual bug (ammo)
+- AceGUI-3.0: ACE-184: make numeric entry for slider more intuitive (ammo)
+- AceConfigCmd-3.0: ACE-172 - ignore description in cmd (ammo)
+- AceConsole-3.0:  nolonger check for existance of slashcommands, overwrite where needed. Last one wins, this enables AddonLoader to X-LoadOn-Slash and override the slashcommand from AddonLoader slashcommand with an Ace3 one. (Ammo)
+
+Ace3 Beta - Revision 69509 (April 13th, 2008)
+---------------------------------------------
+- AceComm-3.0: turn off error messages when receiving invalid multi-part messages (its happening on login etc) (nevcairiel)
+- AceDBOptions-3.0: shorten info text at top to prevent scrollbars. (nevcairiel)
+- AceHook-3.0: ACE-162: fix unhooking of objects that were not actually hooked (nevcairiel)
+- AceDB-3.0: fire the DB callbacks after the namespaces changed their profile as well (nevcairiel)
+- AceDB-3.0: namespaces can now be individually reset using :ResetProfile() on the namespace directly (nevcairiel)
+- AceDB-3.0: added a optional argument to :ResetProfile to not populate the reset to all namespaces (so the main profile can reset individually without reseting all namespaces too)  (nevcairiel)
+
+Ace3 Beta - Revision 66329 (March 27th, 2008)
+---------------------------------------------
+- Overall 2.4 clean ups - removing 2.4 checks and work arounds (nevcairiel)
+- AceBucket-3.0: clear the timer reference when unregistering a bucket to prevent a error when unregistering a bucket that was never fired (nevcairiel)
+- AceAddon-3.0: Bugfix when enabling/disabling modules from the parents OnEnable after disabling / enabling the parent addon. (ammo)
+- AceGUI-3.0: Don't parent the BlizOptionsGroup widget to UIParent and Hide it by default. Fixes stray controls on the screen. (nargiddley)
+- AceConfigDialog-3.0: Config windows without a default size won't incorrectly get a default size from a previously open window. (nargiddley)
+- AceDBOptions-3.0: added zhCN and zhTW locale (nevcairiel)
+
+Ace3 Beta - Revision 65665 (March 25th, 2008)
+---------------------------------------------
+- AceGUI-3.0: ACE-139: Changed all Widgets to resemble the Blizzard 2.4 Options Style (nevcairiel)
+- AceGUI-3.0: Fixed "List"-Layout not reporting new width to "fill"-mode widgets (mikk)
+- AceGUI-3.0: added :SetColor to the Label widget (nevcairiel)
+- AceGUI-3.0: ACE-132: ColorPicker: added checkers texture for better alpha channel display, and fixed "white"-texture bug (nevcairiel,nargiddley,ammo)
+- AceConfig-3.0: ACE-113: Added uiName, uiType, handler, option, type to the info table (nevcairiel,nargiddley)
+- AceConfigDialog-3.0: ACE-139: Adjusted for 2.4 options panels (nevcairiel)
+- AceConfigDialog-3.0: Use "width" parameter for the description widget (if present) (nevcairiel)
+- AceConfigDialog-3.0: ACE-135: Add support for specifying a rowcount for multiline editboxes (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions will return the frame registered so you can use it in InterfaceOptionsFrame_OpenToFrame (nevcairiel)
+- AceConfigCmd-3.0: handle "hidden" in help-output (nevcairiel)
+- AceHook-3.0: fix unhooking of secure hooks (nevcairiel)
+- AceDBOptions-3.0: add optional argument to GetOptionsTable(db[, noDefaultProfiles]) - if set to true will not show the default profiles in the profile selection (nevcairiel)
+- AceDBOptions-3.0: added koKR locale (nevcairiel)
+- Ace3 Standalone: Removed the "Ace3" Category from the 2.4 options panel (nevcairiel)
+
+Ace3 Beta - Revision 64176 (March 10th, 2008)
+---------------------------------------------
+- AceGUI-3.0: Improve Alpha handling for the ColorPicker widget, ColorPicker widget closes the ColorPickerFrame before opening to prevent values getting carried over (nargiddley)
+- AceGUI-3.0: The Slider widget will only react to the mousewheel after it has been clicked (anywhere including the label) to prevent accidental changes to the value when trying to scroll the container it is in (nargiddley)
+- AceGUI-3.0: The TreeGroup widget is scrollable with the mousewheel (nargiddley)
+- AceGUI-3.0: ACE-154: Fix frame levels in more cases to prevent widgets ending up behind their containers (nargiddley)
+- AceConfigDialog: Color picker obeys hasAlpha on the color type (nargiddley)
+- AceConfigDialog-3.0: ACE-155: Make sure that the selected group is type='group' when checking if it exists (nargiddley)
+- AceDBOptions-3.0: added frFR locale (nevcairiel)
+
+Ace3 Beta - Revision 63886 (March 8th, 2008)
+---------------------------------------------
+- AceDBOptions-3.0: new library to provide a Ace3Options table to control the AceDB-3.0 profiles (nevcairiel)
+- AceDB-3.0: add "silent" option to DeleteProfile and CopyProfile when we deal with namespaces (nevcairiel)
+- AceDB-3.0: implement library upgrade path (nevcairiel)
+- AceDB-3.0: ACE-146: fix problem with non-table values overruling ['*']-type defaults (nevcairiel)
+- AceConsole-3.0: treat |T|t texture links similar to |H|h|h links. (ammo)
+- AceGUI-3.0: Use Blizzard Templates for the EditBox and DropDown widget (nevcairiel)
+- AceBucket-3.0: ACE-150: callback is now optional, if not supplied will use the eventname as method name (only possible if one event is supplied, and not a event table) (nevcairiel)
+- tests: adjust tests for AceGUI and AceConsole changes (nevcairiel)
+
+Ace3 Beta - Revision 63220 (Feb 29th, 2008)
+---------------------------------------------
+- AceTimer-3.0: CancelAllTimers() now cancels silent (elkano)
+- AceConfigDialog: Add :SetDefaultSize(appName, width, height), sets the size the dialog will open to. Does not effect already open windows.  (nargiddley)
+- AceConfigDialog: Fix typo in type check for range values (nargiddley)
+- AceGUI: ColorPicker widget will correctly fire OnValueChanged for the cancel event of the colorpicker popup.  Reset ColorPicker's color on Acquire.  (nargiddley)
+- AceGUI: Fix Spelling of Aquire -> Acquire for widgets, all custom widgets will need to be updated.  A warning will be printed for widgets not upgraded yet.  (nargiddley)
+- AceConfigCmd-3.0: add simple coloring to slashcommand output. (ammo)
+- AceConsole-3.0: add some color to :Print (ammo)
+- AceAddon-3.0: set error level on library embedding to point to the :NewAddon call (nevcairiel)
+
+Ace3 Beta - Revision 62182 (Feb 20th, 2008)
+---------------------------------------------
+- Ace3 StandAlone: Add a page to the Blizzard 2.4 Interface Options with icons to open dialogs for configs registered when installed standalone (nargiddley)
+- AceConfigDialog: type = 'description' now uses the fields image and imageCoords instead of icon and iconCoords, add imageWidth and imageHeight (nargiddley)
+- AceConfigDialog: Add :AddToBlizzardOptions(appName, name), this will add the specified config to the Blizzard Options pane new in 2.4.  This will only be available if running on the 2.4 PTR (nargiddley)
+- AceDB: fix GetProfiles() when setting the same profile twice (nevcairiel)
+- AceDB: bail out of :SetProfile early when trying to set to the same profile (nevcairiel)
+- AceDB: add nil checks to metatable handling (nevcairiel)
+- AceDB: clear tables that are empty after defaults removal (nevcairiel)
+- AceGUI: Fix a couple of layout bugs causing the width of groups to be wrong (nargiddley)
+- AceGUI: Add Icon widget (nargiddley)
+- AceGUI: Allow room for the border in the BlizOptionsGroup widget (nargiddley)
+- AceGUI: Button and Keybinding use UIPanelButtonTemplate2 (nargiddley)
+- AceConsole-3.0: Fix bug where no table for [self] was created when registering weak commands (ammo)
+- AceTimer-3.0: add missing :OnEmbedDisable (ammo)
+- AceAddon-3.0: added :GetName() that will always return the "real" name of a addon or module object without any prefixes (nevcairiel)
+
+Ace3 Beta - Revision 60697 (Feb 9th, 2008)
+---------------------------------------------
+- CallbackHandler-1.0: remove unnecessary table creation if a event is fired thats not registered (nevcairiel)
+- AceAddon-3.0: fixed a bug with recursive addon loading (nevcairiel)
+- AceGUI: Update TabGroup's tablist format, tabs are selected by value not index (nargiddley)
+- AceGUI: Add MultiLineEditBox widget (nargiddley, originally by bam)
+- AceGUI: Small fix to the flow layout preventing controls overlapping in some cases (nargiddley)
+- AceConfigDialog: Implement control and dialogControl for types 'input' and 'select' (nargiddley)
+- AceConfigDialog: Add support for multiline = true on type = 'input' (nargiddley)
+- AceConfigDialog: Fix an error when all groups are hidden in a group with childGroups = 'select' (nargiddley)
+- AceConfigDialog: type = 'description' will now show .icon as an image with its text (nargiddley)
+- AceConfigDialog: multiline inputs are no longer forced to width = "full" (nargiddley)
+- AceConfigDialog: bug fix when loading without AceConsole present (nevcairiel)
+
+Ace3 Beta - Revision 60545 (Feb 7th, 2008)
+---------------------------------------------
+- AceGUI: SetToplevel(true) for the Frame widget, multiple open windows should play nice together now (nargiddley)
+- AceGUI: Move Frames to the FULLSCREEN_DIALOG strata (nargiddley)
+- AceGUI: Dropdown, Editbox and Keybinding labels grey out when disabled (nargiddley)
+- AceGUI: Add OnClick callback to the TreeGroup widget (nargiddley)
+- AceConfigDialog: Confirm popups will be above the config window (nargiddley)
+
+Ace3 Beta - Revision 60163 (Feb 3rd, 2008)
+---------------------------------------------
+- Initial Beta release
\ No newline at end of file
diff --git a/Libs/changelog-Ace3-r1241.txt b/Libs/changelog-Ace3-r1241.txt
new file mode 100644
index 0000000..b00755e
--- /dev/null
+++ b/Libs/changelog-Ace3-r1241.txt
@@ -0,0 +1,435 @@
+Ace3 Release - Revision r1241 (October 13th, 2020)
+--------------------------------------------------
+- AceAddon-3.0: Suppress more Blizzard addon load events from activating Ace3 addons "too early", causing loading issues.
+- AceGUI-3.0: Updated for Backdrop changes in WoW 9.0
+- AceGUI-3.0: Re-structured widget releasing to avoid recursive release in some circumstances
+- AceGUI-3.0: Label: Anchors are being refreshed when the font is changed (Ticket #540)
+- AceGUI-3.0: Dropdown: Initialize the widget with an empty list so that AddItem can be used on a fresh dropdown (Ticket #542)
+
+Ace3 Release - Revision r1227 (August 12th, 2019)
+-------------------------------------------------
+- AceConfigDialog-3.0: Fixed an issue with a missing template on WoW Classic (Ticket #517)
+
+Ace3 Release - Revision r1224 (August 1st, 2019)
+------------------------------------------------
+- AceConfigDialog-3.0: Replace use of StaticPopup with a custom frame to minimize taint
+- AceGUI-3.0: Ensure the OnLeave callback on various widgets still fires when its being released while visible (Ticket #505)
+- AceGUI-3.0: Various fixes for anchoring problems in WoW 8.2 (Ticket #512, and other reports)
+
+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
+- AceGUI-3.0: Worked around various quirks in the WoW 8.0/8.1 API
+- AceGUI-3.0: ColorPicker: Store references to the background/checkers textures (Ticket #473)
+- AceConfigDialog-3.0: Allow custom controls for almost all option types (Ticket #475)
+
+Ace3 Release - Revision r1182 (July 17th, 2018)
+-----------------------------------------------
+- AceComm-3.0: Support numeric targets for custom channels (Ticket #419)
+- AceComm-3.0/ChatThrottleLib: Updated for WoW 8.0 API changes
+- AceConfig-3.0: Allow number values for the "width" parameter, which acts as a multiplier of the default width
+- AceConfigDialog-3.0: Enable iconCoords for the main level of a tree group (Ticket #417)
+- AceGUI-3.0: Implement a Table Layout (#442)
+- AceGUI-3.0: EditBox: Only try to handle dragging if a valid object is being dragged into the text box
+- AceGUI-3.0: Various fixes and work-arounds for WoW 8.0 changes
+
+Ace3 Release - Revision r1166 (August 29th, 2017)
+-------------------------------------------------
+- Updated any use of PlaySound to the new numeric constants (Fix for WoW 7.3)
+- AceConfigDialog-3.0: implement fallback validation feedback in a StaticPopup (Ticket #2)
+
+Ace3 Release - Revision r1158 (March 28th, 2017)
+------------------------------------------------
+- AceGUI-3.0: Fire OnShow events from Frame and Windows containers (Ticket #396)
+- AceGUI-3.0: Add SetJustifyV/H API to the Label/InteractiveLabel widgets (Ticket #397)
+
+Ace3 Release - Revision r1151 (July 18th, 2016)
+-----------------------------------------------
+- AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+- AceGUI-3.0: Use SetColorTexture in WoW 7.0
+- AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+- AceGUI-3.0: Keybinding: Support MouseWheel Up/Down bindings (Ticket #372)
+- AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation (Fixes missing tree in WoW 7.0)
+- AceSerializer-3.0: Create consistent tokens for infinity, independent of the clients platform
+
+Ace3 Release - Revision r1134 (June 23rd, 2015)
+-----------------------------------------------
+- AceGUI-3.0: TreeGroup: Prevent Word Wrap in tree elements
+
+Ace3 Release - Revision r1128 (February 24th, 2015)
+---------------------------------------------------
+- AceGUI-3.0: Fixed an error in GameTooltip handling causing wrong formatting in some cases
+
+Ace3 Release - Revision r1122 (October 14th, 2014)
+--------------------------------------------------
+- AceDB-3.0: Now using the GetCurrentRegion() API to determine region-based profile keys (fix for WoW 6.0)
+- AceComm-3.0: Update ChatThrottleLib to v23
+- AceConfigDialog-3.0: Show a more meaningful title on Blizzard Options Groups (Ticket #353)
+- AceGUI-3.0: ColorPicker: Frame Level is automatically increased to ensure the color picker frame is above the option panel
+- AceGUI-3.0: DropDown: Properly disable all clickable areas when the dropdown is disabled (Ticket #360)
+- AceHook-3.0: Always use HookScript when hooking scripts in a secure fashion (Ticket #338)
+- AceTimer-3.0: New timer implementation based on C_Timer.After
+
+Ace3 Release - Revision r1109 (February 19th, 2014)
+---------------------------------------------------
+- AceComm-3.0: Ambiguate addon comm messages to restore behavior to be identical to pre-5.4.7
+- AceConfigRegistry-3.0: Added an option to skip options table validation on registering
+
+Ace3 Release - Revision r1104 (October 31st, 2013)
+--------------------------------------------------
+- AceGUI-3.0: Flow Layout: Added a safeguard to prevent an infinite loop in the layout engine
+- AceGUI-3.0: DropDown: Adjust its style slightly to closer resemble the Blizzard DropDown Widget
+- AceGUI-3.0: DropDown: API enhancements to specify the width of the pullout and be notified when its opened
+
+Ace3 Release - Revision r1098 (September 13th, 2013)
+----------------------------------------------------
+- AceDB-3.0: Switch characters to the default profile if their active profile is deleted (Ticket #324)
+- AceConfigDialog-3.0: Try to prevent static popup taint (Ticket #322)
+- AceGUI-3.0: Button: Add a new "Auto Width" option (Ticket #310)
+- AceGUI-3.0: DropDown: Make the entire DropDown widget clickable (Ticket #339)
+- AceGUI-3.0: EditBox: Allow dragging macros to the editbox (which will then contain the macros name) (Ticket #337)
+- AceGUI-3.0: Slider: Add a workaround for the broken slider steps in WoW 5.4 (Ticket #346)
+- AceGUI-3.0: TreeGroup: Fix an issue introduced by 5.4 broken scrollbars (Ticket #345)
+- AceHook-3.0: Allow hooking of AnimationGroup scripts (Ticket #314)
+
+Ace3 Release - Revision r1086 (May 21st, 2013)
+----------------------------------------------
+- AceAddon-3.0: Improved behavior when loading modules during game startup, ensures proper loading order
+
+Ace3 Release - Revision r1083 (March 4th, 2013)
+-----------------------------------------------
+- AceTimer-3.0: Fixed an issue that caused the parameter list passed to the callback to be cut off at nil values
+- AceGUI-3.0: InlineGroup: The title attribute is properly reset for recycled objects
+
+Ace3 Release - Revision r1078 (February 10th, 2013)
+---------------------------------------------------
+- AceTimer-3.0: Re-write based on AnimationTimers
+- AceHook-3.0: Improved checks/error messages when trying to hook a script on a "nil" frame
+- AceDBOptions-3.0: Added Italian locale
+- AceGUI-3.0: BlizOptionsGroup: Fixed the "default" button callback
+- AceGUI-3.0: Colorpicker: The colorpicker is now clamped to the screen
+
+Ace3 Release - Revision r1061 (August 27th, 2012)
+-------------------------------------------------
+- AceConfigDialog-3.0: Try to avoid potential taints in static popup dialogs
+- AceConfigDialog-3.0: Sort multiselects with "radio" style
+- AceGUI-3.0: Support for WoW 5.0
+- AceGUI-3.0: MultiLineEditBox: Support shift-click'ing items/spells/etc. into the editbox
+- AceGUI-3.0: Label: Fix text alignment (Ticket #301)
+- AceGUI-3.0: Checkbox: Description text on a disable checkbox should look disabled (Ticket #304)
+- AceGUI-3.0: Keybinding: Ensure the Keybinding popup is on the top level (Ticket #305)
+
+Ace3 Release - Revision r1041 (November 29th, 2011)
+---------------------------------------------------
+- AceDB-3.0: Added locale and factionrealmregion profile keys
+- AceSerializer-3.0: Removed support for NaN, as WoW 4.3 does no longer allow it.
+- AceGUI-3.0: Frame: Add :EnableResize (Ticket #214)
+
+Ace3 Release - Revision r1032 (June 29th, 2011)
+-----------------------------------------------
+- AceTab-3.0: Improvements to Match handling (Ticket #255 and #256)
+- AceGUI-3.0: DropDown layout fix with hidden labels (Ticket #234)
+
+Ace3 Release - Revision r1025 (April 27th, 2011)
+------------------------------------------------
+- AceComm-3.0: Updated for 4.1 changes - now handles RegisterAddonMessagePrefix internally for you.
+- AceGUI-3.0: TabGroup: Fixed width of tabs in 4.1(Ticket #243)
+
+Ace3 Release - Revision r1009 (February 9th, 2011)
+--------------------------------------------------
+- AceLocale-3.0: Fix erronous assumption that the default locale is always the first to be registered for the :NewLocale() "silent" flag. The flag must now be set on the FIRST locale to be registered.
+- AceLocale-3.0: The :NewLocale() "silent" flag may now be set to the string "raw", meaning nils are returned for unknown translations.
+- AceGUI-3.0: Fix the disabled state of Icon widgets
+- AceGUI-3.0: The header of the Frame widget now dynamically changes size to fit the text (Ticket #171)
+- AceGUI-3.0: Its now possible to define a custom order the elements in a dropdown widget
+- AceGUI-3.0: Improved widget focus behaviour across the board (Ticket #192, #193)
+- AceGUI-3.0: Fixed a bug that made it impossible to block the tree widget from being user resizable (Ticket #163)
+- AceGUI-3.0: Fixed a bug that caused TreeGroups to become unresponsive under certain conditions (Ticket #189, #202)
+- AceGUI-3.0: Enhanced the DropDown widget to allow it to be reused more easily.
+- AceConfigDialog-3.0: Select Groups now have the proper order in the dropdown (Ticket #184)
+- AceConfigDialog-3.0: Implemented "radio" style select boxes (Ticket #149)
+
+Ace3 Release - Revision r981 (October 27th, 2010)
+-------------------------------------------------
+- AceAddon-3.0: Fixed a library upgrading issue
+- AceAddon-3.0: Modules are now enabled in loading order
+- AceGUI-3.0: Keybinding: The widget will no longer steal keybindings even when inactive (Ticket #169)
+- AceGUI-3.0: EditBox: Fixed spell drag'n'drop
+
+
+Ace3 Release - Revision r971 (October 12th, 2010)
+-------------------------------------------------
+- Small fixes and adjustments for the 4.0 Content Patch.
+- AceGUI-3.0: ScrollFrame: Allow for a small margin of error when determining if the scroll bar should be shown.
+- AceGUI-3.0: Added new widget APIs: GetText for EditBox and DisableButton for MultiLineEditBox
+
+Ace3 Release - Revision r960 (July 20th, 2010)
+----------------------------------------------
+- AceGUI-3.0: Label: Reset Image Size and TexCoords on Acquire (Ticket #110)
+- AceGUI-3.0: CheckBox: Re-apply the disabled state after setting a value, so the visuals are correct in either case. (Ticket #107)
+- AceGUI-3.0: Icon: Fix the vertical size. It'll now properly scale with the image size, and not be fixed to about 110px. (Ticket #104)
+- AceGUI-3.0: External Containers (Frame, Window) should always start in a visible state. (Ticket #121)
+- AceGUI-3.0: Added Blizzard sounds to widgets (Ticket #120)
+- AceGUI-3.0: CheckBox: check for self.desc:GetText() being nil as well as "" to prevent setting the wrong height on the checkbox causing bouncing checkboxes.
+- AceGUI-3.0: Rewrite of the MultiLineEditBox (Ticket #68)
+- AceGUI-3.0: CheckBox: Fix alignment of the text in OnMouseDown when an image is set. (Ticket #142)
+- AceGUI-3.0: Add SetMaxLetters APIs to EB and MLEB (Ticket #135)
+- AceGUI-3.0: Frame: Add events for OnEnter/OnLeave of the statusbar (Ticket #139)
+- AceGUI-3.0: Major cleanups and refactoring in nearly all widgets and containers.
+- AceConfigDialog-3.0: Always obey the min/max values on range-type widgets (Ticket #114)
+- AceConfigDialog-3.0: Pass iconCoords set on groups in the options table to the tree widget (Ticket #111)
+- AceConfigDialog-3.0: Implement "softMin" and "softMax", allowing for a UI-specific minimum/maximum for range controls, while allowing manual input of values in the old min/max range. (Ticket #123)
+- AceConfigDialog-3.0: Don't close frames in CloseAll that are being opened after the CloseAll event was dispatched. (Ticket #132).
+- AceSerializer-3.0: Fix encoding & decoding of \030. (Ticket #115)
+- AceDB-3.0: Remove empty sections on logout, keeping the SV clean of more useless informations.
+- AceDBOptions-3.0.lua: Fix a string typo (Ticket #141)
+
+Ace3 Release - Revision r907 (December 16th, 2009)
+---------------------------------------------------
+- AceGUI-3.0: Frame: Properly save the width in the status table.
+- AceConfigCmd-3.0: Properly handle help output of inline groups with a different handler. (Ticket #101)
+- AceConfigDialog-3.0: Don't bail out and error when a dialogControl was invalid, instead show the error and fallback to the default control for that type.
+- AceConfigDialog-3.0: Fix a hickup with the OnUpdate script not getting upgraded properly in some situations.
+
+Ace3 Release - Revision r900 (December 8th, 2009)
+--------------------------------------------------
+- AceGUI-3.0: Alot of visual fixes regarding margins and general widget styles.
+- AceGUI-3.0: Ability to accept links for EditBox Widget (Ticket #21)
+- AceGUI-3.0: ScrollFrame: Hide the scrollbar when there is no overflowing content, and allow the Layout functions to use that space for widgets.
+- AceGUI-3.0: DropDown: Added a GetValue() API to the Widget (Ticket #69)
+- AceGUI-3.0: Button: Pass the arguments of the OnClick handler to the OnClick callback (Ticket #57)
+- AceGUI-3.0: add a Window container, basically a plain window with close button
+- AceGUI-3.0: Add support for inline descriptions to the checkbox widget.
+- AceGUI-3.0: Added an API to the Window container to disable the user-resizing of the same. (Ticket #80)
+- AceGUI-3.0: TreeGroup: Allow iconCoords to be passed for the tree elements. (Ticket #59)
+- AceGUI-3.0: Slider: Add a more visible backdrop/border around the manual input area (Ticket #98, #46)
+- AceGUI-3.0: Allow displaying a image in front of the checkbox label. (Ticket #82)
+- AceConfig-3.0: Added an experimental "descStyle" member to all option table nodes that allows you to control the way the description is presented.
+                 Supported values are "tooltip" for the old behaviour, and "inline" for a inline display of the description, pending support in AceGUI-3.0 widgets.
+- AceConfigCmd-3.0: Properly parse functions and methods supplied for the "hidden" option table member. (Ticket #96)
+- AceConfigDialog-3.0: Fix the unpacking of the basepath arguments when internally calling :Open (Ticket #90)
+- AceConfigDialog-3.0: Properly refresh BlizOptions Windows which are registered with a path on NotifyChange. (Ticket #93)
+- AceConfigDialog-3.0: Allow image/imageCoords on toogle elements (Note that the width/height of the image on the toggle cannot be changed) (Ticket #82)
+- AceConfigDialog-3.0: Pass the groups "name" tag to DropDownGroups as the title. (Ticket #79)
+- AceDB-3.0: Remove the metatable from the DB before removing defaults, so we don't accidentally invoke it in the process. (Ticket #66)
+- AceDB-3.0: Don't save the profileKeys for namespaces, since we use the profile of the parent DB anyway. This will cut down on SV complexity when using alot of namespaces.
+- AceDB-3.0: Don't fire the OnProfileReset callback when copying a profile.
+- AceDBOptions-3.0: Show the current profile on the dialog. (Ticket #56)
+- AceComm-3.0: Add callbacks for message chunks going out the wire (via CTL). Useful for displaying progress for very large messages.
+- AceConsole-3.0: Add :Printf() so you don't have to do Print(format())
+
+Ace3 Beta - Revision 820 (August 7th, 2009)
+--------------------------------------------
+- AceComm-3.0: Updated ChatThrottleLib to v21
+- AceGUI-3.0: Fixed a glitch in the TabGroup code that caused tabs to be unresponsive under rare conditions. (Ticket #38)
+- AceGUI-3.0: Consistent "disabled" behaviour of all widgets. (Ticket #47)
+- AceGUI-3.0: Changed the way widgets are handled on release to avoid a crash in the game client. (Ticket #49)
+- AceGUI-3.0: Fixed a glitch in the button graphics. (Ticket #58)
+- AceGUI-3.0: Localized the "Close" Text on the Frame widget.
+
+Ace3 Beta - Revision 803 (April 14th, 2009)
+--------------------------------------------
+- AceConfig-3.0: Allow spaces in the keys of config tables. Spaces will be changed on the fly to underscores in AceConfigCmd-3.0 - there is no collision check in place, yet.
+- AceConfig-3.0: Support a "fontSize" attribute to the description type. Possible values are "small" (default), "medium" and "large".
+- AceConfigDialog-3.0: Fixed an error that would occur when calling InterfaceOptionsFrame_OpenToCategory from within an event handler in a Blizzard Options integrated frame. (Ticket #33)
+- AceConfigDialog-3.0: The "execute" type does now recognize the "image" attributes, and will display a clickable icon instead of the button when an image is supplied. (Ticket #35)
+- AceConfigDialog-3.0: Pass icons defined in the option table to the TreeGroup widget (Ticket #20)
+- AceConfigDialog-3.0: Fixed a bug that caused an empty group widget to be drawn if all groups were hidden.
+- AceConfigCmd-3.0: Improved the behaviour of select and multiselect elements. (Ticket #26)
+- AceDB-3.0: Add a GetNamespace function to the DB Objects which returns an existing namespace from the DB object.
+- AceGUI-3.0 Slider Widget: Properly show percentage values as min/max if isPercent is true. (Ticket #32)
+- AceGUI-3.0: Fixed an error in the TreeGroup Widget that caused execution to stop if no name was provided.
+- AceGUI-3.0: Fixed the behaviour of the MultiLineEditbox Widget (Accept button not clickable). (Ticket #28)
+- AceGUI-3.0: TabGroup: Set a maximum width for tabs based on the size of the widget. (Ticket #34)
+- AceGUI-3.0: Added a new InteractiveLabel with OnEnter/OnLeave/OnClick callbacks and a highlight texture
+- AceGUI-3.0: Add SetFont and SetFontObject functions to the Label widget (and the new InteractiveLabel)
+- AceGUI-3.0: Support icons in the TreeGroup display. (Ticket #20)
+- AceGUI-3.0: Added a new :SetRelativeWidth Widget-API that allows you to set the width of widgets relative to their container.
+- AceGUI-3.0: Alot of fixes, tweaks and consistency changes.
+
+Ace3 Beta - Revision 741 (Feb 15th, 2009)
+--------------------------------------------
+- AceDBOptions-3.0: Disable the "Copy From" and "Delete" dropdowns if there are no profiles to choose from. (Ticket #19)
+- AceGUI-3.0: Improve TabGroup visual style - only stretch them to the full width if they would use more then 75% of the exisiting space.
+- AceGUI-3.0: Added a third optional argument to <container>:AddChild() to specify the position for the new widget. (Ticket #22)
+- AceConfigCmd-3.0: Improve help output when viewing groups.
+- AceConfigDialog-3.0: Refresh the Options Panel after a confirmation is canceled to reset the value to its previous value. (Ticket #23)
+- AceDB-3.0: Fix a data inconsistency when using false as a table key. (Ticket #25)
+
+Ace3 Beta - Revision 722 (Jan 4th, 2009)
+--------------------------------------------
+- AceHook-3.0: Fix :SecureHookScript to not fail on previously empty scripts since frame:HookScript does nothing at all in that case. (Ticket #16)
+- AceLocale-3.0: Implement 'silent' option for :NewLocale to disable the warnings on unknown entrys (Ticket #18)
+- AceTimer-3.0: Implement :TimeLeft(handle) function (Ticket #10)
+- AceGUI-3.0: Fix TabGroup tab resizing to be consistent
+- AceGUI-3.0: Fixed EditBox alignment when the label is disabled (Ticket #13)
+- AceDB-3.0: Implement OnProfileShutdown callback (Ticket #7)
+- AceDBOptions-3.0: Updated esES and ruRU locale
+
+Ace3 Beta - Revision 706 (Oct 18th, 2008)
+--------------------------------------------
+- First Beta release after WoWAce move
+- Removed WoW 2.4.x compat layer
+- AceGUI-3.0: Fix disabling of the Multiline Editbox
+- AceGUI-3.0: Improvements to the Keybinding Widget
+
+Ace3 Beta - Revision 81437 (Sept 6th, 2008)
+--------------------------------------------
+- AceConfigDialog-3.0: the confirm callback will now receive the new value that is being set (same signature as the validate callback)
+- AceConfigDialog-3.0: :Close and :CloseAll are now safe to call from within callbacks.
+- AceGUI-3.0: Added new methods to the widget base table, see ACE-205 for full reference
+- AceGUI-3.0: Various fixes to Widgets and recycling process
+- Now compatible with WoW 3.0 (compat layer is to be removed upon 3.0 release)
+
+
+Ace3 Beta - Revision 76325 (June 9th, 2008)
+--------------------------------------------
+- AceGUI-3.0: Finish Multiselect support for the Dropdown widget (nargiddley)
+- AceGUI-3.0: Re-write TabGroup layouting (nargiddley)
+- AceGUI-3.0: TreeGroup: Add :EnableButtonTooltips(enable) to make the default tooltips on the tree optional, enabled by default. (nargiddley)
+- AceGUI-3.0: TabGroup: Add OnTabEnter and OnTabLeave Callbacks  (nargiddley)
+- AceConfigDialog-3.0: Add :SelectGroup(appName, ...) - Selects the group given by the path specified then refreshes open windows. (nargiddley)
+- AceConfigDialog-3.0: :Open now accepts an optional path, when given will open the window with only the given group and its children visible (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions now accepts an optional path, this will add the config page to display the specified group and its children only. (nargiddley)
+- AceConfigDialog-3.0: ACE-189: allow multiselect to be shown as a dropdown by setting dialogControl = "Dropdown" (nargiddley)
+- AceConfigDialog-3.0: Add Custom tooltips to the TreeGroup and TabGroup, shows both name and desc for the group. (nargiddley)
+- AceConfigCmd-3.0: ACE-195: Remove unneeded references to .confirm, will no longer error when .confirm is a boolean (nargiddley)
+- AceAddon-3.0: Allow for an optional first argument to NewAddon to be a table to be used as the base for the addon. (ammo)
+
+Ace3 Beta - Revision 74633 (May 19th, 2008)
+--------------------------------------------
+- AceTimer-3.0: ACE-173: don't error on nil handle for CancelTimer(), just bail out early. (ammo)
+- AceGUI-3.0: ACE-161, ACE-180, ACE-181: New and improved DropDown widget (originally coded by Borlox) (nargiddley,nevcairiel)
+- AceGUI-3.0: AceGUI will call OnWidthSet and OnHeightSet as frames resize (nargiddley)
+- AceGUI-3.0: TabGroup: Use OptionsFrameTabButtonTemplate for tabs (nargiddley)
+- AceGUI-3.0: TabGroup: Tabs now span multiple lines when there are too many to fit in the width of the frame (nargiddley)
+- AceGUI-3.0: TreeGroup: Tree is now sizable by dragging, orig patch by yssaril (nargiddley)
+- AceGUI-3.0: Flow layout will now reduce widgets width to fit rather than leaving them sticking out the side of container widgets (nargiddley)
+- AceGUI-3.0: Dropdowns will no longer be left open in the background when the frame is clicked or other widgets are activated (nargiddley)
+- AceGUI-3.0: ACE-159: Rename Release to OnRelease and Acquire to OnAcquire for widgets. (nargiddley)
+- AceGUI-3.0: ACE-171: add IsVisible and IsShown methods to the widget metatable (nargiddley)
+- AceGUI-3.0: ACE-164: add tooltips to tree to show full text of childs that got clipped (ammo)
+- AceGUI-3.0: ACE-174: make buttons in AceGUI-3.0 locale independant (ammo)
+- AceGUI-3.0: ACE-166: fix treegroup visual bug (ammo)
+- AceGUI-3.0: ACE-184: make numeric entry for slider more intuitive (ammo)
+- AceConfigCmd-3.0: ACE-172 - ignore description in cmd (ammo)
+- AceConsole-3.0:  nolonger check for existance of slashcommands, overwrite where needed. Last one wins, this enables AddonLoader to X-LoadOn-Slash and override the slashcommand from AddonLoader slashcommand with an Ace3 one. (Ammo)
+
+Ace3 Beta - Revision 69509 (April 13th, 2008)
+---------------------------------------------
+- AceComm-3.0: turn off error messages when receiving invalid multi-part messages (its happening on login etc) (nevcairiel)
+- AceDBOptions-3.0: shorten info text at top to prevent scrollbars. (nevcairiel)
+- AceHook-3.0: ACE-162: fix unhooking of objects that were not actually hooked (nevcairiel)
+- AceDB-3.0: fire the DB callbacks after the namespaces changed their profile as well (nevcairiel)
+- AceDB-3.0: namespaces can now be individually reset using :ResetProfile() on the namespace directly (nevcairiel)
+- AceDB-3.0: added a optional argument to :ResetProfile to not populate the reset to all namespaces (so the main profile can reset individually without reseting all namespaces too)  (nevcairiel)
+
+Ace3 Beta - Revision 66329 (March 27th, 2008)
+---------------------------------------------
+- Overall 2.4 clean ups - removing 2.4 checks and work arounds (nevcairiel)
+- AceBucket-3.0: clear the timer reference when unregistering a bucket to prevent a error when unregistering a bucket that was never fired (nevcairiel)
+- AceAddon-3.0: Bugfix when enabling/disabling modules from the parents OnEnable after disabling / enabling the parent addon. (ammo)
+- AceGUI-3.0: Don't parent the BlizOptionsGroup widget to UIParent and Hide it by default. Fixes stray controls on the screen. (nargiddley)
+- AceConfigDialog-3.0: Config windows without a default size won't incorrectly get a default size from a previously open window. (nargiddley)
+- AceDBOptions-3.0: added zhCN and zhTW locale (nevcairiel)
+
+Ace3 Beta - Revision 65665 (March 25th, 2008)
+---------------------------------------------
+- AceGUI-3.0: ACE-139: Changed all Widgets to resemble the Blizzard 2.4 Options Style (nevcairiel)
+- AceGUI-3.0: Fixed "List"-Layout not reporting new width to "fill"-mode widgets (mikk)
+- AceGUI-3.0: added :SetColor to the Label widget (nevcairiel)
+- AceGUI-3.0: ACE-132: ColorPicker: added checkers texture for better alpha channel display, and fixed "white"-texture bug (nevcairiel,nargiddley,ammo)
+- AceConfig-3.0: ACE-113: Added uiName, uiType, handler, option, type to the info table (nevcairiel,nargiddley)
+- AceConfigDialog-3.0: ACE-139: Adjusted for 2.4 options panels (nevcairiel)
+- AceConfigDialog-3.0: Use "width" parameter for the description widget (if present) (nevcairiel)
+- AceConfigDialog-3.0: ACE-135: Add support for specifying a rowcount for multiline editboxes (nargiddley)
+- AceConfigDialog-3.0: :AddToBlizOptions will return the frame registered so you can use it in InterfaceOptionsFrame_OpenToFrame (nevcairiel)
+- AceConfigCmd-3.0: handle "hidden" in help-output (nevcairiel)
+- AceHook-3.0: fix unhooking of secure hooks (nevcairiel)
+- AceDBOptions-3.0: add optional argument to GetOptionsTable(db[, noDefaultProfiles]) - if set to true will not show the default profiles in the profile selection (nevcairiel)
+- AceDBOptions-3.0: added koKR locale (nevcairiel)
+- Ace3 Standalone: Removed the "Ace3" Category from the 2.4 options panel (nevcairiel)
+
+Ace3 Beta - Revision 64176 (March 10th, 2008)
+---------------------------------------------
+- AceGUI-3.0: Improve Alpha handling for the ColorPicker widget, ColorPicker widget closes the ColorPickerFrame before opening to prevent values getting carried over (nargiddley)
+- AceGUI-3.0: The Slider widget will only react to the mousewheel after it has been clicked (anywhere including the label) to prevent accidental changes to the value when trying to scroll the container it is in (nargiddley)
+- AceGUI-3.0: The TreeGroup widget is scrollable with the mousewheel (nargiddley)
+- AceGUI-3.0: ACE-154: Fix frame levels in more cases to prevent widgets ending up behind their containers (nargiddley)
+- AceConfigDialog: Color picker obeys hasAlpha on the color type (nargiddley)
+- AceConfigDialog-3.0: ACE-155: Make sure that the selected group is type='group' when checking if it exists (nargiddley)
+- AceDBOptions-3.0: added frFR locale (nevcairiel)
+
+Ace3 Beta - Revision 63886 (March 8th, 2008)
+---------------------------------------------
+- AceDBOptions-3.0: new library to provide a Ace3Options table to control the AceDB-3.0 profiles (nevcairiel)
+- AceDB-3.0: add "silent" option to DeleteProfile and CopyProfile when we deal with namespaces (nevcairiel)
+- AceDB-3.0: implement library upgrade path (nevcairiel)
+- AceDB-3.0: ACE-146: fix problem with non-table values overruling ['*']-type defaults (nevcairiel)
+- AceConsole-3.0: treat |T|t texture links similar to |H|h|h links. (ammo)
+- AceGUI-3.0: Use Blizzard Templates for the EditBox and DropDown widget (nevcairiel)
+- AceBucket-3.0: ACE-150: callback is now optional, if not supplied will use the eventname as method name (only possible if one event is supplied, and not a event table) (nevcairiel)
+- tests: adjust tests for AceGUI and AceConsole changes (nevcairiel)
+
+Ace3 Beta - Revision 63220 (Feb 29th, 2008)
+---------------------------------------------
+- AceTimer-3.0: CancelAllTimers() now cancels silent (elkano)
+- AceConfigDialog: Add :SetDefaultSize(appName, width, height), sets the size the dialog will open to. Does not effect already open windows.  (nargiddley)
+- AceConfigDialog: Fix typo in type check for range values (nargiddley)
+- AceGUI: ColorPicker widget will correctly fire OnValueChanged for the cancel event of the colorpicker popup.  Reset ColorPicker's color on Acquire.  (nargiddley)
+- AceGUI: Fix Spelling of Aquire -> Acquire for widgets, all custom widgets will need to be updated.  A warning will be printed for widgets not upgraded yet.  (nargiddley)
+- AceConfigCmd-3.0: add simple coloring to slashcommand output. (ammo)
+- AceConsole-3.0: add some color to :Print (ammo)
+- AceAddon-3.0: set error level on library embedding to point to the :NewAddon call (nevcairiel)
+
+Ace3 Beta - Revision 62182 (Feb 20th, 2008)
+---------------------------------------------
+- Ace3 StandAlone: Add a page to the Blizzard 2.4 Interface Options with icons to open dialogs for configs registered when installed standalone (nargiddley)
+- AceConfigDialog: type = 'description' now uses the fields image and imageCoords instead of icon and iconCoords, add imageWidth and imageHeight (nargiddley)
+- AceConfigDialog: Add :AddToBlizzardOptions(appName, name), this will add the specified config to the Blizzard Options pane new in 2.4.  This will only be available if running on the 2.4 PTR (nargiddley)
+- AceDB: fix GetProfiles() when setting the same profile twice (nevcairiel)
+- AceDB: bail out of :SetProfile early when trying to set to the same profile (nevcairiel)
+- AceDB: add nil checks to metatable handling (nevcairiel)
+- AceDB: clear tables that are empty after defaults removal (nevcairiel)
+- AceGUI: Fix a couple of layout bugs causing the width of groups to be wrong (nargiddley)
+- AceGUI: Add Icon widget (nargiddley)
+- AceGUI: Allow room for the border in the BlizOptionsGroup widget (nargiddley)
+- AceGUI: Button and Keybinding use UIPanelButtonTemplate2 (nargiddley)
+- AceConsole-3.0: Fix bug where no table for [self] was created when registering weak commands (ammo)
+- AceTimer-3.0: add missing :OnEmbedDisable (ammo)
+- AceAddon-3.0: added :GetName() that will always return the "real" name of a addon or module object without any prefixes (nevcairiel)
+
+Ace3 Beta - Revision 60697 (Feb 9th, 2008)
+---------------------------------------------
+- CallbackHandler-1.0: remove unnecessary table creation if a event is fired thats not registered (nevcairiel)
+- AceAddon-3.0: fixed a bug with recursive addon loading (nevcairiel)
+- AceGUI: Update TabGroup's tablist format, tabs are selected by value not index (nargiddley)
+- AceGUI: Add MultiLineEditBox widget (nargiddley, originally by bam)
+- AceGUI: Small fix to the flow layout preventing controls overlapping in some cases (nargiddley)
+- AceConfigDialog: Implement control and dialogControl for types 'input' and 'select' (nargiddley)
+- AceConfigDialog: Add support for multiline = true on type = 'input' (nargiddley)
+- AceConfigDialog: Fix an error when all groups are hidden in a group with childGroups = 'select' (nargiddley)
+- AceConfigDialog: type = 'description' will now show .icon as an image with its text (nargiddley)
+- AceConfigDialog: multiline inputs are no longer forced to width = "full" (nargiddley)
+- AceConfigDialog: bug fix when loading without AceConsole present (nevcairiel)
+
+Ace3 Beta - Revision 60545 (Feb 7th, 2008)
+---------------------------------------------
+- AceGUI: SetToplevel(true) for the Frame widget, multiple open windows should play nice together now (nargiddley)
+- AceGUI: Move Frames to the FULLSCREEN_DIALOG strata (nargiddley)
+- AceGUI: Dropdown, Editbox and Keybinding labels grey out when disabled (nargiddley)
+- AceGUI: Add OnClick callback to the TreeGroup widget (nargiddley)
+- AceConfigDialog: Confirm popups will be above the config window (nargiddley)
+
+Ace3 Beta - Revision 60163 (Feb 3rd, 2008)
+---------------------------------------------
+- Initial Beta release
diff --git a/Locales/Core-Locale-enUS.lua b/Locales/Core-Locale-enUS.lua
index 5b6cce2..2bf2a0e 100644
--- a/Locales/Core-Locale-enUS.lua
+++ b/Locales/Core-Locale-enUS.lua
@@ -151,9 +151,9 @@ L["RESETTING_PROFILE"] = "Resetting profile: "
 L["PROFILE_DELETED"] = "Profile deleted - iterating all modules."
 L["DELETING_PROFILE"] = "Deleting profile: "
 L["Failed_LOAD_MODULE"] =  "Failed to load EMA Module: "
-L["TEXT1"] = "Ebony's MultiBoxing Assistant v2.2 For 8.2.0!"
+L["TEXT1"] = "Ebony's MultiBoxing Assistant v3.0 For 9.0.1!"
 L["TEXT2"] = ""
-L["TEXT3"] = "Welcome To v2.2!"
+L["TEXT3"] = "Welcome To v3.0!"
 L["TEXT4"] = ""
 L["TEXT5"] = ""
 L["TEXT6"] = "|cFFFFFFFFRead The ChangeLog For More Information"
@@ -180,7 +180,7 @@ L["FRAME_RESET"] = "Frame Reset"
 L["ALL_SETTINGS_RESET"] = "Thank You For Using EMA \nYour settings have been reset. \n\nPlease report any bugs to the source control issue tracker."
 L["CAN_NOT_RUN_JAMBA_AND_EMA"] = "|cFFFF0000 You Can Not Run \"Jamba\" With EMA \nDisabling Jamba Addon \n\nThis Will Reload Your UI"
 -- CHANGE ME!!!
-L["v2_NEWS"] = "|cFFFFFF00Thank You For Upgrading EMA \nYou Are Now On Release v2.2 \n\n|cFFFFFFFFRead Changelog For More Information"
+L["v2_NEWS"] = "|cFFFFFF00Thank You For Upgrading EMA \nYou Are Now On Release v3.0 \n\n|cFFFFFFFFRead Changelog For More Information"

 --------------------------
 -- Communications Locale
@@ -470,10 +470,10 @@ L["CURR"] = "Curr"
 L["CHAT_TRIGGER"] = "Chat !Triggers"
 L["CHAT_TRIGGERS"] = "Listen to Chat Triggers"
 L["CHAT_TRIGGERS_HELP"] = "Listen to !Triggers in \nParty/raid/guild to tell your team about things\n!emahelp"
+L["NO_KEYSTONE_FOUND"] = "I Do Not Currently Have a Keystone"
 L["I_HAVE_X_GOLD"] = function( gold )
 	return string.format( "%s ", gold)
 end
-
 L["MY_KEY_STONE_IS"] = function( key )
 	return string.format( "%s", key )
 end
@@ -533,7 +533,9 @@ L["SHOW_HEALTH"] = "Show the Team's Health Bars"
 L["SHOW_CLASS_COLORS"] = "Show Class Colors"
 L["SHOW_CLASS_COLORS_HELP"] = "Show Class Colors on Health Bars"
 L["POWER_HELP"] = "Show the Team Power Bar\n\nMana, Rage, Etc..."
-L["CLASS_POWER"] = "Show the Teams Class Power Bar\n\nComboPoints\nSoulShards\nHoly Power\nRunes"
+L["CLASS_POWER"] = "Show the Teams Class Power Bar\n\nComboPoints\nSoulShards\nHoly Power\nDK Runes"
+L["GCD_FRAME_HEADER"] = "Trufigcd Support"
+L["GCD_FRAME"] = "Show A Trufigcd Bar On The Ema Team List\nNote:You Will Need The Trufigcd Addon Installed"
 L["DEAD"] = "Dead"
 L["PORTRAIT_HEADER"] = "Portrait"
 L["FOLLOW_BAR_HEADER"] = "Follow Status Bar"
@@ -541,7 +543,8 @@ L["EXPERIENCE_HEADER"] = "Experience Bars"
 L["HEALTH_BAR_HEADER"] = "Health Bar"
 L["POWER_BAR_HEADER"] = "Power Bar"
 L["CLASS_BAR_HEADER"] = "Class Power Bar"
-
+L["CAN_NOT_FIND_TRUFIGCD_ADDON"] = "TrufiGCD Missing"
+L["NOT_SUPPORTED"] = "UnSupported"
 --------------------------
 -- Follow Locale
 L["FOLLOW_BINDING_HEADER"] = "Follow Key Bindings"
@@ -646,7 +649,7 @@ L["FOCUS"] = "Not Focus!"
 L["LOW_HEALTH"] = "Low Health!"
 L["LOW_MANA"] = "Low Mana!"
 L["BAGS_FULL"] = "Bags Full!"
-L["CCED"] = "I'm"
+L["CCED"] = "I've Been"
 -- Vendor
 L["AUTO_REPAIR"] = "Auto Repair"
 L["AUTO_REPAIR_HELP"] = "Auto Repairs Toon's Items When You Visit a Repair Merchant"
@@ -840,6 +843,7 @@ L["TRACK_ALL_TOOLTIP"] = "Track All Quests On All Minions"
 L["UNTRACK_ALL"] = "Untrack All"
 L["UNTRACK_ALL_TOOLTIP"] = "Untrack All Quests on all Minions"
 L["ABANDONING_ALLQUEST"] = "Abandoning Quests To All Toons"
+L["AM_I_TALKING_TO_A_NPC"] = "Am I Talking To A NPC"

 -- Quest Strings
 L["AUTOMATICALLY_ACCEPTED_ESCORT_QUEST"] = function( questName )
diff --git a/Modules/DisplayTeam.lua b/Modules/DisplayTeam.lua
index d81f3ac..e6d2e83 100644
--- a/Modules/DisplayTeam.lua
+++ b/Modules/DisplayTeam.lua
@@ -24,8 +24,9 @@ local EMA = LibStub( "AceAddon-3.0" ):NewAddon(
 local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" )
 local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" )
 local LibBagUtils = LibStub:GetLibrary( "LibBagUtils-1.0" )
-local LibButtonGlow = LibStub:GetLibrary( "LibButtonGlow-1.0")
+local LibButtonGlow = LibStub:GetLibrary( "LibButtonGlow-1.0" )
 EMA.SharedMedia = LibStub( "LibSharedMedia-3.0" )
+local TrufiGCD = IsAddOnLoaded( "TrufiGCD" )

 -- Constants required by EMAModule and Locale for this module.
 EMA.moduleName = "JmbDspTm"
@@ -95,8 +96,10 @@ EMA.settings = {
 		comboStatusHeight = 10,
 		comboStatusShowValues = true,
 		comboStatusShowPercentage = true,
-		showToolTipInfo = false,
---		ShowEquippedOnly = false,
+		showGCDFrame = false,
+		gCDFrameWidth = 3,
+		gCDFrameHeight = 15,
+		gCDFrameToolTips = true,
 		framePoint = "LEFT",
 		frameRelativePoint = "LEFT",
 		frameXOffset = 0,
@@ -111,7 +114,8 @@ EMA.settings = {
 		frameBorderColourB = 1.0,
 		frameBorderColourA = 1.0,
 		timerCount = 1,
-		currGold = true
+		currGold = true,
+		showLastSpellBarTemp = true
 	},
 }

@@ -212,6 +216,7 @@ local function GetCharacterHeight()
 	local heightHealthStatus = 0
 	local heightPowerStatus = 0
 	local heightComboStatus = 0
+	local heightGcdFrame = 0
 	local heightAllBars = 0
 	if EMA.db.showCharacterPortrait == true then
 		heightPortrait = EMA.db.characterPortraitWidth + EMA.db.teamListVerticalSpacing
@@ -236,12 +241,16 @@ local function GetCharacterHeight()
 		heightComboStatus = EMA.db.comboStatusHeight + EMA.db.barVerticalSpacing
 		heightAllBars = heightAllBars + heightComboStatus
 	end
+	if EMA.db.showGCDFrame == true then
+		heightGcdFrame = EMA.db.gCDFrameHeight + EMA.db.barVerticalSpacing
+		heightAllBars = heightAllBars + heightGcdFrame
+	end
 	if EMA.db.barsAreStackedVertically == true then
 		height = max( heightPortrait, heightAllBars )

 	else
-		height = max( heightPortrait, heightFollowStatus, heightExperienceStatus, heightHealthStatus, heightPowerStatus, heightComboStatus )
-		--height = max( heightPortrait, heightBagInformation, heightFollowStatus, heightExperienceStatus, heightReputationStatus, heightHealthStatus, heightPowerStatus, heightComboStatus )
+		height = max( heightPortrait, heightFollowStatus, heightExperienceStatus, heightHealthStatus, heightPowerStatus, heightComboStatus, heightGcdFrame )
+		--height = max( heightPortrait, heightBagInformation, heightFollowStatus, heightExperienceStatus, heightReputationStatus, heightHealthStatus, heightPowerStatus, heightComboStatus, heightGcdFrame)
 	end
 	return height
 end
@@ -254,6 +263,7 @@ local function GetCharacterWidth()
 	local widthHealthStatus = 0
 	local widthPowerStatus = 0
 	local widthComboStatus = 0
+	local widthGcdFrame = 0
 	local widthAllBars = 0
 	if EMA.db.showCharacterPortrait == true then
 		widthPortrait = EMA.db.characterPortraitWidth + EMA.db.teamListHorizontalSpacing
@@ -278,9 +288,14 @@ local function GetCharacterWidth()
 		widthComboStatus = EMA.db.comboStatusWidth + EMA.db.barHorizontalSpacing
 		widthAllBars = widthAllBars + widthComboStatus
 	end
+	if EMA.db.showGCDFrame == true then
+		widthGcdFrame = ( EMA.db.gCDFrameWidth * EMA.db.gCDFrameHeight + EMA.db.gCDFrameHeight ) + EMA.db.barHorizontalSpacing
+		widthAllBars = widthAllBars +  widthGcdFrame
+	end
+
 	if EMA.db.barsAreStackedVertically == true then
-		width = widthPortrait + max( widthFollowStatus, widthExperienceStatus, widthHealthStatus, widthPowerStatus, widthComboStatus )
-		--width = widthPortrait + max( widthBagInformation, widthFollowStatus, widthExperienceStatus, widthReputationStatus, widthHealthStatus, widthPowerStatus, widthComboStatus )
+		width = widthPortrait + max( widthFollowStatus, widthExperienceStatus, widthHealthStatus, widthPowerStatus, widthComboStatus,  widthGcdFrame )
+		--width = widthPortrait + max( widthBagInformation, widthFollowStatus, widthExperienceStatus, widthReputationStatus, widthHealthStatus, widthPowerStatus, widthComboStatus,  widthGcdFrame )
 	else
 		width = widthPortrait + widthAllBars
 	end
@@ -309,7 +324,7 @@ end

 local function CreateEMATeamListFrame()
 	-- The frame.
-	local frame = CreateFrame( "Frame", "EMADisplayTeamListWindowFrame", UIParent )
+	local frame = CreateFrame( "Frame", "EMADisplayTeamListWindowFrame", UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil )
 	frame.obj = EMA
 	frame:SetFrameStrata( "LOW" )
 	frame:SetToplevel( true )
@@ -453,9 +468,6 @@ function EMA:SettingsUpdateStatusBarTexture()
 		characterStatusBar["experienceArtBar"]:SetStatusBarTexture( statusBarTexture )
 		characterStatusBar["experienceArtBar"]:GetStatusBarTexture():SetHorizTile( false )
 		characterStatusBar["experienceArtBar"]:GetStatusBarTexture():SetVertTile( false )
-	--	characterStatusBar["experienceHonorBar"]:SetStatusBarTexture( statusBarTexture )
-	--	characterStatusBar["experienceHonorBar"]:GetStatusBarTexture():SetHorizTile( false )
-	--	characterStatusBar["experienceHonorBar"]:GetStatusBarTexture():SetVertTile( false )
 		characterStatusBar["reputationBar"]:SetStatusBarTexture( statusBarTexture )
 		characterStatusBar["reputationBar"]:GetStatusBarTexture():SetHorizTile( false )
 		characterStatusBar["reputationBar"]:GetStatusBarTexture():SetVertTile( false )
@@ -478,12 +490,11 @@ function EMA:SettingsUpdateFontStyle()
 		characterStatusBar["followBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["experienceBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["experienceArtBarText"]:SetFont( textFont , textSize , "OUTLINE")
---		characterStatusBar["experienceHonorBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["reputationBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["healthBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["powerBarText"]:SetFont( textFont , textSize , "OUTLINE")
 		characterStatusBar["comboBarText"]:SetFont( textFont , textSize , "OUTLINE")
-
+		characterStatusBar["GCDFrameText"]:SetFont( textFont , textSize , "OUTLINE")
 	end
 end

@@ -505,7 +516,6 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	local statusBarTexture = EMA.SharedMedia:Fetch( "statusbar", EMA.db.statusBarTexture )
 	local textFont = EMA.SharedMedia:Fetch( "font", EMA.db.fontStyle )
 	local textSize = EMA.db.fontSize
-
 	-- Create the table to hold the status bars for this character.
 	EMA.characterStatusBar[characterName] = {}
 	-- Get the status bars table.
@@ -523,6 +533,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	portraitButtonClick:SetAttribute( "unit", Ambiguate( characterName, "all" ) )
 	characterStatusBar["portraitButton"] = portraitButton
 	characterStatusBar["portraitButtonClick"] = portraitButtonClick
+
 	-- Set the follow bar.
 	local followName = EMA.globalFramePrefix.."FollowBar"
 	local followBar = CreateFrame( "StatusBar", followName, parentFrame) --, "TextStatusBar,SecureActionButtonTemplate" )
@@ -547,6 +558,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	followBarText:SetAllPoints()
 	characterStatusBar["followBarText"] = followBarText
 	EMA:SettingsUpdateFollowText( characterName ) --, UnitLevel( Ambiguate( characterName, "none" ) ), nil, nil )
+
 	-- Set the experience bar.
 	local experienceName = EMA.globalFramePrefix.."ExperienceBar"
 	local experienceBar = CreateFrame( "StatusBar", experienceName, parentFrame, "AnimatedStatusBarTemplate" ) --"TextStatusBar,SecureActionButtonTemplate" )
@@ -573,6 +585,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	experienceBarText.playerLevel = 1
 	characterStatusBar["experienceBarText"] = experienceBarText
 	EMA:UpdateExperienceStatus( characterName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
+
 	-- Set the artifactXP bar.
 	local experienceArtName = EMA.globalFramePrefix.."ExperienceArtBar"
 	local experienceArtBar = CreateFrame( "StatusBar", experienceArtName, parentFrame, "AnimatedStatusBarTemplate" ) --"TextStatusBar,SecureActionButtonTemplate" )
@@ -599,36 +612,8 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	experienceArtBarText.artifactPointsSpent = 1
 	experienceArtBarText.artifactPointsAvailable = 0
 	characterStatusBar["experienceArtBarText"] = experienceArtBarText
-	EMA:UpdateExperienceStatus( characterName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
---[[
-	-- Set the HonorXP bar.
-	local experienceHonorName = EMA.globalFramePrefix.."ExperienceHonorBar"
-	local experienceHonorBar = CreateFrame( "StatusBar", experienceHonorName, parentFrame, "AnimatedStatusBarTemplate" ) --"TextStatusBar,SecureActionButtonTemplate" )
-	experienceHonorBar.backgroundTexture = experienceArtBar:CreateTexture( experienceArtName.."BackgroundTexture", "ARTWORK" )
-	experienceHonorBar.backgroundTexture:SetColorTexture( 1.0, 0.0, 0.0, 0.15 )
-	experienceHonorBar:SetStatusBarTexture( statusBarTexture )
-	experienceHonorBar:GetStatusBarTexture():SetHorizTile( false )
-	experienceHonorBar:GetStatusBarTexture():SetVertTile( false )
-	experienceHonorBar:SetMinMaxValues( 0, 100 )
-	experienceHonorBar:SetValue( 100 )
-	experienceHonorBar:SetFrameStrata( "LOW" )
-	local experienceHonorBarClick = CreateFrame( "CheckButton", experienceHonorName.."Click", parentFrame, "SecureActionButtonTemplate" )
-	experienceHonorBarClick:SetAttribute( "unit", Ambiguate( characterName, "all" ) )
-	experienceHonorBarClick:SetFrameStrata( "MEDIUM" )
-	characterStatusBar["experienceHonorBar"] = experienceHonorBar
-	characterStatusBar["experienceHonorBarClick"] = experienceHonorBarClick
-	local experienceHonorBarText = experienceHonorBar:CreateFontString( experienceHonorName.."Text", "OVERLAY", "GameFontNormal" )
-	experienceHonorBarText:SetTextColor( 1.00, 1.00, 1.00, 1.00 )
-	experienceHonorBarText:SetFont( textFont , textSize, "OUTLINE")
-	experienceHonorBarText:SetAllPoints()
-	experienceHonorBarText.honorLevel = 0
-	experienceHonorBarText.honorXP = 0
-	experienceHonorBarText.honorMax = 100
-	experienceHonorBarText.honorExhaustionStateID = 1
-	experienceHonorBarText.canPrestige = "N/A"
-	characterStatusBar["experienceHonorBarText"] = experienceHonorBarText
 	EMA:UpdateExperienceStatus( characterName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil )
-]]
+
 	-- Set the reputation bar.
 	local reputationName = EMA.globalFramePrefix.."ReputationBar"
 	local reputationBar = CreateFrame( "StatusBar", reputationName, parentFrame, "AnimatedStatusBarTemplate" ) --"TextStatusBar,SecureActionButtonTemplate" )
@@ -656,8 +641,8 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	reputationBarText.reputationBarValue = 100
 	characterStatusBar["reputationBarText"] = reputationBarText
 	EMA:UpdateReputationStatus( characterName, nil, nil, nil )
-	-- Set the health bar.

+	-- Set the health bar.
 	local healthName = EMA.globalFramePrefix.."HealthBar"
 	local healthBar = CreateFrame( "StatusBar", healthName, parentFrame, "TextStatusBar","SecureActionButtonTemplate" )
 	healthBar.backgroundTexture = healthBar:CreateTexture( healthName.."BackgroundTexture", "ARTWORK" )
@@ -669,8 +654,6 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	healthBar:SetValue( 100 )
 	healthBar:SetFrameStrata( "LOW" )
 	healthBar:SetAlpha( 1 )
-
-
 	local healthIncomingName = EMA.globalFramePrefix.."HealthIncomingBar"
 	local healthIncomingBar = CreateFrame( "StatusBar", healthIncomingName, parentFrame, "TextStatusBar","SecureActionButtonTemplate" )
 	healthIncomingBar.backgroundTexture = healthIncomingBar:CreateTexture( healthIncomingName.."BackgroundTexture", "ARTWORK" )
@@ -683,8 +666,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	healthIncomingBar:SetFrameStrata( "BACKGROUND" )
 	healthIncomingBar:SetAlpha( 1 )

-	-- Set the heal Incoming bar
-
+	-- Set the heal Incoming bar
 	local healthBarClick = CreateFrame( "CheckButton", healthName.."Click"..characterName, parentFrame, "SecureActionButtonTemplate" )
 	healthBarClick:SetAttribute( "unit", Ambiguate( characterName, "all" ) )
 	healthBarClick:SetFrameStrata( "MEDIUM" )
@@ -701,7 +683,6 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	characterStatusBar["healthBarText"] = healthBarText
 	EMA:UpdateHealthStatus( characterName, nil, nil )

-
 	-- Set the power bar.
 	local powerName = EMA.globalFramePrefix.."PowerBar"
 	local powerBar = CreateFrame( "StatusBar", powerName, parentFrame, "TextStatusBar","SecureActionButtonTemplate" )
@@ -727,6 +708,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	powerBarText.playerMaxPower = 100
 	characterStatusBar["powerBarText"] = powerBarText
 	EMA:UpdatePowerStatus( characterName, nil, nil, nil )
+
 	-- Set the Combo Points bar.
 	local comboName = EMA.globalFramePrefix.."ComboBar"
 	local comboBar = CreateFrame( "StatusBar", comboName, parentFrame, "TextStatusBar","SecureActionButtonTemplate" )
@@ -753,6 +735,23 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 	comboBarText.playerMaxCombo = 5
 	characterStatusBar["comboBarText"] = comboBarText
 	EMA:UpdateComboStatus( characterName, nil, nil )
+
+	-- Set the GCD Bar.
+	local gCDFrameName = EMA.globalFramePrefix.."GCDFrame"
+	local gCDFrame = CreateFrame( "Frame", gCDFrameName, parentFrame )
+	--gCDFrame.backgroundTexture = gCDFrame:CreateTexture( gCDFrameName.."BackgroundTexture", "ARTWORK" )
+	--gCDFrame.backgroundTexture:SetColorTexture( 0.58, 0.0, 0.55, 0.15 )
+	--gCDFrame:SetFrameStrata( "LOW" )
+	--gCDFrame:SetAlpha( 1 )
+	characterStatusBar["GCDFrame"] = gCDFrame
+
+	local gCDFrameText = gCDFrame:CreateFontString( gCDFrameName.."Text", "OVERLAY", "GameFontNormal" )
+	gCDFrameText:SetTextColor( 1.00, 1.00, 0.0, 1.00 )
+	gCDFrameText:SetFont( textFont , textSize, "OUTLINE")
+	gCDFrameText:SetAllPoints()
+	characterStatusBar["GCDFrameText"] = gCDFrameText
+	EMA:SetTrGCOpt()
+
 	-- Add the health and power click bars to ClickCastFrames for addons like Clique to use.
 	--Ebony if Support for Clique if not on then default to target unit
 	--TODO there got to be a better way to doing this for sure but right now i can not be assed to do this for now you need to reload the UI when turning off and on clique support.
@@ -764,7 +763,7 @@ function EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 		ClickCastFrames[reputationBarClick] = true
 		ClickCastFrames[healthBarClick] = true
 		ClickCastFrames[powerBarClick] = true
-		ClickCastFrames[comboBarClick] = true
+		ClickCastFrames[comboBarClick] = true
 	else
 		portraitButtonClick:SetAttribute( "type1", "target")
 		followBarClick:SetAttribute( "type1", "target")
@@ -785,7 +784,6 @@ function EMA:HideEMATeamStatusBar( characterName )
 		EMA:CreateEMATeamStatusBar( characterName, parentFrame )
 		characterStatusBar = EMA.characterStatusBar[characterName]
 	end
-	--if characterStatusBar ~= nil then
 	-- Hide the bars.
 	characterStatusBar["portraitButton"]:Hide()
 	characterStatusBar["portraitButtonClick"]:Hide()
@@ -794,9 +792,7 @@ function EMA:HideEMATeamStatusBar( characterName )
 	characterStatusBar["experienceBar"]:Hide()
 	characterStatusBar["experienceBarClick"]:Hide()
 	characterStatusBar["experienceArtBar"]:Hide()
-	characterStatusBar["experienceArtBarClick"]:Hide()
---	characterStatusBar["experienceHonorBar"]:Hide()
---	characterStatusBar["experienceHonorBarClick"]:Hide()
+	characterStatusBar["experienceArtBarClick"]:Hide()
 	characterStatusBar["reputationBar"]:Hide()
 	characterStatusBar["reputationBarClick"]:Hide()
 	characterStatusBar["healthBar"]:Hide()
@@ -806,7 +802,7 @@ function EMA:HideEMATeamStatusBar( characterName )
 	characterStatusBar["powerBarClick"]:Hide()
 	characterStatusBar["comboBar"]:Hide()
 	characterStatusBar["comboBarClick"]:Hide()
-	--end
+	characterStatusBar["GCDFrame"]:Hide()
 end


@@ -822,6 +818,7 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 	local characterHeight = GetCharacterHeight()
 	local characterWidth = GetCharacterWidth()
 	local positionLeft = 0
+	local spaceing = 10
 	local positionTop = -EMA.db.teamListTitleHeight - (EMA.db.teamListVerticalSpacing * 2)
 	local charactersPerRow = EMA.db.charactersPerRow
 	if EMA.db.teamListHorizontal == true then
@@ -964,28 +961,7 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 				setArtLeft = positionLeft
 				setArtTop = positionTop
 			end
-		end
-	--[[if EMA.db.showHonorStatus == true then
-			--EMA:Print("ShowHonorXP")
-			showBarCount = showBarCount + 1
-			if EMA.db.showXpStatus == true and EMA.db.showArtifactStatus == false then
-				showHonorBeforeBar = experienceBar
-				setHonorPoint = "BOTTOMLEFT"
-				setHonorLeft = 0
-				setHonorTop = -1
-			elseif EMA.db.showArtifactStatus == true then
-				showHonorBeforeBar = experienceArtBar
-				setHonorPoint = "BOTTOMLEFT"
-				setHonorLeft = 0
-				setHonorTop = -1
-			else
-				showHonorBeforeBar = parentFrame
-				setHonorPoint = "TOPLEFT"
-				setHonorLeft = positionLeft
-				setHonorTop = positionTop
-			end
-		end
-	]]
+		end
 		if EMA.db.showRepStatus == true then
 			--EMA:Print("Show Reputation")
 			showBarCount = showBarCount + 1
@@ -1001,13 +977,6 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 				setRepPoint = "BOTTOMLEFT"
 				setRepLeft = 0
 				setRepTop = -1
-		--[[	elseif EMA.db.showHonorStatus == true then
-				--EMA:Print("Show Reputation 3")
-				showRepBeforeBar = experienceHonorBar
-				setRepPoint = "BOTTOMLEFT"
-				setRepLeft = 0
-				setRepTop = -1
-		]]
 			else
 				--EMA:Print("Show Reputation 4")
 				showRepBeforeBar = parentFrame
@@ -1054,22 +1023,8 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 			experienceArtBar:Hide()
 			experienceArtBarClick:Hide()
 		end
-	--[[	-- Honor
-			experienceHonorBar.backgroundTexture:SetAllPoints()
-			experienceHonorBar:SetWidth( EMA.db.experienceStatusWidth )
-			experienceHonorBar:SetHeight( EMA.db.experienceStatusHeight / showBarCount )
-			experienceHonorBar:SetPoint( "TOPLEFT", showHonorBeforeBar , setHonorPoint, setHonorLeft, setHonorTop )
-			experienceHonorBarClick:SetPoint( "TOPLEFT", showHonorBeforeBar , setHonorPoint, setHonorLeft, setHonorTop )
-			experienceHonorBarClick:SetWidth( EMA.db.experienceStatusWidth )
-			experienceHonorBarClick:SetHeight( EMA.db.experienceStatusHeight / showBarCount )
-		if EMA.db.showHonorStatus == true then
-			experienceHonorBar:Show()
-			experienceHonorBarClick:Show()
-		else
-			experienceHonorBar:Hide()
-			experienceHonorBarClick:Hide()
-		end
-	]]	--rep
+
+		--rep
 			reputationBar.backgroundTexture:SetAllPoints()
 			reputationBar:SetWidth( EMA.db.experienceStatusWidth )
 			reputationBar:SetHeight( EMA.db.experienceStatusHeight / showBarCount )
@@ -1098,8 +1053,6 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 		experienceBarClick:Hide()
 		experienceArtBar:Hide()
 		experienceArtBarClick:Hide()
-	--	experienceHonorBar:Hide()
-	--	experienceHonorBarClick:Hide()
 	end
 	-- Display the health bar.
 	local healthBar	= characterStatusBar["healthBar"]
@@ -1185,7 +1138,25 @@ function EMA:UpdateEMATeamStatusBar( characterName, characterPosition )
 	else
 		comboBar:Hide()
 		comboBarClick:Hide()
-	end
+	end
+
+	-- Display the GCD.
+	local GCDFrame = characterStatusBar["GCDFrame"]
+	if EMA.db.showGCDFrame == true then
+		--GCDFrame.backgroundTexture:SetAllPoints()
+		GCDFrame:SetWidth( EMA.db.gCDFrameWidth *  EMA.db.gCDFrameHeight + EMA.db.gCDFrameHeight)
+		GCDFrame:SetHeight( EMA.db.gCDFrameHeight )
+		GCDFrame:ClearAllPoints()
+		GCDFrame:SetPoint( "TOPLEFT", parentFrame, "TOPLEFT", positionLeft, positionTop )
+		GCDFrame:Show()
+		if EMA.db.barsAreStackedVertically == true then
+			positionTop = positionTop - EMA.db.gCDFrameHeight - EMA.db.barVerticalSpacing
+		else
+			positionLeft = positionLeft + (EMA.db.gCDFrameWidth * EMA.db.gCDFrameHeight + EMA.db.gCDFrameHeight ) + EMA.db.teamListHorizontalSpacing
+		end
+	else
+		GCDFrame:Hide()
+	end
 end

 -------------------------------------------------------------------------------------------------------------
@@ -1456,7 +1427,7 @@ local function SettingsCreateDisplayOptions( top )
 		movingTop,
 		L["HEIGHT"]
 	)
-	EMA.settingsControl.displayOptionsFollowStatusHeightSlider:SetSliderValues( 15, 100, 1 )
+	EMA.settingsControl.displayOptionsFollowStatusHeightSlider:SetSliderValues( 15, 50, 1 )
 	EMA.settingsControl.displayOptionsFollowStatusHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeFollowStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
 	-- Create experience status.
@@ -1507,18 +1478,7 @@ local function SettingsCreateDisplayOptions( top )
 		L["ARTIFACT_BAR"],
 		EMA.SettingsToggleShowArtifactStatus,
 		L["ARTIFACT_BAR_HELP"]
-	)
---[[
-	EMA.settingsControl.displayOptionsCheckBoxShowHonorStatus = EMAHelperSettings:CreateCheckBox(
-		EMA.settingsControl,
-		thirdWidth,
-		left3,
-		movingTop,
-		L["HONORXP"],
-		EMA.SettingsToggleShowHonorStatus,
-		L["HONORXP_HELP"]
-	)
-]]
+	)
 	movingTop = movingTop - checkBoxHeight - verticalSpacing
 	EMA.settingsControl.displayOptionsCheckBoxShowRepStatus = EMAHelperSettings:CreateCheckBox(
 		EMA.settingsControl,
@@ -1546,7 +1506,7 @@ local function SettingsCreateDisplayOptions( top )
 		movingTop,
 		L["HEIGHT"]
 	)
-	EMA.settingsControl.displayOptionsExperienceStatusHeightSlider:SetSliderValues( 15, 100, 1 )
+	EMA.settingsControl.displayOptionsExperienceStatusHeightSlider:SetSliderValues( 15, 60, 1 )
 	EMA.settingsControl.displayOptionsExperienceStatusHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeExperienceStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
 	-- Create health status.
@@ -1606,7 +1566,7 @@ local function SettingsCreateDisplayOptions( top )
 		movingTop,
 		L["HEIGHT"]
 	)
-	EMA.settingsControl.displayOptionsHealthStatusHeightSlider:SetSliderValues( 15, 100, 1 )
+	EMA.settingsControl.displayOptionsHealthStatusHeightSlider:SetSliderValues( 15, 60, 1 )
 	EMA.settingsControl.displayOptionsHealthStatusHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeHealthStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
 	-- Create power status.
@@ -1656,7 +1616,7 @@ local function SettingsCreateDisplayOptions( top )
 		movingTop,
 		L["HEIGHT"]
 	)
-	EMA.settingsControl.displayOptionsPowerStatusHeightSlider:SetSliderValues( 10, 100, 1 )
+	EMA.settingsControl.displayOptionsPowerStatusHeightSlider:SetSliderValues( 10, 60, 1 )
 	EMA.settingsControl.displayOptionsPowerStatusHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangePowerStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
 	-- Create Combo Point status.
@@ -1706,9 +1666,53 @@ local function SettingsCreateDisplayOptions( top )
 		movingTop,
 		L["HEIGHT"]
 	)
-	EMA.settingsControl.displayOptionsComboStatusHeightSlider:SetSliderValues( 10, 100, 1 )
+	EMA.settingsControl.displayOptionsComboStatusHeightSlider:SetSliderValues( 10, 60, 1 )
 	EMA.settingsControl.displayOptionsComboStatusHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeComboStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
+	-- Create GCD Frame.
+	EMAHelperSettings:CreateHeading( EMA.settingsControl, L["GCD_FRAME_HEADER"], movingTop, true )
+	movingTop = movingTop - headingHeight
+	EMA.settingsControl.displayOptionsCheckBoxShowGcdFrame = EMAHelperSettings:CreateCheckBox(
+		EMA.settingsControl,
+		thirdWidth,
+		left,
+		movingTop,
+		L["SHOW"],
+		EMA.SettingsToggleShowGcdFrame,
+		L["GCD_FRAME"]
+	)
+--[[
+	EMA.settingsControl.displayOptionsCheckBoxShowGcdFrameToolTips = EMAHelperSettings:CreateCheckBox(
+		EMA.settingsControl,
+		thirdWidth,
+		left2,
+		movingTop,
+		L["TOOLTIPS"],
+		EMA.SettingsToggleShowGcdFrameToolTips,
+		L["TOOLTIPS_HELP"]
+	)
+]]
+	movingTop = movingTop - checkBoxHeight - verticalSpacing
+	EMA.settingsControl.displayOptionsGcdFrameWidthSlider = EMAHelperSettings:CreateSlider(
+		EMA.settingsControl,
+		halfWidthSlider,
+		left,
+		movingTop,
+		L["WIDTH"]
+	)
+	EMA.settingsControl.displayOptionsGcdFrameWidthSlider:SetSliderValues( 1, 8 , 1 )
+	EMA.settingsControl.displayOptionsGcdFrameWidthSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeGcdFrameWidth )
+	EMA.settingsControl.displayOptionsGcdFrameHeightSlider = EMAHelperSettings:CreateSlider(
+		EMA.settingsControl,
+		halfWidthSlider,
+		column2left,
+		movingTop,
+		L["HEIGHT"]
+	)
+	EMA.settingsControl.displayOptionsGcdFrameHeightSlider:SetSliderValues( 15, 60 , 1 )
+	EMA.settingsControl.displayOptionsGcdFrameHeightSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeGcdFrameHeight )
+
+	movingTop = movingTop - sliderHeight - sectionSpacing
 	return movingTop
 end

@@ -1768,7 +1772,6 @@ function EMA:SettingsRefresh()
 	EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatus:SetValue( EMA.db.showExperienceStatus )
 	EMA.settingsControl.displayOptionsCheckBoxShowXpStatus:SetValue( EMA.db.showXpStatus )
 	EMA.settingsControl.displayOptionsCheckBoxShowArtifactStatus:SetValue( EMA.db.showArtifactStatus )
---	EMA.settingsControl.displayOptionsCheckBoxShowHonorStatus:SetValue( EMA.db.showHonorStatus )
 	EMA.settingsControl.displayOptionsCheckBoxShowRepStatus:SetValue( EMA.db.showRepStatus )
 	EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatusValues:SetValue( EMA.db.experienceStatusShowValues )
 	EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatusPercentage:SetValue( EMA.db.experienceStatusShowPercentage )
@@ -1790,9 +1793,12 @@ function EMA:SettingsRefresh()
 	EMA.settingsControl.displayOptionsCheckBoxShowComboStatusPercentage:SetValue( EMA.db.comboStatusShowPercentage )
 	EMA.settingsControl.displayOptionsComboStatusWidthSlider:SetValue( EMA.db.comboStatusWidth )
 	EMA.settingsControl.displayOptionsComboStatusHeightSlider:SetValue( EMA.db.comboStatusHeight )
+	EMA.settingsControl.displayOptionsCheckBoxShowGcdFrame:SetValue( EMA.db.showGCDFrame )
+--	EMA.settingsControl.displayOptionsCheckBoxShowGcdFrameToolTips:SetValue( EMA.db.gCDFrameToolTips )
+	EMA.settingsControl.displayOptionsGcdFrameWidthSlider:SetValue( EMA.db.gCDFrameWidth )
+	EMA.settingsControl.displayOptionsGcdFrameHeightSlider:SetValue( EMA.db.gCDFrameHeight )
 	EMA.settingsControl.displayOptionsBackgroundColourPicker:SetColor( EMA.db.frameBackgroundColourR, EMA.db.frameBackgroundColourG, EMA.db.frameBackgroundColourB, EMA.db.frameBackgroundColourA )
 	EMA.settingsControl.displayOptionsBorderColourPicker:SetColor( EMA.db.frameBorderColourR, EMA.db.frameBorderColourG, EMA.db.frameBorderColourB, EMA.db.frameBorderColourA )
---	EMA.settingsControl.displayOptionsCheckBoxShowEquippedOnly:SetValue( EMA.db.ShowEquippedOnly )
 	-- State.
 	-- Trying to change state in combat lockdown causes taint. Let's not do that. Eventually it would be nice to have a "proper state driven team display",
 	-- but this workaround is enough for now.
@@ -1821,7 +1827,6 @@ function EMA:SettingsRefresh()
 		EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatus:SetDisabled( not EMA.db.showTeamList )
 		EMA.settingsControl.displayOptionsCheckBoxShowXpStatus:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus)
 		EMA.settingsControl.displayOptionsCheckBoxShowArtifactStatus:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus)
---		EMA.settingsControl.displayOptionsCheckBoxShowHonorStatus:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus)
 		EMA.settingsControl.displayOptionsCheckBoxShowRepStatus:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus )
 		EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatusValues:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus )
 		EMA.settingsControl.displayOptionsCheckBoxShowExperienceStatusPercentage:SetDisabled( not EMA.db.showTeamList or not EMA.db.showExperienceStatus )
@@ -1843,6 +1848,10 @@ function EMA:SettingsRefresh()
 		EMA.settingsControl.displayOptionsCheckBoxShowComboStatusPercentage:SetDisabled( not EMA.db.showTeamList or not EMA.db.showComboStatus)
 		EMA.settingsControl.displayOptionsComboStatusWidthSlider:SetDisabled( not EMA.db.showTeamList or not EMA.db.showComboStatus)
 		EMA.settingsControl.displayOptionsComboStatusHeightSlider:SetDisabled( not EMA.db.showTeamList or not EMA.db.showComboStatus)
+		EMA.settingsControl.displayOptionsCheckBoxShowGcdFrame:SetDisabled( not EMA.db.showTeamList )
+--		EMA.settingsControl.displayOptionsCheckBoxShowGcdFrameToolTips:SetDisabled( not EMA.db.showTeamList or not EMA.db.showGCDFrame )
+		EMA.settingsControl.displayOptionsGcdFrameWidthSlider:SetDisabled( not EMA.db.showTeamList or not EMA.db.showGCDFrame)
+		EMA.settingsControl.displayOptionsGcdFrameWidthSlider:SetDisabled( not EMA.db.showTeamList or not EMA.db.showGCDFrame)
 		EMA.settingsControl.displayOptionsBackgroundColourPicker:SetDisabled( not EMA.db.showTeamList )
 		EMA.settingsControl.displayOptionsBorderColourPicker:SetDisabled( not EMA.db.showTeamList )
 		if EMA.teamListCreated == true then
@@ -1857,6 +1866,7 @@ function EMA:SettingsRefresh()
 			EMA:SettingsUpdateHealthAll()
 			EMA:SettingsUpdatePowerAll()
 			EMA:SettingsUpdateComboAll()
+			EMA:SetTrGCOpt()
 		end
 	else
 		EMA.updateSettingsAfterCombat = true
@@ -1892,7 +1902,6 @@ function EMA:EMAOnSettingsReceived( characterName, settings )
 		EMA.db.showExperienceStatus = settings.showExperienceStatus
 		EMA.db.showXpStatus = settings.showXpStatus
 		EMA.db.showArtifactStatus = settings.showArtifactStatus
---		EMA.db.showHonorStatus = settings.showHonorStatus
 		EMA.db.showRepStatus = settings.showRepStatus
 		EMA.db.experienceStatusWidth = settings.experienceStatusWidth
 		EMA.db.experienceStatusHeight = settings.experienceStatusHeight
@@ -1914,6 +1923,10 @@ function EMA:EMAOnSettingsReceived( characterName, settings )
 		EMA.db.comboStatusHeight = settings.comboStatusHeight
 		EMA.db.comboStatusShowValues = settings.comboStatusShowValues
 		EMA.db.comboStatusShowPercentage = settings.comboStatusShowPercentage
+		EMA.db.showGCDFrame = settings.showGCDFrame
+		EMA.db.gCDFrameWidth = settings.gCDFrameWidth
+		EMA.db.gCDFrameHeight = settings.gCDFrameHeight
+		EMA.db.gCDFrameToolTips = settings.gCDFrameToolTips
 		EMA.db.frameAlpha = settings.frameAlpha
 		EMA.db.framePoint = settings.framePoint
 		EMA.db.frameRelativePoint = settings.frameRelativePoint
@@ -2047,12 +2060,6 @@ function EMA:SettingsToggleShowFollowStatusName( event, checked )
 	EMA:SettingsRefresh()
 end

-function EMA:SettingsToggleShowToolTipInfo( event, checked )
-	EMA.db.showToolTipInfo = checked
-	EMA:SettingsRefresh()
-end
-
-
 function EMA:SettingsChangeFollowStatusWidth( event, value )
 	EMA.db.followStatusWidth = tonumber( value )
 	EMA:SettingsRefresh()
@@ -2078,12 +2085,7 @@ function EMA:SettingsToggleShowArtifactStatus( event, checked )
 	EMA.db.showArtifactStatus = checked
 	EMA:SettingsRefresh()
 end
---[[
-function EMA:SettingsToggleShowHonorStatus( event, checked )
-	EMA.db.showHonorStatus = checked
-	EMA:SettingsRefresh()
-end
-]]
+
 function EMA:SettingsToggleShowRepStatus( event, checked )
 	EMA.db.showRepStatus = checked
 	EMA:SettingsRefresh()
@@ -2190,6 +2192,27 @@ function EMA:SettingsChangeComboStatusHeight( event, value )
 	EMA:SettingsRefresh()
 end

+function EMA:SettingsToggleShowGcdFrame( event, checked )
+	--EMA:Print("test")
+	EMA.db.showGCDFrame = checked
+	EMA:SettingsRefresh()
+end
+
+function EMA:SettingsToggleShowGcdFrameToolTips( event, checked )
+	EMA.db.gCDFrameToolTips = checked
+	EMA:SettingsRefresh()
+end
+
+function EMA:SettingsChangeGcdFrameWidth( event, value )
+	EMA.db.gCDFrameWidth = tonumber( value )
+	EMA:SettingsRefresh()
+end
+
+function EMA:SettingsChangeGcdFrameHeight( event, value )
+	EMA.db.gCDFrameHeight = tonumber( value )
+	EMA:SettingsRefresh()
+end
+
 function EMA:SettingsBackgroundColourPickerChanged( event, r, g, b, a )
 	EMA.db.frameBackgroundColourR = r
 	EMA.db.frameBackgroundColourG = g
@@ -2206,13 +2229,6 @@ function EMA:SettingsBorderColourPickerChanged( event, r, g, b, a )
 	EMA:SettingsRefresh()
 end

---[[
-function EMA:SettingsToggleShowEquippedOnly( event, checked )
-	EMA.db.ShowEquippedOnly = checked
-	EMA:SettingsRefresh()
-end ]]
-
-
 -------------------------------------------------------------------------------------------------------------
 -- Commands.
 -------------------------------------------------------------------------------------------------------------
@@ -2542,16 +2558,6 @@ function EMA:UpdateExperienceStatus( characterName, playerExperience, playerMaxE
 	if characterStatusBar["experienceArtBar"] == nil then
 		return
 	end
---[[
-	local experienceHonorBarText = characterStatusBar["experienceHonorBarText"]
-	if characterStatusBar["experienceHonorBarText"] == nil then
-		return
-	end
-	local experienceHonorBar = characterStatusBar["experienceHonorBar"]
-	if characterStatusBar["experienceHonorBar"] == nil then
-		return
-	end
-]]
 	if playerExperience == nil then
 		playerExperience = experienceBarText.playerExperience
 	end
@@ -2870,7 +2876,7 @@ end

 function EMA:UpdateHealthStatus( characterName, playerHealth, playerMaxHealth, inComingHeal, class )
 	--EMA:Print("testUpdate", characterName, playerHealth, playerMaxHealth, inComingHeal, class )
-		if characterName == nil then
+	if characterName == nil then
 		return
 	end
 	if CanDisplayTeamList() == false then
@@ -3235,6 +3241,82 @@ function EMA:SetStatusBarColourForCombo( comboBar, Class )
 	end
 end

+
+
+-------------------------------------------------------------------------------------------------------------
+-- Last Spell Bar Updates.
+-------------------------------------------------------------------------------------------------------------
+
+function EMA:UNIT_SPELLCAST_START( event, unitTarget , castGUID, spellID )
+	EMA:UpdateSpellStatus( unitTarget, spellID )
+end
+
+function EMA:UNIT_SPELLCAST_SUCCEEDED( event, unitTarget , castGUID, spellID )
+	EMA:UpdateSpellStatus( unitTarget , spellID )
+end
+
+function EMA:UNIT_SPELLCAST_STOP( event, unitTarget , castGUID, spellID )
+	EMA:UpdateSpellStatus( unitTarget , spellID )
+end
+
+function EMA:UNIT_SPELLCAST_CHANNEL_STOP( event, unitTarget , castGUID, spellID )
+EMA:UpdateSpellStatus( unitTarget , spellID )
+end
+
+function EMA:UpdateSpellStatus( unitTarget, spellID )
+	if EMA.db.showTeamList == false and EMA.db.showGCDFrame == false then
+		return
+	end
+	local characterName = UnitName( unitTarget )
+	characterName = EMAUtilities:AddRealmToNameIfMissing( characterName )
+	local characterStatusBar = EMA.characterStatusBar[characterName]
+	if characterStatusBar == nil then
+		return
+	end
+	local GCDFrame = characterStatusBar["GCDFrame"]
+	local GCDFrameText = characterStatusBar["GCDFrameText"]
+	--EMA:Print("testUpdate", unitTarget )
+	if IsAddOnLoaded( "TrufiGCD" ) == true then
+		local i, _ = TrGCDPlayerDetect(unitTarget)
+		--EMA:Print("test", unitTarget, i )
+		if i > 0 and i <= 5 then
+			-- setpoint
+			TrGCDQueueFr[i]:ClearAllPoints()
+			TrGCDQueueFr[i]:SetPoint( "LEFT", GCDFrame, "LEFT", 0 , 0 )
+		end
+	else
+		GCDFrameText:SetText( L["CAN_NOT_FIND_TRUFIGCD_ADDON"] )
+	end
+end
+
+function EMA:SetTrGCOpt()
+	if IsAddOnLoaded( "TrufiGCD" ) == true then
+		local TimeGcd = 1.6
+		for i=1,5 do
+		-- enable
+			TrGCDQueueOpt[i].enable = true
+			TrufiGCDGlSave["TrGCDQueueFr"][i]["enable"] = true
+			-- fade
+			TrGCDQueueOpt[i].fade = "Right"
+			TrufiGCDGlSave["TrGCDQueueFr"][i]["fade"] = "Right"
+			-- spells ( width )
+			TrGCDQueueOpt[i].width = EMA.db.gCDFrameWidth
+			TrufiGCDGlSave["TrGCDQueueFr"][i]["width"] = 3
+			TrGCDSpWidthChanged( i, EMA.db.gCDFrameWidth )
+			-- Icon Size!
+			--EMA:Print("sizetest", TrGCDQueueOpt[i].size, EMA.db.comboStatusHeight )
+			TrGCDQueueOpt[i].size = EMA.db.gCDFrameHeight
+			TrufiGCDGlSave["TrGCDQueueFr"][i]["size"] = EMA.db.gCDFrameHeight
+			TrGCDQueueOpt[i].speed = TrGCDQueueOpt[i].size / TimeGcd
+			TrufiGCDGlSave["TrGCDQueueFr"][i]["speed"] = TrGCDQueueOpt[i].speed
+			TrGCDResizeQFr(i)
+			if TrGCDQueueOpt[i].size ~= EMA.db.gCDFrameHeight then
+				TrGCDClear(i)
+			end
+			TrGCDLoadSettings()
+		end
+	end
+end
 -------------------------------------------------------------------------------------------------------------
 -- Addon initialization, enabling and disabling.
 -------------------------------------------------------------------------------------------------------------
@@ -3254,6 +3336,7 @@ function EMA:OnInitialize()
 	EMA:SetTeamListVisibility()
 	-- Is Following to stop spam
 	EMA.isFollowing = false
+	EMA:SetTrGCOpt()
 end

 -- Called when the addon is enabled.
@@ -3268,24 +3351,20 @@ function EMA:OnEnable()
 	EMA:RegisterEvent( "UNIT_HEALTH" )
 	EMA:RegisterEvent( "UNIT_MAXHEALTH" )
 	EMA:RegisterEvent( "UNIT_HEAL_PREDICTION" )
-	--TODO Adds support for 8.0.x
-	if EMAPrivate.Core.isBetaBuild() == true then
-		EMA:RegisterEvent( "UNIT_POWER_UPDATE", "UNIT_POWER" )
-	else
-		EMA:RegisterEvent( "UNIT_POWER", "UNIT_POWER" )
-	end
+	EMA:RegisterEvent( "UNIT_POWER_UPDATE", "UNIT_POWER" )
 	EMA:RegisterEvent( "UNIT_MAXPOWER", "UNIT_POWER" )
 	EMA:RegisterEvent( "UNIT_DISPLAYPOWER" )
 	EMA:RegisterEvent( "CHAT_MSG_COMBAT_FACTION_CHANGE" )
 	EMA:RegisterEvent( "UNIT_POWER_FREQUENT")
 	EMA:RegisterEvent( "RUNE_POWER_UPDATE" )
 	EMA:RegisterEvent( "PLAYER_TALENT_UPDATE")
-	--EMA:RegisterEvent( "HONOR_XP_UPDATE" )
-	--EMA:RegisterEvent( "HONOR_LEVEL_UPDATE" )
-	--EMA:RegisterEvent( "HONOR_PRESTIGE_UPDATE" )
 	EMA:RegisterEvent( "GROUP_ROSTER_UPDATE" )
 	EMA:RegisterEvent( "ARTIFACT_XP_UPDATE" )
 	EMA:RegisterEvent("UNIT_PORTRAIT_UPDATE")
+	EMA:RegisterEvent("UNIT_SPELLCAST_START")
+	EMA:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
+	EMA:RegisterEvent("UNIT_SPELLCAST_STOP")
+	EMA:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
 	EMA.SharedMedia.RegisterCallback( EMA, "LibSharedMedia_Registered" )
     EMA.SharedMedia.RegisterCallback( EMA, "LibSharedMedia_SetGlobal" )
 	EMA:RegisterMessage( EMAApi.MESSAGE_TEAM_CHARACTER_ADDED, "OnCharactersChanged" )
@@ -3294,7 +3373,6 @@ function EMA:OnEnable()
 	EMA:RegisterMessage( EMAApi.MESSAGE_TEAM_MASTER_CHANGED, "OnMasterChanged" )
 	EMA:RegisterMessage( EMAApi.MESSAGE_CHARACTER_ONLINE, "OnCharactersChanged")
 	EMA:RegisterMessage( EMAApi.MESSAGE_CHARACTER_OFFLINE, "OnCharactersChanged")
-
 	EMA:SecureHook( "SetWatchedFactionIndex" )
 	EMA:ScheduleTimer( "RefreshTeamListControls", 3 )
 	EMA:ScheduleTimer( "SendExperienceStatusUpdateCommand", 8 )
@@ -3378,5 +3456,4 @@ end

 function EMA:OnCharactersChanged()
 	EMA:RefreshTeamListControls()
-end
-
+end
\ No newline at end of file
diff --git a/Modules/Follow.lua b/Modules/Follow.lua
index fc85306..2b529c9 100644
--- a/Modules/Follow.lua
+++ b/Modules/Follow.lua
@@ -983,14 +983,14 @@ function EMA:PLAYER_REGEN_DISABLED()
 			end
 		end
 	end
-	if EMA.db.doNotWarnFollowPvP == true then
+	if EMA.db.warnFollowPvP == true then
 		EMA.warnFollowPvPCombat = true
 	end
 end

 function EMA:PVP_FOLLOW(event, arg1, message, ...  )
 	--EMA:Print("test", message, EMA.warnFollowPvPCombat )
-	if EMA.db.doNotWarnFollowPvP == false and EMA.db.warnWhenFollowBreaks == false then
+	if EMA.db.warnFollowPvP == false and EMA.db.warnWhenFollowBreaks == false then
 		return
 	end
 	if message == ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT or message == ERR_INVALID_FOLLOW_PVP_COMBAT then
diff --git a/Modules/Information.lua b/Modules/Information.lua
index a076141..056db2b 100644
--- a/Modules/Information.lua
+++ b/Modules/Information.lua
@@ -28,7 +28,7 @@ EMA.SharedMedia = LibStub( "LibSharedMedia-3.0" )

 --  Constants and Locale for this module.
 EMA.moduleName = "Information"
-EMA.settingsDatabaseName = "CurrProfileDB"
+EMA.settingsDatabaseName = "InformationProfileDB"
 EMA.chatCommand = "ema-info"
 local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" )
 EMA.parentDisplayName = L["DISPLAY"]
@@ -95,14 +95,20 @@ EMA.currTypes.PrismaticManapearl = 1721
 --8.3
 EMA.currTypes.CoalescingVisions = 1755
 EMA.currTypes.CorruptedMementos = 1719
-EMA.currTypes.echoesOfNyalotha = 1803
+EMA.currTypes.EchoesOfNyalotha = 1803
+
+--9.0
+EMA.currTypes.Honor = 1792

 -------------------------------------- End of edit --------------------------------------------------------------

 function EMA:CurrencyIconAndName( id )
-	local fullName, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered, quality = GetCurrencyInfo(id)
-	local currName = strconcat(" |T"..icon..":20|t", L[" "]..fullName)
-	return currName
+	local fullName, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered, quality = C_CurrencyInfo.GetCurrencyInfo(id)
+	---EMA:Print("test", fullName, icon)
+	if 	icon ~= nil then
+		local currName = strconcat(" |T"..icon..":20|t", L[" "]..fullName)
+		return currName
+	end
 end


@@ -732,7 +738,6 @@ function EMA:OnInitialize()
 	EMA:SettingsRefresh()
 	-- Create the currency list frame.
 	EMA:CreateEMAToonCurrencyListFrame()
-	--EMA:CreateEMAToonCurrencyListFrameTwo()
 end

 -- Called when the addon is enabled.
@@ -844,55 +849,6 @@ function EMA:MatchCurrValue(value)
 	end
 end

-function EMA:CreateEMAToonCurrencyListFrameTwo()
-	local frameTwo = AceGUI:Create( "Frame" )
-	frameTwo:SetTitle( "test" )
-	frameTwo:SetWidth(800)
-	frameTwo:SetHeight(650)
-	frameTwo:SetLayout("Fill")
-
-
-
-	local containerWidgetSettings = AceGUI:Create( "SimpleGroup" )
-	containerWidgetSettings:SetLayout( "JambaFill" )
-
-	local widgetSettingsHelp = AceGUI:Create( "ScrollFrame" )
-	widgetSettingsHelp:SetLayout( "Flow" )
-
-	local widgetSettings = AceGUI:Create( "ScrollFrame" )
-	widgetSettings:SetLayout( "Flow" )
-
-	local tabGroupWidgetSettings = AceGUI:Create( "TabGroup" )
-	-- Was 'Fill', which causes lockup, started at patch 4.1 (40100).  Similar to http://forums.wowace.com/showthread.php?t=17872
-	tabGroupWidgetSettings:SetLayout( "Flow" )
-	tabGroupWidgetSettings:SetTabs( { {text=L["Options"], value="options"}, {text=L["Commands"], value="help"} } )
-
-
-
-
-
-	frameTwo:AddChild( tabGroupWidgetSettings )
-	tabGroupWidgetSettings:AddChild( widgetSettings )
-
-	-- Callback function for OnGroupSelected
-	local function SelectGroup(container, event, group)
-	container:ReleaseChildren()
-	EMA:Print("test", container, event, group )
-	if group == "options" then
-		EMA:Print("HELLO")
-		EMA:DrawGroup1(container)
-
-	elseif group == "tab1" then
-		EMA:Print("Grp1")
-		DrawGroup1(container)
-	elseif group == "tab2" then
-		DrawGroup2(container)
-	end
-end
-	tabGroupWidgetSettings:SetCallback("OnGroupSelected", SelectGroup)
-	EMAToonCurrencyListFrameTwo = frameTwo
-
-end

 function EMA:DrawGroup1(container)
 	for characterName, currencyFrameCharacterInfo in pairs( EMA.currencyFrameCharacterInfo ) do
@@ -904,7 +860,7 @@ end

 function EMA:CreateEMAToonCurrencyListFrame()
 	-- The frame.
-	local frame = CreateFrame( "Frame", "EMAToonCurrencyListWindowFrame", UIParent )
+	local frame = CreateFrame( "Frame", "EMAToonCurrencyListWindowFrame", UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil )
 	frame.obj = EMA
 	frame:SetFrameStrata( "LOW" )
 	frame:SetToplevel( false )
@@ -1112,37 +1068,37 @@ end
 function EMA:UpdateHendingText()
 	local parentFrame = EMAToonCurrencyListFrame
 	-- Type One
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeOne )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeOne )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeOneText:SetText( iconTextureString )
 	end
 	-- Type Two
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeTwo )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeTwo )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeTwoText:SetText( iconTextureString )
 	end
 	-- Type Three
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeThree )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeThree )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeThreeText:SetText( iconTextureString )
 	end
 	-- Type Four
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeFour )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFour )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeFourText:SetText( iconTextureString )
 	end
 	-- Type Five
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeFive )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFive )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeFiveText:SetText( iconTextureString )
 	end
 	-- Type six
-	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = GetCurrencyInfo( EMA.db.CcurrTypeSix )
+	local name, amount, icon, earnedThisWeek, weeklyMax, totalMax, isDiscovered = C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeSix )
 	if icon ~= nil then
 		local iconTextureString = strconcat(" |T"..icon..":20|t")
 			parentFrame.TypeSixText:SetText( iconTextureString )
@@ -1589,8 +1545,8 @@ function EMA:EMAToonRequestCurrency()
 		end
 	end
 	EMA:EMASendCommandToTeam( EMA.COMMAND_REQUEST_CURRENCY, "" )
+	EMAToonCurrencyListFrame:Show()
 	EMA.SettingsRefresh()
-
 end

 function EMA:DoSendCurrency( characterName, dummyValue )
@@ -1599,19 +1555,19 @@ function EMA:DoSendCurrency( characterName, dummyValue )
 	table.wipe( EMA.currentCurrencyValues )
 	EMA.currentCurrencyValues.currGold = GetMoney()
 	-- CurrencyValues
-	EMA.currentCurrencyValues.currTypeOne = select( 2, GetCurrencyInfo( EMA.db.CcurrTypeOne ) )
-	EMA.currentCurrencyValues.currTypeTwo = select( 2, GetCurrencyInfo( EMA.db.CcurrTypeTwo ) )
-	EMA.currentCurrencyValues.currTypeThree = select( 2, GetCurrencyInfo( EMA.db.CcurrTypeThree ) )
-	EMA.currentCurrencyValues.currTypeFour	= select( 2, GetCurrencyInfo( EMA.db.CcurrTypeFour ) )
-	EMA.currentCurrencyValues.currTypeFive = select( 2, GetCurrencyInfo( EMA.db.CcurrTypeFive ) )
-	EMA.currentCurrencyValues.currTypeSix = select( 2, GetCurrencyInfo( EMA.db.CcurrTypeSix ) )
+	EMA.currentCurrencyValues.currTypeOne = select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeOne ) )
+	EMA.currentCurrencyValues.currTypeTwo = select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeTwo ) )
+	EMA.currentCurrencyValues.currTypeThree = select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeThree ) )
+	EMA.currentCurrencyValues.currTypeFour	= select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFour ) )
+	EMA.currentCurrencyValues.currTypeFive = select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFive ) )
+	EMA.currentCurrencyValues.currTypeSix = select( 2, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeSix ) )
 	-- Max CurrencyValues
-	EMA.currentCurrencyValues.currMaxTypeOne = select( 6, GetCurrencyInfo( EMA.db.CcurrTypeOne ) )
-	EMA.currentCurrencyValues.currMaxTypeTwo = select( 6, GetCurrencyInfo( EMA.db.CcurrTypeTwo ) )
-	EMA.currentCurrencyValues.currMaxTypeThree = select( 6, GetCurrencyInfo( EMA.db.CcurrTypeThree ) )
-	EMA.currentCurrencyValues.currMaxTypeFour	= select( 6, GetCurrencyInfo( EMA.db.CcurrTypeFour ) )
-	EMA.currentCurrencyValues.currMaxTypeFive = select( 6, GetCurrencyInfo( EMA.db.CcurrTypeFive ) )
-	EMA.currentCurrencyValues.currMaxTypeSix = select( 6, GetCurrencyInfo( EMA.db.CcurrTypeSix ) )
+	EMA.currentCurrencyValues.currMaxTypeOne = select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeOne ) )
+	EMA.currentCurrencyValues.currMaxTypeTwo = select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeTwo ) )
+	EMA.currentCurrencyValues.currMaxTypeThree = select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeThree ) )
+	EMA.currentCurrencyValues.currMaxTypeFour	= select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFour ) )
+	EMA.currentCurrencyValues.currMaxTypeFive = select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeFive ) )
+	EMA.currentCurrencyValues.currMaxTypeSix = select( 6, C_CurrencyInfo.GetCurrencyInfo( EMA.db.CcurrTypeSix ) )
 	EMA:EMASendCommandToToon( characterName, EMA.COMMAND_HERE_IS_CURRENCY, EMA.currentCurrencyValues )
 	else
 		return
@@ -1760,7 +1716,7 @@ end
 function EMA:TellTeamGold( event, msg, playerName )
 	--EMA:Print("goldtest", event, msg)
 	local money = GetMoney()
-	local gold, silver, copper  = EMAUtilities:MoneyString(money)
+	local gold, silver, copper  = EMAUtilities:MoneyStringFormatted(money)
 	local goldText = gold.." Gold "..silver.." Silver "..copper.." Copper"
 	local channel = nil
 	if event == "CHAT_MSG_GUILD" then
@@ -1787,7 +1743,11 @@ function EMA:TellTeamKeys( event, msg, playerName)
 	elseif event == "CHAT_MSG_RAID" or event == "CHAT_MSG_RAID_LEADER" then
 		channel = "RAID"
 	end
-	if channel ~= nil then
+	if KeyStone == nil then
+		KeyStone = L["NO_KEYSTONE_FOUND"]
+	end
+
+	if channel ~= nil and KeyStone ~= nil then
 		SendChatMessage(L["MY_KEY_STONE_IS"](KeyStone), channel)
 	end
 end
diff --git a/Modules/ItemUse.lua b/Modules/ItemUse.lua
index 2b425d3..f1a2648 100644
--- a/Modules/ItemUse.lua
+++ b/Modules/ItemUse.lua
@@ -206,8 +206,7 @@ end

 local function CreateEMAItemUseFrame()
 	-- The frame.	EMAItemUseWindowFrame
-	local frame = CreateFrame( "Frame", "EMAItemUseWindowFrame" , UIParent, "SecureHandlerStateTemplate" )
-
+	local frame = CreateFrame("Frame", "EMAItemUseWindowFrame", UIParent, "SecureHandlerStateTemplate")Mixin(frame, BackdropTemplateMixin or {})
 	frame:SetAttribute("_onstate-page", [[
 		self:SetAttribute("state", newstate)
 		control:ChildUpdate("state", newstate)
@@ -238,12 +237,14 @@ local function CreateEMAItemUseFrame()
 			EMA.db.frameXOffset = xOffset
 			EMA.db.frameYOffset = yOffset
 		end	)
+
 	frame:SetBackdrop( {
 		bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
 		edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
 		tile = true, tileSize = 10, edgeSize = 10,
 		insets = { left = 3, right = 3, top = 3, bottom = 3 }
 	} )
+
 	frame:ClearAllPoints()
 	frame:SetPoint( EMA.db.framePoint, nil, EMA.db.frameRelativePoint, EMA.db.frameXOffset, EMA.db.frameYOffset )
 	-- Clear Button
@@ -273,7 +274,7 @@ local function CreateEMAItemUseFrame()
 	-- Set the global frame reference for this frame.
 	EMAItemUseFrame = frame
 	-- Remove unsued items --test
-	EMA:SettingsUpdateBorderStyle()
+--	EMA:SettingsUpdateBorderStyle()
 	EMA.itemUseCreated = true
 	EMA.UpdateHeight()
 end
@@ -481,9 +482,15 @@ end

 --ebony test Using the wowapi and not the scanning of tooltips
 function EMA:CheckForQuestItemAndAddToBar()
-	for iterateQuests = 1, GetNumQuestLogEntries() do
-		local questLogTitleText,_,_,isHeader, _, _, _, questID = GetQuestLogTitle(iterateQuests)
-		if not isHeader then
+	--for iterateQuests = 1, GetNumQuestLogEntries() do
+	--	local questLogTitleText,_,_,isHeader, _, _, _, questID = GetQuestLogTitle(iterateQuests)
+
+	local index = C_QuestLog.GetNumQuestLogEntries()
+		for iterateQuests = 1, index do
+			local info =  C_QuestLog.GetInfo( iterateQuests )
+
+
+		if not info.isHeader then
 			--EMA:Print("test", questItemLink, iterateQuests, questLogTitleText, questID )
 			local questItemLink, questItemIcon, questItemCharges = GetQuestLogSpecialItemInfo( iterateQuests )
 			if questItemLink ~= nil then
@@ -1025,7 +1032,7 @@ function EMA:SettingsRefresh()
 		EMA.settingsControl.displayOptionsBorderColourPicker:SetDisabled( not EMA.db.showItemUse )
 		if EMA.itemUseCreated == true then
 			EMA:RefreshItemUseControls()
-			EMA:SettingsUpdateBorderStyle()
+	--		EMA:SettingsUpdateBorderStyle()
 			EMA:SetItemUseVisibility()
 			EMA:UpdateItemsInBar()
 			EMA:UpdateHeight()
@@ -1154,7 +1161,7 @@ function EMA:OnInitialize()
 	-- Create the item use frame.
 	CreateEMAItemUseFrame()
 	EMA:RefreshItemUseControls()
-	EMA:SettingsUpdateBorderStyle()
+--	EMA:SettingsUpdateBorderStyle()
 	EMA:SetItemUseVisibility()
 	EMA:UpdateItemsInBar()
 	EMA.sharedInvData = {}
diff --git a/Modules/Quest.lua b/Modules/Quest.lua
index aea0bac..fba295d 100644
--- a/Modules/Quest.lua
+++ b/Modules/Quest.lua
@@ -160,7 +160,7 @@ local function InitializePopupDialogs()
 		hideOnEscape = 1,
         OnAccept = function( self )
 			--EMA:Print("Button1")
-			AbandonQuest()
+			C_QuestLog.AbandonQuest()
 		end,
 		OnAlt = function ( self )
 			--EMA:Print("Button3")
@@ -251,11 +251,9 @@ function EMA:OnEnable()
 	EMA:RegisterEvent( "QUEST_PROGRESS" )
 	EMA:RegisterEvent( "CHAT_MSG_SYSTEM", "QUEST_FAIL" )
    -- Quest post hooks.
-    EMA:SecureHook( "SelectGossipOption" )
-    EMA:SecureHook( "SelectGossipActiveQuest" )
-    EMA:SecureHook( "SelectGossipAvailableQuest" )
-    EMA:SecureHook( "SelectActiveQuest" )
-    EMA:SecureHook( "SelectAvailableQuest" )
+	EMA:SecureHook( C_GossipInfo, "SelectOption", "SelectGossipOption")
+	EMA:SecureHook( C_GossipInfo, "SelectActiveQuest" )
+	EMA:SecureHook( C_GossipInfo, "SelectAvailableQuest" )
     EMA:SecureHook( "AcceptQuest" )
 	EMA:SecureHook( "AcknowledgeAutoAcceptQuest" )
     EMA:SecureHook( "CompleteQuest" )
@@ -1199,6 +1197,7 @@ function EMA:QUEST_PROGRESS()
 end

 function EMA:SelectGossipOption( gossipIndex )
+	--EMA:Print("test", gossipIndex)
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		if EMA.isInternalCommand == false then
             EMA:DebugMessage( "SelectGossipOption" )
@@ -1211,7 +1210,7 @@ function EMA:DoSelectGossipOption( sender, gossipIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		EMA.isInternalCommand = true
         EMA:DebugMessage( "DoSelectGossipOption" )
-		SelectGossipOption( gossipIndex )
+		C_GossipInfo.SelectOption( gossipIndex )
 		EMA.isInternalCommand = false
 	end
 end
@@ -1237,7 +1236,7 @@ end
 function EMA:SelectGossipAvailableQuest( gossipIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		if EMA.isInternalCommand == false then
-            EMA:DebugMessage( "SelectGossipAvailableQuest" )
+			EMA:DebugMessage( "SelectGossipAvailableQuest" )
 			EMA:EMASendCommandToTeam( EMA.COMMAND_SELECT_GOSSIP_AVAILABLE_QUEST, gossipIndex )
 		end
 	end
@@ -1247,7 +1246,7 @@ function EMA:DoSelectGossipAvailableQuest( sender, gossipIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		EMA.isInternalCommand = true
         EMA:DebugMessage( "DoSelectGossipAvailableQuest" )
-		SelectGossipAvailableQuest( gossipIndex )
+		SelectAvailableQuest( gossipIndex )
 		EMA.isInternalCommand = false
 	end
 end
@@ -1265,7 +1264,11 @@ function EMA:DoSelectActiveQuest( sender, questIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		EMA.isInternalCommand = true
         EMA:DebugMessage( "DoSelectActiveQuest" )
-		SelectActiveQuest( questIndex )
+		if C_GossipInfo.GetNumActiveQuests() > 1 then
+			C_GossipInfo.SelectActiveQuest( questIndex )
+		else
+			EMA:EMASendMessageToTeam( EMA.db.warningArea, L["AM_I_TALKING_TO_A_NPC"], false )
+		end
 		EMA.isInternalCommand = false
 	end
 end
@@ -1273,17 +1276,23 @@ end
 function EMA:SelectAvailableQuest( questIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		if EMA.isInternalCommand == false then
-            EMA:DebugMessage( "SelectAvailableQuest" )
+			EMA:DebugMessage( "SelectAvailableQuest" )
 			EMA:EMASendCommandToTeam( EMA.COMMAND_SELECT_AVAILABLE_QUEST, questIndex )
 		end
 	end
 end

 function EMA:DoSelectAvailableQuest( sender, questIndex )
+	EMA:Print("test4", sender, questIndex )
 	if EMA.db.mirrorMasterQuestSelectionAndDeclining == true then
 		EMA.isInternalCommand = true
         EMA:DebugMessage( "DoSelectAvailableQuest" )
-		SelectAvailableQuest( questIndex )
+		-- TODO KEEP?
+		--if C_GossipInfo.GetNumAvailableQuests() > 1 then
+			C_GossipInfo.SelectAvailableQuest( questIndex )
+		--else
+		--	EMA:EMASendMessageToTeam( EMA.db.warningArea, L["AM_I_TALKING_TO_A_NPC"], false )
+		--end
 		EMA.isInternalCommand = false
 	end
 end
@@ -1666,9 +1675,9 @@ end

 function EMA:QuestMapQuestOptions_AbandonQuest(questID)
 	if EMAApi.GetTeamListMaximumOrderOnline() > 1 then
-		local lastQuestIndex = GetQuestLogSelection()
+		local lastQuestIndex = C_QuestLog.GetSelectedQuest()
 		--EMA:Print("SetAbandonQuest", lastQuestIndex, questID)
-		title = GetAbandonQuestName()
+		local title = QuestUtils_GetQuestName(C_QuestLog.GetAbandonQuest())
 		local data = {}
 		data.questID = questID
 		data.title = title
@@ -1686,12 +1695,14 @@ end
 function EMA:QuestMapQuestOptions_TrackQuest(questID)
 	if EMAApi.GetTeamListMaximumOrderOnline() > 1 then
 		--EMA:Print("test", questID)
-		local questLogIndex = GetQuestLogIndexByID(questID)
-		local title = GetQuestLogTitle( questLogIndex )
+		local title = QuestUtils_GetQuestName(C_QuestLog.GetAbandonQuest())
+		local questLogIndex = C_QuestLog.GetLogIndexForQuestID( questID )
+
+
 		local data = {}
 		data.questID = questID
 		data.title = title
-		if ( IsQuestWatched(questLogIndex) ) then
+		if ( QuestUtils_IsQuestWatched(questID) ) then
 			--EMA:Print("TrackingQuest")
 			StaticPopup_Show( "EMA_QUEST_TRACK_ALL_TOONS", title, nil, data )
 		else
@@ -1703,7 +1714,7 @@ end

 function EMA:QuestMapQuestOptions_EMA_DoQuestTrack( sender, questID, title, track )
 	--EMA:Print("test1.5", sender, questID, title, track)
-	local questLogIndex = GetQuestLogIndexByID( questID )
+	local questLogIndex = C_QuestLog.GetLogIndexForQuestID( questID )
 	if questLogIndex ~= 0 then
 		if track then
 			EMA:EMADoQuest_TrackQuest( questID, questLogIndex )
@@ -1717,28 +1728,29 @@ end

 function EMA:EMADoQuest_TrackQuest(questID, questLogIndex)
 	--EMA:Print("test", questID, questLogIndex )
-	if ( not IsQuestWatched(questID) ) then
-		AddQuestWatch(questLogIndex, true)
+	if ( not QuestUtils_IsQuestWatched(questID) ) then
+		C_QuestLog.AddQuestWatch(questID, Enum.QuestWatchType.Manual)
 		QuestSuperTracking_OnQuestTracked(questID)
 	end
 end


 function EMA:EMADoQuest_UnTrackQuest(questID, questLogIndex)
-	--EMA:Print("test2", questID, questLogIndex )
-	if ( IsQuestWatched(questLogIndex) ) then
+	EMA:Print("test2", questID, questLogIndex )
+	if ( QuestUtils_IsQuestWatched(questID) ) then
 		QuestObjectiveTracker_UntrackQuest(nil, questID)
 	end
 end

 function EMA:QuestMapQuestOptions_EMA_DoAbandonQuest( sender, questID, title )
-	local questLogIndex = GetQuestLogIndexByID( questID )
-	if questLogIndex ~= 0 then
-		local lastQuestIndex = GetQuestLogSelection();
-		SelectQuestLogEntry(GetQuestLogIndexByID(questID));
-		SetAbandonQuest();
-		AbandonQuest();
-		SelectQuestLogEntry(lastQuestIndex);
+	--local questLogIndex = GetQuestLogIndexByID( questID )
+
+	if  questID ~= nil then
+		local oldSelectedQuest = C_QuestLog.GetSelectedQuest()
+		C_QuestLog.SetSelectedQuest(questID)
+		C_QuestLog.SetAbandonQuest()
+		C_QuestLog.AbandonQuest()
+		C_QuestLog.SetSelectedQuest(oldSelectedQuest)
 		EMA:EMASendMessageToTeam( EMA.db.messageArea, L["QUESTLOG_HAVE_ABANDONED_QUEST"]( title ), false )
 	end
 end
@@ -1747,7 +1759,7 @@ end


 function EMA:CreateEMAMiniQuestLogFrame()
-    EMAMiniQuestLogFrame = CreateFrame( "Frame", "EMAMiniQuestLogFrame", QuestMapFrame )
+    EMAMiniQuestLogFrame = CreateFrame( "Frame", "EMAMiniQuestLogFrame", QuestMapFrame, BackdropTemplateMixin and "BackdropTemplate" or nil )
     local frame = EMAMiniQuestLogFrame
 	frame:SetWidth( 470 )
 	frame:SetHeight( 40 )
@@ -1837,7 +1849,7 @@ function EMA.AbandonNextQuest()
 		local canAbandon = CanAbandonQuest(questID)
 		if canAbandon then
 			EMA:EMASendCommandToTeam( EMA.COMMAND_ABANDON_QUEST, questID, title)
-			if (EMA.iterateQuests ~= GetNumQuestLogEntries()) then
+			if (EMA.iterateQuests ~= C_QuestLog.GetNumQuestLogEntries()) then
 				-- decrement quest count as we have removed one if not last quest
 				EMA.iterateQuests = EMA.iterateQuests - 1
 			end
@@ -1912,7 +1924,7 @@ end

 function EMA:IterateQuests(methodToCall, timer)
 	EMA.iterateQuests = EMA.iterateQuests + 1
-		if EMA.iterateQuests <= GetNumQuestLogEntries() then
+		if EMA.iterateQuests <= C_QuestLog.GetNumQuestLogEntries() then
 			EMA:ScheduleTimer( methodToCall, timer )
 		end
 end
@@ -1972,10 +1984,10 @@ function EMA:QUEST_ACCEPT_CONFIRM( event, senderName, questName )
 end

 function EMA:GetQuestLogIndexByName( questName )
-	for iterateQuests = 1, GetNumQuestLogEntries() do
-        local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests )
+	for iterateQuests = 1,C_QuestLog.GetNumQuestLogEntries() do
+		local info =  C_QuestLog.GetInfo( iterateQuests )
 		if not isHeader then
-			if title == questName then
+			if info.title == questName then
 				return iterateQuests
 			end
 		end
diff --git a/Modules/QuestWatcher.lua b/Modules/QuestWatcher.lua
index 4fd05d1..8f8561b 100644
--- a/Modules/QuestWatcher.lua
+++ b/Modules/QuestWatcher.lua
@@ -150,6 +150,7 @@ end

 -- Initialise the module.
 function EMA:OnInitialize()
+	EMA.QUESTWATCHUPDATING = false
 	EMA.currentAutoQuestPopups = {}
 	EMA.countAutoQuestPopUpFrames = 0
 	EMA.questWatcherFrameCreated = false
@@ -192,10 +193,10 @@ function EMA:OnEnable()
    -- Quest post hooks.
     EMA:SecureHook( "SelectActiveQuest" )
 	EMA:SecureHook( "GetQuestReward" )
-	EMA:SecureHook( "AddQuestWatch" )
-	EMA:SecureHook( "RemoveQuestWatch" )
-	EMA:SecureHook( "AbandonQuest" )
-	EMA:SecureHook( "SetAbandonQuest" )
+	EMA:SecureHook( C_QuestLog, "AddQuestWatch" )
+	EMA:SecureHook( C_QuestLog, "RemoveQuestWatch" )
+	EMA:SecureHook( C_QuestLog, "AbandonQuest" )
+	EMA:SecureHook( C_QuestLog, "SetAbandonQuest" )
 	-- Update the quest watcher for watched quests.
 	EMA:ScheduleTimer( "EMAQuestWatcherUpdate", 1, false, "all" )
 	--EMA:ScheduleTimer( "EMAQuestWatcherScenarioUpdate", 1, false )
@@ -536,7 +537,7 @@ end

 function EMA:CreateQuestWatcherFrame()
 	-- The frame.
-	local frame = CreateFrame( "Frame", "EMAQuestWatcherWindowFrame", UIParent )
+	local frame = CreateFrame( "Frame", "EMAQuestWatcherWindowFrame", UIParent, BackdropTemplateMixin and "BackdropTemplate" or nil )
 	frame.obj = EMA
 	frame:SetFrameStrata( "BACKGROUND" )
 	frame:SetClampedToScreen( true )
@@ -989,9 +990,10 @@ function EMA:GetQuestReward( itemChoice )
 	local questJustCompletedName = GetTitleText()
     EMA:DebugMessage( "GetQuestReward: ", questIndex, questJustCompletedName )
     local questIndex = EMA:GetQuestLogIndexByName( questJustCompletedName )
-    local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
-    EMA:DebugMessage( "GetQuestReward after GetQuestLogTitle: ", questIndex, questJustCompletedName, questID )
-	EMA:RemoveQuestFromWatchList( questID )
+    --local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
+    local info =  C_QuestLog.GetInfo( questIndex )
+	EMA:DebugMessage( "GetQuestReward after GetQuestLogTitle: ", info.questIndex, questJustCompletedName, info.questID )
+	EMA:RemoveQuestFromWatchList( info.questID )
 end

 function EMA:AddQuestWatch( questIndex )
@@ -1004,15 +1006,16 @@ function EMA:AddQuestWatch( questIndex )
 	--EMA:EMAQuestWatcherScenarioUpdate( true )
 end

-function EMA:RemoveQuestWatch( questIndex )
+function EMA:RemoveQuestWatch( questID )
 	if EMA.db.enableQuestWatcher == false then
 		return
     end
-    EMA:DebugMessage( "RemoveQuestWatch", questIndex )
+    --EMA:Print( "RemoveQuestWatch", questID )
 	--EMA:UpdateHideBlizzardWatchFrame()
     EMA:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
-	local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
-    EMA:DebugMessage( "About to call RemoveQuestFromWatchList with value:", questID )
+	--local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
+    --local info =  C_QuestLog.GetInfo( questIndex )
+	EMA:DebugMessage( "About to call RemoveQuestFromWatchList with value:", questID )
 	EMA:RemoveQuestFromWatchList( questID )
 end

@@ -1020,7 +1023,8 @@ function EMA:SetAbandonQuest()
 	if EMA.db.enableQuestWatcher == false then
 		return
 	end
-	local questName = GetAbandonQuestName()
+	--local questName = GetAbandonQuestName()
+	local questName = QuestUtils_GetQuestName(C_QuestLog.GetAbandonQuest())
 	if questName ~= nil then
 		local questIndex = EMA:GetQuestLogIndexByName( questName )
 		EMA:SetActiveQuestForQuestWatcherCache( questIndex )
@@ -1203,8 +1207,9 @@ function EMA:SetActiveQuestForQuestWatcherCache( questIndex )
 		return
 	end
 	if questIndex ~= nil then
-        local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
-		EMA.currentQuestForQuestWatcherID = questID
+        --local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
+		local info =  C_QuestLog.GetInfo( questIndex )
+		EMA.currentQuestForQuestWatcherID = info.questID
 	else
 		EMA.currentQuestForQuestWatcherID = nil
 	end
@@ -1377,77 +1382,101 @@ function EMA:EMAQuestWatcherScenarioUpdate(useCache)
 			end
 		end
 	end
+	EMA.QUESTWATCHUPDATING = false
 end

 function EMA:EMAQuestWatcherQuestLogUpdate( useCache )
-	for i = 1, GetNumQuestLogEntries() do
-		local questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI, isHidden = GetQuestWatchInfo(i)
-		if questID ~= nil then
-		--EMA:Print("EMAQuestData", questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI, isHidden)
-			if numObjectives > 0 then
-				for iterateObjectives = 1, numObjectives do
-					--EMA:Print( "NumObjs:", numObjectives )
-					local objectiveFullText, objectiveType, objectiveFinished = GetQuestLogLeaderBoard( iterateObjectives, questLogIndex )
-					local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText, objectiveType )
-					if objectiveType == "progressbar" then
-						local progress = GetQuestProgressBarPercent( questID )
-						objectiveText = "ProgressBar"..": "..objectiveText
-						amountCompleted = tostring(progress)..L["%"]
-					end
-					if objectiveFullText ~= nil then
-						--EMA:Print("test2", questID, title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
-						if (EMA:QuestCacheUpdate( questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
-							EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, title, iterateObjectives, objectiveText, amountCompleted, isComplete, isComplete )
+		if EMA.QUESTWATCHUPDATING == true then
+			return
+		end
+		--EMA:Print("QUESTWATCHUPDATINGS")
+		EMA.QUESTWATCHUPDATING = true
+		local index = C_QuestLog.GetNumQuestLogEntries()
+		for iterateQuests = 1, index do
+			local info =  C_QuestLog.GetInfo( iterateQuests )
+			if info.questID ~= nil and QuestUtils_IsQuestWatched(info.questID) == true then
+				--EMA:Print("testAA", info.title, info.questLogIndex, info.questID, info.campaignID, info.level, info.difficultyLevel, info.suggestedGroup, info.frequency, info.isHeader, info.isCollapsed, info.startEvent, info.isTask, info.isBounty, info.isStory, info.isScaling, info.isOnMap, info.hasLocalPOI, info.isHidden, info.isAutoComplete, info.overridesSortOrder, info.readyForTranslation )
+				local questLogIndex = C_QuestLog.GetLogIndexForQuestID(info.questID)
+				local numObjectives = GetNumQuestLeaderBoards(questLogIndex )
+				local isComplete = C_QuestLog.IsComplete( info.questID)
+				--local isComplete = EMA:IsCompletedAutoCompleteFieldQuest( questIndex, isComplete )
+				if info.isHeader == false and info.isHidden == false then
+				--EMA:Print("EMAQuestData", questID, title, questLogIndex, numObjectives, requiredMoney, isComplete, startEvent, isAutoComplete, failureTime, timeElapsed, questType, isTask, isBounty, isStory, isOnMap, hasLocalPOI, isHidden)
+				if numObjectives > 0 then
+					for iterateObjectives = 1, numObjectives do
+						--EMA:Print( "NumObjs:", numObjectives )
+						local objectiveFullText, objectiveType, objectiveFinished = GetQuestLogLeaderBoard( iterateObjectives, questLogIndex )
+						local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText, objectiveType )
+
+						if objectiveType == "progressbar" then
+							local progress = GetQuestProgressBarPercent( info.questID )
+							objectiveText = "ProgressBar"..": "..objectiveText
+							amountCompleted = tostring(progress)..L["%"]
+						end
+						if objectiveFullText ~= nil then
+							--EMA:Print("test2", info.questID, info.title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
+							if (EMA:QuestCacheUpdate( info.questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
+								EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, info.questID, info.title, iterateObjectives, objectiveText, amountCompleted, isComplete, isComplete )
+							end
 						end
+					end
+				else
+					local objectiveFullText = GetQuestLogCompletionText(questLogIndex)
+					local iterateObjectives = 0
+					local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText )
+					local objectiveFinished = true
+					--EMA:Print("test3", info.questID, info.title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
+					if (EMA:QuestCacheUpdate( info.questID, info.title, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
+						EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, info.questID, info.title, iterateObjectives, objectiveText, amountCompleted, isComplete, isComplete )
 					end
-				end
-			else
-				local objectiveFullText = GetQuestLogCompletionText(questLogIndex)
-				local iterateObjectives = 0
-				local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText )
-				local objectiveFinished = true
-				--EMA:Print("test3", questID, title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
-				if (EMA:QuestCacheUpdate( questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
-					EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, title, iterateObjectives, objectiveText, amountCompleted, isComplete, isComplete )
 				end
-			end
-		end
+			end
+		end
 	end
+	--EMA:Print("QUESTWATCHUPDATING DONE")
+	EMA.QUESTWATCHUPDATING = false
 end

 function EMA:EMAQuestWatcherWorldQuestUpdate( useCache )
 	--EMA:Print("fireworldquestUpdate")
-	for i = 1, GetNumQuestLogEntries() do
-		local title, level, suggestedGroup, isHeader, isCollapsed, _ , frequency, questID = GetQuestLogTitle(i)
-		local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
-		local isComplete = EMA:IsCompletedAutoCompleteFieldQuest( questIndex, isComplete )
+	--for i = 1, GetNumQuestLogEntries() do
+	local index = C_QuestLog.GetNumQuestLogEntries()
+	for iterateQuests = 1, index do
+		local info =  C_QuestLog.GetInfo( iterateQuests )
+		local questIndex = C_QuestLog.GetLogIndexForQuestID(info.questID)
+		---local title, level, suggestedGroup, isHeader, isCollapsed, _ , frequency, questID = GetQuestLogTitle(i)
+		local isInArea, isOnMap, numObjectives = GetTaskInfo(info.questID)
+		local isComplete = C_QuestLog.IsComplete( info.questID)
+		--local isComplete = EMA:IsCompletedAutoCompleteFieldQuest( questIndex, IsComplete )
+
 			if isInArea and isOnMap then
 			for iterateObjectives = 1, numObjectives do
 				--EMA:Print("test", questID, iterateObjectives, isComplete)
-				local objectiveFullText, objectiveType, objectiveFinished = GetQuestObjectiveInfo( questID, iterateObjectives, isComplete )
+				local objectiveFullText, objectiveType, objectiveFinished = GetQuestObjectiveInfo( info.questID, iterateObjectives, isComplete )
 				local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText )
 				if objectiveType == "progressbar"  then
 					local objectiveText = "ProgressBar"
-					local progress = GetQuestProgressBarPercent( questID )
+					local progress = GetQuestProgressBarPercent( info.questID )
 					local amountCompleted = tostring(progress)..L["%"]
 					--EMA:Print("QuestPercent", title, objectiveText, amountCompleted )
-					local name = tostring("Bonus:")..(title)
-					--EMA:Print("BarQuest", questID, title, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete)
-					if (EMA:QuestCacheUpdate( questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
-						EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, name, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
+					local EditedQuestName = tostring("Bonus:")..(info.title)
+					EMA:Print("BarQuest", info.questID, name, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete)
+					if (EMA:QuestCacheUpdate( info.questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
+						EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, info.questID, EditedQuestName, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
 					end
 			else
 				local amountCompleted, objectiveText = EMA:GetQuestObjectiveCompletion( objectiveFullText )
-				if (EMA:QuestCacheUpdate( questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
+				if (EMA:QuestCacheUpdate( info.questID, iterateObjectives, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
 					--EMA:Print( "UPDATE:", "cache:", useCache, "QuestID", questID, "ObjectID", iterateObjectives )
-					--EMA:Print("sendingquestdata", objectiveText, amountCompleted, finished )
-					local name = tostring("Bonus:")..(title)
-					EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, name, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
+					--EMA:Print("sendingquestdata", info.title, info.questID, objectiveText, amountCompleted, finished )
+					local name = tostring("Bonus:")..(info.title)
+					EMA:EMASendCommandToTeam( EMA.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, info.questID, name, iterateObjectives, objectiveText, amountCompleted, objectiveFinished, isComplete )
 					end
 				end
 			end
 		end
-	end
+	end
+	EMA.QUESTWATCHUPDATING = false
 end

 function EMA:EMAQuestWatcherUpdate( useCache, questType )
@@ -1619,14 +1648,10 @@ function EMA:RemoveQuestsNotBeingWatched()
 	EMA:UpdateAllQuestsInWatchList()
 	for checkQuestID, value in pairs( EMA.questWatchListOfQuests ) do
 		local found = false
-		for iterateWatchedQuests = 1, GetNumQuestWatches() do
-			local questIndex = GetQuestIndexForWatch( iterateWatchedQuests )
-			if questIndex ~= nil then
-                local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
-				if checkQuestID == questID then
-					found = true
-				end
-			end
+		local IsOnQuest = C_QuestLog.IsOnQuest(checkQuestID)
+		if IsOnQuest == true then
+			--EMA:Print("foundQuest", checkQuestID)
+			found = true
 		end
 		if found == false then
 			EMA:RemoveQuestFromWatchList( checkQuestID )
@@ -1707,11 +1732,14 @@ function EMA:GetObjectiveHeaderInWatchList( questID, questName, objectiveIndex,
 end

 function EMA:GetQuestItemFromQuestID(findQuestID)
-	for iterateQuests=1,GetNumQuestLogEntries() do
-		local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID = GetQuestLogTitle(iterateQuests)
+	--for iterateQuests=1,GetNumQuestLogEntries() do
+	--	local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID = GetQuestLogTitle(iterateQuests)
+	local index = C_QuestLog.GetNumQuestLogEntries()
+	for iterateQuests = 1, index do
+		local info =  C_QuestLog.GetInfo( iterateQuests )
 		--if title ~= nil then
-		if not isHeader then
-			if findQuestID == questID then
+		if not info.isHeader then
+			if findQuestID == info.questID then
 				local questItemLink, questItemIcon, questItemCharges = GetQuestLogSpecialItemInfo( iterateQuests )
 				if questItemLink then
 					--EMA:Print("Item", questItemLink, questItemIcon, questID)
@@ -1752,14 +1780,9 @@ function EMA:GetQuestHeaderInWatchList( questID, questName, characterName )
 	if ( questItemIcon ~= nil ) then
 		icon = strconcat(" |T"..questItemIcon..":18|t".."  ")
 	end
-	-- TODO CLEAN UP AFTER 8.0
-	-- Ebony incase we wonna use this then there is C_LFGList.CanCreateQuestGroup(questID)
-	-- that would show the quest using the group finder
-	if EMAPrivate.Core.isBetaBuild() == true then
-		if (C_CampaignInfo.IsCampaignQuest(questID) ) then
+	if (C_CampaignInfo.IsCampaignQuest(questID) ) then
 			--EMA:Print("CampaignQuest", questName)
-			icon = GetInlineFactionIcon()
-		end
+		icon = GetInlineFactionIcon()
 	end
 	local questWatchInfo = EMA:CreateQuestWatchInfo( questID, "QUEST_HEADER", -1, "", questName, icon )

@@ -2248,7 +2271,7 @@ function EMAQuestMapQuestOptionsDropDown_Initialize(self)
 	local questID = EMAQuestMapQuestOptionsDropDown.questID
 	local questText = EMAQuestMapQuestOptionsDropDown.questText
 	if (questID ~= 0 ) then
-		local questLogIndex = GetQuestLogIndexByID(questID)
+		local questLogIndex = C_QuestLog.GetLogIndexForQuestID(questID)

 		local infoTitle = UIDropDownMenu_CreateInfo()
 		infoTitle.text = questText
@@ -2266,7 +2289,7 @@ function EMAQuestMapQuestOptionsDropDown_Initialize(self)
 		info.checked = false
 		UIDropDownMenu_AddButton(info)

-		if ( GetQuestLogPushable(questLogIndex) and IsInGroup() ) then
+		if ( C_QuestLog.IsPushableQuest(questID) and IsInGroup() ) then
 			info.text = SHARE_QUEST
 			info.func = function(_, questID) EMA:QuestMapQuestOptions_ShareQuest(questID) end
 			info.arg1 = self.questID
@@ -2384,7 +2407,8 @@ function EMA:DisplayAutoQuestPopUps()
 			-- TODO - hack, assuming all characters have the same sort of popup.
 			popUpType = characterPopUpType
 		end
-        local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( GetQuestLogIndexByID( questID ) )
+        --local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( C_QuestLog.GetQuestLogIndexByID( questID ) )
+
 		if isComplete and isComplete > 0 then
 			isComplete = true
 		else
@@ -2456,10 +2480,11 @@ end
 -------------------------------------------------------------------------------------------------------------

 function EMA:GetQuestLogIndexByName( questName )
-	for iterateQuests = 1, GetNumQuestLogEntries() do
-        local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests )
-		if not isHeader then
-			if title == questName then
+	for iterateQuests = 1, C_QuestLog.GetNumQuestLogEntries() do
+        --local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests )
+		local info =  C_QuestLog.GetInfo( iterateQuests )
+		if not info.isHeader then
+			if info.title == questName then
 				return iterateQuests
 			end
 		end
@@ -2468,10 +2493,11 @@ function EMA:GetQuestLogIndexByName( questName )
 end

 function EMA:GetQuestLogIndexByID( inQuestID )
-	for iterateQuests = 1, GetNumQuestLogEntries() do
-        local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests )
-		if not isHeader then
-			if questID == inQuestID then
+	for iterateQuests = 1, C_QuestLog.GetNumQuestLogEntries() do
+        --local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( iterateQuests )
+		local info =  C_QuestLog.GetInfo( iterateQuests )
+		if not info.isHeader then
+			if info.questID == inQuestID then
 				return iterateQuests
 			end
 		end
diff --git a/Modules/Toon.lua b/Modules/Toon.lua
index 102713a..e137665 100644
--- a/Modules/Toon.lua
+++ b/Modules/Toon.lua
@@ -354,6 +354,11 @@ local function SettingsCreateToon( top )
 		L["ROLL_LOOT_HELP"]
 	)
 	movingTop = movingTop - checkBoxHeight
+
+
+
+
+
 	EMAHelperSettings:CreateHeading( EMA.settingsControlToon, L["MESSAGES_HEADER"], movingTop, false )
 	movingTop = movingTop - dropdownHeight - verticalSpacing
  	EMA.settingsControlToon.dropdownRequestArea = EMAHelperSettings:CreateDropdown(
@@ -1582,11 +1587,15 @@ end
 --Ebony CCed
 function EMA:LOSS_OF_CONTROL_ADDED( event, ... )
 	if EMA.db.warnCC == true then
-		local eventIndex = C_LossOfControl.GetNumEvents()
+		---local eventIndex = C_LossOfControl.GetNumEvents()
+		local eventIndex = C_LossOfControl.GetActiveLossOfControlDataCount()
 		if eventIndex > 0 then
-			local locType, spellID, text, iconTexture, startTime, timeRemaining, duration, lockoutSchool, priority, displayType = C_LossOfControl.GetEventInfo(eventIndex)
-			if EMAApi.IsCharacterTheMaster( EMA.characterName ) == false then
-				EMA:EMASendMessageToTeam( EMA.db.warningArea, EMA.db.CcMessage..L[" "]..text, false )
+			local LossOfControlData = C_LossOfControl.GetActiveLossOfControlData(eventIndex)
+			--local locType, spellID, text, iconTexture, startTime, timeRemaining, duration, lockoutSchool, priority, displayType
+			local name, rank, icon, castTime, minRange, maxRange, spellId =  GetSpellInfo( LossOfControlData.spellID )
+			--EMA:Print("test", LossOfControlData.spellID, name )
+			if EMAApi.IsCharacterTheMaster( EMA.characterName ) == false and name ~= nil then
+				EMA:EMASendMessageToTeam( EMA.db.warningArea, EMA.db.CcMessage..L[" "].. name, false )
 			end
 		end
 	end