Quantcast

release-7.1.5-5.1.7

ebony [01-25-17 - 16:21]
release-7.1.5-5.1.7
Filename
Jamba-AdvancedLoot/Jamba-AdvancedLoot.toc
Jamba-AdvancedLoot/Locales/Locales.xml
Jamba-Curr/Jamba-Curr.toc
Jamba-Curr/JambaCurr.lua
Jamba-Curr/Locales/JambaCurr-Locale-enUS.lua
Jamba-Curr/Locales/Locales.xml
Jamba-DisplayTeam/Jamba-DisplayTeam.toc
Jamba-DisplayTeam/JambaDisplayTeam.lua
Jamba-DisplayTeam/Locales/JambaDisplayTeam-Locale-enUS.lua
Jamba-DisplayTeam/Locales/Locales.xml
Jamba-FTL/Jamba-FTL.toc
Jamba-FTL/JambaFTL.lua
Jamba-FTL/Locales/Locales.xml
Jamba-Follow/Jamba-Follow.toc
Jamba-Follow/JambaFollow.lua
Jamba-Follow/Locales/JambaFollow-Locale-enUS.lua
Jamba-Follow/Locales/Locales.xml
Jamba-ItemUse/Jamba-ItemUse.toc
Jamba-ItemUse/JambaItemUse.lua
Jamba-ItemUse/Locales/JambaItemUse-Locale-enUS.lua
Jamba-ItemUse/Locales/Locales.xml
Jamba-Macro/Jamba-Macro.toc
Jamba-Macro/JambaMacro.lua
Jamba-Macro/Locales/Jamba-Macro-Locale-enUS.lua
Jamba-Macro/Locales/Locales.xml
Jamba-Mount/Jamba-Mount.toc
Jamba-Mount/JambaMount.lua
Jamba-Mount/Locales/JambaMount-Locale-enUS.lua
Jamba-Mount/Locales/Locales.xml
Jamba-Purchase/Jamba-Purchase.toc
Jamba-Purchase/JambaPurchase.lua
Jamba-Purchase/Locales/JambaPurchase-Locale-enUS.lua
Jamba-Purchase/Locales/Locales.xml
Jamba-Quest/Jamba-Quest.toc
Jamba-Quest/JambaQuest.lua
Jamba-Quest/Locales/JambaQuest-Locale-enUS.lua
Jamba-Quest/Locales/Locales.xml
Jamba-QuestWatcher/Jamba-QuestWatcher.toc
Jamba-QuestWatcher/JambaQuestWatcher.lua
Jamba-QuestWatcher/Locales/JambaQuestWatcher-Locale-enUS.lua
Jamba-QuestWatcher/Locales/Locales.xml
Jamba-Sell/Jamba-Sell.toc
Jamba-Sell/JambaSell.lua
Jamba-Sell/Locales/JambaSell-Locale-enUS.lua
Jamba-Sell/Locales/Locales.xml
Jamba-Talk/Jamba-Talk.toc
Jamba-Talk/JambaTalk.lua
Jamba-Talk/Locales/JambaTalk-Locale-enUS.lua
Jamba-Talk/Locales/Locales.xml
Jamba-Target/Bindings.xml
Jamba-Target/Jamba-Target.toc
Jamba-Target/JambaTarget.lua
Jamba-Target/Locales/JambaTarget-Locale-enUS.lua
Jamba-Target/Locales/Locales.xml
Jamba-Taxi/Jamba-Taxi.toc
Jamba-Taxi/JambaTaxi.lua
Jamba-Taxi/Locales/JambaTaxi-Locale-enUS.lua
Jamba-Taxi/Locales/Locales.xml
Jamba-Toon/Jamba-Toon.toc
Jamba-Toon/JambaToon.lua
Jamba-Toon/Locales/JambaToon-Locale-enUS.lua
Jamba-Toon/Locales/Locales.xml
Jamba-Trade/Jamba-Trade.toc
Jamba-Trade/JambaTrade.lua
Jamba-Trade/Locales/JambaTrade-Locale-enUS.lua
Jamba-Trade/Locales/Locales.xml
Jamba/AceGUIContainer-JambaWindow.lua
Jamba/AceGUIWidget-JambaContinueLabel.lua
Jamba/AceGUIWidget-JambaNormalLabel.lua
Jamba/Bindings.xml
Jamba/CHANGELOG.txt
Jamba/Jamba.toc
Jamba/JambaCommunications.lua
Jamba/JambaCore.lua
Jamba/JambaEmbeds.xml
Jamba/JambaHelperSettings.lua
Jamba/JambaMessage.lua
Jamba/JambaModule.lua
Jamba/JambaStartupMessage.xml
Jamba/JambaTag.lua
Jamba/JambaTeam.lua
Jamba/JambaUtilities.lua
Jamba/LICENSE
Jamba/LibActionButtonJamba-1.0-57.lua
Jamba/LibActionButtonJamba-1.0-66.lua
Jamba/LibActionButtonJamba-1.0.lua
Jamba/Libs/AceAddon-3.0/AceAddon-3.0.xml
Jamba/Libs/AceBucket-3.0/AceBucket-3.0.xml
Jamba/Libs/AceComm-3.0/AceComm-3.0.xml
Jamba/Libs/AceConfig-3.0/AceConfig-3.0.xml
Jamba/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
Jamba/Libs/AceConsole-3.0/AceConsole-3.0.lua
Jamba/Libs/AceConsole-3.0/AceConsole-3.0.xml
Jamba/Libs/AceDB-3.0/AceDB-3.0.lua
Jamba/Libs/AceDB-3.0/AceDB-3.0.xml
Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
Jamba/Libs/AceEvent-3.0/AceEvent-3.0.xml
Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
Jamba/Libs/AceHook-3.0/AceHook-3.0.xml
Jamba/Libs/AceLocale-3.0/AceLocale-3.0.xml
Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
Jamba/Libs/AceTab-3.0/AceTab-3.0.lua
Jamba/Libs/AceTimer-3.0/AceTimer-3.0.xml
Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
Jamba/Libs/Changelog-Ace3-Release-r1151.txt
Jamba/Libs/LibBabble-Class-3.0/LibBabble-Class-3.0.lua
Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test.lua
Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test3.lua
Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test4.lua
Jamba/Libs/LibBabble-Inventory-3.0/lib.xml
Jamba/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
Jamba/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
Jamba/Libs/LibDeformat-3.0/lib.xml
Jamba/Libs/LibGratuity-3.0/LibGratuity-3.0.toc
Jamba/Libs/LibGratuity-3.0/LibStub/tests/test.lua
Jamba/Libs/LibGratuity-3.0/LibStub/tests/test3.lua
Jamba/Libs/LibGratuity-3.0/LibStub/tests/test4.lua
Jamba/Libs/LibGratuity-3.0/lib.xml
Jamba/Libs/LibSharedMedia-3.0/lib.xml
Jamba/Libs/UTF8/UTF8.toc
Jamba/Libs/UTF8/utf8.lua
Jamba/Libs/UTF8/utf8data.lua
Jamba/Locales/JambaCore-Locale-enUS.lua
Jamba/Locales/JambaMessage-Locale-enUS.lua
Jamba/Locales/JambaTeam-Locale-enUS.lua
Jamba/Locales/Locales.xml
diff --git a/Jamba-AdvancedLoot/Jamba-AdvancedLoot.toc b/Jamba-AdvancedLoot/Jamba-AdvancedLoot.toc
index 4a8a9dd..e82eb22 100644
--- a/Jamba-AdvancedLoot/Jamba-AdvancedLoot.toc
+++ b/Jamba-AdvancedLoot/Jamba-AdvancedLoot.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba-AdvancedLoot
 ## Notes: Jamba-AdvancedLoot
-## Author: Max Schilling
-## Version: 7.0.3-5.0
+## Author: Ebony, Former Author: Jafula & Max Schilling
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-AdvancedLoot/Locales/Locales.xml b/Jamba-AdvancedLoot/Locales/Locales.xml
index 8e22097..3a7360b 100644
--- a/Jamba-AdvancedLoot/Locales/Locales.xml
+++ b/Jamba-AdvancedLoot/Locales/Locales.xml
@@ -10,4 +10,4 @@ Credits: Built on top of the awesome JAMBA addon, most code is copied nearly dir

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaAdvancedLoot-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Curr/Jamba-Curr.toc b/Jamba-Curr/Jamba-Curr.toc
index c31e9e1..7da10b0 100644
--- a/Jamba-Curr/Jamba-Curr.toc
+++ b/Jamba-Curr/Jamba-Curr.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaCurr
 ## Notes: JambaCurr
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
@@ -10,5 +10,3 @@
 ## LoadOnDemand: 1
 Locales\Locales.xml
 JambaCurr.lua
-
-
diff --git a/Jamba-Curr/JambaCurr.lua b/Jamba-Curr/JambaCurr.lua
index 993d4fd..0d9a976 100644
--- a/Jamba-Curr/JambaCurr.lua
+++ b/Jamba-Curr/JambaCurr.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -60,7 +60,7 @@ AJM.currTypes.SealofBrokenFate = 1273
 AJM.currTypes.ShadowyCoins = 1154
 AJM.currTypes.SightlessEye = 1149
 AJM.currTypes.TimeWornArtifact = 1268
-
+AJM.currTypes.CuriousCoin = 1275

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

@@ -1488,8 +1488,8 @@ function AJM:DoShowToonsCurrency( characterName, currencyValues )
 	currencyFrameCharacterInfo.TypeFiveText:SetTextColor( r, g, b, a )
 	currencyFrameCharacterInfo.TypeSixText:SetTextColor( r, g, b, a )

-	--currencyFrameCharacterInfo.GoldText:SetText( JambaUtilities:FormatMoneyString( currencyValues.currGold ) )
-	currencyFrameCharacterInfo.GoldText:SetText( GetCoinTextureString( currencyValues.currGold ) )
+	currencyFrameCharacterInfo.GoldText:SetText( JambaUtilities:FormatMoneyString( currencyValues.currGold ) )
+	--currencyFrameCharacterInfo.GoldText:SetText( GetCoinTextureString( currencyValues.currGold ) )
 	currencyFrameCharacterInfo.TypeOneText:SetText( currencyValues.currTypeOne )
 	currencyFrameCharacterInfo.TypeTwoText:SetText( currencyValues.currTypeTwo )
 	currencyFrameCharacterInfo.TypeThreeText:SetText( currencyValues.currTypeThree )
@@ -1498,11 +1498,11 @@ function AJM:DoShowToonsCurrency( characterName, currencyValues )
 	currencyFrameCharacterInfo.TypeSixText:SetText( currencyValues.currTypeSix )
 	-- Total gold.
 	AJM.currencyTotalGold = AJM.currencyTotalGold + currencyValues.currGold
-	--parentFrame.TotalGoldText:SetText( JambaUtilities:FormatMoneyString( AJM.currencyTotalGold ) )
-	parentFrame.TotalGoldText:SetText( GetCoinTextureString( AJM.currencyTotalGold ) )
+	parentFrame.TotalGoldText:SetText( JambaUtilities:FormatMoneyString( AJM.currencyTotalGold ) )
+	--parentFrame.TotalGoldText:SetText( GetCoinTextureString( AJM.currencyTotalGold ) )
 	if IsInGuild() then
-		--parentFrame.TotalGoldGuildText:SetText( JambaUtilities:FormatMoneyString( GetGuildBankMoney() ) )
-		parentFrame.TotalGoldGuildText:SetText( GetCoinTextureString( GetGuildBankMoney() ) )
+		parentFrame.TotalGoldGuildText:SetText( JambaUtilities:FormatMoneyString( GetGuildBankMoney() ) )
+		--parentFrame.TotalGoldGuildText:SetText( GetCoinTextureString( GetGuildBankMoney() ) )
 	end
 	-- Update width of currency list.
 	AJM:CurrencyListSetColumnWidth()
@@ -1517,4 +1517,4 @@ function AJM:JambaOnCommandReceived( characterName, commandName, ... )
 	if commandName == AJM.COMMAND_HERE_IS_CURRENCY then
 		AJM:DoShowToonsCurrency( characterName, ... )
 	end
-end
\ No newline at end of file
+end
diff --git a/Jamba-Curr/Locales/JambaCurr-Locale-enUS.lua b/Jamba-Curr/Locales/JambaCurr-Locale-enUS.lua
index 08ae073..fbb9e0d 100644
--- a/Jamba-Curr/Locales/JambaCurr-Locale-enUS.lua
+++ b/Jamba-Curr/Locales/JambaCurr-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -75,4 +75,4 @@ L["Shows Currency on The Currency display window."] = true
 L["You can change the Currency ID here.\n\nFor a list of ID's\nhttp://www.wowhead.com/currencies"] = true
 L["Show Currency Window"] = true
 L["Open Currency List On Start Up.\n\nThe Master Minion Only)"] = true
-L["Lock Currency List\n\n(Enables Mouse Click-Through)"] = true
\ No newline at end of file
+L["Lock Currency List\n\n(Enables Mouse Click-Through)"] = true
diff --git a/Jamba-Curr/Locales/Locales.xml b/Jamba-Curr/Locales/Locales.xml
index 28cbf06..424585b 100644
--- a/Jamba-Curr/Locales/Locales.xml
+++ b/Jamba-Curr/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaCurr-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-DisplayTeam/Jamba-DisplayTeam.toc b/Jamba-DisplayTeam/Jamba-DisplayTeam.toc
index 3d82797..13cd196 100644
--- a/Jamba-DisplayTeam/Jamba-DisplayTeam.toc
+++ b/Jamba-DisplayTeam/Jamba-DisplayTeam.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba-DisplayTeam
 ## Notes: Jamba-DisplayTeam
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-DisplayTeam/JambaDisplayTeam.lua b/Jamba-DisplayTeam/JambaDisplayTeam.lua
index b22026a..0cad4d8 100644
--- a/Jamba-DisplayTeam/JambaDisplayTeam.lua
+++ b/Jamba-DisplayTeam/JambaDisplayTeam.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -51,6 +51,7 @@ AJM.settings = {
 		barsAreStackedVertically = true,
 		teamListHorizontal = true,
 		showListTitle = false,
+		olnyShowInParty = false,
 		showCharacterPortrait = true,
 		characterPortraitWidth = 80,
 		showFollowStatus = true,
@@ -81,10 +82,6 @@ AJM.settings = {
 		comboStatusHeight = 10,
 		comboStatusShowValues = true,
 		comboStatusShowPercentage = true,
---		showBagInformation = true,
---		showBagFreeSlotsOnly = true,
---		bagInformationWidth = 80,
---		bagInformationHeight = 25,
 		showToolTipInfo = true,
 --		ShowEquippedOnly = false,
 		framePoint = "LEFT",
@@ -154,7 +151,6 @@ end

 AJM.COMMAND_FOLLOW_STATUS_UPDATE = "FlwStsUpd"
 AJM.COMMAND_EXPERIENCE_STATUS_UPDATE = "ExpStsUpd"
---AJM.COMMAND_BAGINFORMATION_UPDATE = "BagInfoUpd"
 AJM.COMMAND_TOONINFORMATION_UPDATE = "IlvlInfoUpd"
 AJM.COMMAND_REPUTATION_STATUS_UPDATE = "RepStsUpd"
 AJM.COMMAND_COMBO_STATUS_UPDATE = "CboStsUpd"
@@ -192,16 +188,11 @@ local function GetCharacterHeight()
 	local heightExperienceStatus = 0
 	local heightHealthStatus = 0
 	local heightPowerStatus = 0
-	local heightComboStatus = 0
---	local heightBagInformation = 0
+	local heightComboStatus = 0
 	local heightAllBars = 0
 	if AJM.db.showCharacterPortrait == true then
 		heightPortrait = AJM.db.characterPortraitWidth + AJM.db.teamListVerticalSpacing
 	end
---	if AJM.db.showBagInformation == true then
---		heightBagInformation = AJM.db.bagInformationHeight + AJM.db.teamListVerticalSpacing
---		heightAllBars = heightAllBars + heightBagInformation
---	end
 	if AJM.db.showFollowStatus == true then
 		heightFollowStatus = AJM.db.followStatusHeight + AJM.db.barVerticalSpacing
 		heightAllBars = heightAllBars + heightFollowStatus
@@ -244,10 +235,6 @@ local function GetCharacterWidth()
 	if AJM.db.showCharacterPortrait == true then
 		widthPortrait = AJM.db.characterPortraitWidth + AJM.db.teamListHorizontalSpacing
 	end
---	if AJM.db.showBagInformation == true then
---		widthBagInformation = AJM.db.bagInformationWidth + AJM.db.teamListHorizontalSpacing
---		widthAllBars = widthAllBars + widthBagInformation
---	end
 	if AJM.db.showFollowStatus == true then
 		widthFollowStatus = AJM.db.followStatusWidth + AJM.db.barHorizontalSpacing
 		widthAllBars = widthAllBars + widthFollowStatus
@@ -409,10 +396,18 @@ function AJM:RefreshTeamListControlsShow()
 	for index, characterName in JambaApi.TeamListOrdered() do
 		characterName = JambaUtilities:AddRealmToNameIfMissing ( characterName )
 		-- Is the team member online?
-		if JambaApi.GetCharacterOnlineStatus( characterName ) == true then
-		-- Yes, the team member is online, draw their status bars.
-			AJM:UpdateJambaTeamStatusBar( characterName, AJM.totalMembersDisplayed )
-			AJM.totalMembersDisplayed = AJM.totalMembersDisplayed + 1
+	if JambaApi.GetCharacterOnlineStatus( characterName ) == true then
+		-- Checks the player is the party to hide the bar if needed.
+			if AJM.db.olnyShowInParty == true then
+				if UnitClass(Ambiguate( characterName, "none" ) ) then
+				-- Yes, the team member is online, draw their status bars.
+					AJM:UpdateJambaTeamStatusBar( characterName, AJM.totalMembersDisplayed )
+					AJM.totalMembersDisplayed = AJM.totalMembersDisplayed + 1
+				end
+			else
+					AJM:UpdateJambaTeamStatusBar( characterName, AJM.totalMembersDisplayed )
+					AJM.totalMembersDisplayed = AJM.totalMembersDisplayed + 1
+			end
 		end
 	end
 	UpdateJambaTeamListDimensions()
@@ -504,24 +499,6 @@ function AJM:CreateJambaTeamStatusBar( characterName, parentFrame )
 	portraitButtonClick:SetAttribute( "unit", Ambiguate( characterName, "all" ) )
 	characterStatusBar["portraitButton"] = portraitButton
 	characterStatusBar["portraitButtonClick"] = portraitButtonClick
---[[
-	-- Set the bag information.
-	local bagInformationFrameName = AJM.globalFramePrefix.."BagInformationFrame"
-	local bagInformationFrame = CreateFrame( "Frame", bagInformationFrameName, parentFrame )
-	local bagInformationFrameText = bagInformationFrame:CreateFontString( bagInformationFrameName.."Text", "OVERLAY", "GameFontNormal" )
-	bagInformationFrameText:SetText( "999/999" )
-	bagInformationFrame:SetAlpha( 1 )
-	--bagInformationFrameText:SetPoint( "CENTER", bagInformationFrame, "CENTER", 0, 0 )
-	bagInformationFrameText:SetAllPoints()
-	bagInformationFrameText:SetJustifyH( "CENTER" )
-	bagInformationFrameText:SetJustifyV( "MIDDLE" )
-	bagInformationFrameText:SetTextColor( 1.00, 1.00, 1.00, 1.00 )
-	bagInformationFrame.slotsFree = 999
-	bagInformationFrame.totalSlots = 999
-	--bagInformationFrame.durability = 100
-	characterStatusBar["bagInformationFrame"] = bagInformationFrame
-	characterStatusBar["bagInformationFrameText"] = bagInformationFrameText
---]]
 	-- Set the follow bar.
 	local followName = AJM.globalFramePrefix.."FollowBar"
 	local followBar = CreateFrame( "StatusBar", followName, parentFrame, "TextStatusBar,SecureActionButtonTemplate" )
@@ -782,7 +759,7 @@ function AJM:ShowFollowTooltip( frame, followBar, characterName, canShow )
 				GameTooltip:AddLine(Ambiguate( characterName, "none" ), 1, 0.82, 0, 1)
 				end
 				--level of player if not max.
-				if followBar.CharacterLevel == followBar.MaxCharacterLevel then
+				if followBar.CharacterLevel ~= followBar.MaxCharacterLevel then
 					GameTooltip:AddLine(L["Player Level:"]..L[" "]..L["("]..tostring (format("%.0f", followBar.CharacterLevel ))..L[")"],1,1,1,1)
 				end
 					-- Item Level of player
@@ -802,6 +779,12 @@ function AJM:ShowFollowTooltip( frame, followBar, characterName, canShow )
 						GameTooltip:AddLine(L["Has New Mail From:"], 1, 0.82, 0, 1)
 						GameTooltip:AddLine( followBar.Mail,1,1,1,1)
 					end
+					if not (followBar.CurrText == "currNothing") then
+						GameTooltip:AddLine(" ",1,1,1,1)
+						GameTooltip:AddLine(L["Currency Info:"], 1, 0.82, 0, 1)
+						GameTooltip:AddLine( followBar.CurrText,1,1,1,1)
+					end
+
 					GameTooltip:Show()
 				else
 					GameTooltip:Hide()
@@ -828,7 +811,6 @@ function AJM:HideJambaTeamStatusBar( characterName )
 	-- Hide the bars.
 	characterStatusBar["portraitButton"]:Hide()
 	characterStatusBar["portraitButtonClick"]:Hide()
---	characterStatusBar["bagInformationFrame"]:Hide()
 	characterStatusBar["followBar"]:Hide()
 	characterStatusBar["followBarClick"]:Hide()
 	characterStatusBar["experienceBar"]:Hide()
@@ -1264,16 +1246,26 @@ local function SettingsCreateDisplayOptions( top )
 	-- Create appearance & layout.
 	JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Appearance & Layout"], movingTop, true )
 	movingTop = movingTop - headingHeight
-		AJM.settingsControl.displayOptionsCheckBoxShowListTitle = JambaHelperSettings:CreateCheckBox(
+	AJM.settingsControl.displayOptionsCheckBoxShowListTitle = JambaHelperSettings:CreateCheckBox(
 		AJM.settingsControl,
-		halfWidthSlider,
+		thirdWidth,
 		left,
 		movingTop,
 		L["Show Title"],
 		AJM.SettingsToggleShowTeamListTitle,
 		L["Show Team List Title"]
 	)
+	AJM.settingsControl.displayOptionsCheckBoxOlnyShowInParty = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		thirdWidth,
+		left2,
+		movingTop,
+		L["Olny Show in Party"],
+		AJM.SettingsToggleOlnyShowinParty,
+		L["Olny Show Display-Team\nIn Party or Raid"]
+	)
 	movingTop = movingTop - checkBoxHeight - verticalSpacing
+
 	AJM.settingsControl.displayOptionsCharactersPerBar = JambaHelperSettings:CreateSlider(
 		AJM.settingsControl,
 		halfWidthSlider,
@@ -1715,47 +1707,6 @@ local function SettingsCreateDisplayOptions( top )
 	AJM.settingsControl.displayOptionsComboStatusHeightSlider:SetSliderValues( 10, 100, 1 )
 	AJM.settingsControl.displayOptionsComboStatusHeightSlider:SetCallback( "OnValueChanged", AJM.SettingsChangeComboStatusHeight )
 	movingTop = movingTop - sliderHeight - sectionSpacing
---[[
-	-- Create bag information status.
-	JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Bag Information"], movingTop, true )
-	movingTop = movingTop - headingHeight
-	AJM.settingsControl.displayOptionsCheckBoxShowBagInformation = JambaHelperSettings:CreateCheckBox(
-		AJM.settingsControl,
-		thirdWidth,
-		left,
-		movingTop,
-		L["Show"],
-		AJM.SettingsToggleShowBagInformation
-	)
-	AJM.settingsControl.displayOptionsCheckBoxShowFreeBagSlotsOnly = JambaHelperSettings:CreateCheckBox(
-		AJM.settingsControl,
-		thirdWidth + thirdWidth,
-		left2,
-		movingTop,
-		L["Only Show Free Bag Slots"],
-		AJM.SettingsToggleShowFreeBagSlotsOnly
-	)
-	movingTop = movingTop - checkBoxHeight - verticalSpacing
-	AJM.settingsControl.displayOptionsBagInformationWidthSlider = JambaHelperSettings:CreateSlider(
-		AJM.settingsControl,
-		halfWidthSlider,
-		left,
-		movingTop,
-		L["Width"]
-	)
-	AJM.settingsControl.displayOptionsBagInformationWidthSlider:SetSliderValues( 15, 300, 1 )
-	AJM.settingsControl.displayOptionsBagInformationWidthSlider:SetCallback( "OnValueChanged", AJM.SettingsChangeBagInformationWidth )
-	AJM.settingsControl.displayOptionsBagInformationHeightSlider = JambaHelperSettings:CreateSlider(
-		AJM.settingsControl,
-		halfWidthSlider,
-		column2left,
-		movingTop,
-		L["Height"]
-	)
-	AJM.settingsControl.displayOptionsBagInformationHeightSlider:SetSliderValues( 15, 100, 1 )
-	AJM.settingsControl.displayOptionsBagInformationHeightSlider:SetCallback( "OnValueChanged", AJM.SettingsChangeBagInformationHeight )
-	movingTop = movingTop - sliderHeight - verticalSpacing
---]]
 	return movingTop
 end

@@ -1796,6 +1747,7 @@ function AJM:SettingsRefresh()
 --	AJM.settingsControl.displayOptionsCheckBoxStackVertically:SetValue( AJM.db.barsAreStackedVertically )
 --	AJM.settingsControl.displayOptionsCheckBoxTeamHorizontal:SetValue( AJM.db.teamListHorizontal )
 	AJM.settingsControl.displayOptionsCheckBoxShowListTitle:SetValue( AJM.db.showListTitle )
+	AJM.settingsControl.displayOptionsCheckBoxOlnyShowInParty:SetValue( AJM.db.olnyShowInParty )
 	AJM.settingsControl.displayOptionsTeamListTransparencySlider:SetValue( AJM.db.frameAlpha )
 	AJM.settingsControl.displayOptionsTeamListScaleSlider:SetValue( AJM.db.teamListScale )
 	AJM.settingsControl.displayOptionsTeamListMediaStatus:SetValue( AJM.db.statusBarTexture )
@@ -1838,10 +1790,6 @@ function AJM:SettingsRefresh()
 	AJM.settingsControl.displayOptionsComboStatusHeightSlider:SetValue( AJM.db.comboStatusHeight )
 	AJM.settingsControl.displayOptionsBackgroundColourPicker:SetColor( AJM.db.frameBackgroundColourR, AJM.db.frameBackgroundColourG, AJM.db.frameBackgroundColourB, AJM.db.frameBackgroundColourA )
 	AJM.settingsControl.displayOptionsBorderColourPicker:SetColor( AJM.db.frameBorderColourR, AJM.db.frameBorderColourG, AJM.db.frameBorderColourB, AJM.db.frameBorderColourA )
---	AJM.settingsControl.displayOptionsCheckBoxShowBagInformation:SetValue( AJM.db.showBagInformation )
---	AJM.settingsControl.displayOptionsCheckBoxShowFreeBagSlotsOnly:SetValue( AJM.db.showBagFreeSlotsOnly )
---	AJM.settingsControl.displayOptionsBagInformationWidthSlider:SetValue( AJM.db.bagInformationWidth )
---	AJM.settingsControl.displayOptionsBagInformationHeightSlider:SetValue( AJM.db.bagInformationHeight )
 --	AJM.settingsControl.displayOptionsCheckBoxShowEquippedOnly:SetValue( AJM.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",
@@ -1854,6 +1802,7 @@ function AJM:SettingsRefresh()
 		--AJM.settingsControl.displayOptionsCheckBoxStackVertically:SetDisabled( not AJM.db.showTeamList )
 		--AJM.settingsControl.displayOptionsCheckBoxTeamHorizontal:SetDisabled( not AJM.db.showTeamList )
 		AJM.settingsControl.displayOptionsCheckBoxShowListTitle:SetDisabled( not AJM.db.showTeamList )
+		AJM.settingsControl.displayOptionsCheckBoxOlnyShowInParty:SetDisabled( not AJM.db.showTeamList )
 		AJM.settingsControl.displayOptionsTeamListScaleSlider:SetDisabled( not AJM.db.showTeamList )
 		AJM.settingsControl.displayOptionsTeamListTransparencySlider:SetDisabled( not AJM.db.showTeamList )
 		AJM.settingsControl.displayOptionsTeamListMediaStatus:SetDisabled( not AJM.db.showTeamList )
@@ -1896,10 +1845,6 @@ function AJM:SettingsRefresh()
 		AJM.settingsControl.displayOptionsComboStatusHeightSlider:SetDisabled( not AJM.db.showTeamList or not AJM.db.showComboStatus)
 		AJM.settingsControl.displayOptionsBackgroundColourPicker:SetDisabled( not AJM.db.showTeamList )
 		AJM.settingsControl.displayOptionsBorderColourPicker:SetDisabled( not AJM.db.showTeamList )
---		AJM.settingsControl.displayOptionsCheckBoxShowBagInformation:SetDisabled( not AJM.db.showTeamList )
---		AJM.settingsControl.displayOptionsCheckBoxShowFreeBagSlotsOnly:SetDisabled( not AJM.db.showTeamList or not AJM.db.ShowBagInformationn)
---		AJM.settingsControl.displayOptionsBagInformationWidthSlider:SetDisabled( not AJM.db.showTeamList or not AJM.db.ShowBagInformation)
---		AJM.settingsControl.displayOptionsBagInformationHeightSlider:SetDisabled( not AJM.db.showTeamList or not AJM.db.ShowBagInformation)
 		AJM.settingsControl.displayOptionsCheckBoxShowToolTipInfo:SetDisabled( not AJM.db.showTeamList or not AJM.db.showFollowStatus )
 --		AJM.settingsControl.displayOptionsCheckBoxShowEquippedOnly:SetDisabled( not AJM.db.showTeamList or not AJM.db.showFollowStatus )
 		if AJM.teamListCreated == true then
@@ -1914,8 +1859,6 @@ function AJM:SettingsRefresh()
 			AJM:SettingsUpdateHealthAll()
 			AJM:SettingsUpdatePowerAll()
 			AJM:SettingsUpdateComboAll()
-			--AJM:SettingsUpdateBagInformationAll()
-			--AJM:SettingsUpdateIlvlInformationAll()
 		end
 	else
 		AJM.updateSettingsAfterCombat = true
@@ -1934,12 +1877,13 @@ function AJM:JambaOnSettingsReceived( characterName, settings )
 		--AJM.db.barsAreStackedVertically = settings.barsAreStackedVertically
 		--AJM.db.teamListHorizontal = settings.teamListHorizontal
 		AJM.db.showListTitle = settings.showListTitle
+		AJM.db.olnyShowInParty = settings.olnyShowInParty
 		AJM.db.teamListScale = settings.teamListScale
 		AJM.db.statusBarTexture = settings.statusBarTexture
 		AJM.db.borderStyle = settings.borderStyle
 		AJM.db.backgroundStyle = settings.backgroundStyle
 		AJM.db.fontStyle = settings.fontStyle
-
+		AJM.db.fontSize = settings.fontSize
 		AJM.db.showCharacterPortrait = settings.showCharacterPortrait
 		AJM.db.characterPortraitWidth = settings.characterPortraitWidth
 		AJM.db.showFollowStatus = settings.showFollowStatus
@@ -1947,7 +1891,6 @@ function AJM:JambaOnSettingsReceived( characterName, settings )
 		AJM.db.followStatusHeight = settings.followStatusHeight
 		AJM.db.followStatusShowName = settings.followStatusShowName
 		AJM.db.showToolTipInfo = settings.showToolTipInfo
---		AJM.db.followStatusShowLevel = settings.followStatusShowLevel
 		AJM.db.showExperienceStatus = settings.showExperienceStatus
 		AJM.db.showXpStatus = settings.showXpStatus
 		AJM.db.showArtifactStatus = settings.showArtifactStatus
@@ -1972,12 +1915,6 @@ function AJM:JambaOnSettingsReceived( characterName, settings )
 		AJM.db.comboStatusHeight = settings.comboStatusHeight
 		AJM.db.comboStatusShowValues = settings.comboStatusShowValues
 		AJM.db.comboStatusShowPercentage = settings.comboStatusShowPercentage
---		AJM.db.showBagInformation = settings.showBagInformation
---		AJM.db.showBagFreeSlotsOnly = settings.showBagFreeSlotsOnly
---		AJM.db.bagInformationWidth = settings.bagInformationWidth
---		AJM.db.bagInformationHeight = settings.bagInformationHeight
-		--EBS
-
 --		AJM.db.ShowEquippedOnly = settings.ShowEquippedOnly
 		AJM.db.frameAlpha = settings.frameAlpha
 		AJM.db.framePoint = settings.framePoint
@@ -2051,6 +1988,11 @@ function AJM:SettingsToggleShowTeamListTitle( event, checked )
 	AJM:SettingsRefresh()
 end

+function AJM:SettingsToggleOlnyShowinParty( event, checked )
+	AJM.db.olnyShowInParty = checked
+	AJM:SettingsRefresh()
+end
+
 function AJM:SettingsChangeScale( event, value )
 	AJM.db.teamListScale = tonumber( value )
 	AJM:SettingsRefresh()
@@ -2267,29 +2209,6 @@ function AJM:SettingsBorderColourPickerChanged( event, r, g, b, a )
 end

 --[[
-function AJM:SettingsToggleShowBagInformation( event, checked )
-	AJM.db.showBagInformation = checked
-	AJM:SettingsRefresh()
-end
-
-function AJM:SettingsToggleShowFreeBagSlotsOnly( event, checked )
-	AJM.db.showBagFreeSlotsOnly = checked
-	AJM:SettingsRefresh()
-end
-
-function AJM:SettingsChangeBagInformationWidth( event, value )
-	AJM.db.bagInformationWidth = tonumber( value )
-	AJM:SettingsRefresh()
-end
-
-function AJM:SettingsChangeBagInformationHeight( event, value )
-	AJM.db.bagInformationHeight = tonumber( value )
-	AJM:SettingsRefresh()
-end
---]]
---ilvl
-
---[[
 function AJM:SettingsToggleShowEquippedOnly( event, checked )
 	AJM.db.ShowEquippedOnly = checked
 	AJM:SettingsRefresh()
@@ -2312,9 +2231,6 @@ function AJM:JambaOnCommandReceived( characterName, commandName, ... )
 	if commandName == AJM.COMMAND_REPUTATION_STATUS_UPDATE then
 		AJM:ProcessUpdateReputationStatusMessage( characterName, ... )
 	end
---	if commandName == AJM.COMMAND_BAGINFORMATION_UPDATE then
---		AJM:ProcessUpdateBagInformationMessage( characterName, ... )
---	end
 	if commandName == AJM.COMMAND_TOONINFORMATION_UPDATE then
 		AJM:ProcessUpdateToonInformationMessage ( characterName, ... )
 	end
@@ -2353,113 +2269,8 @@ function AJM:RangeUpdateCommand()
 	end
 end

---[[
--------------------------------------------------------------------------------------------------------------
--- Bag Information Updates.
--------------------------------------------------------------------------------------------------------------
-
-function AJM:ITEM_PUSH( event, ... )
-	AJM:SendBagInformationUpdateCommand()
-end
-
-function AJM:SendBagInformationUpdateCommand()
-	if AJM.db.showTeamList == true and AJM.db.showBagInformation == true then
-		if UnitIsGhost( "player" ) then
-			return
-		end
-		if UnitIsDead( "player" ) then
-			return
-		end
-		local slotsFree, totalSlots = LibBagUtils:CountSlots( "BAGS", 0 )
-		local curTotal, maxTotal, broken = 0, 0, 0
-
-		--for i = 1, 18 do
-		--	local curItemDurability, maxItemDurability = GetInventoryItemDurability(i)
-		--	if curItemDurability and maxItemDurability then
-		--	curTotal = curTotal + curItemDurability
-		--	maxTotal = maxTotal + maxItemDurability
-		--		if maxItemDurability > 0 and curItemDurability == 0 then
-		--			broken = broken + 1
-		--		end
-		--	end
-		--local percent = curTotal / maxTotal * 100
-		--return percent, broken
-		--end
-		--AJM:Print("Durability", percent, broken)
-		--if AJM.previousSlotsFree ~= slotsFree or AJM.previousTotalSlots ~= totalSlots then
-		if AJM.db.showTeamListOnMasterOnly == true then
-			AJM:JambaSendCommandToMaster( AJM.COMMAND_BAGINFORMATION_UPDATE, slotsFree, totalSlots )
-		else
-			AJM:JambaSendCommandToTeam( AJM.COMMAND_BAGINFORMATION_UPDATE, slotsFree, totalSlots )
-		end
-	end
-end
-
-function AJM:ProcessUpdateBagInformationMessage( characterName, slotsFree, totalSlots, range )
-	AJM:UpdateBagInformation( characterName, slotsFree, totalSlots, range )
-end
-
-function AJM:SettingsUpdateBagInformationAll()
-	for characterName, characterStatusBar in pairs( AJM.characterStatusBar ) do
-		AJM:UpdateBagInformation( characterName, nil, nil, nil, nil )
-	end
-end
-
-function AJM:UpdateBagInformation( characterName, slotsFree, totalSlots, range ) --percent, range )
---	AJM:Print("Data", characterName, slotsFree, totalSlots, percent )
-	if CanDisplayTeamList() == false then
-		return
-	end
-	if AJM.db.showBagInformation == false then
-		return
-	end
-	characterName = JambaUtilities:AddRealmToNameIfMissing( characterName )
-	local characterStatusBar = AJM.characterStatusBar[characterName]
-	if characterStatusBar == nil then
-		return
-	end
-	local bagInformationFrame = characterStatusBar["bagInformationFrame"]
-	local bagInformationFrameText = characterStatusBar["bagInformationFrameText"]
-	if slotsFree == nil then
-		slotsFree = bagInformationFrame.slotsFree
-	end
-	if totalSlots == nil then
-		totalSlots = bagInformationFrame.totalSlots
-	end
---	if percent == nil or percent == false then
---		percent = bagInformationFrame.durability
---	end
-	bagInformationFrame.slotsFree = slotsFree
-	bagInformationFrame.totalSlots = totalSlots
---	bagInformationFrame.durability = percent
-	if 	UnitInParty(Ambiguate( characterName, "none" ) ) == true then
-		if range == false then
-			bagInformationFrame:SetAlpha( 0.5 )
-		else
-			bagInformationFrame:SetAlpha( 1 )
-		end
-	else
-		bagInformationFrame:SetAlpha( 1 )
-	end
-
-	--AJM:Print("test", percent)
-	--local durability = gsub(percent, "%.[^|]+", "")
-	--AJM:Print("hello", durability)
-	--text = text..L["Dura"]..L[" "]..tostring(gsub(percent, "%.[^|]+", "") )..L["%"]
-	local text = ""
-	if AJM.db.showBagFreeSlotsOnly == true then
-		--text = text..("\n")..L["BgS"]..L[" "]..tostring(slotsFree)
-		text = tostring(slotsFree)
-	else
-		--text = text..("\n")..L["BgS"]..L[" "]..tostring((totalSlots - slotsFree)).."/"..tostring(totalSlots)
-		text = tostring((totalSlots - slotsFree)).."/"..tostring(totalSlots)
-	end
-	bagInformationFrameText:SetText( text )
-	--AJM:Print("freespace", slotsFree, totalSlots) --Debug
-end
---]]
 -------------------------------------------------------------------------------------------------------------
--- Ilvl Information Updates.
+-- ToolTip Information Updates.
 -------------------------------------------------------------------------------------------------------------

 function AJM:JambaRequestUpdate()
@@ -2596,7 +2407,6 @@ function AJM:SettingsUpdateToonInfomation( characterName, characterLevel, charac
 	followBar.TotalBagSpace = totalSlots
 	followBar.Mail = mailText
 	followBar.CurrText = currText
-
 end

 -------------------------------------------------------------------------------------------------------------
@@ -3081,35 +2891,41 @@ end
 -------------------------------------------------------------------------------------------------------------

 function AJM:UNIT_HEALTH( event, unit, ... )
-	AJM:SendHealthStatusUpdateCommand( unit, nil )
-	--AJM:Print("test2", unit)
+	AJM:SendHealthStatusUpdateCommand( unit )
+	--AJM:Print("test2", unit)
 end

 function AJM:UNIT_MAXHEALTH( event, unit, ... )
-	AJM:SendHealthStatusUpdateCommand( unit, nil )
+	--AJM:Print("sendtest2", unit )
+	AJM:SendHealthStatusUpdateCommand( unit )
 end


-function AJM:SendHealthStatusUpdateCommand( unit )
+function AJM:SendHealthStatusUpdateCommand(unit)
+	if unit == nil then
+		return
+	end
 	if AJM.db.showTeamList == true and AJM.db.showHealthStatus == true then
 		local playerHealth = UnitHealth( unit )
 		local playerMaxHealth = UnitHealthMax( unit )
-		local isDead = UnitIsDeadOrGhost( unit )
 		local characterName, characterRealm = UnitName( unit )
 		local character = JambaUtilities:AddRealmToNameIfNotNil( characterName, characterRealm )
-		--AJM:Print("HeathStats", character, playerHealth, playerMaxHealth, range)
-		AJM:UpdateHealthStatus( character, playerHealth, playerMaxHealth, isDead )
+		--AJM:Print("HeathStats", character, playerHealth, playerMaxHealth)
+		AJM:UpdateHealthStatus( character, playerHealth, playerMaxHealth)
 	end
 end

 function AJM:SettingsUpdateHealthAll()
 	for characterName, characterStatusBar in pairs( AJM.characterStatusBar ) do
-		AJM:UpdateHealthStatus( characterName, nil, nil, nil, nil )
+		AJM:UpdateHealthStatus( characterName, nil, nil )
 	end
 end

-function AJM:UpdateHealthStatus( characterName, playerHealth, playerMaxHealth, isDead )
-	--AJM:Print("testUpdate", characterName, playerHealth, playerMaxHealth, isDead)
+function AJM:UpdateHealthStatus( characterName, playerHealth, playerMaxHealth )
+	--AJM:Print("testUpdate", characterName, playerHealth, playerMaxHealth)
+		if characterName == nil then
+		return
+	end
 	if CanDisplayTeamList() == false then
 		return
 	end
@@ -3207,12 +3023,15 @@ end

 function AJM:SettingsUpdatePowerAll()
 	for characterName, characterStatusBar in pairs( AJM.characterStatusBar ) do
-		AJM:UpdatePowerStatus( characterName, nil, nil, nil )
+		AJM:UpdatePowerStatus( characterName, nil, nil )
 	end
 end

 function AJM:UpdatePowerStatus( characterName, playerPower, playerMaxPower)
 	--AJM:Print("testPOwer", characterName, playerPower, playerMaxPower )
+	if characterName == nil then
+		return
+	end
 	if CanDisplayTeamList() == false then
 		return
 	end
@@ -3309,10 +3128,6 @@ function AJM:RUNE_POWER_UPDATE( event, ...)
 	AJM:SendComboStatusUpdateCommand()
 end

-function AJM:PLAYER_TALENT_UPDATE(event, ...)
-	AJM:SendComboStatusUpdateCommand()
-end
-
 function AJM:SendComboStatusUpdateCommand()
 	--AJM:Print("test")
 	if AJM.db.showTeamList == true and AJM.db.showComboStatus == true then
@@ -3508,6 +3323,7 @@ function AJM:OnEnable()
 	AJM:RegisterEvent( "HONOR_XP_UPDATE" )
 	AJM:RegisterEvent( "HONOR_LEVEL_UPDATE" )
 	AJM:RegisterEvent( "HONOR_PRESTIGE_UPDATE" )
+	AJM:RegisterEvent( "GROUP_ROSTER_UPDATE" )
 	AJM.SharedMedia.RegisterCallback( AJM, "LibSharedMedia_Registered" )
     AJM.SharedMedia.RegisterCallback( AJM, "LibSharedMedia_SetGlobal" )
 	AJM:RegisterMessage( JambaApi.MESSAGE_TEAM_CHARACTER_ADDED, "OnCharactersChanged" )
@@ -3516,6 +3332,7 @@ function AJM:OnEnable()
 	AJM:RegisterMessage( JambaApi.MESSAGE_TEAM_MASTER_CHANGED, "OnMasterChanged" )
 	AJM:RegisterMessage( JambaApi.MESSAGE_CHARACTER_ONLINE, "OnCharactersChanged")
 	AJM:RegisterMessage( JambaApi.MESSAGE_CHARACTER_OFFLINE, "OnCharactersChanged")
+
 	AJM:SecureHook( "SetWatchedFactionIndex" )
 	AJM:ScheduleTimer( "RefreshTeamListControls", 3 )
 	AJM:ScheduleTimer( "SendExperienceStatusUpdateCommand", 5 )
@@ -3541,23 +3358,25 @@ function AJM:UpdateAll(event, ...)
 	AJM:ScheduleTimer( "SendReputationStatusUpdateCommand", 2 )
 	AJM:ScheduleTimer( "SendInfomationUpdateCommand", 2 )
 	AJM:ScheduleTimer( "SendComboStatusUpdateCommand", 2 )
-	for index, characterName in JambaApi.TeamListOrderedOnline() do
-		unit = Ambiguate( characterName, "none" )
-		AJM:ScheduleTimer( "SendHealthStatusUpdateCommand", 2, unit )
-		AJM:ScheduleTimer( "SendPowerStatusUpdateCommand", 2, unit )
-	end
 end


 function AJM:OnMasterChanged( message, characterName )
 	AJM:SettingsRefresh()
 end
---[[
-function AJM:UNIT_LEVEL( event, ... )
-	--AJM:SettingsUpdateFollowTextAll()
-	AJM:SendIlvlInformationUpdateCommand()
-end]]

+function AJM:GROUP_ROSTER_UPDATE()
+	AJM:ScheduleTimer( "RefreshTeamListControls", 1 )
+	AJM:ScheduleTimer( "SendExperienceStatusUpdateCommand", 1 )
+	AJM:ScheduleTimer( "SendReputationStatusUpdateCommand", 1 )
+	AJM:ScheduleTimer( "SendInfomationUpdateCommand", 1 )
+	AJM:ScheduleTimer( "SendComboStatusUpdateCommand", 1 )
+	for index, characterName in JambaApi.TeamListOrderedOnline() do
+		unit = Ambiguate( characterName, "none" )
+		AJM:ScheduleTimer( "SendHealthStatusUpdateCommand", 2, unit )
+		AJM:ScheduleTimer( "SendPowerStatusUpdateCommand", 2, unit )
+	end
+end

 function AJM:PLAYER_REGEN_ENABLED( event, ... )
 	if AJM.db.hideTeamListInCombat == true then
@@ -3583,9 +3402,13 @@ function AJM:PLAYER_REGEN_DISABLED( event, ... )
 	end
 end

+function AJM:PLAYER_TALENT_UPDATE(event, ...)
+	AJM:SendComboStatusUpdateCommand()
+	AJM:ScheduleTimer( "SendExperienceStatusUpdateCommand", 1 )
+end
+
 function AJM:OnCharactersChanged()
 	AJM:RefreshTeamListControls()
-	--AJM:SendIlvlInformationUpdateCommand()
 end


diff --git a/Jamba-DisplayTeam/Locales/JambaDisplayTeam-Locale-enUS.lua b/Jamba-DisplayTeam/Locales/JambaDisplayTeam-Locale-enUS.lua
index 8b74b88..167ba85 100644
--- a/Jamba-DisplayTeam/Locales/JambaDisplayTeam-Locale-enUS.lua
+++ b/Jamba-DisplayTeam/Locales/JambaDisplayTeam-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -77,10 +77,13 @@ L["Bag Space:"] = true
 L["Durability:"] = true
 L["Gold:"] = true
 L["Has New Mail From:"] = true
-L["Currency:"] = true
+L["Currency Info:"] = true
 L["Unknown Sender"] = true
 L["Show ToolTip"] = true
 L["Characters Per Bar"] = true
+L["Olny Show in Party"] = true
+L["Olny Show Display-Team\nIn Party or Raid"] = true
+
 --Help System

 L["Show Team List"] = true
diff --git a/Jamba-DisplayTeam/Locales/Locales.xml b/Jamba-DisplayTeam/Locales/Locales.xml
index 0ef4e87..3ac59fd 100644
--- a/Jamba-DisplayTeam/Locales/Locales.xml
+++ b/Jamba-DisplayTeam/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaDisplayTeam-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-FTL/Jamba-FTL.toc b/Jamba-FTL/Jamba-FTL.toc
index ad60a68..af34be5 100644
--- a/Jamba-FTL/Jamba-FTL.toc
+++ b/Jamba-FTL/Jamba-FTL.toc
@@ -1,12 +1,12 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaFTL
 ## Notes: JambaFTL
 ## Author: olipcs (although most of the code is originaly from Jafula) (any changes added to support 4.0.5 from ebony!)
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
 ## SavedVariables: JambaFTLProfileDB
 ## LoadOnDemand: 1
 Locales\Locales.xml
-JambaFTL.lua
\ No newline at end of file
+JambaFTL.lua
diff --git a/Jamba-FTL/JambaFTL.lua b/Jamba-FTL/JambaFTL.lua
index dd101d9..beee8ff 100644
--- a/Jamba-FTL/JambaFTL.lua
+++ b/Jamba-FTL/JambaFTL.lua
@@ -701,4 +701,4 @@ end
 -- Called when the addon is disabled.
 function AJM:OnDisable()
 end
-
\ No newline at end of file
+
diff --git a/Jamba-FTL/Locales/Locales.xml b/Jamba-FTL/Locales/Locales.xml
index a0d3c9f..e6c26a5 100644
--- a/Jamba-FTL/Locales/Locales.xml
+++ b/Jamba-FTL/Locales/Locales.xml
@@ -9,4 +9,4 @@ Credits: Many thanks goes to Jafula for the awsome JAMBA addon
 -->
 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaFTL-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Follow/Jamba-Follow.toc b/Jamba-Follow/Jamba-Follow.toc
index a841306..8b3d01a 100644
--- a/Jamba-Follow/Jamba-Follow.toc
+++ b/Jamba-Follow/Jamba-Follow.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaFollow
 ## Notes: JambaFollow
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Follow/JambaFollow.lua b/Jamba-Follow/JambaFollow.lua
index a9d2f32..aeeecf5 100644
--- a/Jamba-Follow/JambaFollow.lua
+++ b/Jamba-Follow/JambaFollow.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -794,6 +794,10 @@ function AJM:AutoFollowEndSend()
 	if AJM.db.doNotWarnFollowBreakInCombat == true and AJM.outOfCombat == false then
 		canWarn = false
 	end
+	--Do not warn if a passenger in a vehicle.
+	if UnitInVehicle("Player") == true and UnitControllingVehicle("player") == false then
+		canWarn = false
+	end
 	-- Do not warn if any other members in combat?
 	if AJM.db.doNotWarnFollowBreakMembersInCombat == true and AJM:AreTeamMembersInCombat() == true then
 		canWarn = false
diff --git a/Jamba-Follow/Locales/JambaFollow-Locale-enUS.lua b/Jamba-Follow/Locales/JambaFollow-Locale-enUS.lua
index 330b19f..c71ef63 100644
--- a/Jamba-Follow/Locales/JambaFollow-Locale-enUS.lua
+++ b/Jamba-Follow/Locales/JambaFollow-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Follow/Locales/Locales.xml b/Jamba-Follow/Locales/Locales.xml
index 9d5d038..5624384 100644
--- a/Jamba-Follow/Locales/Locales.xml
+++ b/Jamba-Follow/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaFollow-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-ItemUse/Jamba-ItemUse.toc b/Jamba-ItemUse/Jamba-ItemUse.toc
index 223895b..69ad7c1 100644
--- a/Jamba-ItemUse/Jamba-ItemUse.toc
+++ b/Jamba-ItemUse/Jamba-ItemUse.toc
@@ -1,13 +1,17 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaItemUse
 ## Notes: JambaItemUse
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
 ## SavedVariables: JambaItemUseProfileDB
 ## LoadOnDemand: 1
+## X-Curse-Packaged-Version: Release-7.1.0-5.1.3
+## X-Curse-Project-Name: Jamba
+## X-Curse-Project-ID: jamba
+## X-Curse-Repository-ID: wow/jamba/mainline
 Locales\Locales.xml
 JambaItemUse.lua

diff --git a/Jamba-ItemUse/JambaItemUse.lua b/Jamba-ItemUse/JambaItemUse.lua
index 7c09b62..2064f70 100644
--- a/Jamba-ItemUse/JambaItemUse.lua
+++ b/Jamba-ItemUse/JambaItemUse.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -16,9 +16,11 @@ local AJM = LibStub( "AceAddon-3.0" ):NewAddon(
 -- Get the Jamba Utilities Library.
 local JambaUtilities = LibStub:GetLibrary( "JambaUtilities-1.0" )
 local JambaHelperSettings = LibStub:GetLibrary( "JambaHelperSettings-1.0" )
-local LibBagUtils = LibStub:GetLibrary( "LibBagUtils-1.0" )
-local LibGratuity = LibStub( "LibGratuity-3.0" )
+--local LibBagUtils = LibStub:GetLibrary( "LibBagUtils-1.0" )
+--local LibGratuity = LibStub( "LibGratuity-3.0" )
 local LibActionButton = LibStub( "LibActionButtonJamba-1.0" )
+local tooltipName = "AJMScanner"
+local tooltipScanner = CreateFrame("GameTooltip", tooltipName, nil, "GameTooltipTemplate")
 AJM.SharedMedia = LibStub( "LibSharedMedia-3.0" )

 --  Constants and Locale for this module.
@@ -61,10 +63,13 @@ AJM.settings = {
 		borderStyle = L["Blizzard Tooltip"],
 		backgroundStyle = L["Blizzard Dialog Background"],
 		itemUseScale = 1,
-		itemUseTitleHeight = 2,
+		itemUseTitleHeight = 3,
 		itemUseVerticalSpacing = 3,
 		itemUseHorizontalSpacing = 2,
 		autoAddQuestItemsToBar = true,
+		autoAddArtifactItemsToBar = true,
+		autoAddSatchelsItemsToBar = true,
+		hideClearButton = false,
 		itemBarsSynchronized = true,
 		numberOfItems = 10,
 		numberOfRows = 2,
@@ -205,7 +210,17 @@ local function CreateJambaItemUseFrame()
 			AJM.db.frameXOffset = xOffset
 			AJM.db.frameYOffset = yOffset
 		end	)
-	frame:ClearAllPoints()
+	-- Artifact Remove Buttion
+		local updateButton = CreateFrame( "Button", "ButtonUpdate", frame, "UIPanelButtonTemplate" )
+		updateButton:SetScript( "OnClick", function() AJM:ClearButton() end )
+		updateButton:SetPoint( "TOPRIGHT", frame, "TOPRIGHT", -4, -3 )
+		updateButton:SetHeight( 20 )
+		updateButton:SetWidth( 70 )
+		updateButton:SetText( L["Clear"] )
+		updateButton:SetScript("OnEnter", function(self) AJM:ShowTooltip(updateButton, true) end)
+		updateButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end)
+		ArtifactUpdateButton = updateButton
+		frame:ClearAllPoints()
 	frame:SetPoint( AJM.db.framePoint, UIParent, AJM.db.frameRelativePoint, AJM.db.frameXOffset, AJM.db.frameYOffset )
 	frame:SetBackdrop( {
 		bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
@@ -217,10 +232,40 @@ local function CreateJambaItemUseFrame()
 	frame:SetAlpha(AJM.db.frameAlpha)
 	-- Set the global frame reference for this frame.
 	JambaItemUseFrame = frame
+	-- Remove unsued items --test
 	AJM:SettingsUpdateBorderStyle()
 	AJM.itemUseCreated = true
+	AJM.UpdateHeight()
 end

+function AJM:ShowTooltip(frame, show)
+	if show then
+		GameTooltip:SetOwner(frame, "ANCHOR_TOP")
+		GameTooltip:SetPoint("TOPLEFT", frame, "TOPRIGHT", 16, 0)
+		GameTooltip:ClearLines()
+		GameTooltip:AddLine(L["Clears items no longer in your bags "], 1, 0.82, 0, 1)
+		GameTooltip:Show()
+	else
+	GameTooltip:Hide()
+	end
+end
+
+
+function AJM:UpdateHeight()
+	if AJM.db.hideClearButton == false then
+		AJM.db.itemUseTitleHeight = 2
+		local newHeight = AJM.db.itemUseTitleHeight + 20
+		ArtifactUpdateButton:Show()
+		return newHeight
+	else
+		AJM.db.itemUseTitleHeight = 2
+		oldHeight = AJM.db.itemUseTitleHeight
+		ArtifactUpdateButton:Hide()
+		return oldHeight
+	end
+end
+
+
 function AJM:ShowItemUseCommand()
 	AJM.db.showItemUse = true
 	AJM:SetItemUseVisibility()
@@ -279,12 +324,15 @@ function AJM:UpdateQuestItemsInBar()
 		local action = itemInfo.action
 		if kind == "item" then
 			local itemLink,_,_,_,_,questItem = GetItemInfo( action )
+			--AJM:Print("Checking Item...", itemLink, action)
 			if questItem == "Quest" then
-				--AJM:Print("Checking Item...", itemLink, action)
-				if AJM:IsInInventory( itemLink ) == false then
-				--AJM:Print("NOT IN BAGS", itemLink)
-					AJM.db.itemsAdvanced[iterateItems] = nil
-				end
+				if JambaApi.IsCharacterTheMaster( AJM.characterName ) == true then
+					if AJM:IsInInventory( itemLink ) == false then
+					--AJM:Print("NOT IN BAGS", itemLink)
+						AJM.db.itemsAdvanced[iterateItems] = nil
+						AJM:JambaSendSettings()
+					end
+				end
 			end
 		end
 	end
@@ -385,16 +433,19 @@ end

 --ebony test Using the wowapi and not the scanning of tooltips
 function AJM:CheckForQuestItemAndAddToBar()
+	--[[
 	for bag = 0,4,1 do
-	for slot = 1,GetContainerNumSlots(bag),1 do
-		local IsQuestItem,StartsQuest,_ = GetContainerItemQuestInfo(bag,slot)
-		local _,_,_,_,readable,_,itemLink = GetContainerItemInfo(bag,slot) -- readable???
-		if not IsQuestItem and StartsQuest then
-			local itemString = GetItemInfo(itemLink)
-				AJM:AddAnItemToTheBarIfNotExists( itemLink, true )
-				end
+		for slot = 1,GetContainerNumSlots(bag),1 do
+			local IsQuestItem,StartsQuest,_ = GetContainerItemQuestInfo(bag,slot)
+			local _,_,_,_,readable,_,itemLink = GetContainerItemInfo(bag,slot) -- readable???
+				-- Quests now auto get started since 7.1 kinda making this usless.
+				--if not IsQuestItem and StartsQuest then
+					--local itemString = GetItemInfo(itemLink)
+					--AJM:AddAnItemToTheBarIfNotExists( itemLink, true)
+				--end
 			end
-		end
+		end
+	]]
 	for iterateQuests=1,GetNumQuestLogEntries() do
 	local questLogTitleText,_,_,_,isHeader = GetQuestLogTitle(iterateQuests)
 		if not isHeader then
@@ -404,7 +455,8 @@ function AJM:CheckForQuestItemAndAddToBar()
 				local questname,rank = GetItemSpell(questItemLink) -- Only means to detect if the item is usable
 				if questname then
 					if JambaUtilities:DoItemLinksContainTheSameItem( questItemLink, questItemLink ) == true then
-						AJM:AddAnItemToTheBarIfNotExists( questItemLink, false )
+						--AJM:Print("addItem", questItemLink )
+						AJM:AddAnItemToTheBarIfNotExists( questItemLink, false)
 					end
 				end
 			end
@@ -412,6 +464,111 @@ function AJM:CheckForQuestItemAndAddToBar()
 	end
 end

+-- Add satchels to item bar.
+function AJM:CheckForSatchelsItemAndAddToBar()
+	for bag = 0, NUM_BAG_SLOTS do
+		for slot = 1, GetContainerNumSlots(bag) do
+		local texture, count, locked, quality, readable, lootable, link, isFiltered, hasNoValue, itemID = GetContainerItemInfo(bag, slot)
+		--AJM:Print("test", link, lootable)
+			if link and lootable then
+				--AJM:Print("satchelsFound", link)
+				AJM:AddAnItemToTheBarIfNotExists( link, false )
+			end
+		end
+	end
+end
+
+-- Removes unused items.
+
+function AJM:ClearButton()
+	local state = "0"
+	for iterateItems = 1, AJM.maximumNumberOfItems, 1 do
+		local itemContainer = AJM.itemContainer[iterateItems]
+		if itemContainer == nil then
+			AJM:CreateJambaItemUseItemContainer( iterateItems, parentFrame )
+			itemContainer = AJM.itemContainer[iterateItems]
+		end
+		local containerButton = itemContainer["container"]
+		local itemInfo = AJM:GetItemFromItemDatabase( iterateItems )
+		local kind = itemInfo.kind
+		local action = itemInfo.action
+		if kind == "item" then
+			local name, itemLink,_,_,_,itemType,questItem = GetItemInfo( action )
+			if itemLink and itemLink:match("item:%d") then
+				tooltipScanner:SetOwner(UIParent, "ANCHOR_NONE")
+				tooltipScanner:SetHyperlink(itemLink)
+				--AJM:Print("scanTooltip", itemLink)
+				local tooltipText = _G[tooltipName.."TextLeft3"]:GetText()
+				--AJM:Print("tooltiptest", tooltipText, tooltipTextTwo)
+				if tooltipText == nil or tooltipText ~= "Unique" then
+					--AJM:Print("testWorks!", itemLink)
+					if AJM:IsInInventory( name ) == false then
+						--AJM:Print("NOT IN BAGS", itemLink)
+						AJM.db.itemsAdvanced[iterateItems] = nil
+						AJM:SettingsRefresh()
+						AJM:JambaSendSettings()
+					end
+				end
+			end
+		end
+	end
+end
+
+-- Adds artifact power items to item bar.
+function AJM:CheckForArtifactItemAndAddToBar()
+	for bag = 0, NUM_BAG_SLOTS do
+		for slot = 1, GetContainerNumSlots(bag) do
+			local itemLink = GetContainerItemLink(bag, slot)
+			--AJM:Print("bagcheck", itemLink)
+			if itemLink and itemLink:match("item:%d") then
+				tooltipScanner:SetOwner(UIParent, "ANCHOR_NONE")
+				tooltipScanner:SetHyperlink(itemLink)
+				--AJM:Print("scanTooltip", itemLink)
+				local tooltipText = _G[tooltipName.."TextLeft2"]:GetText()
+				if tooltipText and tooltipText:match(ARTIFACT_POWER) then
+					--AJM:Print("artifactPowerFound", itemLink)
+					AJM:AddAnItemToTheBarIfNotExists( itemLink, false )
+				end
+			end
+		end
+	end
+end
+
+--Removes artifact power after used.
+--[[
+function AJM:UpdateArtifactItemsInBar()
+	local state = "0"
+	for iterateItems = 1, AJM.maximumNumberOfItems, 1 do
+		local itemContainer = AJM.itemContainer[iterateItems]
+		if itemContainer == nil then
+			AJM:CreateJambaItemUseItemContainer( iterateItems, parentFrame )
+			itemContainer = AJM.itemContainer[iterateItems]
+		end
+		local containerButton = itemContainer["container"]
+		local itemInfo = AJM:GetItemFromItemDatabase( iterateItems )
+		local kind = itemInfo.kind
+		local action = itemInfo.action
+		if kind == "item" then
+			local name, itemLink,_,_,_,_,questItem = GetItemInfo( action )
+			if itemLink and itemLink:match("item:%d") then
+				tooltipScanner:SetOwner(UIParent, "ANCHOR_NONE")
+				tooltipScanner:SetHyperlink(itemLink)
+				--AJM:Print("scanTooltip", name, itemLink)
+				local tooltipText = _G[tooltipName.."TextLeft2"]:GetText()
+				if tooltipText and tooltipText:match(ARTIFACT_POWER) then
+					if AJM:IsInInventory( name ) == false then
+						--AJM:Print("NOT IN BAGS", itemLink)
+						AJM.db.itemsAdvanced[iterateItems] = nil
+						AJM:SettingsRefresh()
+						AJM:JambaSendSettings()
+					end
+				end
+			end
+		end
+	end
+end
+--]]
+
 --Checks the item is in the player players bag
 function AJM:IsInInventory(itemLink)
 	for bag = 0,4,1 do
@@ -433,7 +590,7 @@ function AJM:IsInInventory(itemLink)
 end


-function AJM:AddAnItemToTheBarIfNotExists( itemLink, startsQuest )
+function AJM:AddAnItemToTheBarIfNotExists( itemLink, startsQuest)
 	local itemInfo
 	local barItemId
 	local iterateItems
@@ -441,11 +598,15 @@ function AJM:AddAnItemToTheBarIfNotExists( itemLink, startsQuest )
 	local itemId = JambaUtilities:GetItemIdFromItemLink( itemLink )
 	for iterateItems = 1, AJM.db.numberOfItems, 1 do
 		itemInfo = AJM:GetItemFromItemDatabase( iterateItems )
+			--AJM:Print("check", itemLink, itemInfo.action)
 		if itemInfo.kind == "item" and itemInfo.action == itemId then
 			alreadyExists = true
+		--	AJM:Print("test", itemLink )
+			return
 		end
 	end
 	if alreadyExists == false then
+		--AJM:Print("test2", itemLink )
 		for iterateItems = 1, AJM.db.numberOfItems, 1 do
 			itemInfo = AJM:GetItemFromItemDatabase( iterateItems )
 			--Checks the items we talking about is in the bags of the player.
@@ -453,9 +614,9 @@ function AJM:AddAnItemToTheBarIfNotExists( itemLink, startsQuest )
 				AJM:AddItemToItemDatabase( iterateItems, "item", itemId )
 				AJM:JambaSendSettings()
 				AJM:SettingsRefresh()
-				if startsQuest == true then
-					AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["New item that starts a quest found!"], false )
-				end
+					if startsQuest then
+						AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["New item that starts a quest found!"], false )
+					end
 				return
 			end
 		end
@@ -490,7 +651,8 @@ function AJM:RefreshItemUseControls()
 		row = math.floor((iterateItems - 1) / itemsPerRow)
 		rowLeftModifier = math.floor((iterateItems-1) % itemsPerRow)
 		positionLeft = 6 + (AJM.itemSize * rowLeftModifier) + (AJM.db.itemUseHorizontalSpacing * rowLeftModifier)
-		positionTop = -AJM.db.itemUseTitleHeight - (AJM.db.itemUseVerticalSpacing * 2) - (row * AJM.itemSize) - (row * AJM.db.itemUseVerticalSpacing)
+		local getHeight = AJM.UpdateHeight()
+		positionTop = -getHeight - (AJM.db.itemUseVerticalSpacing * 2) - (row * AJM.itemSize) - (row * AJM.db.itemUseVerticalSpacing)
 		containerButton:SetWidth( AJM.itemSize )
 		containerButton:SetHeight( AJM.itemSize )
 		containerButton:SetPoint( "TOPLEFT", parentFrame, "TOPLEFT", positionLeft, positionTop )
@@ -503,7 +665,8 @@ function AJM:UpdateJambaItemUseDimensions()
 	local frame = JambaItemUseFrame
 	local itemsPerRow = AJM.db.numberOfItems / AJM.db.numberOfRows
 	frame:SetWidth( 5 + (AJM.db.itemUseHorizontalSpacing * (3 + itemsPerRow-1)) + (AJM.itemSize * itemsPerRow) )
-	frame:SetHeight( AJM.db.itemUseTitleHeight + (AJM.itemSize * AJM.db.numberOfRows) + (AJM.db.itemUseVerticalSpacing * AJM.db.numberOfRows) + (AJM.db.itemUseVerticalSpacing * 3))
+	local getHeight = AJM.UpdateHeight()
+	frame:SetHeight( getHeight + (AJM.itemSize * AJM.db.numberOfRows) + (AJM.db.itemUseVerticalSpacing * AJM.db.numberOfRows) + (AJM.db.itemUseVerticalSpacing * 3))
 	frame:SetScale( AJM.db.itemUseScale )
 end

@@ -568,6 +731,33 @@ local function SettingsCreateOptions( top )
 		L["Automatically Add Quest Items To Bar"],
 		AJM.SettingsToggleAutoAddQuestItem
 	)
+	movingTop = movingTop - checkBoxHeight - verticalSpacing
+	AJM.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Automatically Add Artifact Power Items To Bar"],
+		AJM.SettingsToggleAutoAddArtifactItem
+	)
+	movingTop = movingTop - checkBoxHeight - verticalSpacing
+	AJM.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Automatically Add Satchel Items To Bar"],
+		AJM.SettingsToggleAutoAddSatchelsItem
+	)
+	movingTop = movingTop - checkBoxHeight - verticalSpacing
+	AJM.settingsControl.displayOptionsCheckBoxHideClearButton = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Hides the clear Button"],
+		AJM.SettingsToggleHideClearButton
+	)
 	movingTop = movingTop - checkBoxHeight - verticalSpacing
 	AJM.settingsControl.displayOptionsCheckBoxHideItemUseInCombat = JambaHelperSettings:CreateCheckBox(
 		AJM.settingsControl,
@@ -720,6 +910,9 @@ function AJM:SettingsRefresh()
 	AJM.settingsControl.displayOptionsItemUseNumberOfItems:SetValue( AJM.db.numberOfItems )
 	AJM.settingsControl.displayOptionsItemUseNumberOfRows:SetValue( AJM.db.numberOfRows )
 	AJM.settingsControl.displayOptionsCheckBoxAutoAddQuestItem:SetValue( AJM.db.autoAddQuestItemsToBar )
+	AJM.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem:SetValue( AJM.db.autoAddArtifactItemsToBar )
+	AJM.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem:SetValue( AJM.db.autoAddSatchelsItemsToBar )
+	AJM.settingsControl.displayOptionsCheckBoxHideClearButton:SetValue( AJM.db.hideClearButton )
 	AJM.settingsControl.displayOptionsCheckBoxItemBarsSynchronized:SetValue( AJM.db.itemBarsSynchronized )
 	AJM.settingsControl.displayOptionsItemUseScaleSlider:SetValue( AJM.db.itemUseScale )
 	AJM.settingsControl.displayOptionsItemUseTransparencySlider:SetValue( AJM.db.frameAlpha )
@@ -737,6 +930,9 @@ function AJM:SettingsRefresh()
 		AJM.settingsControl.displayOptionsItemUseNumberOfItems:SetDisabled( not AJM.db.showItemUse )
 		AJM.settingsControl.displayOptionsItemUseNumberOfRows:SetDisabled( not AJM.db.showItemUse )
 		AJM.settingsControl.displayOptionsCheckBoxAutoAddQuestItem:SetDisabled( not AJM.db.showItemUse )
+		AJM.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem:SetDisabled( not AJM.db.showItemUse )
+		AJM.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem:SetDisabled( not AJM.db.showItemUse )
+		AJM.settingsControl.displayOptionsCheckBoxHideClearButton:SetDisabled( not AJM.db.showItemUse )
 		AJM.settingsControl.displayOptionsCheckBoxItemBarsSynchronized:SetDisabled( not AJM.db.showItemUse )
 		AJM.settingsControl.displayOptionsItemUseScaleSlider:SetDisabled( not AJM.db.showItemUse )
 		AJM.settingsControl.displayOptionsItemUseTransparencySlider:SetDisabled( not AJM.db.showItemUse )
@@ -750,6 +946,7 @@ function AJM:SettingsRefresh()
 			AJM:SettingsUpdateBorderStyle()
 			AJM:SetItemUseVisibility()
 			AJM:UpdateItemsInBar()
+			AJM:UpdateHeight()
 		end
 	else
 		AJM.updateSettingsAfterCombat = true
@@ -780,6 +977,21 @@ function AJM:SettingsToggleAutoAddQuestItem( event, checked )
 	AJM:SettingsRefresh()
 end

+function AJM:SettingsToggleAutoAddArtifactItem( event, checked )
+	AJM.db.autoAddArtifactItemsToBar = checked
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsToggleAutoAddSatchelsItem( event, checked )
+	AJM.db.autoAddSatchelsItemsToBar = checked
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsToggleHideClearButton(event, checked )
+	AJM.db.hideClearButton = checked
+	AJM:SettingsRefresh()
+end
+
 function AJM:SettingsToggleItemBarsSynchronized( event, checked )
 	AJM.db.itemBarsSynchronized = checked
 	AJM:SettingsRefresh()
@@ -900,6 +1112,9 @@ function AJM:JambaOnSettingsReceived( characterName, settings )
 		AJM.db.itemUseVerticalSpacing = settings.itemUseVerticalSpacing
 		AJM.db.itemUseHorizontalSpacing = settings.itemUseHorizontalSpacing
 		AJM.db.autoAddQuestItemsToBar = settings.autoAddQuestItemsToBar
+		AJM.db.autoAddArtifactItemsToBar = settings.autoAddArtifactItemsToBar
+		AJM.db.autoAddSatchelsItemsToBar = settings.autoAddSatchelsItemsToBar
+		AJM.db.hideClearButton = settings.hideClearButton
 		AJM.db.itemBarsSynchronized = settings.itemBarsSynchronized
 		AJM.db.numberOfItems = settings.numberOfItems
 		AJM.db.numberOfRows = settings.numberOfRows
@@ -960,19 +1175,31 @@ end
 function AJM:BAG_UPDATE()
 	if not InCombatLockdown() then
 		AJM:UpdateItemsInBar()
+		AJM:UpdateQuestItemsInBar()
+		--AJM:ScheduleTimer( "UpdateArtifactItemsInBar", 1 )
 	end
 end

 function AJM:QUEST_UPDATE()
 	if not InCombatLockdown() then
-		AJM:UpdateQuestItemsInBar()	end
+		AJM:UpdateQuestItemsInBar()
+	end
 end


 function AJM:ITEM_PUSH()
+	if AJM.db.showItemUse == false then
+		return
+	end
 	if AJM.db.autoAddQuestItemsToBar == true then
-		AJM:ScheduleTimer( "CheckForQuestItemAndAddToBar", 2 )
+		AJM:ScheduleTimer( "CheckForQuestItemAndAddToBar", 1 )
 	end
+	if AJM.db.autoAddArtifactItemsToBar == true then
+		AJM:ScheduleTimer( "CheckForArtifactItemAndAddToBar", 1 )
+	end
+	if AJM.db.autoAddSatchelsItemsToBar == true then
+		AJM:ScheduleTimer( "CheckForSatchelsItemAndAddToBar", 1 )
+	end
 end

 function AJM:UPDATE_BINDINGS()
diff --git a/Jamba-ItemUse/Locales/JambaItemUse-Locale-enUS.lua b/Jamba-ItemUse/Locales/JambaItemUse-Locale-enUS.lua
index ee0fe64..51677ad 100644
--- a/Jamba-ItemUse/Locales/JambaItemUse-Locale-enUS.lua
+++ b/Jamba-ItemUse/Locales/JambaItemUse-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -65,4 +65,10 @@ L["Number Of Rows"] = true
 L["New item that starts a quest found!"] = true
 L["Clear Item Bar"] = true
 L["Clear the item bar (remove all items)."] = true
+L["Hides the clear Button"] = true
 L["Item Bar Cleared"] = true
+L["Automatically Add Artifact Power Items To Bar"] = true
+L["Automatically Add Satchel Items To Bar"] = true
+L["New Artifact Power Item found!"] = true
+L["Clear"] = true
+L["Clears items no longer in your bags "] = true
diff --git a/Jamba-ItemUse/Locales/Locales.xml b/Jamba-ItemUse/Locales/Locales.xml
index 14d9304..e9fe15b 100644
--- a/Jamba-ItemUse/Locales/Locales.xml
+++ b/Jamba-ItemUse/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaItemUse-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Macro/Jamba-Macro.toc b/Jamba-Macro/Jamba-Macro.toc
index 3cdb663..a28eba0 100644
--- a/Jamba-Macro/Jamba-Macro.toc
+++ b/Jamba-Macro/Jamba-Macro.toc
@@ -1,12 +1,12 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba-Macro
 ## Notes: Jamba-Macro
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
 ## SavedVariables: JambaMacroProfileDB
 ## LoadOnDemand: 1
 Locales\Locales.xml
-JambaMacro.lua
\ No newline at end of file
+JambaMacro.lua
diff --git a/Jamba-Macro/JambaMacro.lua b/Jamba-Macro/JambaMacro.lua
index 3707f92..4c6d016 100644
--- a/Jamba-Macro/JambaMacro.lua
+++ b/Jamba-Macro/JambaMacro.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Macro/Locales/Jamba-Macro-Locale-enUS.lua b/Jamba-Macro/Locales/Jamba-Macro-Locale-enUS.lua
index 944995c..a30a082 100644
--- a/Jamba-Macro/Locales/Jamba-Macro-Locale-enUS.lua
+++ b/Jamba-Macro/Locales/Jamba-Macro-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Macro/Locales/Locales.xml b/Jamba-Macro/Locales/Locales.xml
index bd8b828..079efe2 100644
--- a/Jamba-Macro/Locales/Locales.xml
+++ b/Jamba-Macro/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="Jamba-Macro-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Mount/Jamba-Mount.toc b/Jamba-Mount/Jamba-Mount.toc
new file mode 100644
index 0000000..67a08fa
--- /dev/null
+++ b/Jamba-Mount/Jamba-Mount.toc
@@ -0,0 +1,12 @@
+## Interface: 70100
+## Title: Jamba-Mount
+## Notes: Jamba-Mount
+## Author: Ebony
+## Version: 7.1.5-5.1.7
+## X-Category: Interface Enhancements
+## X-Child-Of: Jamba
+## Dependencies: Jamba
+## SavedVariables: JambaMountProfileDB
+## LoadOnDemand: 1
+Locales\Locales.xml
+JambaMount.lua
diff --git a/Jamba-Mount/JambaMount.lua b/Jamba-Mount/JambaMount.lua
new file mode 100644
index 0000000..d141145
--- /dev/null
+++ b/Jamba-Mount/JambaMount.lua
@@ -0,0 +1,427 @@
+--[[
+Jamba - Jafula's Awesome Multi-Boxer Assistant
+Copyright 2008 - 2017 Michael "Jafula" Miller
+License: The MIT License
+
+This is was made by Ebony with the idea from Hydra
+]]--
+
+-- Create the addon using AceAddon-3.0 and embed some libraries.
+local AJM = LibStub( "AceAddon-3.0" ):NewAddon(
+	"JambaMount",
+	"JambaModule-1.0",
+	"AceConsole-3.0",
+	"AceEvent-3.0",
+	"AceHook-3.0",
+	"AceTimer-3.0"
+)
+
+-- Get the Jamba Utilities Library.
+local JambaUtilities = LibStub:GetLibrary( "JambaUtilities-1.0" )
+local JambaHelperSettings = LibStub:GetLibrary( "JambaHelperSettings-1.0" )
+
+--  Constants and Locale for this module.
+AJM.moduleName = "Jamba-Mount"
+AJM.settingsDatabaseName = "JambaMountProfileDB"
+AJM.chatCommand = "jamba-mount"
+local L = LibStub( "AceLocale-3.0" ):GetLocale( AJM.moduleName )
+AJM.parentDisplayName = L["Toon"]
+AJM.moduleDisplayName = L["Mount"]
+
+-- Settings - the values to store and their defaults for the settings database.
+AJM.settings = {
+	profile = {
+		mountWithTeam = true,
+		dismountWithTeam = true,
+		dismountWithMaster = true,
+		mountInRange = false,
+		--mountName = nil,
+		--messageArea = JambaApi.DefaultMessageArea(),
+		warningArea = JambaApi.DefaultWarningArea()
+	},
+}
+
+-- Configuration.
+function AJM:GetConfiguration()
+	local configuration = {
+		name = AJM.moduleDisplayName,
+		handler = AJM,
+		type = 'group',
+		childGroups  = "tab",
+		get = "JambaConfigurationGetSetting",
+		set = "JambaConfigurationSetSetting",
+		args = {
+			push = {
+				type = "input",
+				name = L["Push Settings"],
+				desc = L["Push the Mount settings to all characters in the team."],
+				usage = "/jamba-mount push",
+				get = false,
+				set = "JambaSendSettings",
+				order = 4,
+				guiHidden = true,
+			},
+		},
+	}
+	return configuration
+end
+
+-------------------------------------------------------------------------------------------------------------
+-- Command this module sends.
+-------------------------------------------------------------------------------------------------------------
+
+AJM.COMMAND_MOUNT_ME = "JambaMountMe"
+AJM.COMMAND_MOUNT_DISMOUNT = "JambaMountDisMount"
+
+-------------------------------------------------------------------------------------------------------------
+-- Messages module sends.
+-------------------------------------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------------------------------------
+-- Addon initialization, enabling and disabling.
+-------------------------------------------------------------------------------------------------------------
+
+-- Initialise the module.
+function AJM:OnInitialize()
+	-- Create the settings control.
+	AJM:SettingsCreate()
+	-- Initialse the JambaModule part of this module.
+	AJM:JambaModuleInitialize( AJM.settingsControl.widgetSettings.frame )
+	-- Populate the settings.
+	AJM:SettingsRefresh()
+end
+
+-- Called when the addon is enabled.
+function AJM:OnEnable()
+--	AJM:RegisterEvent("PLAYER_REGEN_ENABLED")
+--	AJM:RegisterEvent("PLAYER_REGEN_DISABLED")
+	AJM:RegisterEvent("UNIT_SPELLCAST_START")
+	AJM:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
+	--AJM:RegisterEvent("UNIT_AURA")
+	AJM:RegisterMessage( JambaApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" )
+
+end
+
+-- Called when the addon is disabled.
+function AJM:OnDisable()
+	-- AceHook-3.0 will tidy up the hooks for us.
+end
+
+function AJM:SettingsCreate()
+	AJM.settingsControl = {}
+	-- Create the settings panel.
+	JambaHelperSettings:CreateSettings(
+		AJM.settingsControl,
+		AJM.moduleDisplayName,
+		AJM.parentDisplayName,
+		AJM.SettingsPushSettingsClick
+	)
+	local bottomOfInfo = AJM:SettingsCreateMount( JambaHelperSettings:TopOfSettings() )
+	AJM.settingsControl.widgetSettings.content:SetHeight( -bottomOfInfo )
+	-- Help
+	local helpTable = {}
+	JambaHelperSettings:CreateHelp( AJM.settingsControl, helpTable, AJM:GetConfiguration() )
+end
+
+function AJM:SettingsPushSettingsClick( event )
+	AJM:JambaSendSettings()
+end
+
+function AJM:SettingsCreateMount( top )
+	local checkBoxHeight = JambaHelperSettings:GetCheckBoxHeight()
+	local left = JambaHelperSettings:LeftOfSettings()
+	local headingHeight = JambaHelperSettings:HeadingHeight()
+	local headingWidth = JambaHelperSettings:HeadingWidth( false )
+	local dropdownHeight = JambaHelperSettings:GetDropdownHeight()
+	local verticalSpacing = JambaHelperSettings:GetVerticalSpacing()
+	local movingTop = top
+	JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Mount Options"], movingTop, false )
+	movingTop = movingTop - headingHeight
+	AJM.settingsControl.checkBoxMountWithTeam = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Mount with Team"],
+		AJM.SettingsToggleMountWithTeam
+	)
+	movingTop = movingTop - headingHeight
+	AJM.settingsControl.checkBoxDismountWithTeam = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Dismount with Team"],
+		AJM.SettingsToggleDisMountWithTeam,
+		L["Dismount with Character That Dismount"]
+	)
+	movingTop = movingTop - headingHeight
+	AJM.settingsControl.checkBoxDismountWithMaster = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Only Dismount's from Master"],
+		AJM.SettingsToggleDisMountWithMaster,
+		L["Only Dismount's from Master character."]
+	)
+	movingTop = movingTop - headingHeight
+	AJM.settingsControl.checkBoxMountInRange = JambaHelperSettings:CreateCheckBox(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Only Mount when in Range"],
+		AJM.SettingsToggleMountInRange,
+		L["Only Works In a party!"]
+	)
+--	movingTop = movingTop - checkBoxHeight
+--	AJM.settingsControl.dropdownMessageArea = JambaHelperSettings:CreateDropdown(
+--		AJM.settingsControl,
+--		headingWidth,
+--		left,
+--		movingTop,
+--		L["Message Area"]
+--	)
+--	AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() )
+--	AJM.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", AJM.SettingsSetMessageArea )
+	movingTop = movingTop - checkBoxHeight
+	AJM.settingsControl.dropdownWarningArea = JambaHelperSettings:CreateDropdown(
+		AJM.settingsControl,
+		headingWidth,
+		left,
+		movingTop,
+		L["Send Warning Area"]
+	)
+	AJM.settingsControl.dropdownWarningArea:SetList( JambaApi.MessageAreaList() )
+	AJM.settingsControl.dropdownWarningArea:SetCallback( "OnValueChanged", AJM.SettingsSetWarningArea )
+
+
+
+	movingTop = movingTop - dropdownHeight - verticalSpacing
+	return movingTop
+end
+
+function AJM:OnMessageAreasChanged( message )
+	--AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() )
+	AJM.settingsControl.dropdownWarningArea:SetList( JambaApi.MessageAreaList() )
+end
+
+function AJM:SettingsSetWarningArea( event, value )
+	AJM.db.warningArea = value
+	AJM:SettingsRefresh()
+end
+
+--function AJM:SettingsSetMessageArea( event, value )
+--	AJM.db.messageArea = value
+--	AJM:SettingsRefresh()
+--end
+
+function AJM:SettingsToggleMountWithTeam( event, checked )
+	AJM.db.mountWithTeam = checked
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsToggleDisMountWithTeam( event, checked )
+	AJM.db.dismountWithTeam = checked
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsToggleDisMountWithMaster( event, checked )
+	AJM.db.dismountWithMaster = checked
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsToggleMountInRange( event, checked )
+	AJM.db.mountInRange = checked
+	AJM:SettingsRefresh()
+end
+
+-- Settings received.
+function AJM:JambaOnSettingsReceived( characterName, settings )
+	if characterName ~= AJM.characterName then
+		-- Update the settings.
+		AJM.db.mountWithTeam = settings.mountWithTeam
+		AJM.db.dismountWithTeam = settings.dismountWithTeam
+		AJM.db.dismountWithMaster = settings.dismountWithMaster
+		AJM.db.mountInRange = settings.mountInRange
+		AJM.db.messageArea = settings.messageArea
+		AJM.db.warningArea = settings.warningArea
+		-- Refresh the settings.
+		AJM:SettingsRefresh()
+		-- Tell the player.
+		AJM:Print( L["Settings received from A."]( characterName ) )
+		-- Tell the team?
+		--AJM:JambaSendMessageToTeam( AJM.db.messageArea,  L["Settings received from A."]( characterName ), false )
+	end
+end
+
+function AJM:BeforeJambaProfileChanged()
+end
+
+function AJM:OnJambaProfileChanged()
+	AJM:SettingsRefresh()
+end
+
+function AJM:SettingsRefresh()
+	AJM.settingsControl.checkBoxMountWithTeam:SetValue( AJM.db.mountWithTeam )
+	AJM.settingsControl.checkBoxDismountWithTeam:SetValue( AJM.db.dismountWithTeam )
+	AJM.settingsControl.checkBoxDismountWithMaster:SetValue( AJM.db.dismountWithMaster )
+	AJM.settingsControl.checkBoxMountInRange:SetValue( AJM.db.mountInRange )
+	--AJM.settingsControl.dropdownMessageArea:SetValue( AJM.db.messageArea )
+	AJM.settingsControl.dropdownWarningArea:SetValue( AJM.db.warningArea )
+	-- Set state.
+	--AJM.settingsControl.checkBoxMountWithTeam:SetDisabled( not AJM.db.mountWithTeam )
+	AJM.settingsControl.checkBoxDismountWithTeam:SetDisabled( not AJM.db.mountWithTeam )
+	AJM.settingsControl.checkBoxDismountWithMaster:SetDisabled( not AJM.db.dismountWithTeam or not AJM.db.mountWithTeam )
+	AJM.settingsControl.checkBoxMountInRange:SetDisabled( not AJM.db.mountWithTeam )
+end
+
+-------------------------------------------------------------------------------------------------------------
+-- JambaMount functionality.
+-------------------------------------------------------------------------------------------------------------
+
+function AJM:UNIT_SPELLCAST_START(event, unitID, spell, rank, lineID, spellID, ...  )
+	--AJM:Print("Looking for Spells.", unitID, spellID, spell)
+	AJM.castingMount = nil
+	if unitID == "player" then
+	local mountIDs = C_MountJournal.GetMountIDs()
+		for i = 1, #mountIDs do
+			--local name , id, icon, active = C_MountJournal.GetMountInfoByID(i)
+			local creatureName,_,_,_,_,_,_,_,_,_,_,mountID = C_MountJournal.GetMountInfoByID(mountIDs[i])
+			--AJM:Print("Test", spell, creatureName)
+			if spell == creatureName then
+				--AJM:Print("SendtoTeam", "name", creatureName, "id", mountID)
+				if IsShiftKeyDown() == false then
+					AJM:JambaSendCommandToTeam( AJM.COMMAND_MOUNT_ME, creatureName, mountID )
+					AJM.castingMount = creatureName
+					break
+				end
+			end
+		end
+	end
+end
+
+function AJM:UNIT_SPELLCAST_SUCCEEDED(event, unitID, spell, rank, lineID, spellID, ... )
+	if unitID ~= "player" then
+        return
+    end
+	--AJM:Print("Looking for Spells Done", spell, AJM.castingMount)
+	if spell == AJM.castingMount then
+		--AJM:Print("test", spell)
+		AJM.isMounted = spell
+		--AJM:Print("Mounted!", AJM.isMounted)
+		AJM:RegisterEvent("UNIT_AURA")
+	--else
+		-- SomeThing gone wrong! so going to cast a random mount!
+		--AJM:Print("This Mount is not supported!", spell)
+		--AJM:JambaSendCommandToTeam( AJM.COMMAND_MOUNT_ME, "Random", "0" )
+	end
+
+end
+
+function AJM:UNIT_AURA(event, unitID, ... )
+	--AJM:Print("tester", unitID, AJM.isMounted)
+	if unitID ~= "player" or AJM.isMounted == nil or AJM.db.dismountWithTeam == false then
+        return
+    end
+	if not UnitBuff( unitID, AJM.isMounted) then
+		--AJM:Print("I have Dismounted - Send to team!")
+		if AJM.db.dismountWithMaster == true then
+			if JambaApi.IsCharacterTheMaster( AJM.characterName ) == true then
+				if IsShiftKeyDown() == false then
+					--AJM:Print("test")
+					AJM:JambaSendCommandToTeam( AJM.COMMAND_MOUNT_DISMOUNT )
+					AJM:UnregisterEvent("UNIT_AURA")
+				end
+			else
+				--AJM:Print("test1")
+				return
+			end
+		else
+			AJM:JambaSendCommandToTeam( AJM.COMMAND_MOUNT_DISMOUNT )
+			AJM:UnregisterEvent("UNIT_AURA")
+		end
+	end
+end
+
+function AJM:TeamMount(characterName, name, mountID)
+	--AJM:Print("testTeamMount", characterName, name, mountID )
+	--mount with team truned off.
+	if AJM.db.mountWithTeam == false then
+		return
+	end
+	-- already mounted.
+	if IsMounted() then
+		return
+	end
+	-- Checks if character is in range.
+	if AJM.db.mountInRange == true then
+		if UnitIsVisible(Ambiguate(characterName, "none") ) == false then
+			--AJM:Print("UnitIsNotVisible", characterName)
+			return
+		end
+	end
+	-- Checks done now the fun stuff!
+	--Do i have the same mount as master?
+	hasMount = false
+	local creatureName, spellID, icon, active, isUsable, sourceType, isFavorite, isFactionSpecific, faction, hideOnChar, isCollected, mountID = C_MountJournal.GetMountInfoByID(mountID)
+	if isUsable == true then
+		--AJM:Print("i have this Mount", creatureName)
+		hasMount = true
+		mount = mountID
+	else
+		--AJM:Print("i Do not have Mount", creatureName)
+		for i = 1, C_MountJournal.GetNumMounts() do
+		local creatureName, spellID, icon, active, isUsable, sourceType, isFavorite, isFactionSpecific, faction, hideOnChar, isCollected, mountID = C_MountJournal.GetMountInfoByID(i)
+			--AJM:Print("looking for a mount i can use", i)
+			if isUsable == true then
+				mount = mountID
+				hasMount = true
+				break
+			end
+		end
+	end
+
+--AJM:Print("test1420", mount, name)
+	-- for unsupported mounts.
+	if hasMount == true then
+		--AJM:Print("test14550", mount, name )
+		if name == "Random" then
+			C_MountJournal.SummonByID(0)
+		else
+			--AJM:Print("test1054" )
+			C_MountJournal.SummonByID( mount )
+		end
+		if IsMounted() == false then
+			AJM:ScheduleTimer( "AmNotMounted", 2 )
+		end
+	end
+end
+
+function AJM:AmNotMounted()
+	if IsMounted() == false then
+		--AJM:Print("test")
+		AJM:JambaSendMessageToTeam( AJM.db.warningArea, L["I am unable to Mount."], false )
+	end
+end
+
+
+
+-- A Jamba command has been received.
+function AJM:JambaOnCommandReceived( characterName, commandName, ... )
+	if characterName ~= self.characterName then
+		if commandName == AJM.COMMAND_MOUNT_ME then
+			--AJM:Print("command")
+			AJM:TeamMount( characterName, ... )
+		end
+		-- Dismount if mounted!
+		if commandName == AJM.COMMAND_MOUNT_DISMOUNT then
+			--AJM:Print("time to Dismount")
+			if IsMounted() then
+				Dismount()
+			end
+		end
+	end
+end
diff --git a/Jamba-Mount/Locales/JambaMount-Locale-enUS.lua b/Jamba-Mount/Locales/JambaMount-Locale-enUS.lua
new file mode 100644
index 0000000..47f0f36
--- /dev/null
+++ b/Jamba-Mount/Locales/JambaMount-Locale-enUS.lua
@@ -0,0 +1,27 @@
+--[[
+Jamba - Jafula's Awesome Multi-Boxer Assistant
+Copyright 2008 - 2017 Michael "Jafula" Miller
+License: The MIT License
+]]--
+
+local L = LibStub("AceLocale-3.0"):NewLocale( "Jamba-Mount", "enUS", true )
+L["Settings received from A."] = function( characterName )
+	return "Settings received from "..characterName.."."
+end
+
+L["Toon"] = true
+L["Mount"] = true
+L["Mount Options"] = true
+L["Push Settings"] = true
+L["Push the Mount settings to all characters in the team."] = true
+L["Mount with Team"] = true
+L["Dismount with Team"] = true
+L["Only Dismount's from Master"] = true
+L["Only Mount when in Range"] = true
+L["Message Area"]  = true
+L["Send Warning Area"]  = true
+---------------Help System-----------------------
+L["I am unable to Mount."] = true
+L["Only Works In a party!"] = true
+L["Dismount with Character That Dismount"] = true
+L["Only Dismount's from Master character."] = true
diff --git a/Jamba-Mount/Locales/Locales.xml b/Jamba-Mount/Locales/Locales.xml
new file mode 100644
index 0000000..ae1937a
--- /dev/null
+++ b/Jamba-Mount/Locales/Locales.xml
@@ -0,0 +1,9 @@
+<!--
+Jamba - Jafula's Awesome Multi-Boxer Assistant
+Copyright 2008 - 2017 Michael "Jafula" Miller
+License: The MIT License
+-->
+
+<Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file="JambaMount-Locale-enUS.lua" />
+</Ui>
diff --git a/Jamba-Purchase/Jamba-Purchase.toc b/Jamba-Purchase/Jamba-Purchase.toc
index edc0913..384b5ab 100644
--- a/Jamba-Purchase/Jamba-Purchase.toc
+++ b/Jamba-Purchase/Jamba-Purchase.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba-Purchase
 ## Notes: Jamba-Purchase
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Purchase/JambaPurchase.lua b/Jamba-Purchase/JambaPurchase.lua
index ef9d799..569c4ec 100644
--- a/Jamba-Purchase/JambaPurchase.lua
+++ b/Jamba-Purchase/JambaPurchase.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Purchase/Locales/JambaPurchase-Locale-enUS.lua b/Jamba-Purchase/Locales/JambaPurchase-Locale-enUS.lua
index f55a4ac..6528163 100644
--- a/Jamba-Purchase/Locales/JambaPurchase-Locale-enUS.lua
+++ b/Jamba-Purchase/Locales/JambaPurchase-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Purchase/Locales/Locales.xml b/Jamba-Purchase/Locales/Locales.xml
index ba0e513..32ff556 100644
--- a/Jamba-Purchase/Locales/Locales.xml
+++ b/Jamba-Purchase/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaPurchase-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Quest/Jamba-Quest.toc b/Jamba-Quest/Jamba-Quest.toc
index 49be9a0..4f84694 100644
--- a/Jamba-Quest/Jamba-Quest.toc
+++ b/Jamba-Quest/Jamba-Quest.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaQuest
 ## Notes: JambaQuest
 ## Author: Ebony, DropDownchanges by Schilm, Former Author: Jafula
-## Version: 7.0.3-5.0.1
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Quest/JambaQuest.lua b/Jamba-Quest/JambaQuest.lua
index 685fb59..b2ddcf7 100644
--- a/Jamba-Quest/JambaQuest.lua
+++ b/Jamba-Quest/JambaQuest.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba -- Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 --]]

@@ -177,7 +177,7 @@ function AJM:OnEnable()
 	AJM:RegisterEvent( "QUEST_PROGRESS" )
 	AJM:RegisterEvent( "WORLD_MAP_UPDATE" )
 	AJM:RegisterEvent( "ZONE_CHANGED_NEW_AREA" )
-    -- Quest post hooks.
+   -- Quest post hooks.
     AJM:SecureHook( "SelectGossipOption" )
     AJM:SecureHook( "SelectGossipActiveQuest" )
     AJM:SecureHook( "SelectGossipAvailableQuest" )
@@ -186,7 +186,9 @@ function AJM:OnEnable()
     AJM:SecureHook( "AcceptQuest" )
 	AJM:SecureHook( "AcknowledgeAutoAcceptQuest" )
     AJM:SecureHook( "CompleteQuest" )
-    AJM:SecureHook( "DeclineQuest" )
+    --AJM:SecureHook( "DeclineQuest" )
+	AJM:SecureHook( "IgnoreQuest" )
+	AJM:SecureHook( "UnignoreQuest" )
 	AJM:SecureHook( "GetQuestReward" )
 	AJM:SecureHook( "ToggleFrame" )
 	AJM:SecureHook( "ToggleQuestLog" )
@@ -1234,7 +1236,16 @@ function AJM:DoSelectAvailableQuest( sender, questIndex )
 	end
 end

-function AJM:DeclineQuest()
+function AJM:UnignoreQuest()
+	if AJM.db.mirrorMasterQuestSelectionAndDeclining == true then
+		if AJM.isInternalCommand == false then
+            AJM:DebugMessage( "DeclineQuest" )
+			AJM:JambaSendCommandToTeam( AJM.COMMAND_DECLINE_QUEST )
+		end
+	end
+end
+
+function AJM:IgnoreQuest()
 	if AJM.db.mirrorMasterQuestSelectionAndDeclining == true then
 		if AJM.isInternalCommand == false then
             AJM:DebugMessage( "DeclineQuest" )
@@ -1247,7 +1258,13 @@ function AJM:DoDeclineQuest( sender )
 	if AJM.db.mirrorMasterQuestSelectionAndDeclining == true then
 		AJM.isInternalCommand = true
         AJM:DebugMessage( "DoDeclineQuest" )
-		DeclineQuest()
+		--DeclineQuest()
+		local isIgnored = IsQuestIgnored()
+		if isIgnored then
+			UnignoreQuest()
+		else
+			IgnoreQuest()
+		end
 		AJM.isInternalCommand = false
 	end
 end
diff --git a/Jamba-Quest/Locales/JambaQuest-Locale-enUS.lua b/Jamba-Quest/Locales/JambaQuest-Locale-enUS.lua
index b0b607b..af192dc 100644
--- a/Jamba-Quest/Locales/JambaQuest-Locale-enUS.lua
+++ b/Jamba-Quest/Locales/JambaQuest-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba -- Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Quest/Locales/Locales.xml b/Jamba-Quest/Locales/Locales.xml
index 2dc985f..f632b18 100644
--- a/Jamba-Quest/Locales/Locales.xml
+++ b/Jamba-Quest/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaQuest-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-QuestWatcher/Jamba-QuestWatcher.toc b/Jamba-QuestWatcher/Jamba-QuestWatcher.toc
index f434bbc..8e5a312 100644
--- a/Jamba-QuestWatcher/Jamba-QuestWatcher.toc
+++ b/Jamba-QuestWatcher/Jamba-QuestWatcher.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaQuestWatcher
 ## Notes: JambaQuestWatcher
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-QuestWatcher/JambaQuestWatcher.lua b/Jamba-QuestWatcher/JambaQuestWatcher.lua
index a2ea30a..0a5f997 100644
--- a/Jamba-QuestWatcher/JambaQuestWatcher.lua
+++ b/Jamba-QuestWatcher/JambaQuestWatcher.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -177,8 +177,12 @@ function AJM:OnEnable()
 	AJM:SecureHook( "SetAbandonQuest" )
 	-- Update the quest watcher for watched quests.
 	AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, false )
+	AJM:ScheduleTimer( "JambaQuestWatcherScenarioUpdate", 1, false )
 	AJM:UpdateUnlockWatcherFrame()
-	AJM:UpdateHideBlizzardWatchFrame()
+	-- To Hide After elv changes. --ebony
+	AJM:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
+	-- Remvoed me somtime 7.0.4
+	--AJM:UpdateHideBlizzardWatchFrame()
 	if AJM.db.enableQuestWatcher == true then
 		AJM:QuestWatcherQuestListScrollRefresh()
 	end
@@ -259,16 +263,16 @@ function AJM:SettingsCreateQuestWatcherControl( top )
 		AJM.SettingsToggleEnableQuestWatcher,
 		L["Enables Jamba Objective Tracker"]
 	)
-	movingTop = movingTop - checkBoxHeight
-	AJM.settingsControlWatcher.checkBoxShowFrame = JambaHelperSettings:CreateCheckBox(
-		AJM.settingsControlWatcher,
-		headingWidth,
-		left,
-		movingTop,
-		L["Show Quest Watcher"],
-		AJM.SettingsToggleShowFrame,
-		L["Show Quest Watcher"]
-	)
+--	movingTop = movingTop - checkBoxHeight
+--	AJM.settingsControlWatcher.checkBoxShowFrame = JambaHelperSettings:CreateCheckBox(
+--		AJM.settingsControlWatcher,
+--		headingWidth,
+--		left,
+--		movingTop,
+--		L["Show Quest Watcher"],
+--		AJM.SettingsToggleShowFrame,
+--		L["Show Quest Watcher"]
+--	)
 	movingTop = movingTop - checkBoxHeight
 	AJM.settingsControlWatcher.checkBoxUnlockWatcherFrame = JambaHelperSettings:CreateCheckBox(
 		AJM.settingsControlWatcher,
@@ -683,13 +687,14 @@ function AJM:JambaOnSettingsReceived( characterName, settings )
 		AJM.db.doNotHideCompletedObjectives = settings.doNotHideCompletedObjectives
 		AJM.db.showCompletedObjectivesAsDone = settings.showCompletedObjectivesAsDone
 		AJM.db.hideQuestIfAllComplete = settings.hideQuestIfAllComplete
-		AJM.db.showFrame = settings.showFrame
+--		AJM.db.showFrame = settings.showFrame
 		AJM.db.sendProgressChatMessages = settings.sendProgressChatMessages
 		AJM.db.messageArea = settings.messageArea
 		-- Refresh the settings.
 		AJM:SettingsRefresh()
 		AJM:UpdateUnlockWatcherFrame()
-		AJM:UpdateHideBlizzardWatchFrame()
+		--AJM:UpdateHideBlizzardWatchFrame()
+		AJM:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
 		-- Tell the player.
 		AJM:Print( L["Settings received from A."]( characterName ) )
 		-- Tell the team?
@@ -730,7 +735,7 @@ function AJM:SettingsRefresh()
 	AJM.settingsControlWatcher.checkBoxShowCompletedObjectivesAsDone:SetValue( AJM.db.showCompletedObjectivesAsDone  )
 	AJM.settingsControlWatcher.checkBoxShowDoNotHideCompletedObjectives:SetValue( AJM.db.doNotHideCompletedObjectives )
 	AJM.settingsControlWatcher.checkBoxHideQuestIfAllComplete:SetValue( AJM.db.hideQuestIfAllComplete )
-	AJM.settingsControlWatcher.checkBoxShowFrame:SetValue( AJM.db.showFrame )
+--	AJM.settingsControlWatcher.checkBoxShowFrame:SetValue( AJM.db.showFrame )
 	AJM.settingsControlWatcher.dropdownMessageArea:SetValue( AJM.db.messageArea )
 	AJM.settingsControlWatcher.checkBoxSendProgressChatMessages:SetValue( AJM.db.sendProgressChatMessages )
 	-- Quest watcher state.
@@ -752,7 +757,7 @@ function AJM:SettingsRefresh()
 	AJM.settingsControlWatcher.checkBoxShowCompletedObjectivesAsDone:SetDisabled( not AJM.db.enableQuestWatcher )
 	AJM.settingsControlWatcher.checkBoxShowDoNotHideCompletedObjectives:SetDisabled( not AJM.db.enableQuestWatcher )
 	AJM.settingsControlWatcher.checkBoxHideQuestIfAllComplete:SetDisabled( not AJM.db.enableQuestWatcher )
-	AJM.settingsControlWatcher.checkBoxShowFrame:SetDisabled( not AJM.db.enableQuestWatcher )
+--	AJM.settingsControlWatcher.checkBoxShowFrame:SetDisabled( not AJM.db.enableQuestWatcher )
 	AJM.settingsControlWatcher.dropdownMessageArea:SetDisabled( not AJM.db.enableQuestWatcher )
 	AJM.settingsControlWatcher.checkBoxSendProgressChatMessages:SetDisabled( not AJM.db.enableQuestWatcher )
 	if AJM.questWatcherFrameCreated == true then
@@ -872,7 +877,8 @@ end

 function AJM:SettingsToggleHideBlizzardWatchFrame( event, checked )
 	AJM.db.hideBlizzardWatchFrame = checked
-	AJM:UpdateHideBlizzardWatchFrame()
+	--AJM:UpdateHideBlizzardWatchFrame()
+	AJM:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
 	AJM:SettingsRefresh()
 end

@@ -943,8 +949,10 @@ function AJM:AddQuestWatch( questIndex )
 	if AJM.db.enableQuestWatcher == false then
 		return
 	end
-	AJM:UpdateHideBlizzardWatchFrame()
+	--AJM:UpdateHideBlizzardWatchFrame()
+	AJM:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
 	AJM:JambaQuestWatcherUpdate( true )
+	AJM:JambaQuestWatcherScenarioUpdate( true )
 end

 function AJM:RemoveQuestWatch( questIndex )
@@ -952,8 +960,9 @@ function AJM:RemoveQuestWatch( questIndex )
 		return
     end
     AJM:DebugMessage( "RemoveQuestWatch", questIndex )
-	AJM:UpdateHideBlizzardWatchFrame()
-    local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
+	--AJM:UpdateHideBlizzardWatchFrame()
+    AJM:ScheduleTimer( "UpdateHideBlizzardWatchFrame", 2 )
+	local title, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle( questIndex )
     AJM:DebugMessage( "About to call RemoveQuestFromWatchList with value:", questID )
 	AJM:RemoveQuestFromWatchList( questID )
 end
@@ -979,6 +988,7 @@ end


 function AJM:QUEST_WATCH_UPDATE( event, ... )
+	--AJM:Print("test4")
 	if AJM.db.enableQuestWatcher == true then
 		-- Wait a bit for the correct information to come through from the server...
 		AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, true )
@@ -987,6 +997,7 @@ end


 function AJM:QUEST_LOG_UPDATE( event, ... )
+	--AJM:Print("test")
 	if AJM.db.enableQuestWatcher == true then
 		-- Wait a bit for the correct information to come through from the server...
 		AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, true )
@@ -995,22 +1006,31 @@ end


 function AJM:SCENARIO_UPDATE( event, ... )
+	--AJM:Print("test2")
 	if AJM.db.enableQuestWatcher == true then
-		AJM:JambaQuestWatchListUpdateButtonClicked()
+		--AJM:JambaQuestWatchListUpdateButtonClicked()
+		AJM:RemoveQuestsNotBeingWatched()
+		AJM:ScheduleTimer( "JambaQuestWatcherScenarioUpdate", 1, true )
 	end
 end


 function AJM:SCENARIO_CRITERIA_UPDATE( event, ... )
+	--AJM:Print("test3")
 	if AJM.db.enableQuestWatcher == true then
 		-- Wait a bit for the correct information to come through from the server...
-		AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, false )
+		--AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, false )
+		AJM:ScheduleTimer( "JambaQuestWatcherScenarioUpdate", 1, true )
 	end
 end

 function AJM:PLAYER_ENTERING_WORLD( event, ... )
+	--AJM:Print("test4")
 	if AJM.db.enableQuestWatcher == true then
-		AJM:JambaQuestWatchListUpdateButtonClicked()
+		AJM:RemoveQuestsNotBeingWatched()
+		AJM:ScheduleTimer( "JambaQuestWatcherScenarioUpdate", 1, false )
+		AJM:ScheduleTimer( "JambaQuestWatcherUpdate", 1, false )
+		--AJM:JambaQuestWatchListUpdateButtonClicked()
 	end
 end

@@ -1049,6 +1069,7 @@ end

 function AJM:DoQuestWatchListUpdate( characterName )
 	AJM:JambaQuestWatcherUpdate( false )
+	AJM:JambaQuestWatcherScenarioUpdate( false )
 end


@@ -1211,16 +1232,14 @@ end
 -- QUEST WATCH COMMUNICATION
 -------------------------------------------------------------------------------------------------------------
 --Ebony test
-
-function AJM:JambaQuestWatcherUpdate( useCache )
+function AJM:JambaQuestWatcherScenarioUpdate( useCache )
 	if AJM.db.enableQuestWatcher == false then
 		return
 	end
-	AJM:DebugMessage( "Sending quest watch information...")
 	-- Scenario information
 	local isInScenario = C_Scenario.IsInScenario()
 	if isInScenario == true then
-		local useCache = false
+		--local useCache = false
 		local scenarioName, currentStage, numStages, flags, _, _, _, xp, money = C_Scenario.GetInfo()
 		--AJM:Print("scenario", scenarioName, currentStage, numStages)
 			for StagesIndex = 1, currentStage do
@@ -1262,26 +1281,26 @@ function AJM:JambaQuestWatcherUpdate( useCache )
 				local criteriaString, criteriaType, completed, quantity, totalQuantity, flags, assetID, quantityString, criteriaID, duration, elapsed = C_Scenario.GetCriteriaInfo(criteriaIndex)
 		--AJM:Print("test", criteriaString, criteriaType, completed, quantity, totalQuantity )
 				--Ebony to fix a bug with character trial quest (this might be a blizzard bug) TODO relook at somepoint in beta.
-				if (criteriaString) then
-					local questID = 1001
-					local amountCompleted = tostring( quantity ).."/"..( totalQuantity )
-					--AJM:Print("Stages", numStages)
-					local name = nil
-						if (numStages) > 1 then
-							local textName = "Scenario:"..stageName.." "..currentStage.."/"..numStages
-							newName = textName
-						else
-							local textName = "Scenario:"..stageName
-							newName = textName
-						end
-					local name = newName
-						if (AJM:QuestCacheUpdate( questID, criteriaIndex, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
-						--AJM:Print("test", questID, name, criteriaIndex, criteriaString , amountCompleted , completed, completed)
-						AJM:JambaSendCommandToTeam( AJM.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, name, criteriaIndex, criteriaString , amountCompleted , completed, completed )						if AJM.db.sendProgressChatMessages == true then
-							if AJM.db.sendProgressChatMessages == true then
-							AJM:JambaSendMessageToTeam( AJM.db.messageArea, objectiveText.." "..amountCompleted, false )
+					if (criteriaString) then
+						local questID = 1001
+						local amountCompleted = tostring( quantity ).."/"..( totalQuantity )
+						--AJM:Print("Stages", numStages)
+						local name = nil
+							if (numStages) > 1 then
+								local textName = "Scenario:"..stageName.." "..currentStage.."/"..numStages
+								newName = textName
+							else
+								local textName = "Scenario:"..stageName
+								newName = textName
 							end
-						end
+							local name = newName
+							if (AJM:QuestCacheUpdate( questID, criteriaIndex, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
+							--AJM:Print("test", questID, name, criteriaIndex, criteriaString , amountCompleted , completed, completed)
+							AJM:JambaSendCommandToTeam( AJM.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, name, criteriaIndex, criteriaString , amountCompleted , completed, completed )						if AJM.db.sendProgressChatMessages == true then
+							--	if AJM.db.sendProgressChatMessages == true then
+							--	AJM:JambaSendMessageToTeam( AJM.db.messageArea, objectiveText.." "..amountCompleted, false )
+							--	end
+							end
 						end
 					end
 				end
@@ -1305,14 +1324,22 @@ function AJM:JambaQuestWatcherUpdate( useCache )
 	--AJM:Print("scenarioBouns", questID, name, criteriaIndexa, criteriaString , amountCompleted , totalQuantity, completed )
 					if (AJM:QuestCacheUpdate( questID, criteriaIndex, amountCompleted, objectiveFinished ) == true) or (useCache == false) then
 						AJM:JambaSendCommandToTeam( AJM.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE, questID, name, criteriaIndex, criteriaString , amountCompleted , completed, completed )
-						if AJM.db.sendProgressChatMessages == true then
-							AJM:JambaSendMessageToTeam( AJM.db.messageArea, objectiveText.." "..amountCompleted, false )
-						end
+						--if AJM.db.sendProgressChatMessages == true then
+						--	AJM:JambaSendMessageToTeam( AJM.db.messageArea, objectiveText.." "..amountCompleted, false )
+						--end
 					end
 				end
 			end
 		end
 	end
+end
+
+
+function AJM:JambaQuestWatcherUpdate( useCache )
+	if AJM.db.enableQuestWatcher == false then
+		return
+	end
+	AJM:DebugMessage( "Sending quest watch information...")
 	-- old wow quests system
 		for iterateWatchedQuests = 1, GetNumQuestWatches() do
 		--for iterateQuests = 1, GetNumQuestLogEntries() do
@@ -2207,25 +2234,27 @@ end

 -- A Jamba command has been recieved.
 function AJM:JambaOnCommandReceived( characterName, commandName, ... )
-	if commandName == AJM.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE then
-		AJM:DoQuestWatchObjectiveUpdate( characterName, ... )
-	end
-	if commandName == AJM.COMMAND_UPDATE_QUEST_WATCHER_LIST then
-		AJM:DoQuestWatchListUpdate( characterName, ... )
-	end
-	if commandName == AJM.COMMAND_QUEST_WATCH_REMOVE_QUEST then
-		AJM:DoRemoveQuestFromWatchList( characterName, ... )
-	end
-	if commandName == AJM.COMMAND_AUTO_QUEST_COMPLETE then
-		AJM:DoAutoQuestFieldComplete( characterName, ... )
-	end
-	if commandName == AJM.COMMAND_REMOVE_AUTO_QUEST_COMPLETE then
-		AJM:DoRemoveAutoQuestFieldComplete( characterName, ... )
-	end
-	if commandName == AJM.COMMAND_AUTO_QUEST_OFFER then
-		AJM:DoAutoQuestFieldOffer( characterName, ... )
-	end
+	--if characterName ~= AJM.characterName then
+		if commandName == AJM.COMMAND_QUEST_WATCH_OBJECTIVE_UPDATE then
+			AJM:DoQuestWatchObjectiveUpdate( characterName, ... )
+		end
+		if commandName == AJM.COMMAND_UPDATE_QUEST_WATCHER_LIST then
+			AJM:DoQuestWatchListUpdate( characterName, ... )
+		end
+		if commandName == AJM.COMMAND_QUEST_WATCH_REMOVE_QUEST then
+			AJM:DoRemoveQuestFromWatchList( characterName, ... )
+		end
+		if commandName == AJM.COMMAND_AUTO_QUEST_COMPLETE then
+			AJM:DoAutoQuestFieldComplete( characterName, ... )
+		end
+		if commandName == AJM.COMMAND_REMOVE_AUTO_QUEST_COMPLETE then
+			AJM:DoRemoveAutoQuestFieldComplete( characterName, ... )
+		end
+		if commandName == AJM.COMMAND_AUTO_QUEST_OFFER then
+			AJM:DoAutoQuestFieldOffer( characterName, ... )
+		end
+	--end
 end


-JambaApi.ClearAllQuests = ClearAllQuests
\ No newline at end of file
+JambaApi.ClearAllQuests = ClearAllQuests
diff --git a/Jamba-QuestWatcher/Locales/JambaQuestWatcher-Locale-enUS.lua b/Jamba-QuestWatcher/Locales/JambaQuestWatcher-Locale-enUS.lua
index fb9b25b..23a9d06 100644
--- a/Jamba-QuestWatcher/Locales/JambaQuestWatcher-Locale-enUS.lua
+++ b/Jamba-QuestWatcher/Locales/JambaQuestWatcher-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-QuestWatcher/Locales/Locales.xml b/Jamba-QuestWatcher/Locales/Locales.xml
index 53c26eb..5a048be 100644
--- a/Jamba-QuestWatcher/Locales/Locales.xml
+++ b/Jamba-QuestWatcher/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaQuestWatcher-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Sell/Jamba-Sell.toc b/Jamba-Sell/Jamba-Sell.toc
index aebca63..2cddcbe 100644
--- a/Jamba-Sell/Jamba-Sell.toc
+++ b/Jamba-Sell/Jamba-Sell.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaSell
 ## Notes: JambaSell
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Sell/JambaSell.lua b/Jamba-Sell/JambaSell.lua
index 451ca39..5408a54 100644
--- a/Jamba-Sell/JambaSell.lua
+++ b/Jamba-Sell/JambaSell.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Sell/Locales/JambaSell-Locale-enUS.lua b/Jamba-Sell/Locales/JambaSell-Locale-enUS.lua
index 7313003..9335066 100644
--- a/Jamba-Sell/Locales/JambaSell-Locale-enUS.lua
+++ b/Jamba-Sell/Locales/JambaSell-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Sell/Locales/Locales.xml b/Jamba-Sell/Locales/Locales.xml
index a74c300..de2c799 100644
--- a/Jamba-Sell/Locales/Locales.xml
+++ b/Jamba-Sell/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaSell-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Talk/Jamba-Talk.toc b/Jamba-Talk/Jamba-Talk.toc
index 0df5750..7d8fd75 100644
--- a/Jamba-Talk/Jamba-Talk.toc
+++ b/Jamba-Talk/Jamba-Talk.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaTalk
 ## Notes: JambaTalk
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Talk/JambaTalk.lua b/Jamba-Talk/JambaTalk.lua
index f2914db..eabff5d 100644
--- a/Jamba-Talk/JambaTalk.lua
+++ b/Jamba-Talk/JambaTalk.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -785,4 +785,4 @@ function AJM:JambaOnCommandReceived( characterName, commandName, ... )
 	if commandName == AJM.COMMAND_MESSAGE then
 		AJM:ProcessReceivedMessage( characterName, ... )
 	end
-end
\ No newline at end of file
+end
diff --git a/Jamba-Talk/Locales/JambaTalk-Locale-enUS.lua b/Jamba-Talk/Locales/JambaTalk-Locale-enUS.lua
index ac47052..068a91e 100644
--- a/Jamba-Talk/Locales/JambaTalk-Locale-enUS.lua
+++ b/Jamba-Talk/Locales/JambaTalk-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Talk/Locales/Locales.xml b/Jamba-Talk/Locales/Locales.xml
index c947bae..df18854 100644
--- a/Jamba-Talk/Locales/Locales.xml
+++ b/Jamba-Talk/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaTalk-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Target/Bindings.xml b/Jamba-Target/Bindings.xml
index c4b345c..2b1eedb 100644
--- a/Jamba-Target/Bindings.xml
+++ b/Jamba-Target/Bindings.xml
@@ -1,4 +1,4 @@
-<Bindings>
+<Bindings>

   <Binding name="JAMBATARGETMARK" header="JAMBA_TARGET" category="Jamba" runOnUp="true">
     JambaTargetMarkTargetKeyPress( keystate )
diff --git a/Jamba-Target/Jamba-Target.toc b/Jamba-Target/Jamba-Target.toc
index ba5458a..62a7b79 100644
--- a/Jamba-Target/Jamba-Target.toc
+++ b/Jamba-Target/Jamba-Target.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaTarget
 ## Notes: JambaTarget
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Target/JambaTarget.lua b/Jamba-Target/JambaTarget.lua
index 770f2ac..949ee0e 100644
--- a/Jamba-Target/JambaTarget.lua
+++ b/Jamba-Target/JambaTarget.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Target/Locales/JambaTarget-Locale-enUS.lua b/Jamba-Target/Locales/JambaTarget-Locale-enUS.lua
index d436452..7f5919d 100644
--- a/Jamba-Target/Locales/JambaTarget-Locale-enUS.lua
+++ b/Jamba-Target/Locales/JambaTarget-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -71,4 +71,4 @@ L["Background"] = true
 L["Background Colour"] = true
 L["Blizzard Tooltip"] = true
 L["Blizzard Dialog Background"] = true
-L["Scale"] = true
\ No newline at end of file
+L["Scale"] = true
diff --git a/Jamba-Target/Locales/Locales.xml b/Jamba-Target/Locales/Locales.xml
index d3bf55f..c4fd6e8 100644
--- a/Jamba-Target/Locales/Locales.xml
+++ b/Jamba-Target/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaTarget-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Taxi/Jamba-Taxi.toc b/Jamba-Taxi/Jamba-Taxi.toc
index 90088d1..9a49185 100644
--- a/Jamba-Taxi/Jamba-Taxi.toc
+++ b/Jamba-Taxi/Jamba-Taxi.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba-Taxi
 ## Notes: Jamba-Taxi
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Taxi/JambaTaxi.lua b/Jamba-Taxi/JambaTaxi.lua
index f687e3b..b52d5c1 100644
--- a/Jamba-Taxi/JambaTaxi.lua
+++ b/Jamba-Taxi/JambaTaxi.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -10,7 +10,8 @@ local AJM = LibStub( "AceAddon-3.0" ):NewAddon(
 	"JambaModule-1.0",
 	"AceConsole-3.0",
 	"AceEvent-3.0",
-	"AceHook-3.0"
+	"AceHook-3.0",
+	"AceTimer-3.0"
 )

 -- Get the Jamba Utilities Library.
@@ -30,6 +31,7 @@ AJM.settings = {
 	profile = {
 		takeMastersTaxi = true,
 		requestTaxiStop = true,
+		changeTexiTime = 5,
 		messageArea = JambaApi.DefaultMessageArea(),
 	},
 }
@@ -125,10 +127,15 @@ end
 function AJM:SettingsCreateTaxi( top )
 	local checkBoxHeight = JambaHelperSettings:GetCheckBoxHeight()
 	local left = JambaHelperSettings:LeftOfSettings()
+	local sliderHeight = JambaHelperSettings:GetSliderHeight()
 	local headingHeight = JambaHelperSettings:HeadingHeight()
+	local horizontalSpacing = JambaHelperSettings:GetHorizontalSpacing()
 	local headingWidth = JambaHelperSettings:HeadingWidth( false )
+	local halfWidthSlider = (headingWidth - horizontalSpacing) / 2
 	local dropdownHeight = JambaHelperSettings:GetDropdownHeight()
 	local verticalSpacing = JambaHelperSettings:GetVerticalSpacing()
+
+
 	local movingTop = top
 	JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Taxi Options"], movingTop, false )
 	movingTop = movingTop - headingHeight
@@ -137,8 +144,9 @@ function AJM:SettingsCreateTaxi( top )
 		headingWidth,
 		left,
 		movingTop,
-		L["Take Master's Taxi"],
-		AJM.SettingsToggleTakeTaxi
+		L["Take Teams Taxi"],
+		AJM.SettingsToggleTakeTaxi,
+		L["Take the same flight as the any team member (Other Team Members must have NPC Flight Master window open)."]
 	)
 	movingTop = movingTop - headingHeight
 	AJM.settingsControl.checkBoxrequestStop = JambaHelperSettings:CreateCheckBox(
@@ -149,7 +157,20 @@ function AJM:SettingsCreateTaxi( top )
 		L["Request Taxi Stop with Master"],
 		AJM.SettingsTogglerequestStop
 	)
-	movingTop = movingTop - checkBoxHeight
+	movingTop = movingTop - headingHeight
+	movingTop = movingTop - headingHeight
+	AJM.settingsControl.changeTexiTime = JambaHelperSettings:CreateSlider(
+		AJM.settingsControl,
+		halfWidthSlider,
+		left,
+		movingTop,
+		L["Clones To Take Taxi After Master"]
+	)
+	AJM.settingsControl.changeTexiTime:SetSliderValues( 0, 10, 1 )
+	AJM.settingsControl.changeTexiTime:SetCallback( "OnValueChanged", AJM.SettingsChangeTaxiTimer )
+
+	--movingTop = movingTop - halfWidthSlider
+	movingTop = movingTop - sliderHeight - verticalSpacing
 	AJM.settingsControl.dropdownMessageArea = JambaHelperSettings:CreateDropdown(
 		AJM.settingsControl,
 		headingWidth,
@@ -182,12 +203,21 @@ function AJM:SettingsTogglerequestStop( event, checked )
 	AJM.db.requestTaxiStop = checked
 	AJM:SettingsRefresh()
 end
+
+function AJM:SettingsChangeTaxiTimer( event, value )
+	AJM.db.changeTexiTime = tonumber( value )
+	AJM:SettingsRefresh()
+end
+
+
+
 -- Settings received.
 function AJM:JambaOnSettingsReceived( characterName, settings )
 	if characterName ~= AJM.characterName then
 		-- Update the settings.
 		AJM.db.takeMastersTaxi = settings.takeMastersTaxi
 		AJM.db.requestTaxiStop = settings.requestTaxiStop
+		AJM.db.changeTexiTime = settings.changeTexiTime
 		AJM.db.messageArea = settings.messageArea
 		-- Refresh the settings.
 		AJM:SettingsRefresh()
@@ -209,6 +239,7 @@ function AJM:SettingsRefresh()
 	AJM.settingsControl.checkBoxTakeMastersTaxi:SetValue( AJM.db.takeMastersTaxi )
 	AJM.settingsControl.checkBoxrequestStop:SetValue( AJM.db.requestTaxiStop )
 	AJM.settingsControl.dropdownMessageArea:SetValue( AJM.db.messageArea )
+	AJM.settingsControl.changeTexiTime:SetValue( AJM.db.changeTexiTime )
 end

 -------------------------------------------------------------------------------------------------------------
@@ -235,8 +266,9 @@ local function TakeTaxi( sender, nodeName )
 				AJM:SendMessage( AJM.MESSAGE_TAXI_TAKEN )
 				-- Take a taxi.
 				AJM.jambaTakesTaxi = true
-				GetNumRoutes( nodeIndex )
-				TakeTaxiNode( nodeIndex )
+				AJM:ScheduleTimer( "TakeTimedTaxi", AJM.db.changeTexiTime , nodeIndex )
+				--GetNumRoutes( nodeIndex )
+				--TakeTaxiNode( nodeIndex )
 			else
 				-- Tell the master that this character could not take the same flight.
 				AJM:JambaSendMessageToTeam( AJM.db.messageArea,  L["I am unable to fly to A."]( nodeName ), false )
@@ -245,6 +277,14 @@ local function TakeTaxi( sender, nodeName )
 	end
 end

+function AJM.TakeTimedTaxi( event, nodeIndex, ...)
+	if nodeIndex ~= nil then
+		GetNumRoutes( nodeIndex )
+		TakeTaxiNode( nodeIndex )
+	end
+end
+
+
 -- Called after the character has just taken a flight (hooked function).
 function AJM:TakeTaxiNode( taxiNodeIndex )
 	-- If the take masters taxi option is on.
@@ -312,4 +352,4 @@ function AJM:JambaOnCommandReceived( characterName, commandName, ... )
 end

 JambaApi.Taxi = {}
-JambaApi.Taxi.MESSAGE_TAXI_TAKEN = AJM.MESSAGE_TAXI_TAKEN
\ No newline at end of file
+JambaApi.Taxi.MESSAGE_TAXI_TAKEN = AJM.MESSAGE_TAXI_TAKEN
diff --git a/Jamba-Taxi/Locales/JambaTaxi-Locale-enUS.lua b/Jamba-Taxi/Locales/JambaTaxi-Locale-enUS.lua
index 82dcfd4..8ad147e 100644
--- a/Jamba-Taxi/Locales/JambaTaxi-Locale-enUS.lua
+++ b/Jamba-Taxi/Locales/JambaTaxi-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -9,9 +9,10 @@ L["Slash Commands"] = true
 L["Toon"] = true
 L["Taxi"] = true
 L["Taxi Options"] = true
-L["Take Master's Taxi"] = true
+L["Take Teams Taxi"] = true
 L["Request Taxi Stop with Master"] = true
-L["Take the same flight as the master did (minions's must have NPC Flight Master window open)."] = true
+L["Clones To Take Taxi After Master"] = true
+L["Take the same flight as the any team member (Other Team Members must have NPC Flight Master window open)."] = true
 L["Push Settings"] = true
 L["Push the taxi settings to all characters in the team."] = true
 L["I Have Requested a Stop From X"] = function( sender )
@@ -23,4 +24,4 @@ end
 L["I am unable to fly to A."] = function( nodename )
 	return "I am unable to fly to "..nodename.."."
 end
-L["Message Area"] = true
\ No newline at end of file
+L["Message Area"] = true
diff --git a/Jamba-Taxi/Locales/Locales.xml b/Jamba-Taxi/Locales/Locales.xml
index 3fe226a..cdccdd0 100644
--- a/Jamba-Taxi/Locales/Locales.xml
+++ b/Jamba-Taxi/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaTaxi-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Toon/Jamba-Toon.toc b/Jamba-Toon/Jamba-Toon.toc
index 1639862..eddd88b 100644
--- a/Jamba-Toon/Jamba-Toon.toc
+++ b/Jamba-Toon/Jamba-Toon.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaToon
 ## Notes: JambaToon
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Toon/JambaToon.lua b/Jamba-Toon/JambaToon.lua
index a59b322..aa87d0d 100644
--- a/Jamba-Toon/JambaToon.lua
+++ b/Jamba-Toon/JambaToon.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -1196,4 +1196,4 @@ function AJM:JambaOnCommandReceived( characterName, commandName, ... )
 	if commandName == AJM.COMMAND_SOUL_STONE then
 		AJM:doSoulStone()
 	end
-end
\ No newline at end of file
+end
diff --git a/Jamba-Toon/Locales/JambaToon-Locale-enUS.lua b/Jamba-Toon/Locales/JambaToon-Locale-enUS.lua
index 29bcd08..8106656 100644
--- a/Jamba-Toon/Locales/JambaToon-Locale-enUS.lua
+++ b/Jamba-Toon/Locales/JambaToon-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba-Toon/Locales/Locales.xml b/Jamba-Toon/Locales/Locales.xml
index 090b381..935b20b 100644
--- a/Jamba-Toon/Locales/Locales.xml
+++ b/Jamba-Toon/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaToon-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba-Trade/Jamba-Trade.toc b/Jamba-Trade/Jamba-Trade.toc
index 43ce6e0..cd1783c 100644
--- a/Jamba-Trade/Jamba-Trade.toc
+++ b/Jamba-Trade/Jamba-Trade.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: JambaTrade
 ## Notes: JambaTrade
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## X-Category: Interface Enhancements
 ## X-Child-Of: Jamba
 ## Dependencies: Jamba
diff --git a/Jamba-Trade/JambaTrade.lua b/Jamba-Trade/JambaTrade.lua
index 54492c8..6fa16b4 100644
--- a/Jamba-Trade/JambaTrade.lua
+++ b/Jamba-Trade/JambaTrade.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -634,6 +634,7 @@ function AJM:TRADE_SHOW( event, ... )
 	end
 end

+
 function AJM:TradeShowAdjustMoneyWithMaster()
 	if JambaApi.IsCharacterTheMaster( AJM.characterName ) == true then
 		return
@@ -645,8 +646,22 @@ function AJM:TradeShowAdjustMoneyWithMaster()
 		return
 	end
 	if moneyToDepositOrWithdraw > 0 then
-		PickupPlayerMoney( moneyToDepositOrWithdraw )
-		AddTradeMoney()
+		for index, character in JambaApi.TeamListOrderedOnline() do
+			--AJM:Print("Team", character )
+			local teamCharacterName = ( Ambiguate( character, "none" ) )
+			local tradePlayersName = GetUnitName("NPC")
+			if tradePlayersName == teamCharacterName then
+				--AJM:Print("found", tradePlayersName, teamCharacterName )
+				--PickupPlayerMoney( moneyToDepositOrWithdraw )
+				--GetCursorMoney()
+				--AddTradeMoney()
+				MoneyInputFrame_SetCopper(TradePlayerInputMoneyFrame, moneyToDepositOrWithdraw)
+				break
+			else
+				AJM:Print(tradePlayersName, "is not Member of the team, Will not trade Gold.")
+			end
+		end
+
 	end
 end

diff --git a/Jamba-Trade/Locales/JambaTrade-Locale-enUS.lua b/Jamba-Trade/Locales/JambaTrade-Locale-enUS.lua
index baf1318..bb5ef7c 100644
--- a/Jamba-Trade/Locales/JambaTrade-Locale-enUS.lua
+++ b/Jamba-Trade/Locales/JambaTrade-Locale-enUS.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -39,4 +39,4 @@ L["7. Heirloom (light yellow)"] = true
 L["Unknown"] = true
 L["Ignore Soulbound"] = true
 L["Trade Excess Gold To Master From Minion"] = true
-L["Amount Of Gold To Keep"] = true
\ No newline at end of file
+L["Amount Of Gold To Keep"] = true
diff --git a/Jamba-Trade/Locales/Locales.xml b/Jamba-Trade/Locales/Locales.xml
index 829dc16..e819376 100644
--- a/Jamba-Trade/Locales/Locales.xml
+++ b/Jamba-Trade/Locales/Locales.xml
@@ -1,9 +1,9 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

 <Ui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="http://www.blizzard.com/wow/ui/..\FrameXML\UI.xsd" xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file="JambaTrade-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/AceGUIContainer-JambaWindow.lua b/Jamba/AceGUIContainer-JambaWindow.lua
index 2906b35..7b8bc11 100644
--- a/Jamba/AceGUIContainer-JambaWindow.lua
+++ b/Jamba/AceGUIContainer-JambaWindow.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba4 - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License

 Changed to a Newer Ace3 By Ebony
diff --git a/Jamba/AceGUIWidget-JambaContinueLabel.lua b/Jamba/AceGUIWidget-JambaContinueLabel.lua
index f058da5..7be5993 100644
--- a/Jamba/AceGUIWidget-JambaContinueLabel.lua
+++ b/Jamba/AceGUIWidget-JambaContinueLabel.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License


diff --git a/Jamba/AceGUIWidget-JambaNormalLabel.lua b/Jamba/AceGUIWidget-JambaNormalLabel.lua
index 91d1fb1..ab55d07 100644
--- a/Jamba/AceGUIWidget-JambaNormalLabel.lua
+++ b/Jamba/AceGUIWidget-JambaNormalLabel.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller

 License: The MIT License
 ]]--
diff --git a/Jamba/Bindings.xml b/Jamba/Bindings.xml
index ff51a3e..017fcf7 100644
--- a/Jamba/Bindings.xml
+++ b/Jamba/Bindings.xml
@@ -1,6 +1,6 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 -->

diff --git a/Jamba/CHANGELOG.txt b/Jamba/CHANGELOG.txt
index 0c71037..deb27b6 100644
--- a/Jamba/CHANGELOG.txt
+++ b/Jamba/CHANGELOG.txt
@@ -1,8 +1,180 @@
 ---------------------------
 ChangeLogs:
 ---------------------------
+Jamba Version: 5.1.7
+WoW Game Version: 7.1.5
+File Version: 7.1.5-5.1.7
+Release Date: 25/1/2017
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade, Mount
+
+
+*Jamba-Core
+    - Updated Copyright Dates To 2017 -- Happy New Year!
+
+*Jamba-Taxi
+	- Added a timmer/delay to help with sharding. see http://www.dual-boxing.com/threads/53568-Jamba-Fight-Master-Change-5-2-x
+	- Added A Slider to set the dayly of the the Fightmater set to 0 to disable.
+
+*Jamba-Mount
+	- Should now work with Mounts it did not before. Thanks to zinkala on curse for the fix.
+
+*Jamba-TeamDisplay
+	- Currency should work agian in tooltips (Set From In Game Currency Backback box.)
+
+
+---------------------------
+Jamba Version: 5.1.6
+WoW Game Version: 7.1.0
+File Version: 7.1.0-5.1.6
+Release Date: 21/12/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade, Mount
+
+*Jamba-Core
+ 	- Updated Libaction button to 0.28.2
+
+*Jamba-Display-Team
+	- Fixed Players level on tooltip
+
+*Jamba-item-bar
+	- Fixed a bug in the code that was making a Lua-Error.
+
+
+
+---------------------------
+Jamba Version: 5.1.4/5
+WoW Game Version: 7.1.0
+File Version: 7.1.0-5.1.4
+Release Date: 11/11/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade, Mount
+
+*jamba-Item-Use
+	- Now uses blizzard code to scan tooltips.
+	- Removed LibGratuity
+	- Update Artifact is now a tooltip and a button that only say's "clear" to clear up space. (for wubsie ;) The size of two buttons.)
+	- Added a Auto add Satchel Items (items you can open, Blizzard-Devs seems to love them!)
+
+
+---------------------------
+Jamba Version: 5.1.2/3
+WoW Game Version: 7.1.0
+File Version: 7.1.0-5.1.2
+Release Date: 28/10/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade, Mount
+
+*Jamba-currency
+	- Added Curious Coin to DataBase
+
+*jamba-Item-use
+	- The clear button should now work on all team members and not just master
+	- Fixed a bug that was stop quest items auto getting removed.
+	- No Longer Shows Update Button if you truned off auto add of artifact power.
+
+*Jamba-Display-Team
+	-Fixed a API bug that was getting nil when entering phased zones.
+
+---------------------------
+Jamba Version: 5.1.0
+WoW Game Version: 7.1.0
+File Version: 7.1.0-5.1.0
+Release Date: 26/10/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade, Mount
+
+*jamba-core
+	- Updated for patch 7.1
+
+
+*Jamba-Item-Use
+	- Now Adds Artifact Power Items to the jamba Item_Use bar.
+	- Added a Button to remove all artifact items, nolonger updates on its own*
+		* Developer note: This auto update was not working great with Clones not having the same item.
+	- Nolonger adds quest items that starts quests, Quests was changed to Auto-Pickup quests in WoW-7.0.3.
+
+
+*jamba-team
+	- Added Jamba Tag Invite, /jamba-team inviteTag <tag> (for use to make two partys of five. or party of the same class etc.)
+	- Should not convent to raid if using more then 5 players and using a small tag party
+
+*Jamba-team display
+	- ToolTip has Currency Back! To set Currency use the show BackPack setting in the Currency Tab.
+	- Added a New option to olny show the Display-Team in when in a party/raid.
+	- Should now updated Team HP/Mana When you join a party.
+	- Should now updated Artifact XP power when you change spec.
+
+*Jamba-Mount* Beta-c
+	- New Module
+	- Mounts and dismounts with the team.
+	- Holding Shift key down will stop the minions from mounting. - BetaE
+	- Added a Option for minions to dismount olny if the master dismounts. -BetaE
+	- Holding Shift key down will stop the minions dismounting
+
+*Jamba-follow
+	- nolonger warns if a passenger in a vehicle. (When you mount a 2 seater mount.)
+
+*Jamba-Quest*
+	- Now forwards quest Unignore and Ignore to the team.
+
+---------------------------
+Jamba Version: 5.0.4
+WoW Game Version: 7.0.3
+File Version: 7.0.3-5.0.4
+Release Date: 11/09/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade
+
+
+*Jamba-Quest-Tracker
+ - Now Should always hide Blizzard's objective Tracker when using ElvUI Shadow & Light.
+
+*Jamba-Trade
+ - No longer trade Excess Gold with players that are not team members.
+ - Now Shows the Gold in the Edit box when tradeing gold on minions.
+
+*Jamba-Team
+ -Removed Some Debug code.
+
+
+
+
+---------------------------
+
+Jamba Version: 5.0.3
+WoW Game Version: 7.0.3
+File Version: 7.0.3-5.0.3
+Release Date: 10/08/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade
+
+
+*Jamba-Quest-Tracker
+ - No Longer makes the Communications Lag.
+
+
+
+---------------------------
+Jamba Version: 5.0.2
+WoW Game Version: 7.0.3
+File Version: 7.0.3-5.0.2
+Release Date: 28/07/2016
+Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade
+
+*Jamba-core
+	- Updated Ace3 to the newest and lastest
+
+*Jamba-Quest-Tracker
+	-No Longer Spams Quest objective Text.
+
+*Jamba-Display-Team
+	-Will Now Send Font Size with team settings.
+
+Jamba-Toon
+	- no longer not show gold,Silver or copper icons.
+
+
+
+---------------------------
+ChangeLogs:
+---------------------------
 Jamba Version: 5.0.1
 WoW Game Version: 7.0.3
+File Version: 7.0.3-5.0.1
 Release Date: 19/07/2016
 Modules: AdvancedLoot, Core, Display-Team, Follow, FTL, ItemUse, Macro, Purchase, Quest, Sell, Talk, Target, Taxi, Toon, Curr, Trade

@@ -70,7 +242,8 @@ Initial Legion Release.
         - Gold of the minion.
         - Mail if the minion has mail and who it is from (Same as minimap)
     - Tooltip should no longer show in combat.
-    - Removed the old Display Bag Space Bar added to tooltips
+    - Tooltip now shows character name if name is hidden on the bar.
+	- Removed the old Display Bag Space Bar added to tooltips
     - Renamed "Combo PointBar" to "Class Power Bar"
         - Added Support for Other class Power
             -Warlocks - Soul Shards
diff --git a/Jamba/Jamba.toc b/Jamba/Jamba.toc
index 3572ec1..0f450ae 100644
--- a/Jamba/Jamba.toc
+++ b/Jamba/Jamba.toc
@@ -1,8 +1,8 @@
-## Interface: 70000
+## Interface: 70100
 ## Title: Jamba
 ## Notes: Jamba
 ## Author: Ebony, Former Author: Jafula
-## Version: 7.0.3-5.0
+## Version: 7.1.5-5.1.7
 ## SavedVariables: JambaCoreProfileDB, JambaCommunicationsProfileDB, JambaTeamProfileDB, JambaTagProfileDB, JambaMessageProfileDB
 JambaEmbeds.xml
 JambaUtilities.lua
diff --git a/Jamba/JambaCommunications.lua b/Jamba/JambaCommunications.lua
index 8ccf3dc..78509b1 100644
--- a/Jamba/JambaCommunications.lua
+++ b/Jamba/JambaCommunications.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller


 License: The MIT License
diff --git a/Jamba/JambaCore.lua b/Jamba/JambaCore.lua
index 3e23291..4a74c64 100644
--- a/Jamba/JambaCore.lua
+++ b/Jamba/JambaCore.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License


@@ -824,4 +824,4 @@ JambaPrivate.Core.SendCommandToMaster = SendCommandToMaster
 JambaPrivate.Core.SendCommandToToon = SendCommandToToon
 -- TODO: Remove send command to minions?
 --JambaPrivate.Core.SendCommandToMinions = SendCommandToMinions
-JambaPrivate.Core.OnCommandReceived = OnCommandReceived
\ No newline at end of file
+JambaPrivate.Core.OnCommandReceived = OnCommandReceived
diff --git a/Jamba/JambaEmbeds.xml b/Jamba/JambaEmbeds.xml
index eb2a6de..0f2ee8c 100644
--- a/Jamba/JambaEmbeds.xml
+++ b/Jamba/JambaEmbeds.xml
@@ -1,6 +1,6 @@
 <!--
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 http://jafula.com/jamba/
 -->
@@ -36,4 +36,4 @@ http://jafula.com/jamba/
 	<Include file="AceGUIWidget-JambaNormalLabel.lua" />
 	<Include file="AceGUIWidget-JambaContinueLabel.lua" />
 	<Include file="AceGUIWidget-JambaKeybinding.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/JambaHelperSettings.lua b/Jamba/JambaHelperSettings.lua
index 3f34930..a88306d 100644
--- a/Jamba/JambaHelperSettings.lua
+++ b/Jamba/JambaHelperSettings.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller


 License: The MIT License
diff --git a/Jamba/JambaMessage.lua b/Jamba/JambaMessage.lua
index 4d84ada..3cac3d0 100644
--- a/Jamba/JambaMessage.lua
+++ b/Jamba/JambaMessage.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller


 License: The MIT License
@@ -1033,4 +1033,4 @@ JambaPrivate.Message.SendMessage = SendMessage
 JambaApi.MessageAreaList = MessageAreaList
 JambaApi.DefaultMessageArea = DefaultMessageArea
 JambaApi.DefaultWarningArea = DefaultWarningArea
-JambaApi.MESSAGE_MESSAGE_AREAS_CHANGED = AJM.MESSAGE_MESSAGE_AREAS_CHANGED
\ No newline at end of file
+JambaApi.MESSAGE_MESSAGE_AREAS_CHANGED = AJM.MESSAGE_MESSAGE_AREAS_CHANGED
diff --git a/Jamba/JambaModule.lua b/Jamba/JambaModule.lua
index a95fc1c..35ee227 100644
--- a/Jamba/JambaModule.lua
+++ b/Jamba/JambaModule.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

diff --git a/Jamba/JambaStartupMessage.xml b/Jamba/JambaStartupMessage.xml
index c6c9507..db4cbfb 100644
--- a/Jamba/JambaStartupMessage.xml
+++ b/Jamba/JambaStartupMessage.xml
@@ -79,4 +79,4 @@
             </Button>
         </Frames>
     </Frame>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/JambaTag.lua b/Jamba/JambaTag.lua
index d50ac39..56210e6 100644
--- a/Jamba/JambaTag.lua
+++ b/Jamba/JambaTag.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License


@@ -765,4 +765,4 @@ JambaApi.AllTagsList = AllTagsList
 JambaApi.AllTagsListIterator = AllTagsListIterator
 JambaApi.DoesCharacterHaveTag = DoesCharacterHaveTag
 JambaApi.IsAValidTag = IsAValidTag
-JambaApi.GetCharacterWithTag = GetCharacterWithTag
\ No newline at end of file
+JambaApi.GetCharacterWithTag = GetCharacterWithTag
diff --git a/Jamba/JambaTeam.lua b/Jamba/JambaTeam.lua
index 99e8dba..e0c8864 100644
--- a/Jamba/JambaTeam.lua
+++ b/Jamba/JambaTeam.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller


 License: The MIT License
@@ -106,7 +106,15 @@ function AJM:GetConfiguration()
 				usage = "/jamba-team invite",
 				get = false,
 				set = "InviteTeamToParty",
-			},
+			},
+			inviteTag = {
+				type = "input",
+				name = L["Invites"],
+				desc = L["Invite team members to a <tag> party."],
+				usage = "/jamba-team invite <tag>",
+				get = false,
+				set = "InviteTeamToPartys",
+			},
 			disband = {
 				type = "input",
 				name = L["Disband"],
@@ -168,6 +176,7 @@ AJM.orderedCharactersOnline = {}
 -- Command this module sends.
 -------------------------------------------------------------------------------------------------------------

+AJM.COMMAND_TAG_PARTY = "JambaTeamTagGroup"
 -- Leave party command.
 AJM.COMMAND_LEAVE_PARTY = "JambaTeamLeaveGroup"
 -- Set master command.
@@ -176,6 +185,7 @@ AJM.COMMAND_SET_MASTER = "JambaTeamSetMaster"
 AJM.COMMAND_SET_OFFLINE = "JambaTeamSetOffline"
 AJM.COMMAND_SET_ONLINE = "JambaTeamSetOnline"

+
 -------------------------------------------------------------------------------------------------------------
 -- Messages module sends.
 -------------------------------------------------------------------------------------------------------------
@@ -1059,7 +1069,8 @@ function AJM.DoTeamPartyInvite()
 	InviteUnit( AJM.inviteList[AJM.currentInviteCount] )
 	AJM.currentInviteCount = AJM.currentInviteCount + 1
 	if AJM.currentInviteCount < AJM.inviteCount then
-		if GetTeamListMaximumOrderOnline() > 5 and AJM.db.inviteConvertToRaid == true then
+		--if GetTeamListMaximumOrderOnline() > 5 and AJM.db.inviteConvertToRaid == true then
+		if AJM.inviteCount > 5 and AJM.db.inviteConvertToRaid == true then
 		ConvertToRaid()
 		end
 		AJM:ScheduleTimer( "DoTeamPartyInvite", 0.5 )
@@ -1070,6 +1081,55 @@ function AJM.DoTeamPartyInvite()
 	end
 end

+function AJM:InviteTeamToPartys( info, tag )
+	-- Iterate each enabled member and invite them to a group.
+	if tag == nil then
+	return
+	end
+	if JambaPrivate.Tag.DoesCharacterHaveTag( AJM.characterName, tag ) == false then
+		--AJM:Print("IDONOTHAVETAG", tag)
+		for index, characterName in TeamListOrdered() do
+			--AJM:Print("NextChartohavetag", tag, characterName )
+			if JambaPrivate.Tag.DoesCharacterHaveTag( characterName, tag ) then
+				--AJM:Print("i have tag", tag, characterName )
+				AJM:JambaSendCommandToTeam( AJM.COMMAND_TAG_PARTY, characterName, tag )
+				break
+			end
+		end
+		return
+	else
+		AJM.inviteList = {}
+		AJM.inviteCount = 0
+		for index, characterName in TeamListOrdered() do
+			if GetCharacterOnlineStatus( characterName ) == true then
+				--AJM:Print("test", characterName, tag )
+				if JambaPrivate.Tag.DoesCharacterHaveTag( characterName, tag ) then
+					--AJM:Print("HasTag", characterName, tag )
+					-- As long as they are not the player doing the inviting.
+					if characterName ~= AJM.characterName then
+						AJM.inviteList[AJM.inviteCount] = characterName
+						AJM.inviteCount = AJM.inviteCount + 1
+					end
+				end
+			end
+		end
+	end
+	AJM.currentInviteCount = 0
+	AJM:ScheduleTimer( "DoTeamPartyInvite", 0.5 )
+end
+
+function AJM:TagParty(test, characterName, tag, ...)
+	--AJM:Print("test", characterName, tag )
+	if AJM.characterName == characterName then
+	 --AJM:Print("this msg is for me", characterName )
+		if JambaPrivate.Tag.DoesCharacterHaveTag( AJM.characterName, tag ) then
+			AJM:InviteTeamToPartys( nil, tag)
+		else
+			return
+		end
+	 end
+end
+
 function AJM:PLAYER_FOCUS_CHANGED()
 	-- Change master on focus change option enabled?
 	if AJM.db.focusChangeSetMaster == true then
@@ -1154,7 +1214,7 @@ end


 function AJM:PARTY_INVITE_REQUEST( event, inviter, ... )
-	AJM:Print("Inviter", inviter)
+	--AJM:Print("Inviter", inviter)
 	-- Accept this invite, initially no.
 	local acceptInvite = false
 	-- Is character not in a group?
@@ -1698,6 +1758,11 @@ function AJM:JambaOnCommandReceived( sender, commandName, ... )
 			AJM.ReceivesetOnline( ... )
 		end
 	end
+	if commandName == AJM.COMMAND_TAG_PARTY then
+		if IsCharacterInTeam( sender ) == true then
+			AJM.TagParty( characterName, tag, ... )
+		end
+	end
 end

 -- Functions available from Jamba Team for other Jamba internal objects.
@@ -1740,4 +1805,4 @@ JambaApi.setOffline = setOffline
 JambaApi.setOnline = setOnline
 JambaApi.GetTeamListMaximumOrderOnline = GetTeamListMaximumOrderOnline
 JambaApi.TeamListOrderedOnline = TeamListOrderedOnline
-JambaApi.GetPositionForCharacterNameOnline = GetPositionForCharacterNameOnline
\ No newline at end of file
+JambaApi.GetPositionForCharacterNameOnline = GetPositionForCharacterNameOnline
diff --git a/Jamba/JambaUtilities.lua b/Jamba/JambaUtilities.lua
index bbf23de..8154374 100644
--- a/Jamba/JambaUtilities.lua
+++ b/Jamba/JambaUtilities.lua
@@ -1,6 +1,6 @@
 --[[
 Jamba - Jafula's Awesome Multi-Boxer Assistant
-Copyright 2008 - 2016 Michael "Jafula" Miller
+Copyright 2008 - 2017 Michael "Jafula" Miller
 License: The MIT License
 ]]--

@@ -201,4 +201,4 @@ end



-
\ No newline at end of file
+
diff --git a/Jamba/LICENSE b/Jamba/LICENSE
index 1975f7b..46eaad7 100644
--- a/Jamba/LICENSE
+++ b/Jamba/LICENSE
@@ -1,6 +1,6 @@
 The MIT License (MIT)

-Copyright (c) 2008-2016  Michael "Jafula" Miller
+Copyright (c) 2008-2017  Michael "Jafula" Miller

 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/Jamba/LibActionButtonJamba-1.0-57.lua b/Jamba/LibActionButtonJamba-1.0-57.lua
new file mode 100644
index 0000000..aa883b4
--- /dev/null
+++ b/Jamba/LibActionButtonJamba-1.0-57.lua
@@ -0,0 +1,1576 @@
+--[[
+Copyright (c) 2010-2017, Hendrik "nevcairiel" Leppkes <h.leppkes@gmail.com>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of the developer nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+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.
+
+]]
+local MAJOR_VERSION = "LibActionButtonJamba-1.0"
+local MINOR_VERSION = 57
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+-- Lua functions
+local _G = _G
+local type, error, tostring, tonumber, assert, select = type, error, tostring, tonumber, assert, select
+local setmetatable, wipe, unpack, pairs, next = setmetatable, wipe, unpack, pairs, next
+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
+
+local KeyBound = LibStub("LibKeyBound-1.0", true)
+local CBH = LibStub("CallbackHandler-1.0")
+
+lib.eventFrame = lib.eventFrame or CreateFrame("Frame")
+lib.eventFrame:UnregisterAllEvents()
+
+lib.buttonRegistry = lib.buttonRegistry or {}
+lib.activeButtons = lib.activeButtons or {}
+lib.actionButtons = lib.actionButtons or {}
+lib.nonActionButtons = lib.nonActionButtons or {}
+
+lib.unusedOverlayGlows = lib.unusedOverlayGlows or {}
+lib.numOverlays = lib.numOverlays or 0
+
+lib.ACTION_HIGHLIGHT_MARKS = lib.ACTION_HIGHLIGHT_MARKS or setmetatable({}, { __index = ACTION_HIGHLIGHT_MARKS })
+
+lib.callbacks = lib.callbacks or CBH:New(lib)
+
+local Generic = CreateFrame("CheckButton")
+local Generic_MT = {__index = Generic}
+
+local Action = setmetatable({}, {__index = Generic})
+local Action_MT = {__index = Action}
+
+local PetAction = setmetatable({}, {__index = Generic})
+local PetAction_MT = {__index = PetAction}
+
+local Spell = setmetatable({}, {__index = Generic})
+local Spell_MT = {__index = Spell}
+
+local Item = setmetatable({}, {__index = Generic})
+local Item_MT = {__index = Item}
+
+local Macro = setmetatable({}, {__index = Generic})
+local Macro_MT = {__index = Macro}
+
+local Custom = setmetatable({}, {__index = Generic})
+local Custom_MT = {__index = Custom}
+
+local type_meta_map = {
+	empty  = Generic_MT,
+	action = Action_MT,
+	--pet    = PetAction_MT,
+	spell  = Spell_MT,
+	item   = Item_MT,
+	macro  = Macro_MT,
+	custom = Custom_MT
+}
+
+local ButtonRegistry, ActiveButtons, ActionButtons, NonActionButtons = lib.buttonRegistry, lib.activeButtons, lib.actionButtons, lib.nonActionButtons
+
+local Update, UpdateButtonState, UpdateUsable, UpdateCount, UpdateCooldown, UpdateTooltip, UpdateNewAction
+local StartFlash, StopFlash, UpdateFlash, UpdateHotkeys, UpdateRangeTimer, UpdateOverlayGlow
+local UpdateFlyout, ShowGrid, HideGrid, UpdateGrid, SetupSecureSnippets, WrapOnClick
+local ShowOverlayGlow, HideOverlayGlow, GetOverlayGlow, OverlayGlowAnimOutFinished
+local HookCooldown
+
+local InitializeEventHandler, OnEvent, ForAllButtons, OnUpdate
+
+local DefaultConfig = {
+	outOfRangeColoring = "button",
+	tooltip = "enabled",
+	showGrid = false,
+	colors = {
+		range = { 0.8, 0.1, 0.1 },
+		mana = { 0.5, 0.5, 1.0 }
+	},
+	hideElements = {
+		macro = false,
+		hotkey = false,
+		equipped = false,
+	},
+	keyBoundTarget = false,
+	clickOnDown = false,
+	flyoutDirection = "UP",
+}
+
+--- Create a new action button.
+-- @param id Internal id of the button (not used by LibActionButton-1.0, only for tracking inside the calling addon)
+-- @param name Name of the button frame to be created (not used by LibActionButton-1.0 aside from naming the frame)
+-- @param header Header that drives these action buttons (if any)
+function lib:CreateButton(id, name, header, config)
+	if type(name) ~= "string" then
+		error("Usage: CreateButton(id, name. header): Buttons must have a valid name!", 2)
+	end
+	if not header then
+		error("Usage: CreateButton(id, name, header): Buttons without a secure header are not yet supported!", 2)
+	end
+
+	if not KeyBound then
+		KeyBound = LibStub("LibKeyBound-1.0", true)
+	end
+
+	local button = setmetatable(CreateFrame("CheckButton", name, header, "SecureActionButtonTemplate, ActionButtonTemplate"), Generic_MT)
+	button:RegisterForDrag("LeftButton", "RightButton")
+	button:RegisterForClicks("AnyUp")
+
+	-- Frame Scripts
+	button:SetScript("OnEnter", Generic.OnEnter)
+	button:SetScript("OnLeave", Generic.OnLeave)
+	button:SetScript("PreClick", Generic.PreClick)
+	button:SetScript("PostClick", Generic.PostClick)
+
+	button.id = id
+	button.header = header
+	-- Mapping of state -> action
+	button.state_types = {}
+	button.state_actions = {}
+
+	-- Store the LAB Version that created this button for debugging
+	button.__LAB_Version = MINOR_VERSION
+
+	-- just in case we're not run by a header, default to state 0
+	button:SetAttribute("state", 0)
+
+	SetupSecureSnippets(button)
+	WrapOnClick(button)
+
+	-- adjust hotkey style for better readability
+	button.HotKey:SetFont(button.HotKey:GetFont(), 13, "OUTLINE")
+	button.HotKey:SetVertexColor(0.75, 0.75, 0.75)
+
+	-- adjust count/stack size
+	button.Count:SetFont(button.Count:GetFont(), 16, "OUTLINE")
+
+	-- hook Cooldown stuff for alpha fix in 6.0
+	HookCooldown(button)
+
+	-- Store the button in the registry, needed for event and OnUpdate handling
+	if not next(ButtonRegistry) then
+		InitializeEventHandler()
+	end
+	ButtonRegistry[button] = true
+
+	button:UpdateConfig(config)
+
+	-- run an initial update
+	button:UpdateAction()
+	UpdateHotkeys(button)
+
+	-- somewhat of a hack for the Flyout buttons to not error.
+	button.action = 0
+
+	lib.callbacks:Fire("OnButtonCreated", button)
+
+	return button
+end
+
+function SetupSecureSnippets(button)
+	button:SetAttribute("_custom", Custom.RunCustom)
+	-- secure UpdateState(self, state)
+	-- update the type and action of the button based on the state
+	button:SetAttribute("UpdateState", [[
+		local state = ...
+		self:SetAttribute("state", state)
+		local type, action = (self:GetAttribute(format("labtype-%s", state)) or "empty"), self:GetAttribute(format("labaction-%s", state))
+
+		self:SetAttribute("type", type)
+		if type ~= "empty" and type ~= "custom" then
+			local action_field = (type == "pet") and "action" or type
+			self:SetAttribute(action_field, action)
+			self:SetAttribute("action_field", action_field)
+		end
+		local onStateChanged = self:GetAttribute("OnStateChanged")
+		if onStateChanged then
+			self:Run(onStateChanged, state, type, action)
+		end
+	]])
+
+	-- this function is invoked by the header when the state changes
+	button:SetAttribute("_childupdate-state", [[
+		self:RunAttribute("UpdateState", message)
+		self:CallMethod("UpdateAction")
+	]])
+
+	-- secure PickupButton(self, kind, value, ...)
+	-- utility function to place a object on the cursor
+	button:SetAttribute("PickupButton", [[
+		local kind, value = ...
+		if kind == "empty" then
+			return "clear"
+		elseif kind == "action" or kind == "pet" then
+			local actionType = (kind == "pet") and "petaction" or kind
+			return actionType, value
+		elseif kind == "spell" or kind == "item" or kind == "macro" then
+			return "clear", kind, value
+		else
+			print("LibActionButton-1.0: Unknown type: " .. tostring(kind))
+			return false
+		end
+	]])
+
+	button:SetAttribute("OnDragStart", [[
+		if (self:GetAttribute("buttonlock") and not IsModifiedClick("PICKUPACTION")) or self:GetAttribute("LABdisableDragNDrop") then return false end
+		local state = self:GetAttribute("state")
+		local type = self:GetAttribute("type")
+		-- if the button is empty, we can't drag anything off it
+		if type == "empty" or type == "custom" then
+			return false
+		end
+		-- Get the value for the action attribute
+		local action_field = self:GetAttribute("action_field")
+		local action = self:GetAttribute(action_field)
+
+		-- non-action fields need to change their type to empty
+		if type ~= "action" and type ~= "pet" then
+			self:SetAttribute(format("labtype-%s", state), "empty")
+			self:SetAttribute(format("labaction-%s", state), nil)
+			-- update internal state
+			self:RunAttribute("UpdateState", state)
+			-- send a notification to the insecure code
+			self:CallMethod("ButtonContentsChanged", state, "empty", nil)
+		end
+		-- return the button contents for pickup
+		return self:RunAttribute("PickupButton", type, action)
+	]])
+
+	button:SetAttribute("OnReceiveDrag", [[
+		if self:GetAttribute("LABdisableDragNDrop") then return false end
+		local kind, value, subtype, extra = ...
+		if not kind or not value then return false end
+		local state = self:GetAttribute("state")
+		local buttonType, buttonAction = self:GetAttribute("type"), nil
+		if buttonType == "custom" then return false end
+		-- action buttons can do their magic themself
+		-- for all other buttons, we'll need to update the content now
+		if buttonType ~= "action" and buttonType ~= "pet" then
+			-- with "spell" types, the 4th value contains the actual spell id
+			if kind == "spell" then
+				if extra then
+					value = extra
+				else
+					print("no spell id?", ...)
+				end
+			elseif kind == "item" and value then
+				value = format("item:%d", value)
+			end
+
+			-- Get the action that was on the button before
+			if buttonType ~= "empty" then
+				buttonAction = self:GetAttribute(self:GetAttribute("action_field"))
+			end
+
+			-- TODO: validate what kind of action is being fed in here
+			-- We can only use a handful of the possible things on the cursor
+			-- return false for all those we can't put on buttons
+
+			self:SetAttribute(format("labtype-%s", state), kind)
+			self:SetAttribute(format("labaction-%s", state), value)
+			-- update internal state
+			self:RunAttribute("UpdateState", state)
+			-- send a notification to the insecure code
+			self:CallMethod("ButtonContentsChanged", state, kind, value)
+		else
+			-- get the action for (pet-)action buttons
+			buttonAction = self:GetAttribute("action")
+		end
+		return self:RunAttribute("PickupButton", buttonType, buttonAction)
+	]])
+
+	button:SetScript("OnDragStart", nil)
+	-- Wrapped OnDragStart(self, button, kind, value, ...)
+	button.header:WrapScript(button, "OnDragStart", [[
+		return self:RunAttribute("OnDragStart")
+	]])
+	-- Wrap twice, because the post-script is not run when the pre-script causes a pickup (doh)
+	-- we also need some phony message, or it won't work =/
+	button.header:WrapScript(button, "OnDragStart", [[
+		return "message", "update"
+	]], [[
+		self:RunAttribute("UpdateState", self:GetAttribute("state"))
+	]])
+
+	button:SetScript("OnReceiveDrag", nil)
+	-- Wrapped OnReceiveDrag(self, button, kind, value, ...)
+	button.header:WrapScript(button, "OnReceiveDrag", [[
+		return self:RunAttribute("OnReceiveDrag", kind, value, ...)
+	]])
+	-- Wrap twice, because the post-script is not run when the pre-script causes a pickup (doh)
+	-- we also need some phony message, or it won't work =/
+	button.header:WrapScript(button, "OnReceiveDrag", [[
+		return "message", "update"
+	]], [[
+		self:RunAttribute("UpdateState", self:GetAttribute("state"))
+	]])
+end
+
+function WrapOnClick(button)
+	-- Wrap OnClick, to catch changes to actions that are applied with a click on the button.
+	button.header:WrapScript(button, "OnClick", [[
+		if self:GetAttribute("type") == "action" then
+			local type, action = GetActionInfo(self:GetAttribute("action"))
+			return nil, format("%s|%s", tostring(type), tostring(action))
+		end
+	]], [[
+		local type, action = GetActionInfo(self:GetAttribute("action"))
+		if message ~= format("%s|%s", tostring(type), tostring(action)) then
+			self:RunAttribute("UpdateState", self:GetAttribute("state"))
+		end
+	]])
+end
+
+-----------------------------------------------------------
+--- utility
+
+function lib:GetAllButtons()
+	local buttons = {}
+	for button in next, ButtonRegistry do
+		buttons[button] = true
+	end
+	return buttons
+end
+
+function Generic:ClearSetPoint(...)
+	self:ClearAllPoints()
+	self:SetPoint(...)
+end
+
+function Generic:NewHeader(header)
+	self.header = header
+	self:SetParent(header)
+	SetupSecureSnippets(self)
+	WrapOnClick(self)
+end
+
+
+-----------------------------------------------------------
+--- state management
+
+function Generic:ClearStates()
+	for state in pairs(self.state_types) do
+		self:SetAttribute(format("labtype-%s", state), nil)
+		self:SetAttribute(format("labaction-%s", state), nil)
+	end
+	wipe(self.state_types)
+	wipe(self.state_actions)
+end
+
+function Generic:SetState(state, kind, action)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	-- we allow a nil kind for setting a empty state
+	if not kind then kind = "empty" end
+	if not type_meta_map[kind] then
+		error("SetStateAction: unknown action type: " .. tostring(kind), 2)
+	end
+	if kind ~= "empty" and action == nil then
+		error("SetStateAction: an action is required for non-empty states", 2)
+	end
+	if kind ~= "custom" and action ~= nil and type(action) ~= "number" and type(action) ~= "string" or (kind == "custom" and type(action) ~= "table") then
+		error("SetStateAction: invalid action data type, only strings and numbers allowed", 2)
+	end
+
+	if kind == "item" then
+		if tonumber(action) then
+			action = format("item:%s", action)
+		else
+			local itemString = str_match(action, "^|c%x+|H(item[%d:]+)|h%[")
+			if itemString then
+				action = itemString
+			end
+		end
+	end
+
+	self.state_types[state] = kind
+	self.state_actions[state] = action
+	self:UpdateState(state)
+end
+
+function Generic:UpdateState(state)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	self:SetAttribute(format("labtype-%s", state), self.state_types[state])
+	self:SetAttribute(format("labaction-%s", state), self.state_actions[state])
+	if state ~= tostring(self:GetAttribute("state")) then return end
+	if self.header then
+		self.header:SetFrameRef("updateButton", self)
+		self.header:Execute([[
+			local frame = self:GetFrameRef("updateButton")
+			control:RunFor(frame, frame:GetAttribute("UpdateState"), frame:GetAttribute("state"))
+		]])
+	else
+		-- TODO
+	end
+	self:UpdateAction()
+end
+
+function Generic:GetAction(state)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	return self.state_types[state] or "empty", self.state_actions[state]
+end
+
+function Generic:UpdateAllStates()
+	for state in pairs(self.state_types) do
+		self:UpdateState(state)
+	end
+end
+
+function Generic:ButtonContentsChanged(state, kind, value)
+	state = tostring(state)
+	self.state_types[state] = kind or "empty"
+	self.state_actions[state] = value
+	lib.callbacks:Fire("OnButtonContentsChanged", self, state, self.state_types[state], self.state_actions[state])
+	self:UpdateAction(self)
+end
+
+function Generic:DisableDragNDrop(flag)
+	if InCombatLockdown() then
+		error("LibActionButton-1.0: You can only toggle DragNDrop out of combat!", 2)
+	end
+	if flag then
+		self:SetAttribute("LABdisableDragNDrop", true)
+	else
+		self:SetAttribute("LABdisableDragNDrop", nil)
+	end
+end
+
+function Generic:AddToButtonFacade(group)
+	if type(group) ~= "table" or type(group.AddButton) ~= "function" then
+		error("LibActionButton-1.0:AddToButtonFacade: You need to supply a proper group to use!", 2)
+	end
+	group:AddButton(self)
+	self.LBFSkinned = true
+end
+
+function Generic:AddToMasque(group)
+	if type(group) ~= "table" or type(group.AddButton) ~= "function" then
+		error("LibActionButton-1.0:AddToMasque: You need to supply a proper group to use!", 2)
+	end
+	group:AddButton(self)
+	self.MasqueSkinned = true
+end
+
+function Generic:UpdateAlpha()
+	UpdateCooldown(self)
+end
+
+-----------------------------------------------------------
+--- frame scripts
+
+-- copied (and adjusted) from SecureHandlers.lua
+local function PickupAny(kind, target, detail, ...)
+	if kind == "clear" then
+		ClearCursor()
+		kind, target, detail = target, detail, ...
+	end
+
+	if kind == 'action' then
+		PickupAction(target)
+	elseif kind == 'item' then
+		PickupItem(target)
+	elseif kind == 'macro' then
+		PickupMacro(target)
+	elseif kind == 'petaction' then
+		PickupPetAction(target)
+	elseif kind == 'spell' then
+		PickupSpell(target)
+	elseif kind == 'companion' then
+		PickupCompanion(target, detail)
+	elseif kind == 'equipmentset' then
+		PickupEquipmentSet(target)
+	end
+end
+
+function Generic:OnEnter()
+	if self.config.tooltip ~= "disabled" and (self.config.tooltip ~= "nocombat" or not InCombatLockdown()) then
+		UpdateTooltip(self)
+	end
+	if KeyBound then
+		KeyBound:Set(self)
+	end
+
+	if self._state_type == "action" and self.NewActionTexture then
+		lib.ACTION_HIGHLIGHT_MARKS[self._state_action] = false
+		UpdateNewAction(self)
+	end
+end
+
+function Generic:OnLeave()
+	GameTooltip:Hide()
+end
+
+-- Insecure drag handler to allow clicking on the button with an action on the cursor
+-- to place it on the button. Like action buttons work.
+function Generic:PreClick()
+	if self._state_type == "action" or self._state_type == "pet"
+			or InCombatLockdown() or self:GetAttribute("LABdisableDragNDrop")
+	then
+		return
+	end
+	-- check if there is actually something on the cursor
+	local kind, value, subtype = GetCursorInfo()
+	if not (kind and value) then return end
+	self._old_type = self._state_type
+	if self._state_type and self._state_type ~= "empty" then
+		self._old_type = self._state_type
+		self:SetAttribute("type", "empty")
+		--self:SetState(nil, "empty", nil)
+	end
+	self._receiving_drag = true
+end
+
+local function formatHelper(input)
+	if type(input) == "string" then
+		return format("%q", input)
+	else
+		return tostring(input)
+	end
+end
+
+function Generic:PostClick()
+	UpdateButtonState(self)
+	if self._receiving_drag and not InCombatLockdown() then
+		if self._old_type then
+			self:SetAttribute("type", self._old_type)
+			self._old_type = nil
+		end
+		local oldType, oldAction = self._state_type, self._state_action
+		local kind, data, subtype, extra = GetCursorInfo()
+		self.header:SetFrameRef("updateButton", self)
+		self.header:Execute(format([[
+			local frame = self:GetFrameRef("updateButton")
+			control:RunFor(frame, frame:GetAttribute("OnReceiveDrag"), %s, %s, %s, %s)
+			control:RunFor(frame, frame:GetAttribute("UpdateState"), %s)
+		]], formatHelper(kind), formatHelper(data), formatHelper(subtype), formatHelper(extra), formatHelper(self:GetAttribute("state"))))
+		PickupAny("clear", oldType, oldAction)
+	end
+	self._receiving_drag = nil
+end
+
+-----------------------------------------------------------
+--- configuration
+
+local function merge(target, source, default)
+	for k,v in pairs(default) do
+		if type(v) ~= "table" then
+			if source and source[k] ~= nil then
+				target[k] = source[k]
+			else
+				target[k] = v
+			end
+		else
+			if type(target[k]) ~= "table" then target[k] = {} else wipe(target[k]) end
+			merge(target[k], type(source) == "table" and source[k], v)
+		end
+	end
+	return target
+end
+
+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
+	-- merge the two configs
+	merge(self.config, config, DefaultConfig)
+
+	if self.config.outOfRangeColoring == "button" or (oldconfig and oldconfig.outOfRangeColoring == "button") then
+		UpdateUsable(self)
+	end
+	if self.config.outOfRangeColoring == "hotkey" then
+		self.outOfRange = nil
+	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
+		self.Name:Show()
+	end
+
+	self:SetAttribute("flyoutDirection", self.config.flyoutDirection)
+
+	UpdateHotkeys(self)
+	UpdateGrid(self)
+	Update(self)
+	self:RegisterForClicks(self.config.clickOnDown and "AnyDown" or "AnyUp")
+end
+
+-----------------------------------------------------------
+--- event handler
+
+function ForAllButtons(method, onlyWithAction)
+	assert(type(method) == "function")
+	for button in next, (onlyWithAction and ActiveButtons or ButtonRegistry) do
+		method(button)
+	end
+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("ACTIONBAR_PAGE_CHANGED")
+	--lib.eventFrame:RegisterEvent("UPDATE_BONUS_ACTIONBAR")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
+	lib.eventFrame:RegisterEvent("UPDATE_BINDINGS")
+	lib.eventFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
+	lib.eventFrame:RegisterEvent("UPDATE_VEHICLE_ACTIONBAR")
+
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_STATE")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_USABLE")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN")
+	lib.eventFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
+	lib.eventFrame:RegisterEvent("TRADE_SKILL_SHOW")
+	lib.eventFrame:RegisterEvent("TRADE_SKILL_CLOSE")
+	lib.eventFrame:RegisterEvent("ARCHAEOLOGY_CLOSED")
+	lib.eventFrame:RegisterEvent("PLAYER_ENTER_COMBAT")
+	lib.eventFrame:RegisterEvent("PLAYER_LEAVE_COMBAT")
+	lib.eventFrame:RegisterEvent("START_AUTOREPEAT_SPELL")
+	lib.eventFrame:RegisterEvent("STOP_AUTOREPEAT_SPELL")
+	lib.eventFrame:RegisterEvent("UNIT_ENTERED_VEHICLE")
+	lib.eventFrame:RegisterEvent("UNIT_EXITED_VEHICLE")
+	lib.eventFrame:RegisterEvent("COMPANION_UPDATE")
+	lib.eventFrame:RegisterEvent("UNIT_INVENTORY_CHANGED")
+	lib.eventFrame:RegisterEvent("LEARNED_SPELL_IN_TAB")
+	lib.eventFrame:RegisterEvent("PET_STABLE_UPDATE")
+	lib.eventFrame:RegisterEvent("PET_STABLE_SHOW")
+	lib.eventFrame:RegisterEvent("SPELL_ACTIVATION_OVERLAY_GLOW_SHOW")
+	lib.eventFrame:RegisterEvent("SPELL_ACTIVATION_OVERLAY_GLOW_HIDE")
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_CHARGES")
+	lib.eventFrame:RegisterEvent("UPDATE_SUMMONPETS_ACTION")
+
+	-- With those two, do we still need the ACTIONBAR equivalents of them?
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_COOLDOWN")
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_USABLE")
+	lib.eventFrame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
+
+	lib.eventFrame:RegisterEvent("LOSS_OF_CONTROL_ADDED")
+	lib.eventFrame:RegisterEvent("LOSS_OF_CONTROL_UPDATE")
+
+	lib.eventFrame:Show()
+	lib.eventFrame:SetScript("OnUpdate", OnUpdate)
+end
+
+function OnEvent(frame, event, arg1, ...)
+	if (event == "UNIT_INVENTORY_CHANGED" and arg1 == "player") or event == "LEARNED_SPELL_IN_TAB" then
+		local tooltipOwner = GameTooltip:GetOwner()
+		if ButtonRegistry[tooltipOwner] then
+			tooltipOwner:SetTooltip()
+		end
+	elseif event == "ACTIONBAR_SLOT_CHANGED" then
+		for button in next, ButtonRegistry do
+			if button._state_type == "action" and (arg1 == 0 or arg1 == tonumber(button._state_action)) then
+				Update(button)
+			end
+		end
+	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()
+	elseif event == "UPDATE_BINDINGS" then
+		ForAllButtons(UpdateHotkeys)
+	elseif event == "PLAYER_TARGET_CHANGED" then
+		UpdateRangeTimer()
+	elseif (event == "ACTIONBAR_UPDATE_STATE") or
+			((event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITED_VEHICLE") and (arg1 == "player")) or
+			((event == "COMPANION_UPDATE") and (arg1 == "MOUNT")) then
+		ForAllButtons(UpdateButtonState, true)
+	elseif event == "ACTIONBAR_UPDATE_USABLE" then
+		for button in next, ActionButtons do
+			UpdateUsable(button)
+		end
+	elseif event == "SPELL_UPDATE_USABLE" then
+		for button in next, NonActionButtons do
+			UpdateUsable(button)
+		end
+	elseif event == "ACTIONBAR_UPDATE_COOLDOWN" then
+		for button in next, ActionButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "SPELL_UPDATE_COOLDOWN" then
+		for button in next, NonActionButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "LOSS_OF_CONTROL_ADDED" then
+		for button in next, ActiveButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "LOSS_OF_CONTROL_UPDATE" then
+		for button in next, ActiveButtons do
+			UpdateCooldown(button)
+		end
+	elseif event == "TRADE_SKILL_SHOW" or event == "TRADE_SKILL_CLOSE"  or event == "ARCHAEOLOGY_CLOSED" then
+		ForAllButtons(UpdateButtonState, true)
+	elseif event == "PLAYER_ENTER_COMBAT" then
+		for button in next, ActiveButtons do
+			if button:IsAttack() then
+				StartFlash(button)
+			end
+		end
+	elseif event == "PLAYER_LEAVE_COMBAT" then
+		for button in next, ActiveButtons do
+			if button:IsAttack() then
+				StopFlash(button)
+			end
+		end
+	elseif event == "START_AUTOREPEAT_SPELL" then
+		for button in next, ActiveButtons do
+			if button:IsAutoRepeat() then
+				StartFlash(button)
+			end
+		end
+	elseif event == "STOP_AUTOREPEAT_SPELL" then
+		for button in next, ActiveButtons do
+			if button.flashing == 1 and not button:IsAttack() then
+				StopFlash(button)
+			end
+		end
+	elseif event == "PET_STABLE_UPDATE" or event == "PET_STABLE_SHOW" then
+		ForAllButtons(Update)
+	elseif event == "SPELL_ACTIVATION_OVERLAY_GLOW_SHOW" then
+		for button in next, ActiveButtons do
+			local spellId = button:GetSpellId()
+			if spellId and spellId == arg1 then
+				ShowOverlayGlow(button)
+			else
+				if button._state_type == "action" then
+					local actionType, id = GetActionInfo(button._state_action)
+					if actionType == "flyout" and FlyoutHasSpell(id, arg1) then
+						ShowOverlayGlow(button)
+					end
+				end
+			end
+		end
+	elseif event == "SPELL_ACTIVATION_OVERLAY_GLOW_HIDE" then
+		for button in next, ActiveButtons do
+			local spellId = button:GetSpellId()
+			if spellId and spellId == arg1 then
+				HideOverlayGlow(button)
+			else
+				if button._state_type == "action" then
+					local actionType, id = GetActionInfo(button._state_action)
+					if actionType == "flyout" and FlyoutHasSpell(id, arg1) then
+						HideOverlayGlow(button)
+					end
+				end
+			end
+		end
+	elseif event == "PLAYER_EQUIPMENT_CHANGED" then
+		for button in next, ActiveButtons do
+			if button._state_type == "item" then
+				Update(button)
+			end
+		end
+	elseif event == "SPELL_UPDATE_CHARGES" then
+		ForAllButtons(UpdateCount, true)
+	elseif event == "UPDATE_SUMMONPETS_ACTION" then
+		for button in next, ActiveButtons do
+			if button._state_type == "action" then
+				local actionType, id = GetActionInfo(button._state_action)
+				if actionType == "summonpet" then
+					local texture = GetActionTexture(button._state_action)
+					if texture then
+						button.icon:SetTexture(texture)
+					end
+				end
+			end
+		end
+	end
+end
+
+local flashTime = 0
+local rangeTimer = -1
+function OnUpdate(_, elapsed)
+	flashTime = flashTime - elapsed
+	rangeTimer = rangeTimer - elapsed
+	-- Run the loop only when there is something to update
+	if rangeTimer <= 0 or flashTime <= 0 then
+		for button in next, ActiveButtons do
+			-- Flashing
+			if button.flashing == 1 and flashTime <= 0 then
+				if button.Flash:IsShown() then
+					button.Flash:Hide()
+				else
+					button.Flash:Show()
+				end
+			end
+
+			-- Range
+			if rangeTimer <= 0 then
+				local inRange = button:IsInRange()
+				local oldRange = button.outOfRange
+				button.outOfRange = (inRange == false)
+				if oldRange ~= button.outOfRange then
+					if button.config.outOfRangeColoring == "button" then
+						UpdateUsable(button)
+					elseif button.config.outOfRangeColoring == "hotkey" then
+						local hotkey = button.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(button.config.colors.range))
+						else
+							hotkey:SetVertexColor(0.75, 0.75, 0.75)
+						end
+					end
+				end
+			end
+		end
+
+		-- Update values
+		if flashTime <= 0 then
+			flashTime = flashTime + ATTACK_BUTTON_FLASH_TIME
+		end
+		if rangeTimer <= 0 then
+			rangeTimer = TOOLTIP_UPDATE_TIME
+		end
+	end
+end
+
+local gridCounter = 0
+function ShowGrid()
+	gridCounter = gridCounter + 1
+	if gridCounter >= 1 then
+		for button in next, ButtonRegistry do
+			if button:IsShown() then
+				button:SetAlpha(1.0)
+			end
+		end
+	end
+end
+
+function HideGrid()
+	if gridCounter > 0 then
+		gridCounter = gridCounter - 1
+	end
+	if gridCounter == 0 then
+		for button in next, ButtonRegistry do
+			if button:IsShown() and not button:HasAction() and not button.config.showGrid then
+				button:SetAlpha(0.0)
+			end
+		end
+	end
+end
+
+function UpdateGrid(self)
+	if self.config.showGrid then
+		self:SetAlpha(1.0)
+	elseif gridCounter == 0 and self:IsShown() and not self:HasAction() then
+		self:SetAlpha(0.0)
+	end
+end
+
+-----------------------------------------------------------
+--- KeyBound integration
+
+function Generic:GetBindingAction()
+	return self.config.keyBoundTarget or "CLICK "..self:GetName()..":LeftButton"
+end
+
+function Generic:GetHotkey()
+	local name = "CLICK "..self:GetName()..":LeftButton"
+	local key = GetBindingKey(self.config.keyBoundTarget or name)
+	if not key and self.config.keyBoundTarget then
+		key = GetBindingKey(name)
+	end
+	if key then
+		return KeyBound and KeyBound:ToShortKey(key) or key
+	end
+end
+
+local function getKeys(binding, keys)
+	keys = keys or ""
+	for i = 1, select("#", GetBindingKey(binding)) do
+		local hotKey = select(i, GetBindingKey(binding))
+		if keys ~= "" then
+			keys = keys .. ", "
+		end
+		keys = keys .. GetBindingText(hotKey, "KEY_")
+	end
+	return keys
+end
+
+function Generic:GetBindings()
+	local keys, binding
+
+	if self.config.keyBoundTarget then
+		keys = getKeys(self.config.keyBoundTarget)
+	end
+
+	keys = getKeys("CLICK "..self:GetName()..":LeftButton")
+
+	return keys
+end
+
+function Generic:SetKey(key)
+	if self.config.keyBoundTarget then
+		SetBinding(key, self.config.keyBoundTarget)
+	else
+		SetBindingClick(key, self:GetName(), "LeftButton")
+	end
+	lib.callbacks:Fire("OnKeybindingChanged", self, key)
+end
+
+local function clearBindings(binding)
+	while GetBindingKey(binding) do
+		SetBinding(GetBindingKey(binding), nil)
+	end
+end
+
+function Generic:ClearBindings()
+	if self.config.keyBoundTarget then
+		clearBindings(self.config.keyBoundTarget)
+	end
+	clearBindings("CLICK "..self:GetName()..":LeftButton")
+	lib.callbacks:Fire("OnKeybindingChanged", self, nil)
+end
+
+-----------------------------------------------------------
+--- button management
+
+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)
+	if self:HasAction() then
+		ActiveButtons[self] = true
+		if self._state_type == "action" then
+			ActionButtons[self] = true
+			NonActionButtons[self] = nil
+		else
+			ActionButtons[self] = nil
+			NonActionButtons[self] = true
+		end
+		self:SetAlpha(1.0)
+		UpdateButtonState(self)
+		UpdateUsable(self)
+		UpdateCooldown(self)
+		UpdateFlash(self)
+	else
+		ActiveButtons[self] = nil
+		ActionButtons[self] = nil
+		NonActionButtons[self] = nil
+		if gridCounter == 0 and not self.config.showGrid then
+			self:SetAlpha(0.0)
+		end
+		self.cooldown:Hide()
+		self:SetChecked(false)
+	end
+
+	-- Add a green border if button is an equipped item
+	if self:IsEquipped() and not self.config.hideElements.equipped then
+		self.Border:SetVertexColor(0, 1.0, 0, 0.35)
+		self.Border:Show()
+	else
+		self.Border:Hide()
+	end
+
+	-- Update Action Text
+	if not self:IsConsumableOrStackable() then
+		self.Name:SetText(self:GetActionText())
+	else
+		self.Name:SetText("")
+	end
+
+	-- Update icon and hotkey
+	local texture = self:GetTexture()
+	if texture then
+		self.icon:SetTexture(texture)
+		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
+	else
+		self.icon:Hide()
+		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
+	end
+
+	self:UpdateLocal()
+
+	UpdateCount(self)
+
+	UpdateFlyout(self)
+
+	UpdateOverlayGlow(self)
+
+	UpdateNewAction(self)
+
+	if GameTooltip:GetOwner() == self then
+		UpdateTooltip(self)
+	end
+
+	-- this could've been a spec change, need to call OnStateChanged for action buttons, if present
+	if not InCombatLockdown() and self._state_type == "action" then
+		local onStateChanged = self:GetAttribute("OnStateChanged")
+		if onStateChanged then
+			self.header:SetFrameRef("updateButton", self)
+			self.header:Execute(([[
+				local frame = self:GetFrameRef("updateButton")
+				control:RunFor(frame, frame:GetAttribute("OnStateChanged"), %s, %s, %s)
+			]]):format(formatHelper(self:GetAttribute("state")), formatHelper(self._state_type), formatHelper(self._state_action)))
+		end
+	end
+	lib.callbacks:Fire("OnButtonUpdate", self)
+end
+
+function Generic:UpdateLocal()
+	-- dummy function the other button types can override for special updating
+end
+
+function UpdateButtonState(self)
+	if self:IsCurrentlyActive() or self:IsAutoRepeat() then
+		self:SetChecked(true)
+	else
+		self:SetChecked(false)
+	end
+	lib.callbacks:Fire("OnButtonState", 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)
+		else
+			self.icon:SetVertexColor(0.4, 0.4, 0.4)
+			--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
+		end
+	end
+	lib.callbacks:Fire("OnButtonUsable", self)
+end
+
+function UpdateCount(self)
+	if not self:HasAction() then
+		self.Count:SetText("")
+		return
+	end
+	if self:IsConsumableOrStackable() then
+		local count = self:GetCount()
+		if count > (self.maxDisplayCount or 9999) then
+			self.Count:SetText("*")
+		else
+			self.Count:SetText(count)
+		end
+	else
+		local charges, maxCharges, chargeStart, chargeDuration = self:GetCharges()
+		if charges and maxCharges and maxCharges > 0 then
+			self.Count:SetText(charges)
+		else
+			self.Count:SetText("")
+		end
+	end
+end
+
+local function SetCooldownHook(cooldown, ...)
+	local effectiveAlpha = cooldown:GetEffectiveAlpha()
+	local start, duration = ...
+
+	if start ~= 0 or duration ~= 0 then
+		-- update swipe alpha
+		cooldown.__metaLAB.SetSwipeColor(cooldown, cooldown.__SwipeR, cooldown.__SwipeG, cooldown.__SwipeB, cooldown.__SwipeA * effectiveAlpha)
+
+		-- only draw bling and edge if alpha is over 50%
+		cooldown:SetDrawBling(effectiveAlpha > 0.5)
+		if effectiveAlpha < 0.5 then
+			cooldown:SetDrawEdge(false)
+		end
+
+		-- ensure the swipe isn't drawn on fully faded bars
+		if effectiveAlpha <= 0.0 then
+			cooldown:SetDrawSwipe(false)
+		end
+	end
+
+	return cooldown.__metaLAB.SetCooldown(cooldown, ...)
+end
+
+local function SetSwipeColorHook(cooldown, r, g, b, a)
+	local effectiveAlpha = cooldown:GetEffectiveAlpha()
+	cooldown.__SwipeR, cooldown.__SwipeG, cooldown.__SwipeB, cooldown.__SwipeA = r, g, b, (a or 1)
+	return cooldown.__metaLAB.SetSwipeColor(cooldown, r, g, b, a * effectiveAlpha)
+end
+
+function HookCooldown(button)
+	if not button.cooldown.__metaLAB then
+		button.cooldown.__metaLAB = getmetatable(button.cooldown).__index
+		button.cooldown.__SwipeR, button.cooldown.__SwipeG, button.cooldown.__SwipeB, button.cooldown.__SwipeA = 0, 0, 0, 0.8
+
+		button.cooldown.SetCooldown = SetCooldownHook
+		button.cooldown.SetSwipeColor = SetSwipeColorHook
+	end
+end
+
+function OnCooldownDone(self)
+	self:SetScript("OnCooldownDone", nil)
+	UpdateCooldown(self:GetParent())
+end
+
+function UpdateCooldown(self)
+	local locStart, locDuration = self:GetLossOfControlCooldown()
+	local start, duration, enable, charges, maxCharges = self:GetCooldown()
+
+	if (locStart + locDuration) > (start + duration) then
+		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_LOSS_OF_CONTROL then
+			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge-LoC")
+			self.cooldown:SetHideCountdownNumbers(true)
+			self.cooldown.currentCooldownType = COOLDOWN_TYPE_LOSS_OF_CONTROL
+			self.cooldown:SetSwipeColor(0.17, 0, 0, 0.8)
+		end
+		CooldownFrame_SetTimer(self.cooldown, locStart, locDuration, 1, nil, nil, true)
+	else
+		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_NORMAL then
+			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
+			self.cooldown:SetHideCountdownNumbers(false)
+			self.cooldown.currentCooldownType = COOLDOWN_TYPE_NORMAL
+			self.cooldown:SetSwipeColor(0, 0, 0, 0.8)
+		end
+		if locStart > 0 then
+			self.cooldown:SetScript("OnCooldownDone", OnCooldownDone)
+		end
+		CooldownFrame_SetTimer(self.cooldown, start, duration, enable, charges, maxCharges)
+	end
+end
+
+function StartFlash(self)
+	self.flashing = 1
+	flashTime = 0
+	UpdateButtonState(self)
+end
+
+function StopFlash(self)
+	self.flashing = 0
+	self.Flash:Hide()
+	UpdateButtonState(self)
+end
+
+function UpdateFlash(self)
+	if (self:IsAttack() and self:IsCurrentlyActive()) or self:IsAutoRepeat() then
+		StartFlash(self)
+	else
+		StopFlash(self)
+	end
+end
+
+function UpdateTooltip(self)
+	if (GetCVar("UberTooltips") == "1") then
+		GameTooltip_SetDefaultAnchor(GameTooltip, self);
+	else
+		GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+	end
+	if self:SetTooltip() then
+		self.UpdateTooltip = UpdateTooltip
+	else
+		self.UpdateTooltip = nil
+	end
+end
+
+function UpdateHotkeys(self)
+	local key = self:GetHotkey()
+	if not key or key == "" or self.config.hideElements.hotkey then
+		self.HotKey:SetText(RANGE_INDICATOR)
+		self.HotKey:SetPoint("TOPLEFT", self, "TOPLEFT", 1, - 2)
+		self.HotKey:Hide()
+	else
+		self.HotKey:SetText(key)
+		self.HotKey:SetPoint("TOPLEFT", self, "TOPLEFT", - 2, - 2)
+		self.HotKey:Show()
+	end
+end
+
+local function OverlayGlow_OnHide(self)
+	if self.animOut:IsPlaying() then
+		self.animOut:Stop()
+		OverlayGlowAnimOutFinished(self.animOut)
+	end
+end
+
+function GetOverlayGlow()
+	local overlay = tremove(lib.unusedOverlayGlows);
+	if not overlay then
+		lib.numOverlays = lib.numOverlays + 1
+		overlay = CreateFrame("Frame", "LAB10ActionButtonOverlay"..lib.numOverlays, UIParent, "ActionBarButtonSpellActivationAlert")
+		overlay.animOut:SetScript("OnFinished", OverlayGlowAnimOutFinished)
+		overlay:SetScript("OnHide", OverlayGlow_OnHide)
+	end
+	return overlay
+end
+
+function ShowOverlayGlow(self)
+	if self.overlay then
+		if self.overlay.animOut:IsPlaying() then
+			self.overlay.animOut:Stop()
+			self.overlay.animIn:Play()
+		end
+	else
+		self.overlay = GetOverlayGlow()
+		local frameWidth, frameHeight = self:GetSize()
+		self.overlay:SetParent(self)
+		self.overlay:ClearAllPoints()
+		--Make the height/width available before the next frame:
+		self.overlay:SetSize(frameWidth * 1.4, frameHeight * 1.4)
+		self.overlay:SetPoint("TOPLEFT", self, "TOPLEFT", -frameWidth * 0.2, frameHeight * 0.2)
+		self.overlay:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", frameWidth * 0.2, -frameHeight * 0.2)
+		self.overlay.animIn:Play()
+	end
+end
+
+function HideOverlayGlow(self)
+	if self.overlay then
+		if self.overlay.animIn:IsPlaying() then
+			self.overlay.animIn:Stop()
+		end
+		if self:IsVisible() then
+			self.overlay.animOut:Play()
+		else
+			OverlayGlowAnimOutFinished(self.overlay.animOut)
+		end
+	end
+end
+
+function OverlayGlowAnimOutFinished(animGroup)
+	local overlay = animGroup:GetParent()
+	local actionButton = overlay:GetParent()
+	overlay:Hide()
+	tinsert(lib.unusedOverlayGlows, overlay)
+	actionButton.overlay = nil
+end
+
+function UpdateOverlayGlow(self)
+	local spellId = self:GetSpellId()
+	if spellId and IsSpellOverlayed(spellId) then
+		ShowOverlayGlow(self)
+	else
+		HideOverlayGlow(self)
+	end
+end
+
+hooksecurefunc("MarkNewActionHighlight", function(action, flag)
+	lib.ACTION_HIGHLIGHT_MARKS[action] = flag
+	for button in next, ButtonRegistry do
+		if button._state_type == "action" and action == tonumber(button._state_action) then
+			UpdateNewAction(button)
+		end
+	end
+end)
+
+function UpdateNewAction(self)
+	-- special handling for "New Action" markers
+	if self.NewActionTexture then
+		if self._state_type == "action" and lib.ACTION_HIGHLIGHT_MARKS[self._state_action] then
+			self.NewActionTexture:Show()
+		else
+			self.NewActionTexture:Hide()
+		end
+	end
+end
+
+-- Hook UpdateFlyout so we can use the blizzy templates
+hooksecurefunc("ActionButton_UpdateFlyout", function(self, ...)
+	if ButtonRegistry[self] then
+		UpdateFlyout(self)
+	end
+end)
+
+function UpdateFlyout(self)
+	-- disabled FlyoutBorder/BorderShadow, those are not handled by LBF and look terrible
+	self.FlyoutBorder:Hide()
+	self.FlyoutBorderShadow:Hide()
+	if self._state_type == "action" then
+		-- based on ActionButton_UpdateFlyout in ActionButton.lua
+		local actionType = GetActionInfo(self._state_action)
+		if actionType == "flyout" then
+			-- Update border and determine arrow position
+			local arrowDistance
+			if (SpellFlyout and SpellFlyout:IsShown() and SpellFlyout:GetParent() == self) or GetMouseFocus() == self then
+				arrowDistance = 5
+			else
+				arrowDistance = 2
+			end
+
+			-- Update arrow
+			self.FlyoutArrow:Show()
+			self.FlyoutArrow:ClearAllPoints()
+			local direction = self:GetAttribute("flyoutDirection");
+			if direction == "LEFT" then
+				self.FlyoutArrow:SetPoint("LEFT", self, "LEFT", -arrowDistance, 0)
+				SetClampedTextureRotation(self.FlyoutArrow, 270)
+			elseif direction == "RIGHT" then
+				self.FlyoutArrow:SetPoint("RIGHT", self, "RIGHT", arrowDistance, 0)
+				SetClampedTextureRotation(self.FlyoutArrow, 90)
+			elseif direction == "DOWN" then
+				self.FlyoutArrow:SetPoint("BOTTOM", self, "BOTTOM", 0, -arrowDistance)
+				SetClampedTextureRotation(self.FlyoutArrow, 180)
+			else
+				self.FlyoutArrow:SetPoint("TOP", self, "TOP", 0, arrowDistance)
+				SetClampedTextureRotation(self.FlyoutArrow, 0)
+			end
+
+			-- return here, otherwise flyout is hidden
+			return
+		end
+	end
+	self.FlyoutArrow:Hide()
+end
+
+function UpdateRangeTimer()
+	rangeTimer = -1
+end
+
+local function GetSpellIdByName(spellName)
+	if not spellName then return end
+	local spellLink = GetSpellLink(spellName)
+	if spellLink then
+		return tonumber(spellLink:match("spell:(%d+)"))
+	end
+	return nil
+end
+
+-----------------------------------------------------------
+--- WoW API mapping
+--- Generic Button
+Generic.HasAction               = function(self) return nil end
+Generic.GetActionText           = function(self) return "" end
+Generic.GetTexture              = function(self) return nil end
+Generic.GetCharges              = function(self) return nil end
+Generic.GetCount                = function(self) return 0 end
+Generic.GetCooldown             = function(self) return 0, 0, 0 end
+Generic.IsAttack                = function(self) return nil end
+Generic.IsEquipped              = function(self) return nil end
+Generic.IsCurrentlyActive       = function(self) return nil end
+Generic.IsAutoRepeat            = function(self) return nil end
+Generic.IsUsable                = function(self) return nil end
+Generic.IsConsumableOrStackable = function(self) return nil end
+Generic.IsUnitInRange           = function(self, unit) return nil end
+Generic.IsInRange               = function(self)
+	local unit = self:GetAttribute("unit")
+	if unit == "player" then
+		unit = nil
+	end
+	local val = self:IsUnitInRange(unit)
+	-- map 1/0 to true false, since the return values are inconsistent between actions and spells
+	if val == 1 then val = true elseif val == 0 then val = false end
+	return val
+end
+Generic.SetTooltip              = function(self) return nil end
+Generic.GetSpellId              = function(self) return nil end
+Generic.GetLossOfControlCooldown = function(self) return 0, 0 end
+
+-----------------------------------------------------------
+--- Action Button
+Action.HasAction               = function(self) return HasAction(self._state_action) end
+Action.GetActionText           = function(self) return GetActionText(self._state_action) end
+Action.GetTexture              = function(self) return GetActionTexture(self._state_action) end
+Action.GetCharges              = function(self) return GetActionCharges(self._state_action) end
+Action.GetCount                = function(self) return GetActionCount(self._state_action) end
+Action.GetCooldown             = function(self) return GetActionCooldown(self._state_action) end
+Action.IsAttack                = function(self) return IsAttackAction(self._state_action) end
+Action.IsEquipped              = function(self) return IsEquippedAction(self._state_action) end
+Action.IsCurrentlyActive       = function(self) return IsCurrentAction(self._state_action) end
+Action.IsAutoRepeat            = function(self) return IsAutoRepeatAction(self._state_action) end
+Action.IsUsable                = function(self) return IsUsableAction(self._state_action) end
+Action.IsConsumableOrStackable = function(self) return IsConsumableAction(self._state_action) or IsStackableAction(self._state_action) or (not IsItemAction(self._state_action) and GetActionCount(self._state_action) > 0) end
+Action.IsUnitInRange           = function(self, unit) return IsActionInRange(self._state_action, unit) end
+Action.SetTooltip              = function(self) return GameTooltip:SetAction(self._state_action) end
+Action.GetSpellId              = function(self)
+	local actionType, id, subType = GetActionInfo(self._state_action)
+	if actionType == "spell" then
+		return id
+	elseif actionType == "macro" then
+		local _, _, spellId = GetMacroSpell(id)
+		return spellId
+	end
+end
+Action.GetLossOfControlCooldown = function(self) return GetActionLossOfControlCooldown(self._state_action) end
+
+-----------------------------------------------------------
+--- Spell Button
+Spell.HasAction               = function(self) return true end
+Spell.GetActionText           = function(self) return "" end
+Spell.GetTexture              = function(self) return GetSpellTexture(self._state_action) end
+Spell.GetCharges              = function(self) return GetSpellCharges(self._state_action) end
+Spell.GetCount                = function(self) return GetSpellCount(self._state_action) end
+Spell.GetCooldown             = function(self) return GetSpellCooldown(self._state_action) end
+Spell.IsAttack                = function(self) return IsAttackSpell(FindSpellBookSlotBySpellID(self._state_action), "spell") end -- needs spell book id as of 4.0.1.13066
+Spell.IsEquipped              = function(self) return nil end
+Spell.IsCurrentlyActive       = function(self) return IsCurrentSpell(self._state_action) end
+Spell.IsAutoRepeat            = function(self) return IsAutoRepeatSpell(FindSpellBookSlotBySpellID(self._state_action), "spell") end -- needs spell book id as of 4.0.1.13066
+Spell.IsUsable                = function(self) return IsUsableSpell(self._state_action) end
+Spell.IsConsumableOrStackable = function(self) return IsConsumableSpell(self._state_action) end
+Spell.IsUnitInRange           = function(self, unit) return IsSpellInRange(FindSpellBookSlotBySpellID(self._state_action), "spell", unit) end -- needs spell book id as of 4.0.1.13066
+Spell.SetTooltip              = function(self) return GameTooltip:SetSpellByID(self._state_action) end
+Spell.GetSpellId              = function(self) return self._state_action end
+
+-----------------------------------------------------------
+--- Item Button
+local function getItemId(input)
+	return input:match("^item:(%d+)")
+end
+
+Item.HasAction               = function(self) return true end
+Item.GetActionText           = function(self) return "" end
+Item.GetTexture              = function(self) return GetItemIcon(self._state_action) end
+Item.GetCharges              = function(self) return nil end
+Item.GetCount                = function(self) return GetItemCount(self._state_action, nil, true) end
+Item.GetCooldown             = function(self) return GetItemCooldown(getItemId(self._state_action)) end
+Item.IsAttack                = function(self) return nil end
+Item.IsEquipped              = function(self) return IsEquippedItem(self._state_action) end
+Item.IsCurrentlyActive       = function(self) return IsCurrentItem(self._state_action) end
+Item.IsAutoRepeat            = function(self) return nil end
+Item.IsUsable                = function(self) return IsUsableItem(self._state_action) end
+Item.IsConsumableOrStackable = function(self) return IsConsumableItem(self._state_action) 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.GetSpellId              = function(self) return nil end
+
+-----------------------------------------------------------
+--- Macro Button
+-- TODO: map results of GetMacroSpell/GetMacroItem to proper results
+Macro.HasAction               = function(self) return true end
+Macro.GetActionText           = function(self) return (GetMacroInfo(self._state_action)) end
+Macro.GetTexture              = function(self) return (select(2, GetMacroInfo(self._state_action))) end
+Macro.GetCharges              = function(self) return nil end
+Macro.GetCount                = function(self) return 0 end
+Macro.GetCooldown             = function(self) return 0, 0, 0 end
+Macro.IsAttack                = function(self) return nil end
+Macro.IsEquipped              = function(self) return nil end
+Macro.IsCurrentlyActive       = function(self) return nil end
+Macro.IsAutoRepeat            = function(self) return nil end
+Macro.IsUsable                = function(self) return nil end
+Macro.IsConsumableOrStackable = function(self) return nil end
+Macro.IsUnitInRange           = function(self, unit) return nil end
+Macro.SetTooltip              = function(self) return nil end
+Macro.GetSpellId              = function(self) return nil end
+
+-----------------------------------------------------------
+--- Custom Button
+Custom.HasAction               = function(self) return true end
+Custom.GetActionText           = function(self) return "" end
+Custom.GetTexture              = function(self) return self._state_action.texture end
+Custom.GetCharges              = function(self) return nil end
+Custom.GetCount                = function(self) return 0 end
+Custom.GetCooldown             = function(self) return 0, 0, 0 end
+Custom.IsAttack                = function(self) return nil end
+Custom.IsEquipped              = function(self) return nil end
+Custom.IsCurrentlyActive       = function(self) return nil end
+Custom.IsAutoRepeat            = function(self) return nil end
+Custom.IsUsable                = function(self) return true end
+Custom.IsConsumableOrStackable = function(self) return nil end
+Custom.IsUnitInRange           = function(self, unit) return nil end
+Custom.SetTooltip              = function(self) return GameTooltip:SetText(self._state_action.tooltip) end
+Custom.GetSpellId              = function(self) return nil end
+Custom.RunCustom               = function(self, unit, button) return self._state_action.func(self, unit, button) end
+
+-----------------------------------------------------------
+--- Update old Buttons
+if oldversion and next(lib.buttonRegistry) then
+	InitializeEventHandler()
+	for button in next, lib.buttonRegistry do
+		-- this refreshes the metatable on the button
+		Generic.UpdateAction(button, true)
+		SetupSecureSnippets(button)
+		if oldversion < 12 then
+			WrapOnClick(button)
+		end
+		if oldversion < 23 then
+			if button.overlay then
+				button.overlay:Hide()
+				ActionButton_HideOverlayGlow(button)
+				button.overlay = nil
+				UpdateOverlayGlow(button)
+			end
+		end
+	end
+end
diff --git a/Jamba/LibActionButtonJamba-1.0-66.lua b/Jamba/LibActionButtonJamba-1.0-66.lua
new file mode 100644
index 0000000..8f28d61
--- /dev/null
+++ b/Jamba/LibActionButtonJamba-1.0-66.lua
@@ -0,0 +1,1585 @@
+--[[
+Copyright (c) 2010-2017, Hendrik "nevcairiel" Leppkes <h.leppkes@gmail.com>
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of the developer nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+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.
+
+]]
+local MAJOR_VERSION = "LibActionButtonJamba-1.0"
+local MINOR_VERSION = 68
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
+local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
+if not lib then return end
+
+-- Lua functions
+local _G = _G
+local type, error, tostring, tonumber, assert, select = type, error, tostring, tonumber, assert, select
+local setmetatable, wipe, unpack, pairs, next = setmetatable, wipe, unpack, pairs, next
+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
+
+local KeyBound = LibStub("LibKeyBound-1.0", true)
+local CBH = LibStub("CallbackHandler-1.0")
+local LBG = LibStub("LibButtonGlow-1.0", true)
+local Masque = LibStub("Masque", true)
+
+lib.eventFrame = lib.eventFrame or CreateFrame("Frame")
+lib.eventFrame:UnregisterAllEvents()
+
+lib.buttonRegistry = lib.buttonRegistry or {}
+lib.activeButtons = lib.activeButtons or {}
+lib.actionButtons = lib.actionButtons or {}
+lib.nonActionButtons = lib.nonActionButtons or {}
+
+lib.ChargeCooldowns = lib.ChargeCooldowns or {}
+lib.NumChargeCooldowns = lib.NumChargeCooldowns or 0
+
+lib.ACTION_HIGHLIGHT_MARKS = lib.ACTION_HIGHLIGHT_MARKS or setmetatable({}, { __index = ACTION_HIGHLIGHT_MARKS })
+
+lib.callbacks = lib.callbacks or CBH:New(lib)
+
+local Generic = CreateFrame("CheckButton")
+local Generic_MT = {__index = Generic}
+
+local Action = setmetatable({}, {__index = Generic})
+local Action_MT = {__index = Action}
+
+local PetAction = setmetatable({}, {__index = Generic})
+local PetAction_MT = {__index = PetAction}
+
+local Spell = setmetatable({}, {__index = Generic})
+local Spell_MT = {__index = Spell}
+
+local Item = setmetatable({}, {__index = Generic})
+local Item_MT = {__index = Item}
+
+local Macro = setmetatable({}, {__index = Generic})
+local Macro_MT = {__index = Macro}
+
+local Custom = setmetatable({}, {__index = Generic})
+local Custom_MT = {__index = Custom}
+
+local type_meta_map = {
+	empty  = Generic_MT,
+	action = Action_MT,
+	--pet    = PetAction_MT,
+	spell  = Spell_MT,
+	item   = Item_MT,
+	macro  = Macro_MT,
+	custom = Custom_MT
+}
+
+local ButtonRegistry, ActiveButtons, ActionButtons, NonActionButtons = lib.buttonRegistry, lib.activeButtons, lib.actionButtons, lib.nonActionButtons
+
+local Update, UpdateButtonState, UpdateUsable, UpdateCount, UpdateCooldown, UpdateTooltip, UpdateNewAction, ClearNewActionHighlight
+local StartFlash, StopFlash, UpdateFlash, UpdateHotkeys, UpdateRangeTimer, UpdateOverlayGlow
+local UpdateFlyout, ShowGrid, HideGrid, UpdateGrid, SetupSecureSnippets, WrapOnClick
+local ShowOverlayGlow, HideOverlayGlow
+local EndChargeCooldown
+
+local InitializeEventHandler, OnEvent, ForAllButtons, OnUpdate
+
+local DefaultConfig = {
+	outOfRangeColoring = "button",
+	tooltip = "enabled",
+	showGrid = false,
+	colors = {
+		range = { 0.8, 0.1, 0.1 },
+		mana = { 0.5, 0.5, 1.0 }
+	},
+	hideElements = {
+		macro = false,
+		hotkey = false,
+		equipped = false,
+	},
+	keyBoundTarget = false,
+	clickOnDown = false,
+	flyoutDirection = "UP",
+}
+
+--- Create a new action button.
+-- @param id Internal id of the button (not used by LibActionButton-1.0, only for tracking inside the calling addon)
+-- @param name Name of the button frame to be created (not used by LibActionButton-1.0 aside from naming the frame)
+-- @param header Header that drives these action buttons (if any)
+function lib:CreateButton(id, name, header, config)
+	if type(name) ~= "string" then
+		error("Usage: CreateButton(id, name. header): Buttons must have a valid name!", 2)
+	end
+	if not header then
+		error("Usage: CreateButton(id, name, header): Buttons without a secure header are not yet supported!", 2)
+	end
+
+	if not KeyBound then
+		KeyBound = LibStub("LibKeyBound-1.0", true)
+	end
+
+	local button = setmetatable(CreateFrame("CheckButton", name, header, "SecureActionButtonTemplate, ActionButtonTemplate"), Generic_MT)
+	button:RegisterForDrag("LeftButton", "RightButton")
+	button:RegisterForClicks("AnyUp")
+
+	-- Frame Scripts
+	button:SetScript("OnEnter", Generic.OnEnter)
+	button:SetScript("OnLeave", Generic.OnLeave)
+	button:SetScript("PreClick", Generic.PreClick)
+	button:SetScript("PostClick", Generic.PostClick)
+
+	button.id = id
+	button.header = header
+	-- Mapping of state -> action
+	button.state_types = {}
+	button.state_actions = {}
+
+	-- Store the LAB Version that created this button for debugging
+	button.__LAB_Version = MINOR_VERSION
+
+	-- just in case we're not run by a header, default to state 0
+	button:SetAttribute("state", 0)
+
+	SetupSecureSnippets(button)
+	WrapOnClick(button)
+
+	-- adjust hotkey style for better readability
+	button.HotKey:SetFont(button.HotKey:GetFont(), 13, "OUTLINE")
+	button.HotKey:SetVertexColor(0.75, 0.75, 0.75)
+
+	-- adjust count/stack size
+	button.Count:SetFont(button.Count:GetFont(), 16, "OUTLINE")
+
+	-- Store the button in the registry, needed for event and OnUpdate handling
+	if not next(ButtonRegistry) then
+		InitializeEventHandler()
+	end
+	ButtonRegistry[button] = true
+
+	button:UpdateConfig(config)
+
+	-- run an initial update
+	button:UpdateAction()
+	UpdateHotkeys(button)
+
+	-- somewhat of a hack for the Flyout buttons to not error.
+	button.action = 0
+
+	lib.callbacks:Fire("OnButtonCreated", button)
+
+	return button
+end
+
+function SetupSecureSnippets(button)
+	button:SetAttribute("_custom", Custom.RunCustom)
+	-- secure UpdateState(self, state)
+	-- update the type and action of the button based on the state
+	button:SetAttribute("UpdateState", [[
+		local state = ...
+		self:SetAttribute("state", state)
+		local type, action = (self:GetAttribute(format("labtype-%s", state)) or "empty"), self:GetAttribute(format("labaction-%s", state))
+
+		self:SetAttribute("type", type)
+		if type ~= "empty" and type ~= "custom" then
+			local action_field = (type == "pet") and "action" or type
+			self:SetAttribute(action_field, action)
+			self:SetAttribute("action_field", action_field)
+		end
+		local onStateChanged = self:GetAttribute("OnStateChanged")
+		if onStateChanged then
+			self:Run(onStateChanged, state, type, action)
+		end
+	]])
+
+	-- this function is invoked by the header when the state changes
+	button:SetAttribute("_childupdate-state", [[
+		self:RunAttribute("UpdateState", message)
+		self:CallMethod("UpdateAction")
+	]])
+
+	-- secure PickupButton(self, kind, value, ...)
+	-- utility function to place a object on the cursor
+	button:SetAttribute("PickupButton", [[
+		local kind, value = ...
+		if kind == "empty" then
+			return "clear"
+		elseif kind == "action" or kind == "pet" then
+			local actionType = (kind == "pet") and "petaction" or kind
+			return actionType, value
+		elseif kind == "spell" or kind == "item" or kind == "macro" then
+			return "clear", kind, value
+		else
+			print("LibActionButton-1.0: Unknown type: " .. tostring(kind))
+			return false
+		end
+	]])
+
+	button:SetAttribute("OnDragStart", [[
+		if (self:GetAttribute("buttonlock") and not IsModifiedClick("PICKUPACTION")) or self:GetAttribute("LABdisableDragNDrop") then return false end
+		local state = self:GetAttribute("state")
+		local type = self:GetAttribute("type")
+		-- if the button is empty, we can't drag anything off it
+		if type == "empty" or type == "custom" then
+			return false
+		end
+		-- Get the value for the action attribute
+		local action_field = self:GetAttribute("action_field")
+		local action = self:GetAttribute(action_field)
+
+		-- non-action fields need to change their type to empty
+		if type ~= "action" and type ~= "pet" then
+			self:SetAttribute(format("labtype-%s", state), "empty")
+			self:SetAttribute(format("labaction-%s", state), nil)
+			-- update internal state
+			self:RunAttribute("UpdateState", state)
+			-- send a notification to the insecure code
+			self:CallMethod("ButtonContentsChanged", state, "empty", nil)
+		end
+		-- return the button contents for pickup
+		return self:RunAttribute("PickupButton", type, action)
+	]])
+
+	button:SetAttribute("OnReceiveDrag", [[
+		if self:GetAttribute("LABdisableDragNDrop") then return false end
+		local kind, value, subtype, extra = ...
+		if not kind or not value then return false end
+		local state = self:GetAttribute("state")
+		local buttonType, buttonAction = self:GetAttribute("type"), nil
+		if buttonType == "custom" then return false end
+		-- action buttons can do their magic themself
+		-- for all other buttons, we'll need to update the content now
+		if buttonType ~= "action" and buttonType ~= "pet" then
+			-- with "spell" types, the 4th value contains the actual spell id
+			if kind == "spell" then
+				if extra then
+					value = extra
+				else
+					print("no spell id?", ...)
+				end
+			elseif kind == "item" and value then
+				value = format("item:%d", value)
+			end
+
+			-- Get the action that was on the button before
+			if buttonType ~= "empty" then
+				buttonAction = self:GetAttribute(self:GetAttribute("action_field"))
+			end
+
+			-- TODO: validate what kind of action is being fed in here
+			-- We can only use a handful of the possible things on the cursor
+			-- return false for all those we can't put on buttons
+
+			self:SetAttribute(format("labtype-%s", state), kind)
+			self:SetAttribute(format("labaction-%s", state), value)
+			-- update internal state
+			self:RunAttribute("UpdateState", state)
+			-- send a notification to the insecure code
+			self:CallMethod("ButtonContentsChanged", state, kind, value)
+		else
+			-- get the action for (pet-)action buttons
+			buttonAction = self:GetAttribute("action")
+		end
+		return self:RunAttribute("PickupButton", buttonType, buttonAction)
+	]])
+
+	button:SetScript("OnDragStart", nil)
+	-- Wrapped OnDragStart(self, button, kind, value, ...)
+	button.header:WrapScript(button, "OnDragStart", [[
+		return self:RunAttribute("OnDragStart")
+	]])
+	-- Wrap twice, because the post-script is not run when the pre-script causes a pickup (doh)
+	-- we also need some phony message, or it won't work =/
+	button.header:WrapScript(button, "OnDragStart", [[
+		return "message", "update"
+	]], [[
+		self:RunAttribute("UpdateState", self:GetAttribute("state"))
+	]])
+
+	button:SetScript("OnReceiveDrag", nil)
+	-- Wrapped OnReceiveDrag(self, button, kind, value, ...)
+	button.header:WrapScript(button, "OnReceiveDrag", [[
+		return self:RunAttribute("OnReceiveDrag", kind, value, ...)
+	]])
+	-- Wrap twice, because the post-script is not run when the pre-script causes a pickup (doh)
+	-- we also need some phony message, or it won't work =/
+	button.header:WrapScript(button, "OnReceiveDrag", [[
+		return "message", "update"
+	]], [[
+		self:RunAttribute("UpdateState", self:GetAttribute("state"))
+	]])
+end
+
+function WrapOnClick(button)
+	-- Wrap OnClick, to catch changes to actions that are applied with a click on the button.
+	button.header:WrapScript(button, "OnClick", [[
+		if self:GetAttribute("type") == "action" then
+			local type, action = GetActionInfo(self:GetAttribute("action"))
+			return nil, format("%s|%s", tostring(type), tostring(action))
+		end
+	]], [[
+		local type, action = GetActionInfo(self:GetAttribute("action"))
+		if message ~= format("%s|%s", tostring(type), tostring(action)) then
+			self:RunAttribute("UpdateState", self:GetAttribute("state"))
+		end
+	]])
+end
+
+-----------------------------------------------------------
+--- utility
+
+function lib:GetAllButtons()
+	local buttons = {}
+	for button in next, ButtonRegistry do
+		buttons[button] = true
+	end
+	return buttons
+end
+
+function Generic:ClearSetPoint(...)
+	self:ClearAllPoints()
+	self:SetPoint(...)
+end
+
+function Generic:NewHeader(header)
+	self.header = header
+	self:SetParent(header)
+	SetupSecureSnippets(self)
+	WrapOnClick(self)
+end
+
+
+-----------------------------------------------------------
+--- state management
+
+function Generic:ClearStates()
+	for state in pairs(self.state_types) do
+		self:SetAttribute(format("labtype-%s", state), nil)
+		self:SetAttribute(format("labaction-%s", state), nil)
+	end
+	wipe(self.state_types)
+	wipe(self.state_actions)
+end
+
+function Generic:SetState(state, kind, action)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	-- we allow a nil kind for setting a empty state
+	if not kind then kind = "empty" end
+	if not type_meta_map[kind] then
+		error("SetStateAction: unknown action type: " .. tostring(kind), 2)
+	end
+	if kind ~= "empty" and action == nil then
+		error("SetStateAction: an action is required for non-empty states", 2)
+	end
+	if kind ~= "custom" and action ~= nil and type(action) ~= "number" and type(action) ~= "string" or (kind == "custom" and type(action) ~= "table") then
+		error("SetStateAction: invalid action data type, only strings and numbers allowed", 2)
+	end
+
+	if kind == "item" then
+		if tonumber(action) then
+			action = format("item:%s", action)
+		else
+			local itemString = str_match(action, "^|c%x+|H(item[%d:]+)|h%[")
+			if itemString then
+				action = itemString
+			end
+		end
+	end
+
+	self.state_types[state] = kind
+	self.state_actions[state] = action
+	self:UpdateState(state)
+end
+
+function Generic:UpdateState(state)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	self:SetAttribute(format("labtype-%s", state), self.state_types[state])
+	self:SetAttribute(format("labaction-%s", state), self.state_actions[state])
+	if state ~= tostring(self:GetAttribute("state")) then return end
+	if self.header then
+		self.header:SetFrameRef("updateButton", self)
+		self.header:Execute([[
+			local frame = self:GetFrameRef("updateButton")
+			control:RunFor(frame, frame:GetAttribute("UpdateState"), frame:GetAttribute("state"))
+		]])
+	else
+	-- TODO
+	end
+	self:UpdateAction()
+end
+
+function Generic:GetAction(state)
+	if not state then state = self:GetAttribute("state") end
+	state = tostring(state)
+	return self.state_types[state] or "empty", self.state_actions[state]
+end
+
+function Generic:UpdateAllStates()
+	for state in pairs(self.state_types) do
+		self:UpdateState(state)
+	end
+end
+
+function Generic:ButtonContentsChanged(state, kind, value)
+	state = tostring(state)
+	self.state_types[state] = kind or "empty"
+	self.state_actions[state] = value
+	lib.callbacks:Fire("OnButtonContentsChanged", self, state, self.state_types[state], self.state_actions[state])
+	self:UpdateAction(self)
+end
+
+function Generic:DisableDragNDrop(flag)
+	if InCombatLockdown() then
+		error("LibActionButton-1.0: You can only toggle DragNDrop out of combat!", 2)
+	end
+	if flag then
+		self:SetAttribute("LABdisableDragNDrop", true)
+	else
+		self:SetAttribute("LABdisableDragNDrop", nil)
+	end
+end
+
+function Generic:AddToButtonFacade(group)
+	if type(group) ~= "table" or type(group.AddButton) ~= "function" then
+		error("LibActionButton-1.0:AddToButtonFacade: You need to supply a proper group to use!", 2)
+	end
+	group:AddButton(self)
+	self.LBFSkinned = true
+end
+
+function Generic:AddToMasque(group)
+	if type(group) ~= "table" or type(group.AddButton) ~= "function" then
+		error("LibActionButton-1.0:AddToMasque: You need to supply a proper group to use!", 2)
+	end
+	group:AddButton(self)
+	self.MasqueSkinned = true
+end
+
+function Generic:UpdateAlpha()
+	UpdateCooldown(self)
+end
+
+-----------------------------------------------------------
+--- frame scripts
+
+-- copied (and adjusted) from SecureHandlers.lua
+local function PickupAny(kind, target, detail, ...)
+	if kind == "clear" then
+		ClearCursor()
+		kind, target, detail = target, detail, ...
+	end
+
+	if kind == 'action' then
+		PickupAction(target)
+	elseif kind == 'item' then
+		PickupItem(target)
+	elseif kind == 'macro' then
+		PickupMacro(target)
+	elseif kind == 'petaction' then
+		PickupPetAction(target)
+	elseif kind == 'spell' then
+		PickupSpell(target)
+	elseif kind == 'companion' then
+		PickupCompanion(target, detail)
+	elseif kind == 'equipmentset' then
+		PickupEquipmentSet(target)
+	end
+end
+
+function Generic:OnEnter()
+	if self.config.tooltip ~= "disabled" and (self.config.tooltip ~= "nocombat" or not InCombatLockdown()) then
+		UpdateTooltip(self)
+	end
+	if KeyBound then
+		KeyBound:Set(self)
+	end
+
+	if self._state_type == "action" and self.NewActionTexture then
+		ClearNewActionHighlight(self._state_action, false, false)
+		UpdateNewAction(self)
+	end
+end
+
+function Generic:OnLeave()
+	GameTooltip:Hide()
+end
+
+-- Insecure drag handler to allow clicking on the button with an action on the cursor
+-- to place it on the button. Like action buttons work.
+function Generic:PreClick()
+	if self._state_type == "action" or self._state_type == "pet"
+	   or InCombatLockdown() or self:GetAttribute("LABdisableDragNDrop")
+	then
+		return
+	end
+	-- check if there is actually something on the cursor
+	local kind, value, subtype = GetCursorInfo()
+	if not (kind and value) then return end
+	self._old_type = self._state_type
+	if self._state_type and self._state_type ~= "empty" then
+		self._old_type = self._state_type
+		self:SetAttribute("type", "empty")
+		--self:SetState(nil, "empty", nil)
+	end
+	self._receiving_drag = true
+end
+
+local function formatHelper(input)
+	if type(input) == "string" then
+		return format("%q", input)
+	else
+		return tostring(input)
+	end
+end
+
+function Generic:PostClick()
+	UpdateButtonState(self)
+	if self._receiving_drag and not InCombatLockdown() then
+		if self._old_type then
+			self:SetAttribute("type", self._old_type)
+			self._old_type = nil
+		end
+		local oldType, oldAction = self._state_type, self._state_action
+		local kind, data, subtype, extra = GetCursorInfo()
+		self.header:SetFrameRef("updateButton", self)
+		self.header:Execute(format([[
+			local frame = self:GetFrameRef("updateButton")
+			control:RunFor(frame, frame:GetAttribute("OnReceiveDrag"), %s, %s, %s, %s)
+			control:RunFor(frame, frame:GetAttribute("UpdateState"), %s)
+		]], formatHelper(kind), formatHelper(data), formatHelper(subtype), formatHelper(extra), formatHelper(self:GetAttribute("state"))))
+		PickupAny("clear", oldType, oldAction)
+	end
+	self._receiving_drag = nil
+
+	if self._state_type == "action" and lib.ACTION_HIGHLIGHT_MARKS[self._state_action] then
+		ClearNewActionHighlight(self._state_action, false, false)
+	end
+end
+
+-----------------------------------------------------------
+--- configuration
+
+local function merge(target, source, default)
+	for k,v in pairs(default) do
+		if type(v) ~= "table" then
+			if source and source[k] ~= nil then
+				target[k] = source[k]
+			else
+				target[k] = v
+			end
+		else
+			if type(target[k]) ~= "table" then target[k] = {} else wipe(target[k]) end
+			merge(target[k], type(source) == "table" and source[k], v)
+		end
+	end
+	return target
+end
+
+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
+	-- merge the two configs
+	merge(self.config, config, DefaultConfig)
+
+	if self.config.outOfRangeColoring == "button" or (oldconfig and oldconfig.outOfRangeColoring == "button") then
+		UpdateUsable(self)
+	end
+	if self.config.outOfRangeColoring == "hotkey" then
+		self.outOfRange = nil
+	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
+		self.Name:Show()
+	end
+
+	self:SetAttribute("flyoutDirection", self.config.flyoutDirection)
+
+	UpdateHotkeys(self)
+	UpdateGrid(self)
+	Update(self)
+	self:RegisterForClicks(self.config.clickOnDown and "AnyDown" or "AnyUp")
+end
+
+-----------------------------------------------------------
+--- event handler
+
+function ForAllButtons(method, onlyWithAction)
+	assert(type(method) == "function")
+	for button in next, (onlyWithAction and ActiveButtons or ButtonRegistry) do
+		method(button)
+	end
+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("ACTIONBAR_PAGE_CHANGED")
+	--lib.eventFrame:RegisterEvent("UPDATE_BONUS_ACTIONBAR")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_SLOT_CHANGED")
+	lib.eventFrame:RegisterEvent("UPDATE_BINDINGS")
+	lib.eventFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
+	lib.eventFrame:RegisterEvent("UPDATE_VEHICLE_ACTIONBAR")
+
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_STATE")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_USABLE")
+	lib.eventFrame:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN")
+	lib.eventFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
+	lib.eventFrame:RegisterEvent("TRADE_SKILL_SHOW")
+	lib.eventFrame:RegisterEvent("TRADE_SKILL_CLOSE")
+	lib.eventFrame:RegisterEvent("ARCHAEOLOGY_CLOSED")
+	lib.eventFrame:RegisterEvent("PLAYER_ENTER_COMBAT")
+	lib.eventFrame:RegisterEvent("PLAYER_LEAVE_COMBAT")
+	lib.eventFrame:RegisterEvent("START_AUTOREPEAT_SPELL")
+	lib.eventFrame:RegisterEvent("STOP_AUTOREPEAT_SPELL")
+	lib.eventFrame:RegisterEvent("UNIT_ENTERED_VEHICLE")
+	lib.eventFrame:RegisterEvent("UNIT_EXITED_VEHICLE")
+	lib.eventFrame:RegisterEvent("COMPANION_UPDATE")
+	lib.eventFrame:RegisterEvent("UNIT_INVENTORY_CHANGED")
+	lib.eventFrame:RegisterEvent("LEARNED_SPELL_IN_TAB")
+	lib.eventFrame:RegisterEvent("PET_STABLE_UPDATE")
+	lib.eventFrame:RegisterEvent("PET_STABLE_SHOW")
+	lib.eventFrame:RegisterEvent("SPELL_ACTIVATION_OVERLAY_GLOW_SHOW")
+	lib.eventFrame:RegisterEvent("SPELL_ACTIVATION_OVERLAY_GLOW_HIDE")
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_CHARGES")
+	lib.eventFrame:RegisterEvent("UPDATE_SUMMONPETS_ACTION")
+
+	-- With those two, do we still need the ACTIONBAR equivalents of them?
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_COOLDOWN")
+	lib.eventFrame:RegisterEvent("SPELL_UPDATE_USABLE")
+	lib.eventFrame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
+
+	lib.eventFrame:RegisterEvent("LOSS_OF_CONTROL_ADDED")
+	lib.eventFrame:RegisterEvent("LOSS_OF_CONTROL_UPDATE")
+
+	lib.eventFrame:Show()
+	lib.eventFrame:SetScript("OnUpdate", OnUpdate)
+end
+
+function OnEvent(frame, event, arg1, ...)
+	if (event == "UNIT_INVENTORY_CHANGED" and arg1 == "player") or event == "LEARNED_SPELL_IN_TAB" then
+		local tooltipOwner = GameTooltip:GetOwner()
+		if ButtonRegistry[tooltipOwner] then
+			tooltipOwner:SetTooltip()
+		end
+	elseif event == "ACTIONBAR_SLOT_CHANGED" then
+		for button in next, ButtonRegistry do
+			if button._state_type == "action" and (arg1 == 0 or arg1 == tonumber(button._state_action)) then
+				ClearNewActionHighlight(button._state_action, true, false)
+				Update(button)
+			end
+		end
+	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()
+	elseif event == "UPDATE_BINDINGS" then
+		ForAllButtons(UpdateHotkeys)
+	elseif event == "PLAYER_TARGET_CHANGED" then
+		UpdateRangeTimer()
+	elseif (event == "ACTIONBAR_UPDATE_STATE") or
+		((event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITED_VEHICLE") and (arg1 == "player")) or
+		((event == "COMPANION_UPDATE") and (arg1 == "MOUNT")) then
+		ForAllButtons(UpdateButtonState, true)
+	elseif event == "ACTIONBAR_UPDATE_USABLE" then
+		for button in next, ActionButtons do
+			UpdateUsable(button)
+		end
+	elseif event == "SPELL_UPDATE_USABLE" then
+		for button in next, NonActionButtons do
+			UpdateUsable(button)
+		end
+	elseif event == "ACTIONBAR_UPDATE_COOLDOWN" then
+		for button in next, ActionButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "SPELL_UPDATE_COOLDOWN" then
+		for button in next, NonActionButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "LOSS_OF_CONTROL_ADDED" then
+		for button in next, ActiveButtons do
+			UpdateCooldown(button)
+			if GameTooltip:GetOwner() == button then
+				UpdateTooltip(button)
+			end
+		end
+	elseif event == "LOSS_OF_CONTROL_UPDATE" then
+		for button in next, ActiveButtons do
+			UpdateCooldown(button)
+		end
+	elseif event == "TRADE_SKILL_SHOW" or event == "TRADE_SKILL_CLOSE"  or event == "ARCHAEOLOGY_CLOSED" then
+		ForAllButtons(UpdateButtonState, true)
+	elseif event == "PLAYER_ENTER_COMBAT" then
+		for button in next, ActiveButtons do
+			if button:IsAttack() then
+				StartFlash(button)
+			end
+		end
+	elseif event == "PLAYER_LEAVE_COMBAT" then
+		for button in next, ActiveButtons do
+			if button:IsAttack() then
+				StopFlash(button)
+			end
+		end
+	elseif event == "START_AUTOREPEAT_SPELL" then
+		for button in next, ActiveButtons do
+			if button:IsAutoRepeat() then
+				StartFlash(button)
+			end
+		end
+	elseif event == "STOP_AUTOREPEAT_SPELL" then
+		for button in next, ActiveButtons do
+			if button.flashing == 1 and not button:IsAttack() then
+				StopFlash(button)
+			end
+		end
+	elseif event == "PET_STABLE_UPDATE" or event == "PET_STABLE_SHOW" then
+		ForAllButtons(Update)
+	elseif event == "SPELL_ACTIVATION_OVERLAY_GLOW_SHOW" then
+		for button in next, ActiveButtons do
+			local spellId = button:GetSpellId()
+			if spellId and spellId == arg1 then
+				ShowOverlayGlow(button)
+			else
+				if button._state_type == "action" then
+					local actionType, id = GetActionInfo(button._state_action)
+					if actionType == "flyout" and FlyoutHasSpell(id, arg1) then
+						ShowOverlayGlow(button)
+					end
+				end
+			end
+		end
+	elseif event == "SPELL_ACTIVATION_OVERLAY_GLOW_HIDE" then
+		for button in next, ActiveButtons do
+			local spellId = button:GetSpellId()
+			if spellId and spellId == arg1 then
+				HideOverlayGlow(button)
+			else
+				if button._state_type == "action" then
+					local actionType, id = GetActionInfo(button._state_action)
+					if actionType == "flyout" and FlyoutHasSpell(id, arg1) then
+						HideOverlayGlow(button)
+					end
+				end
+			end
+		end
+	elseif event == "PLAYER_EQUIPMENT_CHANGED" then
+		for button in next, ActiveButtons do
+			if button._state_type == "item" then
+				Update(button)
+			end
+		end
+	elseif event == "SPELL_UPDATE_CHARGES" then
+		ForAllButtons(UpdateCount, true)
+	elseif event == "UPDATE_SUMMONPETS_ACTION" then
+		for button in next, ActiveButtons do
+			if button._state_type == "action" then
+				local actionType, id = GetActionInfo(button._state_action)
+				if actionType == "summonpet" then
+					local texture = GetActionTexture(button._state_action)
+					if texture then
+						button.icon:SetTexture(texture)
+					end
+				end
+			end
+		end
+	end
+end
+
+local flashTime = 0
+local rangeTimer = -1
+function OnUpdate(_, elapsed)
+	flashTime = flashTime - elapsed
+	rangeTimer = rangeTimer - elapsed
+	-- Run the loop only when there is something to update
+	if rangeTimer <= 0 or flashTime <= 0 then
+		for button in next, ActiveButtons do
+			-- Flashing
+			if button.flashing == 1 and flashTime <= 0 then
+				if button.Flash:IsShown() then
+					button.Flash:Hide()
+				else
+					button.Flash:Show()
+				end
+			end
+
+			-- Range
+			if rangeTimer <= 0 then
+				local inRange = button:IsInRange()
+				local oldRange = button.outOfRange
+				button.outOfRange = (inRange == false)
+				if oldRange ~= button.outOfRange then
+					if button.config.outOfRangeColoring == "button" then
+						UpdateUsable(button)
+					elseif button.config.outOfRangeColoring == "hotkey" then
+						local hotkey = button.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(button.config.colors.range))
+						else
+							hotkey:SetVertexColor(0.75, 0.75, 0.75)
+						end
+					end
+				end
+			end
+		end
+
+		-- Update values
+		if flashTime <= 0 then
+			flashTime = flashTime + ATTACK_BUTTON_FLASH_TIME
+		end
+		if rangeTimer <= 0 then
+			rangeTimer = TOOLTIP_UPDATE_TIME
+		end
+	end
+end
+
+local gridCounter = 0
+function ShowGrid()
+	gridCounter = gridCounter + 1
+	if gridCounter >= 1 then
+		for button in next, ButtonRegistry do
+			if button:IsShown() then
+				button:SetAlpha(1.0)
+			end
+		end
+	end
+end
+
+function HideGrid()
+	if gridCounter > 0 then
+		gridCounter = gridCounter - 1
+	end
+	if gridCounter == 0 then
+		for button in next, ButtonRegistry do
+			if button:IsShown() and not button:HasAction() and not button.config.showGrid then
+				button:SetAlpha(0.0)
+			end
+		end
+	end
+end
+
+function UpdateGrid(self)
+	if self.config.showGrid then
+		self:SetAlpha(1.0)
+	elseif gridCounter == 0 and self:IsShown() and not self:HasAction() then
+		self:SetAlpha(0.0)
+	end
+end
+
+-----------------------------------------------------------
+--- KeyBound integration
+
+function Generic:GetBindingAction()
+	return self.config.keyBoundTarget or "CLICK "..self:GetName()..":LeftButton"
+end
+
+function Generic:GetHotkey()
+	local name = "CLICK "..self:GetName()..":LeftButton"
+	local key = GetBindingKey(self.config.keyBoundTarget or name)
+	if not key and self.config.keyBoundTarget then
+		key = GetBindingKey(name)
+	end
+	if key then
+		return KeyBound and KeyBound:ToShortKey(key) or key
+	end
+end
+
+local function getKeys(binding, keys)
+	keys = keys or ""
+	for i = 1, select("#", GetBindingKey(binding)) do
+		local hotKey = select(i, GetBindingKey(binding))
+		if keys ~= "" then
+			keys = keys .. ", "
+		end
+		keys = keys .. GetBindingText(hotKey, "KEY_")
+	end
+	return keys
+end
+
+function Generic:GetBindings()
+	local keys, binding
+
+	if self.config.keyBoundTarget then
+		keys = getKeys(self.config.keyBoundTarget)
+	end
+
+	keys = getKeys("CLICK "..self:GetName()..":LeftButton")
+
+	return keys
+end
+
+function Generic:SetKey(key)
+	if self.config.keyBoundTarget then
+		SetBinding(key, self.config.keyBoundTarget)
+	else
+		SetBindingClick(key, self:GetName(), "LeftButton")
+	end
+	lib.callbacks:Fire("OnKeybindingChanged", self, key)
+end
+
+local function clearBindings(binding)
+	while GetBindingKey(binding) do
+		SetBinding(GetBindingKey(binding), nil)
+	end
+end
+
+function Generic:ClearBindings()
+	if self.config.keyBoundTarget then
+		clearBindings(self.config.keyBoundTarget)
+	end
+	clearBindings("CLICK "..self:GetName()..":LeftButton")
+	lib.callbacks:Fire("OnKeybindingChanged", self, nil)
+end
+
+-----------------------------------------------------------
+--- button management
+
+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)
+	if self:HasAction() then
+		ActiveButtons[self] = true
+		if self._state_type == "action" then
+			ActionButtons[self] = true
+			NonActionButtons[self] = nil
+		else
+			ActionButtons[self] = nil
+			NonActionButtons[self] = true
+		end
+		self:SetAlpha(1.0)
+		UpdateButtonState(self)
+		UpdateUsable(self)
+		UpdateCooldown(self)
+		UpdateFlash(self)
+	else
+		ActiveButtons[self] = nil
+		ActionButtons[self] = nil
+		NonActionButtons[self] = nil
+		if gridCounter == 0 and not self.config.showGrid then
+			self:SetAlpha(0.0)
+		end
+		self.cooldown:Hide()
+		self:SetChecked(false)
+
+		if self.chargeCooldown then
+			EndChargeCooldown(self.chargeCooldown)
+		end
+	end
+
+	-- Add a green border if button is an equipped item
+	if self:IsEquipped() and not self.config.hideElements.equipped then
+		self.Border:SetVertexColor(0, 1.0, 0, 0.35)
+		self.Border:Show()
+	else
+		self.Border:Hide()
+	end
+
+	-- Update Action Text
+	if not self:IsConsumableOrStackable() then
+		self.Name:SetText(self:GetActionText())
+	else
+		self.Name:SetText("")
+	end
+
+	-- Update icon and hotkey
+	local texture = self:GetTexture()
+
+	-- Zone ability button handling
+	self.zoneAbilityDisabled = false
+	self.icon:SetDesaturated(false)
+	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
+			local name = GetSpellInfo(ZoneAbilityFrame.baseName)
+			local abilityName = GetSpellInfo(id)
+			if name == abilityName then
+				texture = GetLastZoneAbilitySpellTexture()
+				self.zoneAbilityDisabled = true
+				self.icon:SetDesaturated(true)
+			end
+		end
+	end
+
+	if texture then
+		self.icon:SetTexture(texture)
+		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
+	else
+		self.icon:Hide()
+		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
+	end
+
+	self:UpdateLocal()
+
+	UpdateCount(self)
+
+	UpdateFlyout(self)
+
+	UpdateOverlayGlow(self)
+
+	UpdateNewAction(self)
+
+	if GameTooltip:GetOwner() == self then
+		UpdateTooltip(self)
+	end
+
+	-- this could've been a spec change, need to call OnStateChanged for action buttons, if present
+	if not InCombatLockdown() and self._state_type == "action" then
+		local onStateChanged = self:GetAttribute("OnStateChanged")
+		if onStateChanged then
+			self.header:SetFrameRef("updateButton", self)
+			self.header:Execute(([[
+				local frame = self:GetFrameRef("updateButton")
+				control:RunFor(frame, frame:GetAttribute("OnStateChanged"), %s, %s, %s)
+			]]):format(formatHelper(self:GetAttribute("state")), formatHelper(self._state_type), formatHelper(self._state_action)))
+		end
+	end
+	lib.callbacks:Fire("OnButtonUpdate", self)
+end
+
+function Generic:UpdateLocal()
+-- dummy function the other button types can override for special updating
+end
+
+function UpdateButtonState(self)
+	if self:IsCurrentlyActive() or self:IsAutoRepeat() then
+		self:SetChecked(true)
+	else
+		self:SetChecked(false)
+	end
+	lib.callbacks:Fire("OnButtonState", 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)
+		else
+			self.icon:SetVertexColor(0.4, 0.4, 0.4)
+			--self.NormalTexture:SetVertexColor(1.0, 1.0, 1.0)
+		end
+	end
+	lib.callbacks:Fire("OnButtonUsable", self)
+end
+
+function UpdateCount(self)
+	if not self:HasAction() then
+		self.Count:SetText("")
+		return
+	end
+	if self:IsConsumableOrStackable() then
+		local count = self:GetCount()
+		if count > (self.maxDisplayCount or 9999) then
+			self.Count:SetText("*")
+		else
+			self.Count:SetText(count)
+		end
+	else
+		local charges, maxCharges, chargeStart, chargeDuration = self:GetCharges()
+		if charges and maxCharges and maxCharges > 1 then
+			self.Count:SetText(charges)
+		else
+			self.Count:SetText("")
+		end
+	end
+end
+
+function EndChargeCooldown(self)
+	self:Hide()
+	self:SetParent(UIParent)
+	self.parent.chargeCooldown = nil
+	self.parent = nil
+	tinsert(lib.ChargeCooldowns, self)
+end
+
+local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeModRate)
+	if not parent.chargeCooldown then
+		local cooldown = tremove(lib.ChargeCooldowns)
+		if not cooldown then
+			lib.NumChargeCooldowns = lib.NumChargeCooldowns + 1
+			cooldown = CreateFrame("Cooldown", "LAB10ChargeCooldown"..lib.NumChargeCooldowns, parent, "CooldownFrameTemplate");
+			cooldown:SetScript("OnCooldownDone", EndChargeCooldown)
+			cooldown:SetHideCountdownNumbers(true)
+			cooldown:SetDrawSwipe(false)
+		end
+		cooldown:SetParent(parent)
+		cooldown:SetAllPoints(parent)
+		cooldown:SetFrameStrata("TOOLTIP")
+		cooldown:Show()
+		parent.chargeCooldown = cooldown
+		cooldown.parent = parent
+	end
+	-- set cooldown
+	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
+	if Masque and Masque.UpdateCharge then
+		Masque:UpdateCharge(parent)
+	end
+
+	if not chargeStart or chargeStart == 0 then
+		EndChargeCooldown(parent.chargeCooldown)
+	end
+end
+
+local function OnCooldownDone(self)
+	self:SetScript("OnCooldownDone", nil)
+	UpdateCooldown(self:GetParent())
+end
+
+function UpdateCooldown(self)
+	local locStart, locDuration = self:GetLossOfControlCooldown()
+	local start, duration, enable, modRate = self:GetCooldown()
+	local charges, maxCharges, chargeStart, chargeDuration, chargeModRate = self:GetCharges()
+
+	self.cooldown:SetDrawBling(self.cooldown:GetEffectiveAlpha() > 0.5)
+
+	if (locStart + locDuration) > (start + duration) then
+		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_LOSS_OF_CONTROL then
+			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge-LoC")
+			self.cooldown:SetSwipeColor(0.17, 0, 0)
+			self.cooldown:SetHideCountdownNumbers(true)
+			self.cooldown.currentCooldownType = COOLDOWN_TYPE_LOSS_OF_CONTROL
+		end
+		CooldownFrame_Set(self.cooldown, locStart, locDuration, true, true, modRate)
+	else
+		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.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)
+		elseif self.chargeCooldown then
+			EndChargeCooldown(self.chargeCooldown)
+		end
+		CooldownFrame_Set(self.cooldown, start, duration, enable, false, modRate)
+	end
+end
+
+function StartFlash(self)
+	self.flashing = 1
+	flashTime = 0
+	UpdateButtonState(self)
+end
+
+function StopFlash(self)
+	self.flashing = 0
+	self.Flash:Hide()
+	UpdateButtonState(self)
+end
+
+function UpdateFlash(self)
+	if (self:IsAttack() and self:IsCurrentlyActive()) or self:IsAutoRepeat() then
+		StartFlash(self)
+	else
+		StopFlash(self)
+	end
+end
+
+function UpdateTooltip(self)
+	if (GetCVar("UberTooltips") == "1") then
+		GameTooltip_SetDefaultAnchor(GameTooltip, self);
+	else
+		GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
+	end
+	if self:SetTooltip() then
+		self.UpdateTooltip = UpdateTooltip
+	else
+		self.UpdateTooltip = nil
+	end
+end
+
+function UpdateHotkeys(self)
+	local key = self:GetHotkey()
+	if not key or key == "" or self.config.hideElements.hotkey then
+		self.HotKey:SetText(RANGE_INDICATOR)
+		self.HotKey:SetPoint("TOPLEFT", self, "TOPLEFT", 1, - 2)
+		self.HotKey:Hide()
+	else
+		self.HotKey:SetText(key)
+		self.HotKey:SetPoint("TOPLEFT", self, "TOPLEFT", - 2, - 2)
+		self.HotKey:Show()
+	end
+end
+
+function ShowOverlayGlow(self)
+	if LBG then
+		LBG.ShowOverlayGlow(self)
+	end
+end
+
+function HideOverlayGlow(self)
+	if LBG then
+		LBG.HideOverlayGlow(self)
+	end
+end
+
+function UpdateOverlayGlow(self)
+	local spellId = self:GetSpellId()
+	if spellId and IsSpellOverlayed(spellId) then
+		ShowOverlayGlow(self)
+	else
+		HideOverlayGlow(self)
+	end
+end
+
+function ClearNewActionHighlight(action, preventIdenticalActionsFromClearing, value)
+	lib.ACTION_HIGHLIGHT_MARKS[action] = value
+
+	for button in next, ButtonRegistry do
+		if button._state_type == "action" and action == tonumber(button._state_action) then
+			UpdateNewAction(button)
+		end
+	end
+
+	if preventIdenticalActionsFromClearing then
+		return
+	end
+
+	-- iterate through actions and unmark all that are the same type
+	local unmarkedType, unmarkedID = GetActionInfo(action)
+	for actionKey, markValue in pairs(lib.ACTION_HIGHLIGHT_MARKS) do
+		if markValue then
+			local actionType, actionID = GetActionInfo(actionKey)
+			if actionType == unmarkedType and actionID == unmarkedID then
+				ClearNewActionHighlight(actionKey, true, value)
+			end
+		end
+	end
+end
+
+hooksecurefunc("MarkNewActionHighlight", function(action)
+	lib.ACTION_HIGHLIGHT_MARKS[action] = true
+	for button in next, ButtonRegistry do
+		if button._state_type == "action" and action == tonumber(button._state_action) then
+			UpdateNewAction(button)
+		end
+	end
+end)
+
+hooksecurefunc("ClearNewActionHighlight", function(action, preventIdenticalActionsFromClearing)
+	ClearNewActionHighlight(action, preventIdenticalActionsFromClearing, nil)
+end)
+
+function UpdateNewAction(self)
+	-- special handling for "New Action" markers
+	if self.NewActionTexture then
+		if self._state_type == "action" and lib.ACTION_HIGHLIGHT_MARKS[self._state_action] then
+			self.NewActionTexture:Show()
+		else
+			self.NewActionTexture:Hide()
+		end
+	end
+end
+
+-- Hook UpdateFlyout so we can use the blizzy templates
+hooksecurefunc("ActionButton_UpdateFlyout", function(self, ...)
+	if ButtonRegistry[self] then
+		UpdateFlyout(self)
+	end
+end)
+
+function UpdateFlyout(self)
+	-- disabled FlyoutBorder/BorderShadow, those are not handled by LBF and look terrible
+	self.FlyoutBorder:Hide()
+	self.FlyoutBorderShadow:Hide()
+	if self._state_type == "action" then
+		-- based on ActionButton_UpdateFlyout in ActionButton.lua
+		local actionType = GetActionInfo(self._state_action)
+		if actionType == "flyout" then
+			-- Update border and determine arrow position
+			local arrowDistance
+			if (SpellFlyout and SpellFlyout:IsShown() and SpellFlyout:GetParent() == self) or GetMouseFocus() == self then
+				arrowDistance = 5
+			else
+				arrowDistance = 2
+			end
+
+			-- Update arrow
+			self.FlyoutArrow:Show()
+			self.FlyoutArrow:ClearAllPoints()
+			local direction = self:GetAttribute("flyoutDirection");
+			if direction == "LEFT" then
+				self.FlyoutArrow:SetPoint("LEFT", self, "LEFT", -arrowDistance, 0)
+				SetClampedTextureRotation(self.FlyoutArrow, 270)
+			elseif direction == "RIGHT" then
+				self.FlyoutArrow:SetPoint("RIGHT", self, "RIGHT", arrowDistance, 0)
+				SetClampedTextureRotation(self.FlyoutArrow, 90)
+			elseif direction == "DOWN" then
+				self.FlyoutArrow:SetPoint("BOTTOM", self, "BOTTOM", 0, -arrowDistance)
+				SetClampedTextureRotation(self.FlyoutArrow, 180)
+			else
+				self.FlyoutArrow:SetPoint("TOP", self, "TOP", 0, arrowDistance)
+				SetClampedTextureRotation(self.FlyoutArrow, 0)
+			end
+
+			-- return here, otherwise flyout is hidden
+			return
+		end
+	end
+	self.FlyoutArrow:Hide()
+end
+
+function UpdateRangeTimer()
+	rangeTimer = -1
+end
+
+-----------------------------------------------------------
+--- WoW API mapping
+--- Generic Button
+Generic.HasAction               = function(self) return nil end
+Generic.GetActionText           = function(self) return "" end
+Generic.GetTexture              = function(self) return nil end
+Generic.GetCharges              = function(self) return nil end
+Generic.GetCount                = function(self) return 0 end
+Generic.GetCooldown             = function(self) return 0, 0, 0 end
+Generic.IsAttack                = function(self) return nil end
+Generic.IsEquipped              = function(self) return nil end
+Generic.IsCurrentlyActive       = function(self) return nil end
+Generic.IsAutoRepeat            = function(self) return nil end
+Generic.IsUsable                = function(self) return nil end
+Generic.IsConsumableOrStackable = function(self) return nil end
+Generic.IsUnitInRange           = function(self, unit) return nil end
+Generic.IsInRange               = function(self)
+	local unit = self:GetAttribute("unit")
+	if unit == "player" then
+		unit = nil
+	end
+	local val = self:IsUnitInRange(unit)
+	-- map 1/0 to true false, since the return values are inconsistent between actions and spells
+	if val == 1 then val = true elseif val == 0 then val = false end
+	return val
+end
+Generic.SetTooltip              = function(self) return nil end
+Generic.GetSpellId              = function(self) return nil end
+Generic.GetLossOfControlCooldown = function(self) return 0, 0 end
+
+-----------------------------------------------------------
+--- Action Button
+Action.HasAction               = function(self) return HasAction(self._state_action) end
+Action.GetActionText           = function(self) return GetActionText(self._state_action) end
+Action.GetTexture              = function(self) return GetActionTexture(self._state_action) end
+Action.GetCharges              = function(self) return GetActionCharges(self._state_action) end
+Action.GetCount                = function(self) return GetActionCount(self._state_action) end
+Action.GetCooldown             = function(self) return GetActionCooldown(self._state_action) end
+Action.IsAttack                = function(self) return IsAttackAction(self._state_action) end
+Action.IsEquipped              = function(self) return IsEquippedAction(self._state_action) end
+Action.IsCurrentlyActive       = function(self) return IsCurrentAction(self._state_action) end
+Action.IsAutoRepeat            = function(self) return IsAutoRepeatAction(self._state_action) end
+Action.IsUsable                = function(self) return IsUsableAction(self._state_action) end
+Action.IsConsumableOrStackable = function(self) return IsConsumableAction(self._state_action) or IsStackableAction(self._state_action) or (not IsItemAction(self._state_action) and GetActionCount(self._state_action) > 0) end
+Action.IsUnitInRange           = function(self, unit) return IsActionInRange(self._state_action, unit) end
+Action.SetTooltip              = function(self) return GameTooltip:SetAction(self._state_action) end
+Action.GetSpellId              = function(self)
+	local actionType, id, subType = GetActionInfo(self._state_action)
+	if actionType == "spell" then
+		return id
+	elseif actionType == "macro" then
+		local _, _, spellId = GetMacroSpell(id)
+		return spellId
+	end
+end
+Action.GetLossOfControlCooldown = function(self) return GetActionLossOfControlCooldown(self._state_action) end
+
+-----------------------------------------------------------
+--- Spell Button
+Spell.HasAction               = function(self) return true end
+Spell.GetActionText           = function(self) return "" end
+Spell.GetTexture              = function(self) return GetSpellTexture(self._state_action) end
+Spell.GetCharges              = function(self) return GetSpellCharges(self._state_action) end
+Spell.GetCount                = function(self) return GetSpellCount(self._state_action) end
+Spell.GetCooldown             = function(self) return GetSpellCooldown(self._state_action) end
+Spell.IsAttack                = function(self) return IsAttackSpell(FindSpellBookSlotBySpellID(self._state_action), "spell") end -- needs spell book id as of 4.0.1.13066
+Spell.IsEquipped              = function(self) return nil end
+Spell.IsCurrentlyActive       = function(self) return IsCurrentSpell(self._state_action) end
+Spell.IsAutoRepeat            = function(self) return IsAutoRepeatSpell(FindSpellBookSlotBySpellID(self._state_action), "spell") end -- needs spell book id as of 4.0.1.13066
+Spell.IsUsable                = function(self) return IsUsableSpell(self._state_action) end
+Spell.IsConsumableOrStackable = function(self) return IsConsumableSpell(self._state_action) end
+Spell.IsUnitInRange           = function(self, unit) return IsSpellInRange(FindSpellBookSlotBySpellID(self._state_action), "spell", unit) end -- needs spell book id as of 4.0.1.13066
+Spell.SetTooltip              = function(self) return GameTooltip:SetSpellByID(self._state_action) end
+Spell.GetSpellId              = function(self) return self._state_action end
+
+-----------------------------------------------------------
+--- Item Button
+local function getItemId(input)
+	return input:match("^item:(%d+)")
+end
+
+Item.HasAction               = function(self) return true end
+Item.GetActionText           = function(self) return "" end
+Item.GetTexture              = function(self) return GetItemIcon(self._state_action) end
+Item.GetCharges              = function(self) return nil end
+Item.GetCount                = function(self) return GetItemCount(self._state_action, nil, true) end
+Item.GetCooldown             = function(self) return GetItemCooldown(getItemId(self._state_action)) end
+Item.IsAttack                = function(self) return nil end
+Item.IsEquipped              = function(self) return IsEquippedItem(self._state_action) end
+Item.IsCurrentlyActive       = function(self) return IsCurrentItem(self._state_action) end
+Item.IsAutoRepeat            = function(self) return nil end
+Item.IsUsable                = function(self) return IsUsableItem(self._state_action) end
+Item.IsConsumableOrStackable = function(self) return IsConsumableItem(self._state_action) 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.GetSpellId              = function(self) return nil end
+
+-----------------------------------------------------------
+--- Macro Button
+-- TODO: map results of GetMacroSpell/GetMacroItem to proper results
+Macro.HasAction               = function(self) return true end
+Macro.GetActionText           = function(self) return (GetMacroInfo(self._state_action)) end
+Macro.GetTexture              = function(self) return (select(2, GetMacroInfo(self._state_action))) end
+Macro.GetCharges              = function(self) return nil end
+Macro.GetCount                = function(self) return 0 end
+Macro.GetCooldown             = function(self) return 0, 0, 0 end
+Macro.IsAttack                = function(self) return nil end
+Macro.IsEquipped              = function(self) return nil end
+Macro.IsCurrentlyActive       = function(self) return nil end
+Macro.IsAutoRepeat            = function(self) return nil end
+Macro.IsUsable                = function(self) return nil end
+Macro.IsConsumableOrStackable = function(self) return nil end
+Macro.IsUnitInRange           = function(self, unit) return nil end
+Macro.SetTooltip              = function(self) return nil end
+Macro.GetSpellId              = function(self) return nil end
+
+-----------------------------------------------------------
+--- Custom Button
+Custom.HasAction               = function(self) return true end
+Custom.GetActionText           = function(self) return "" end
+Custom.GetTexture              = function(self) return self._state_action.texture end
+Custom.GetCharges              = function(self) return nil end
+Custom.GetCount                = function(self) return 0 end
+Custom.GetCooldown             = function(self) return 0, 0, 0 end
+Custom.IsAttack                = function(self) return nil end
+Custom.IsEquipped              = function(self) return nil end
+Custom.IsCurrentlyActive       = function(self) return nil end
+Custom.IsAutoRepeat            = function(self) return nil end
+Custom.IsUsable                = function(self) return true end
+Custom.IsConsumableOrStackable = function(self) return nil end
+Custom.IsUnitInRange           = function(self, unit) return nil end
+Custom.SetTooltip              = function(self) return GameTooltip:SetText(self._state_action.tooltip) end
+Custom.GetSpellId              = function(self) return nil end
+Custom.RunCustom               = function(self, unit, button) return self._state_action.func(self, unit, button) end
+
+-----------------------------------------------------------
+--- Update old Buttons
+if oldversion and next(lib.buttonRegistry) then
+	InitializeEventHandler()
+	for button in next, lib.buttonRegistry do
+		-- this refreshes the metatable on the button
+		Generic.UpdateAction(button, true)
+		SetupSecureSnippets(button)
+		if oldversion < 12 then
+			WrapOnClick(button)
+		end
+		if oldversion < 23 then
+			if button.overlay then
+				button.overlay:Hide()
+				ActionButton_HideOverlayGlow(button)
+				button.overlay = nil
+				UpdateOverlayGlow(button)
+			end
+		end
+	end
+end
diff --git a/Jamba/LibActionButtonJamba-1.0.lua b/Jamba/LibActionButtonJamba-1.0.lua
index 93899c3..8f28d61 100644
--- a/Jamba/LibActionButtonJamba-1.0.lua
+++ b/Jamba/LibActionButtonJamba-1.0.lua
@@ -1,5 +1,5 @@
 --[[
-Copyright (c) 2010-2015, Hendrik "nevcairiel" Leppkes <h.leppkes@gmail.com>
+Copyright (c) 2010-2017, Hendrik "nevcairiel" Leppkes <h.leppkes@gmail.com>

 All rights reserved.

@@ -29,14 +29,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 ]]
 local MAJOR_VERSION = "LibActionButtonJamba-1.0"
-local MINOR_VERSION = 66
+local MINOR_VERSION = 68

 if not LibStub then error(MAJOR_VERSION .. " requires LibStub.") end
 local lib, oldversion = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
 if not lib then return end

-local IsLegion = select(4, GetBuildInfo()) >= 70000
-
 -- Lua functions
 local _G = _G
 local type, error, tostring, tonumber, assert, select = type, error, tostring, tonumber, assert, select
@@ -57,7 +55,7 @@ local str_match, format, tinsert, tremove = string.match, format, tinsert, tremo
 -- GLOBALS: GetItemIcon, GetItemCount, GetItemCooldown, IsEquippedItem, IsCurrentItem, IsUsableItem, IsConsumableItem, IsItemInRange
 -- GLOBALS: GetActionCharges, IsItemAction, GetSpellCharges
 -- GLOBALS: RANGE_INDICATOR, ATTACK_BUTTON_FLASH_TIME, TOOLTIP_UPDATE_TIME
--- GLOBALS: DraenorZoneAbilityFrame, HasDraenorZoneAbility, GetLastDraenorSpellTexture
+-- GLOBALS: ZoneAbilityFrame, HasZoneAbility, GetLastZoneAbilitySpellTexture

 local KeyBound = LibStub("LibKeyBound-1.0", true)
 local CBH = LibStub("CallbackHandler-1.0")
@@ -112,7 +110,7 @@ local type_meta_map = {

 local ButtonRegistry, ActiveButtons, ActionButtons, NonActionButtons = lib.buttonRegistry, lib.activeButtons, lib.actionButtons, lib.nonActionButtons

-local Update, UpdateButtonState, UpdateUsable, UpdateCount, UpdateCooldown, UpdateTooltip, UpdateNewAction
+local Update, UpdateButtonState, UpdateUsable, UpdateCount, UpdateCooldown, UpdateTooltip, UpdateNewAction, ClearNewActionHighlight
 local StartFlash, StopFlash, UpdateFlash, UpdateHotkeys, UpdateRangeTimer, UpdateOverlayGlow
 local UpdateFlyout, ShowGrid, HideGrid, UpdateGrid, SetupSecureSnippets, WrapOnClick
 local ShowOverlayGlow, HideOverlayGlow
@@ -532,7 +530,7 @@ function Generic:OnEnter()
 	end

 	if self._state_type == "action" and self.NewActionTexture then
-		lib.ACTION_HIGHLIGHT_MARKS[self._state_action] = false
+		ClearNewActionHighlight(self._state_action, false, false)
 		UpdateNewAction(self)
 	end
 end
@@ -587,6 +585,10 @@ function Generic:PostClick()
 		PickupAny("clear", oldType, oldAction)
 	end
 	self._receiving_drag = nil
+
+	if self._state_type == "action" and lib.ACTION_HIGHLIGHT_MARKS[self._state_action] then
+		ClearNewActionHighlight(self._state_action, false, false)
+	end
 end

 -----------------------------------------------------------
@@ -706,6 +708,7 @@ function OnEvent(frame, event, arg1, ...)
 	elseif event == "ACTIONBAR_SLOT_CHANGED" then
 		for button in next, ButtonRegistry do
 			if button._state_type == "action" and (arg1 == 0 or arg1 == tonumber(button._state_action)) then
+				ClearNewActionHighlight(button._state_action, true, false)
 				Update(button)
 			end
 		end
@@ -1054,17 +1057,17 @@ function Update(self)
 	-- Update icon and hotkey
 	local texture = self:GetTexture()

-	-- Draenor zone button handling
-	self.draenorZoneDisabled = false
+	-- Zone ability button handling
+	self.zoneAbilityDisabled = false
 	self.icon:SetDesaturated(false)
 	if self._state_type == "action" then
 		local action_type, id = GetActionInfo(self._state_action)
-		if ((action_type == "spell" or action_type == "companion") and DraenorZoneAbilityFrame and DraenorZoneAbilityFrame.baseName and not HasDraenorZoneAbility()) then
-			local name = GetSpellInfo(DraenorZoneAbilityFrame.baseName)
+		if ((action_type == "spell" or action_type == "companion") and ZoneAbilityFrame and ZoneAbilityFrame.baseName and not HasZoneAbility()) then
+			local name = GetSpellInfo(ZoneAbilityFrame.baseName)
 			local abilityName = GetSpellInfo(id)
 			if name == abilityName then
-				texture = GetLastDraenorSpellTexture()
-				self.draenorZoneDisabled = true
+				texture = GetLastZoneAbilitySpellTexture()
+				self.zoneAbilityDisabled = true
 				self.icon:SetDesaturated(true)
 			end
 		end
@@ -1185,7 +1188,7 @@ function EndChargeCooldown(self)
 	tinsert(lib.ChargeCooldowns, self)
 end

-local function StartChargeCooldown(parent, chargeStart, chargeDuration)
+local function StartChargeCooldown(parent, chargeStart, chargeDuration, chargeModRate)
 	if not parent.chargeCooldown then
 		local cooldown = tremove(lib.ChargeCooldowns)
 		if not cooldown then
@@ -1193,7 +1196,6 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration)
 			cooldown = CreateFrame("Cooldown", "LAB10ChargeCooldown"..lib.NumChargeCooldowns, parent, "CooldownFrameTemplate");
 			cooldown:SetScript("OnCooldownDone", EndChargeCooldown)
 			cooldown:SetHideCountdownNumbers(true)
-			cooldown:SetDrawEdge(true)
 			cooldown:SetDrawSwipe(false)
 		end
 		cooldown:SetParent(parent)
@@ -1205,7 +1207,7 @@ local function StartChargeCooldown(parent, chargeStart, chargeDuration)
 	end
 	-- set cooldown
 	parent.chargeCooldown:SetDrawBling(parent.chargeCooldown:GetEffectiveAlpha() > 0.5)
-	parent.chargeCooldown:SetCooldown(chargeStart, chargeDuration)
+	CooldownFrame_Set(parent.chargeCooldown, chargeStart, chargeDuration, true, true, chargeModRate)

 	-- update charge cooldown skin when masque is used
 	if Masque and Masque.UpdateCharge then
@@ -1224,8 +1226,8 @@ end

 function UpdateCooldown(self)
 	local locStart, locDuration = self:GetLossOfControlCooldown()
-	local start, duration, enable = self:GetCooldown()
-	local charges, maxCharges, chargeStart, chargeDuration = self:GetCharges()
+	local start, duration, enable, modRate = self:GetCooldown()
+	local charges, maxCharges, chargeStart, chargeDuration, chargeModRate = self:GetCharges()

 	self.cooldown:SetDrawBling(self.cooldown:GetEffectiveAlpha() > 0.5)

@@ -1236,11 +1238,7 @@ function UpdateCooldown(self)
 			self.cooldown:SetHideCountdownNumbers(true)
 			self.cooldown.currentCooldownType = COOLDOWN_TYPE_LOSS_OF_CONTROL
 		end
-		if IsLegion then
-			CooldownFrame_Set(self.cooldown, locStart, locDuration, true, true)
-		else
-			CooldownFrame_SetTimer(self.cooldown, locStart, locDuration, 1, true)
-		end
+		CooldownFrame_Set(self.cooldown, locStart, locDuration, true, true, modRate)
 	else
 		if self.cooldown.currentCooldownType ~= COOLDOWN_TYPE_NORMAL then
 			self.cooldown:SetEdgeTexture("Interface\\Cooldown\\edge")
@@ -1253,15 +1251,11 @@ function UpdateCooldown(self)
 		end

 		if charges and maxCharges and charges > 0 and charges < maxCharges then
-			StartChargeCooldown(self, chargeStart, chargeDuration)
+			StartChargeCooldown(self, chargeStart, chargeDuration, chargeModRate)
 		elseif self.chargeCooldown then
 			EndChargeCooldown(self.chargeCooldown)
 		end
-		if IsLegion then
-			CooldownFrame_Set(self.cooldown, start, duration, enable)
-		else
-			CooldownFrame_SetTimer(self.cooldown, start, duration, enable)
-		end
+		CooldownFrame_Set(self.cooldown, start, duration, enable, false, modRate)
 	end
 end

@@ -1332,8 +1326,33 @@ function UpdateOverlayGlow(self)
 	end
 end

-hooksecurefunc("MarkNewActionHighlight", function(action, flag)
-	lib.ACTION_HIGHLIGHT_MARKS[action] = flag
+function ClearNewActionHighlight(action, preventIdenticalActionsFromClearing, value)
+	lib.ACTION_HIGHLIGHT_MARKS[action] = value
+
+	for button in next, ButtonRegistry do
+		if button._state_type == "action" and action == tonumber(button._state_action) then
+			UpdateNewAction(button)
+		end
+	end
+
+	if preventIdenticalActionsFromClearing then
+		return
+	end
+
+	-- iterate through actions and unmark all that are the same type
+	local unmarkedType, unmarkedID = GetActionInfo(action)
+	for actionKey, markValue in pairs(lib.ACTION_HIGHLIGHT_MARKS) do
+		if markValue then
+			local actionType, actionID = GetActionInfo(actionKey)
+			if actionType == unmarkedType and actionID == unmarkedID then
+				ClearNewActionHighlight(actionKey, true, value)
+			end
+		end
+	end
+end
+
+hooksecurefunc("MarkNewActionHighlight", function(action)
+	lib.ACTION_HIGHLIGHT_MARKS[action] = true
 	for button in next, ButtonRegistry do
 		if button._state_type == "action" and action == tonumber(button._state_action) then
 			UpdateNewAction(button)
@@ -1341,6 +1360,10 @@ hooksecurefunc("MarkNewActionHighlight", function(action, flag)
 	end
 end)

+hooksecurefunc("ClearNewActionHighlight", function(action, preventIdenticalActionsFromClearing)
+	ClearNewActionHighlight(action, preventIdenticalActionsFromClearing, nil)
+end)
+
 function UpdateNewAction(self)
 	-- special handling for "New Action" markers
 	if self.NewActionTexture then
diff --git a/Jamba/Libs/AceAddon-3.0/AceAddon-3.0.xml b/Jamba/Libs/AceAddon-3.0/AceAddon-3.0.xml
index e6ad639..dcf24c7 100644
--- a/Jamba/Libs/AceAddon-3.0/AceAddon-3.0.xml
+++ b/Jamba/Libs/AceAddon-3.0/AceAddon-3.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="AceAddon-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceBucket-3.0/AceBucket-3.0.xml b/Jamba/Libs/AceBucket-3.0/AceBucket-3.0.xml
index 43c6bee..06ab712 100644
--- a/Jamba/Libs/AceBucket-3.0/AceBucket-3.0.xml
+++ b/Jamba/Libs/AceBucket-3.0/AceBucket-3.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="AceBucket-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceComm-3.0/AceComm-3.0.xml b/Jamba/Libs/AceComm-3.0/AceComm-3.0.xml
index 09e8d87..24fb43b 100644
--- a/Jamba/Libs/AceComm-3.0/AceComm-3.0.xml
+++ b/Jamba/Libs/AceComm-3.0/AceComm-3.0.xml
@@ -2,4 +2,4 @@
 ..\FrameXML\UI.xsd">
 	<Script file="ChatThrottleLib.lua"/>
 	<Script file="AceComm-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfig-3.0.xml b/Jamba/Libs/AceConfig-3.0/AceConfig-3.0.xml
index 87972ad..a3569b7 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfig-3.0.xml
+++ b/Jamba/Libs/AceConfig-3.0/AceConfig-3.0.xml
@@ -5,4 +5,4 @@
 	<Include file="AceConfigDialog-3.0\AceConfigDialog-3.0.xml"/>
 	<!--<Include file="AceConfigDropdown-3.0\AceConfigDropdown-3.0.xml"/>-->
 	<Script file="AceConfig-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml b/Jamba/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
index 188d354..9e157b5 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
+++ b/Jamba/Libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.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="AceConfigCmd-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
index 820aea8..3612fe8 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ b/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
@@ -1,10 +1,10 @@
 --- 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 1126 2014-11-10 06:38:01Z nevcairiel $
+-- @release $Id: AceConfigDialog-3.0.lua 1139 2016-07-03 07:43:51Z nevcairiel $

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

 if not AceConfigDialog then return end
@@ -1092,7 +1092,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)

-					if type(image) == "string" then
+					if type(image) == "string" or type(image) == "number" then
 						control = gui:Create("Icon")
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
@@ -1154,7 +1154,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local image = GetOptionsMemberValue("image", v, options, path, appName)
 					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)

-					if type(image) == "string" then
+					if type(image) == "string" or type(image) == "number" then
 						if type(imageCoords) == "table" then
 							control:SetImage(image, unpack(imageCoords))
 						else
@@ -1354,7 +1354,7 @@ local function FeedOptions(appName, options,container,rootframe,path,group,inlin
 					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
 					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)

-					if type(image) == "string" then
+					if type(image) == "string" or type(image) == "number" then
 						if not width then
 							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
 						end
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml b/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
index 86ce057..8e1e606 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
+++ b/Jamba/Libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.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="AceConfigDialog-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
index d684d66..cf81973 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ b/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
@@ -8,8 +8,8 @@
 -- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
 -- @class file
 -- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1105 2013-12-08 22:11:58Z nevcairiel $
-local MAJOR, MINOR = "AceConfigRegistry-3.0", 15
+-- @release $Id: AceConfigRegistry-3.0.lua 1139 2016-07-03 07:43:51Z nevcairiel $
+local MAJOR, MINOR = "AceConfigRegistry-3.0", 16
 local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceConfigRegistry then return end
@@ -57,6 +57,7 @@ local istable={["table"]=true,   _="table"}
 local ismethodtable={["table"]=true,["string"]=true,["function"]=true,   _="methodname, funcref or table"}
 local optstring={["nil"]=true,["string"]=true, _="string"}
 local optstringfunc={["nil"]=true,["string"]=true,["function"]=true, _="string or funcref"}
+local optstringnumberfunc={["nil"]=true,["string"]=true,["number"]=true,["function"]=true, _="string, number or funcref"}
 local optnumber={["nil"]=true,["number"]=true, _="number"}
 local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
 local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"}
@@ -82,7 +83,7 @@ local basekeys={
 		dialogHidden=optmethodbool,
 		dropdownHidden=optmethodbool,
 	cmdHidden=optmethodbool,
-	icon=optstringfunc,
+	icon=optstringnumberfunc,
 	iconCoords=optmethodtable,
 	handler=opttable,
 	get=optmethodfalse,
@@ -95,7 +96,7 @@ local basekeys={
 local typedkeys={
 	header={},
 	description={
-		image=optstringfunc,
+		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
@@ -112,7 +113,7 @@ local typedkeys={
 		childGroups=optstring,
 	},
 	execute={
-		image=optstringfunc,
+		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 		imageHeight=optnumber,
 		imageWidth=optnumber,
@@ -127,7 +128,7 @@ local typedkeys={
 	},
 	toggle={
 		tristate=optbool,
-		image=optstringfunc,
+		image=optstringnumberfunc,
 		imageCoords=optmethodtable,
 	},
 	tristate={
diff --git a/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml b/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
index 101bfda..4ea69ca 100644
--- a/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
+++ b/Jamba/Libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.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="AceConfigRegistry-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.lua b/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.lua
index c001123..0567a65 100644
--- a/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.lua
+++ b/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.lua
@@ -9,7 +9,7 @@
 -- make into AceConsole.
 -- @class file
 -- @name AceConsole-3.0
--- @release $Id: AceConsole-3.0.lua 878 2009-11-02 18:51:58Z nevcairiel $
+-- @release $Id: AceConsole-3.0.lua 1143 2016-07-11 08:52:03Z nevcairiel $
 local MAJOR,MINOR = "AceConsole-3.0", 7

 local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
@@ -136,7 +136,7 @@ end

 --- Retreive one or more space-separated arguments from a string.
 -- Treats quoted strings and itemlinks as non-spaced.
--- @param string The raw argument string
+-- @param str The raw argument string
 -- @param numargs How many arguments to get (default 1)
 -- @param startpos Where in the string to start scanning (default  1)
 -- @return Returns arg1, arg2, ..., nextposition\\
diff --git a/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.xml b/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.xml
index be9f47c..4f4699a 100644
--- a/Jamba/Libs/AceConsole-3.0/AceConsole-3.0.xml
+++ b/Jamba/Libs/AceConsole-3.0/AceConsole-3.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="AceConsole-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceDB-3.0/AceDB-3.0.lua b/Jamba/Libs/AceDB-3.0/AceDB-3.0.lua
index a17c6f1..b42b442 100644
--- a/Jamba/Libs/AceDB-3.0/AceDB-3.0.lua
+++ b/Jamba/Libs/AceDB-3.0/AceDB-3.0.lua
@@ -10,6 +10,7 @@
 -- * **race** Race-specific data. All of the players characters of the same race share this database.
 -- * **faction** Faction-specific data. All of the players characters of the same faction share this database.
 -- * **factionrealm** Faction and realm specific data. All of the players characters on the same realm and of the same faction share this database.
+-- * **locale** Locale specific data, based on the locale of the players game client.
 -- * **global** Global Data. All characters on the same account share this database.
 -- * **profile** Profile-specific data. All characters using the same profile share this database. The user can control which profile should be used.
 --
@@ -39,7 +40,7 @@
 -- end
 -- @class file
 -- @name AceDB-3.0.lua
--- @release $Id: AceDB-3.0.lua 1124 2014-10-27 21:00:07Z funkydude $
+-- @release $Id: AceDB-3.0.lua 1142 2016-07-11 08:36:19Z nevcairiel $
 local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26
 local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)

diff --git a/Jamba/Libs/AceDB-3.0/AceDB-3.0.xml b/Jamba/Libs/AceDB-3.0/AceDB-3.0.xml
index 46b20ba..108fc70 100644
--- a/Jamba/Libs/AceDB-3.0/AceDB-3.0.xml
+++ b/Jamba/Libs/AceDB-3.0/AceDB-3.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="AceDB-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
index 616f35e..5028fef 100644
--- a/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ b/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
@@ -1,8 +1,8 @@
 --- AceDBOptions-3.0 provides a universal AceConfig options screen for managing AceDB-3.0 profiles.
 -- @class file
 -- @name AceDBOptions-3.0
--- @release $Id: AceDBOptions-3.0.lua 1066 2012-09-18 14:36:49Z nevcairiel $
-local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 14
+-- @release $Id: AceDBOptions-3.0.lua 1140 2016-07-03 07:53:29Z nevcairiel $
+local ACEDBO_MAJOR, ACEDBO_MINOR = "AceDBOptions-3.0", 15
 local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)

 if not AceDBOptions then return end -- No upgrade needed
@@ -53,19 +53,19 @@ if LOCALE == "deDE" then
 	L["choose_sub"] = "Wählt ein bereits vorhandenes Profil aus."
 	L["copy"] = "Kopieren von..."
 	L["copy_desc"] = "Kopiere die Einstellungen von einem vorhandenen Profil in das aktive Profil."
-	-- L["current"] = "Current Profile:"
+	L["current"] = "Aktuelles Profil:"
 	L["default"] = "Standard"
 	L["delete"] = "Profil löschen"
 	L["delete_confirm"] = "Willst du das ausgewählte Profil wirklich löschen?"
-	L["delete_desc"] = "Lösche vorhandene oder unbenutzte Profile aus der Datenbank um Platz zu sparen und um die SavedVariables Datei 'sauber' zu halten."
+	L["delete_desc"] = "Lösche vorhandene oder unbenutzte Profile aus der Datenbank, um Platz zu sparen und die SavedVariables-Datei 'sauber' zu halten."
 	L["delete_sub"] = "Löscht ein Profil aus der Datenbank."
-	L["intro"] = "Hier kannst du das aktive Datenbankprofile ändern, damit du verschiedene Einstellungen für jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration möglich wird."
+	L["intro"] = "Hier kannst du das aktive Datenbankprofil ändern, damit du verschiedene Einstellungen für jeden Charakter erstellen kannst, wodurch eine sehr flexible Konfiguration möglich wird."
 	L["new"] = "Neu"
 	L["new_sub"] = "Ein neues Profil erstellen."
 	L["profiles"] = "Profile"
 	L["profiles_sub"] = "Profile verwalten"
 	L["reset"] = "Profil zurücksetzen"
-	L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zurück, für den Fall das mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
+	L["reset_desc"] = "Setzt das momentane Profil auf Standardwerte zurück, für den Fall, dass mit der Konfiguration etwas schief lief oder weil du einfach neu starten willst."
 	L["reset_sub"] = "Das aktuelle Profil auf Standard zurücksetzen."
 elseif LOCALE == "frFR" then
 	L["choose"] = "Profils existants"
@@ -73,7 +73,7 @@ elseif LOCALE == "frFR" then
 	L["choose_sub"] = "Permet de choisir un des profils déjà disponibles."
 	L["copy"] = "Copier à partir de"
 	L["copy_desc"] = "Copie les paramètres d'un profil déjà existant dans le profil actuellement actif."
-	-- L["current"] = "Current Profile:"
+	L["current"] = "Profil actuel :"
 	L["default"] = "Défaut"
 	L["delete"] = "Supprimer un profil"
 	L["delete_confirm"] = "Etes-vous sûr de vouloir supprimer le profil sélectionné ?"
@@ -88,32 +88,32 @@ elseif LOCALE == "frFR" then
 	L["reset_desc"] = "Réinitialise le profil actuel au cas où votre configuration est corrompue ou si vous voulez tout simplement faire table rase."
 	L["reset_sub"] = "Réinitialise le profil actuel avec les paramètres par défaut."
 elseif LOCALE == "koKR" then
-	L["choose"] = "프로필 선택"
-	L["choose_desc"] = "새로운 이름을 입력하거나, 이미 있는 프로필중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
-	L["choose_sub"] = "당신이 현재 이용할수 있는 프로필을 선택합니다."
-	L["copy"] = "복사"
-	L["copy_desc"] = "현재 사용중인 프로필에, 선택한 프로필의 설정을 복사합니다."
-	-- L["current"] = "Current Profile:"
+	L["choose"] = "저장 중인 프로필"
+	L["choose_desc"] = "입력창에 새로운 이름을 입력하거나 저장 중인 프로필 중 하나를 선택하여 새로운 프로필을 만들 수 있습니다."
+	L["choose_sub"] = "현재 이용할 수 있는 프로필 중 하나를 선택합니다."
+	L["copy"] = "복사해오기"
+	L["copy_desc"] = "현재 사용 중인 프로필에 선택한 프로필의 설정을 복사합니다."
+	L["current"] = "현재 프로필:"
 	L["default"] = "기본값"
 	L["delete"] = "프로필 삭제"
-	L["delete_confirm"] = "정말로 선택한 프로필의 삭제를 원하십니까?"
-	L["delete_desc"] = "데이터베이스에 사용중이거나 저장된 프로파일 삭제로 SavedVariables 파일의 정리와 공간 절약이 됩니다."
+	L["delete_confirm"] = "정말로 선택한 프로필을 삭제할까요?"
+	L["delete_desc"] = "저장 공간 절약과 SavedVariables 파일의 정리를 위해 데이터베이스에서 사용하지 않는 프로필을 삭제하세요."
 	L["delete_sub"] = "데이터베이스의 프로필을 삭제합니다."
-	L["intro"] = "모든 캐릭터의 다양한 설정과 사용중인 데이터베이스 프로필, 어느것이던지 매우 다루기 쉽게 바꿀수 있습니다."
+	L["intro"] = "활성 데이터베이스 프로필을 변경할 수 있고, 각 캐릭터 별로 다른 설정을 할 수 있습니다."
 	L["new"] = "새로운 프로필"
 	L["new_sub"] = "새로운 프로필을 만듭니다."
 	L["profiles"] = "프로필"
-	L["profiles_sub"] = "프로필 설정"
+	L["profiles_sub"] = "프로필 관리"
 	L["reset"] = "프로필 초기화"
-	L["reset_desc"] = "단순히 다시 새롭게 구성을 원하는 경우, 현재 프로필을 기본값으로 초기화 합니다."
-	L["reset_sub"] = "현재의 프로필을 기본값으로 초기화 합니다"
+	L["reset_desc"] = "설정이 깨졌거나 처음부터 다시 설정을 원하는 경우, 현재 프로필을 기본값으로 초기화하세요."
+	L["reset_sub"] = "현재 프로필을 기본값으로 초기화합니다"
 elseif LOCALE == "esES" or LOCALE == "esMX" then
 	L["choose"] = "Perfiles existentes"
 	L["choose_desc"] = "Puedes crear un nuevo perfil introduciendo un nombre en el recuadro o puedes seleccionar un perfil de los ya existentes."
 	L["choose_sub"] = "Selecciona uno de los perfiles disponibles."
 	L["copy"] = "Copiar de"
 	L["copy_desc"] = "Copia los ajustes de un perfil existente al perfil actual."
-	-- L["current"] = "Current Profile:"
+	L["current"] = "Perfil actual:"
 	L["default"] = "Por defecto"
 	L["delete"] = "Borrar un Perfil"
 	L["delete_confirm"] = "¿Estas seguro que quieres borrar el perfil seleccionado?"
@@ -129,31 +129,31 @@ elseif LOCALE == "esES" or LOCALE == "esMX" then
 	L["reset_sub"] = "Reinicar el perfil actual al de por defecto"
 elseif LOCALE == "zhTW" then
 	L["choose"] = "現有的設定檔"
-	L["choose_desc"] = "你可以通過在文本框內輸入一個名字創立一個新的設定檔,也可以選擇一個已經存在的設定檔。"
-	L["choose_sub"] = "從當前可用的設定檔裏面選擇一個。"
+	L["choose_desc"] = "您可以在文字方塊內輸入名字以建立新的設定檔,或是選擇一個現有的設定檔使用。"
+	L["choose_sub"] = "從當前可用的設定檔裡面選擇一個。"
 	L["copy"] = "複製自"
-	L["copy_desc"] = "從當前某個已保存的設定檔複製到當前正使用的設定檔。"
-	-- L["current"] = "Current Profile:"
+	L["copy_desc"] = "從一個現有的設定檔,將設定複製到現在使用中的設定檔。"
+	L["current"] = "目前設定檔:"
 	L["default"] = "預設"
 	L["delete"] = "刪除一個設定檔"
-	L["delete_confirm"] = "你確定要刪除所選擇的設定檔嗎?"
-	L["delete_desc"] = "從資料庫裏刪除不再使用的設定檔,以節省空間,並且清理SavedVariables檔。"
-	L["delete_sub"] = "從資料庫裏刪除一個設定檔。"
-	L["intro"] = "你可以選擇一個活動的資料設定檔,這樣你的每個角色就可以擁有不同的設定值,可以給你的插件設定帶來極大的靈活性。"
+	L["delete_confirm"] = "確定要刪除所選擇的設定檔嗎?"
+	L["delete_desc"] = "從資料庫裡刪除不再使用的設定檔,以節省空間,並且清理 SavedVariables 檔案。"
+	L["delete_sub"] = "從資料庫裡刪除一個設定檔。"
+	L["intro"] = "您可以從資料庫中選擇一個設定檔來使用,如此就可以讓每個角色使用不同的設定。"
 	L["new"] = "新建"
 	L["new_sub"] = "新建一個空的設定檔。"
 	L["profiles"] = "設定檔"
 	L["profiles_sub"] = "管理設定檔"
 	L["reset"] = "重置設定檔"
-	L["reset_desc"] = "將當前的設定檔恢復到它的預設值,用於你的設定檔損壞,或者你只是想重來的情況。"
-	L["reset_sub"] = "將當前的設定檔恢復為預設值"
+	L["reset_desc"] = "將現用的設定檔重置為預設值;用於設定檔損壞,或者單純想要重來的情況。"
+	L["reset_sub"] = "將目前的設定檔重置為預設值"
 elseif LOCALE == "zhCN" then
 	L["choose"] = "现有的配置文件"
 	L["choose_desc"] = "你可以通过在文本框内输入一个名字创立一个新的配置文件,也可以选择一个已经存在的配置文件。"
 	L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
 	L["copy"] = "复制自"
 	L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
-	-- L["current"] = "Current Profile:"
+	L["current"] = "当前配置文件:"
 	L["default"] = "默认"
 	L["delete"] = "删除一个配置文件"
 	L["delete_confirm"] = "你确定要删除所选择的配置文件么?"
@@ -173,7 +173,7 @@ elseif LOCALE == "ruRU" then
 	L["choose_sub"] = "Выбор одиного из уже доступных профилей"
 	L["copy"] = "Скопировать из"
 	L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный."
-	-- L["current"] = "Current Profile:"
+	L["current"] = "Текущий профиль:"
 	L["default"] = "По умолчанию"
 	L["delete"] = "Удалить профиль"
 	L["delete_confirm"] = "Вы уверены, что вы хотите удалить выбранный профиль?"
@@ -185,17 +185,17 @@ elseif LOCALE == "ruRU" then
 	L["profiles"] = "Профили"
 	L["profiles_sub"] = "Управление профилями"
 	L["reset"] = "Сброс профиля"
-	L["reset_desc"] = "Если ваша конфигурации испорчена или если вы хотите настроить всё заново - сбросьте текущий профиль на стандартные значения."
+	L["reset_desc"] = "Сбросить текущий профиль к стандартным настройкам, если ваша конфигурация испорчена или вы хотите настроить всё заново."
 	L["reset_sub"] = "Сброс текущего профиля на стандартный"
 elseif LOCALE == "itIT" then
-	L["choose"] = "Profili esistenti"
-	L["choose_desc"] = "Puoi creare un nuovo profilo digitando il nome della casella di testo, oppure scegliendone uno tra i profili gia' esistenti."
-	L["choose_sub"] = "Seleziona uno dei profili disponibili."
+	L["choose"] = "Profili Esistenti"
+	L["choose_desc"] = "Puoi creare un nuovo profilo digitando il nome della casella di testo, oppure scegliendone uno tra i profili già esistenti."
+	L["choose_sub"] = "Seleziona uno dei profili attualmente disponibili."
 	L["copy"] = "Copia Da"
 	L["copy_desc"] = "Copia le impostazioni da un profilo esistente, nel profilo attivo in questo momento."
 	L["current"] = "Profilo Attivo:"
 	L["default"] = "Standard"
-	L["delete"] = "Cancella un profilo"
+	L["delete"] = "Cancella un Profilo"
 	L["delete_confirm"] = "Sei sicuro di voler cancellare il profilo selezionato?"
 	L["delete_desc"] = "Cancella i profili non utilizzati dal database per risparmiare spazio e mantenere puliti i file di configurazione SavedVariables."
 	L["delete_sub"] = "Cancella un profilo dal Database."
@@ -205,8 +205,28 @@ elseif LOCALE == "itIT" then
 	L["profiles"] = "Profili"
 	L["profiles_sub"] = "Gestisci Profili"
 	L["reset"] = "Reimposta Profilo"
-	L["reset_desc"] = "Riporta il tuo profilo attivo alle sue impostazioni di default, nel caso in cui la tua configurazione si sia corrotta, o semplicemente tu voglia re-inizializzarla."
-	L["reset_sub"] = "Reimposta il profilo ai suoi valori di default."
+	L["reset_desc"] = "Riporta il tuo profilo attivo alle sue impostazioni predefinite, nel caso in cui la tua configurazione si sia corrotta, o semplicemente tu voglia re-inizializzarla."
+	L["reset_sub"] = "Reimposta il profilo ai suoi valori predefiniti."
+elseif LOCALE == "ptBR" then
+	L["choose"] = "Perfis Existentes"
+	L["choose_desc"] = "Você pode tanto criar um perfil novo tanto digitando um nome na caixa de texto, quanto escolher um dos perfis já existentes."
+	L["choose_sub"] = "Selecione um de seus perfis atualmente disponíveis."
+	L["copy"] = "Copiar De"
+	L["copy_desc"] = "Copia as definições de um perfil existente no perfil atualmente ativo."
+	L["current"] = "Perfil Autal:"
+	L["default"] = "Padrão"
+	L["delete"] = "Remover um Perfil"
+	L["delete_confirm"] = "Tem certeza que deseja remover o perfil selecionado?"
+	L["delete_desc"] = "Remove perfis existentes e inutilizados do banco de dados para economizar espaço, e limpar o arquivo SavedVariables."
+	L["delete_sub"] = "Remove um perfil do banco de dados."
+	L["intro"] = "Você pode alterar o perfil do banco de dados ativo, para que possa ter definições diferentes para cada personagem."
+	L["new"] = "Novo"
+	L["new_sub"] = "Cria um novo perfil vazio."
+	L["profiles"] = "Perfis"
+	L["profiles_sub"] = "Gerenciar Perfis"
+	L["reset"] = "Resetar Perfil"
+	L["reset_desc"] = "Reseta o perfil atual para os valores padrões, no caso de sua configuração estar quebrada, ou simplesmente se deseja começar novamente."
+	L["reset_sub"] = "Resetar o perfil atual ao padrão"
 end

 local defaultProfiles
diff --git a/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml b/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
index 2668fb0..51305f9 100644
--- a/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
+++ b/Jamba/Libs/AceDBOptions-3.0/AceDBOptions-3.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="AceDBOptions-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceEvent-3.0/AceEvent-3.0.xml b/Jamba/Libs/AceEvent-3.0/AceEvent-3.0.xml
index 313ef4d..41ef791 100644
--- a/Jamba/Libs/AceEvent-3.0/AceEvent-3.0.xml
+++ b/Jamba/Libs/AceEvent-3.0/AceEvent-3.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="AceEvent-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
index 3644493..482fb71 100644
--- a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
+++ b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
@@ -1,4 +1,4 @@
-## Interface: 60200
+## Interface: 60200
 ## X-Curse-Packaged-Version: r53
 ## X-Curse-Project-Name: AceGUI-3.0-SharedMediaWidgets
 ## X-Curse-Project-ID: ace-gui-3-0-shared-media-widgets
@@ -16,4 +16,4 @@
 # Libs\AceGUI-3.0\AceGUI-3.0.xml
 #@end-no-lib-strip@

-widget.xml
\ No newline at end of file
+widget.xml
diff --git a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
index 15cd102..43c46a1 100644
--- a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets/widget.xml
@@ -6,4 +6,4 @@
 	<Script file="StatusbarWidget.lua" />
 	<Script file="BorderWidget.lua" />
 	<Script file="BackgroundWidget.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
index dd3eb2b..ecf2945 100644
--- a/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ b/Jamba/Libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
@@ -1,4 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
 ..\FrameXML\UI.xsd">
 	<Include file="AceGUI-3.0-SharedMediaWidgets\widget.xml" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
index 06f5d52..0dae68c 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
@@ -284,21 +284,6 @@ local function Constructor()
 	sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)

 	--Container Support
-
-		local content = CreateFrame("Frame",nil,frame)
-		self.content = content
-		content.obj = self
-		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
-		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
-		AceGUI:RegisterAsContainer(self)
-		return self
-
-end
-
-
-
---[[
 	local content = CreateFrame("Frame", nil, frame)
 	content:SetPoint("TOPLEFT", 17, -27)
 	content:SetPoint("BOTTOMRIGHT", -17, 40)
@@ -322,5 +307,5 @@ end

 	return AceGUI:RegisterAsContainer(widget)
 end
---]]
+
 AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
index a56e7cd..6dd0c4d 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
@@ -2,10 +2,12 @@
 ScrollFrame Container
 Plain container that scrolls its content and doesn't grow in height.
 -------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 23
+local Type, Version = "ScrollFrame", 24
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

+local IsLegion = select(4, GetBuildInfo()) >= 70000
+
 -- Lua APIs
 local pairs, assert, type = pairs, assert, type
 local min, max, floor, abs = math.min, math.max, math.floor, math.abs
@@ -176,7 +178,11 @@ local function Constructor()

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

 	--Container Support
 	local content = CreateFrame("Frame", nil, scrollframe)
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
index 085449b..9bf17d8 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
@@ -2,10 +2,12 @@
 TreeGroup Container
 Container that uses a tree control to switch between groups.
 -------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 38
+local Type, Version = "TreeGroup", 40
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

+local IsLegion = select(4, GetBuildInfo()) >= 70000
+
 -- Lua APIs
 local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
 local math_min, math_max, floor = math.min, math.max, floor
@@ -295,6 +297,7 @@ local methods = {
 	["OnAcquire"] = function(self)
 		self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
 		self:EnableButtonTooltips(true)
+		self.frame:SetScript("OnUpdate", FirstFrameUpdate)
 	end,

 	["OnRelease"] = function(self)
@@ -669,7 +672,12 @@ local function Constructor()

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

 	local border = CreateFrame("Frame",nil,frame)
 	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
index 028e524..c7c72c1 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
@@ -13,12 +13,6 @@ local pairs = pairs
 local _G = _G
 local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent

-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
@@ -80,7 +74,7 @@ Constructor
 -------------------------------------------------------------------------------]]
 local function Constructor()
 	local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Button", name, UIParent, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
+	local frame = CreateFrame("Button", name, UIParent, "UIPanelButtonTemplate")
 	frame:Hide()

 	frame:EnableMouse(true)
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
index b7060aa..740a467 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
@@ -1,10 +1,12 @@
 --[[-----------------------------------------------------------------------------
 ColorPicker Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 22
+local Type, Version = "ColorPicker", 23
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

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

@@ -146,8 +148,11 @@ local function Constructor()
 	local texture = frame:CreateTexture(nil, "BACKGROUND")
 	texture:SetWidth(16)
 	texture:SetHeight(16)
-	texture:SetTexture(1, 1, 1)
-	--texture:SetColorTexture(1, 1, 1)
+	if IsLegion then
+		texture:SetColorTexture(1, 1, 1)
+	else
+		texture:SetTexture(1, 1, 1)
+	end
 	texture:SetPoint("CENTER", colorSwatch)
 	texture:Show()

diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
index 1f28cb5..5ea840f 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
@@ -1,7 +1,9 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 996 2010-12-01 18:34:17Z nevcairiel $ ]]--
+--[[ $Id: AceGUIWidget-DropDown-Items.lua 1137 2016-05-15 10:57:36Z nevcairiel $ ]]--

 local AceGUI = LibStub("AceGUI-3.0")

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

@@ -440,7 +442,7 @@ end
 -- A single line to separate items
 do
 	local widgetType = "Dropdown-Item-Separator"
-	local widgetVersion = 1
+	local widgetVersion = 2

 	-- exported, override
 	local function SetDisabled(self, disabled)
@@ -455,7 +457,11 @@ do

 		local line = self.frame:CreateTexture(nil, "OVERLAY")
 		line:SetHeight(1)
-		line:SetTexture(.5, .5, .5)
+		if IsLegion then
+			line:SetColorTexture(.5, .5, .5)
+		else
+			line:SetTexture(.5, .5, .5)
+		end
 		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
 		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)

diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
index c67902c..d039026 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
@@ -1,7 +1,7 @@
 --[[-----------------------------------------------------------------------------
 EditBox Widget
 -------------------------------------------------------------------------------]]
-local Type, Version = "EditBox", 25
+local Type, Version = "EditBox", 26
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -200,6 +200,10 @@ local methods = {
 		if not self.frame:IsShown() then
 			self.frame:SetScript("OnShow", Frame_OnShowFocus)
 		end
+	end,
+
+	["HighlightText"] = function(self, from, to)
+		self.editbox:HighlightText(from, to)
 	end
 }

diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
index 8d01b54..561da73 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
@@ -9,7 +9,7 @@ if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
 local select, pairs, print = select, pairs, print

 -- WoW APIs
-local CreateFrame, UIParent, GetBuildInfo = CreateFrame, UIParent, GetBuildInfo
+local CreateFrame, UIParent = CreateFrame, UIParent

 --[[-----------------------------------------------------------------------------
 Scripts
@@ -131,12 +131,8 @@ local function Constructor()
 	for method, func in pairs(methods) do
 		widget[method] = func
 	end
-	-- SetText is deprecated, but keep it around for a while. (say, to WoW 4.0)
-	if (select(4, GetBuildInfo()) < 40000) then
-		widget.SetText = widget.SetLabel
-	else
-		widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end
-	end
+
+	widget.SetText = function(self, ...) print("AceGUI-3.0-Icon: SetText is deprecated! Use SetLabel instead!"); self:SetLabel(...) end

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

@@ -17,12 +17,6 @@ local CreateFrame, UIParent = CreateFrame, UIParent
 -- List them here for Mikk's FindGlobals script
 -- GLOBALS: NOT_BOUND

-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
 --[[-----------------------------------------------------------------------------
 Scripts
 -------------------------------------------------------------------------------]]
@@ -40,11 +34,13 @@ local function Keybinding_OnClick(frame, button)
 		local self = frame.obj
 		if self.waitingForKey then
 			frame:EnableKeyboard(false)
+			frame:EnableMouseWheel(false)
 			self.msgframe:Hide()
 			frame:UnlockHighlight()
 			self.waitingForKey = nil
 		else
 			frame:EnableKeyboard(true)
+			frame:EnableMouseWheel(true)
 			self.msgframe:Show()
 			frame:LockHighlight()
 			self.waitingForKey = true
@@ -79,6 +75,7 @@ local function Keybinding_OnKeyDown(frame, key)
 		end

 		frame:EnableKeyboard(false)
+		frame:EnableMouseWheel(false)
 		self.msgframe:Hide()
 		frame:UnlockHighlight()
 		self.waitingForKey = nil
@@ -103,6 +100,16 @@ local function Keybinding_OnMouseDown(frame, button)
 	Keybinding_OnKeyDown(frame, button)
 end

+local function Keybinding_OnMouseWheel(frame, direction)
+	local button
+	if direction >= 0 then
+		button = "MOUSEWHEELUP"
+	else
+		button = "MOUSEWHEELDOWN"
+	end
+	Keybinding_OnKeyDown(frame, button)
+end
+
 --[[-----------------------------------------------------------------------------
 Methods
 -------------------------------------------------------------------------------]]
@@ -115,6 +122,7 @@ local methods = {
 		self.msgframe:Hide()
 		self:SetDisabled(false)
 		self.button:EnableKeyboard(false)
+		self.button:EnableMouseWheel(false)
 	end,

 	-- ["OnRelease"] = nil,
@@ -180,15 +188,17 @@ local function Constructor()
 	local name = "AceGUI30KeybindingButton" .. AceGUI:GetNextWidgetNum(Type)

 	local frame = CreateFrame("Frame", nil, UIParent)
-	local button = CreateFrame("Button", name, frame, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
+	local button = CreateFrame("Button", name, frame, "UIPanelButtonTemplate")

 	button:EnableMouse(true)
+	button:EnableMouseWheel(false)
 	button:RegisterForClicks("AnyDown")
 	button:SetScript("OnEnter", Control_OnEnter)
 	button:SetScript("OnLeave", Control_OnLeave)
 	button:SetScript("OnClick", Keybinding_OnClick)
 	button:SetScript("OnKeyDown", Keybinding_OnKeyDown)
 	button:SetScript("OnMouseDown", Keybinding_OnMouseDown)
+	button:SetScript("OnMouseWheel", Keybinding_OnMouseWheel)
 	button:SetPoint("BOTTOMLEFT")
 	button:SetPoint("BOTTOMRIGHT")
 	button:SetHeight(24)
diff --git a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
index a27a2fc..9af4b87 100644
--- a/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ b/Jamba/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
@@ -1,4 +1,4 @@
-local Type, Version = "MultiLineEditBox", 27
+local Type, Version = "MultiLineEditBox", 28
 local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
 if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end

@@ -14,12 +14,6 @@ local _G = _G
 -- List them here for Mikk's FindGlobals script
 -- GLOBALS: ACCEPT, ChatFontNormal

-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
 --[[-----------------------------------------------------------------------------
 Support functions
 -------------------------------------------------------------------------------]]
@@ -251,7 +245,11 @@ local methods = {
 			self.frame:SetScript("OnShow", OnShowFocus)
 		end
 	end,
-
+
+	["HighlightText"] = function(self, from, to)
+		self.editBox:HighlightText(from, to)
+	end,
+
 	["GetCursorPosition"] = function(self)
 		return self.editBox:GetCursorPosition()
 	end,
@@ -285,7 +283,7 @@ local function Constructor()
 	label:SetText(ACCEPT)
 	label:SetHeight(10)

-	local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
+	local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, "UIPanelButtonTemplate")
 	button:SetPoint("BOTTOMLEFT", 0, 4)
 	button:SetHeight(22)
 	button:SetWidth(label:GetStringWidth() + 24)
diff --git a/Jamba/Libs/AceHook-3.0/AceHook-3.0.xml b/Jamba/Libs/AceHook-3.0/AceHook-3.0.xml
index add0f26..fe51336 100644
--- a/Jamba/Libs/AceHook-3.0/AceHook-3.0.xml
+++ b/Jamba/Libs/AceHook-3.0/AceHook-3.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="AceHook-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceLocale-3.0/AceLocale-3.0.xml b/Jamba/Libs/AceLocale-3.0/AceLocale-3.0.xml
index e017af0..bf023f0 100644
--- a/Jamba/Libs/AceLocale-3.0/AceLocale-3.0.xml
+++ b/Jamba/Libs/AceLocale-3.0/AceLocale-3.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="AceLocale-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.lua b/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
index 150a31e..0b19e08 100644
--- a/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
+++ b/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.lua
@@ -10,8 +10,8 @@
 -- make into AceSerializer.
 -- @class file
 -- @name AceSerializer-3.0
--- @release $Id: AceSerializer-3.0.lua 1038 2011-10-03 01:39:58Z mikk $
-local MAJOR,MINOR = "AceSerializer-3.0", 4
+-- @release $Id: AceSerializer-3.0.lua 1135 2015-09-19 20:39:16Z nevcairiel $
+local MAJOR,MINOR = "AceSerializer-3.0", 5
 local AceSerializer, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not AceSerializer then return end
@@ -27,8 +27,8 @@ local tconcat = table.concat
 local inf = math.huge

 local serNaN  -- can't do this in 4.3, see ace3 ticket 268
-local serInf = tostring(inf)
-local serNegInf = tostring(-inf)
+local serInf, serInfMac = "1.#INF", "inf"
+local serNegInf, serNegInfMac = "-1.#INF", "-inf"


 -- Serialization functions
@@ -62,11 +62,15 @@ local function SerializeValue(v, res, nres)

 	elseif t=="number" then	-- ^N = number (just tostring()ed) or ^F (float components)
 		local str = tostring(v)
-		if tonumber(str)==v  --[[not in 4.3 or str==serNaN]] or str==serInf or str==serNegInf then
+		if tonumber(str)==v  --[[not in 4.3 or str==serNaN]] then
 			-- translates just fine, transmit as-is
 			res[nres+1] = "^N"
 			res[nres+2] = str
 			nres=nres+2
+		elseif v == inf or v == -inf then
+			res[nres+1] = "^N"
+			res[nres+2] = v == inf and serInf or serNegInf
+			nres=nres+2
 		else
 			local m,e = frexp(v)
 			res[nres+1] = "^F"
@@ -147,9 +151,9 @@ end
 local function DeserializeNumberHelper(number)
 	--[[ not in 4.3 if number == serNaN then
 		return 0/0
-	else]]if number == serNegInf then
+	else]]if number == serNegInf or number == serNegInfMac then
 		return -inf
-	elseif number == serInf then
+	elseif number == serInf or number == serInfMac then
 		return inf
 	else
 		return tonumber(number)
@@ -280,4 +284,4 @@ end
 -- Update embeds
 for target, v in pairs(AceSerializer.embeds) do
 	AceSerializer:Embed(target)
-end
\ No newline at end of file
+end
diff --git a/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.xml b/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
index 94924af..677d08e 100644
--- a/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.0.xml
+++ b/Jamba/Libs/AceSerializer-3.0/AceSerializer-3.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="AceSerializer-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/AceTab-3.0/AceTab-3.0.lua b/Jamba/Libs/AceTab-3.0/AceTab-3.0.lua
index a6ab192..b7c64db 100644
--- a/Jamba/Libs/AceTab-3.0/AceTab-3.0.lua
+++ b/Jamba/Libs/AceTab-3.0/AceTab-3.0.lua
@@ -2,15 +2,13 @@
 -- Note: This library is not yet finalized.
 -- @class file
 -- @name AceTab-3.0
--- @release $Id: AceTab-3.0.lua 1031 2011-06-29 15:04:34Z nevcairiel $
+-- @release $Id: AceTab-3.0.lua 1148 2016-07-18 09:13:02Z nevcairiel $

 local ACETAB_MAJOR, ACETAB_MINOR = 'AceTab-3.0', 9
 local AceTab, oldminor = LibStub:NewLibrary(ACETAB_MAJOR, ACETAB_MINOR)

 if not AceTab then return end -- No upgrade needed

-local is335 = GetBuildInfo() >= "3.3.5"
-
 AceTab.registry = AceTab.registry or {}

 -- local upvalues
@@ -38,7 +36,7 @@ end
 local function hookFrame(f)
 	if f.hookedByAceTab3 then return end
 	f.hookedByAceTab3 = true
-	if f == (is335 and ChatEdit_GetActiveWindow() or ChatFrameEditBox) then
+	if f == ChatEdit_GetActiveWindow() then
 		local origCTP = ChatEdit_CustomTabPressed
 		function ChatEdit_CustomTabPressed(...)
 			if AceTab:OnTabPressed(f) then
@@ -126,13 +124,9 @@ function AceTab:RegisterTabCompletion(descriptor, prematches, wordlist, usagefun

 	-- Make listenframes into a one-element table if it was not passed a table of frames.
 	if not listenframes then  -- default
-		if is335 then
-			listenframes = {}
-			for i = 1, NUM_CHAT_WINDOWS do
-				listenframes[i] = _G["ChatFrame"..i.."EditBox"]
-			end
-		else
-			listenframes = { ChatFrameEditBox }
+		listenframes = {}
+		for i = 1, NUM_CHAT_WINDOWS do
+			listenframes[i] = _G["ChatFrame"..i.."EditBox"]
 		end
 	elseif type(listenframes) ~= 'table' or type(listenframes[0]) == 'userdata' and type(listenframes.IsObjectType) == 'function' then  -- single frame or framename
 		listenframes = { listenframes }
@@ -327,7 +321,7 @@ function AceTab:OnTabPressed(this)
 	if this:GetText() == '' then return true end

 	-- allow Blizzard to handle slash commands, themselves
-	if this == (is335 and ChatEdit_GetActiveWindow() or ChatFrameEditBox) then
+	if this == ChatEdit_GetActiveWindow() then
 		local command = this:GetText()
 		if strfind(command, "^/[%a%d_]+$") then
 			return true
diff --git a/Jamba/Libs/AceTimer-3.0/AceTimer-3.0.xml b/Jamba/Libs/AceTimer-3.0/AceTimer-3.0.xml
index 38e9021..d5aee81 100644
--- a/Jamba/Libs/AceTimer-3.0/AceTimer-3.0.xml
+++ b/Jamba/Libs/AceTimer-3.0/AceTimer-3.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="AceTimer-3.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
index a127301..675d7b0 100644
--- a/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ b/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
@@ -1,4 +1,4 @@
---[[ $Id: CallbackHandler-1.0.lua 965 2010-08-09 00:47:52Z mikk $ ]]
+--[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]]
 local MAJOR, MINOR = "CallbackHandler-1.0", 6
 local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)

@@ -65,9 +65,7 @@ end})
 --   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
 --   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.

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

 	RegisterName = RegisterName or "RegisterCallback"
 	UnregisterName = UnregisterName or "UnregisterCallback"
diff --git a/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
index 876df83..c107f88 100644
--- a/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
+++ b/Jamba/Libs/CallbackHandler-1.0/CallbackHandler-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="CallbackHandler-1.0.lua"/>
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/Changelog-Ace3-Release-r1151.txt b/Jamba/Libs/Changelog-Ace3-Release-r1151.txt
new file mode 100644
index 0000000..c78dc9d
--- /dev/null
+++ b/Jamba/Libs/Changelog-Ace3-Release-r1151.txt
@@ -0,0 +1,92 @@
+------------------------------------------------------------------------
+r1151 | nevcairiel | 2016-07-18 17:03:29 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   A /tags/Release-r1151 (from /trunk:1150)
+
+Tag as Release-r1151
+------------------------------------------------------------------------
+r1150 | nevcairiel | 2016-07-18 17:02:20 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/changelog.txt
+
+Update changelog
+------------------------------------------------------------------------
+r1149 | nevcairiel | 2016-07-18 17:02:10 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/Ace3.toc
+
+Update TOC for 7.0
+------------------------------------------------------------------------
+r1148 | nevcairiel | 2016-07-18 09:13:02 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+   M /trunk/AceTab-3.0/AceTab-3.0.lua
+
+Remove remaining compat code for ancient WoW versions
+------------------------------------------------------------------------
+r1147 | nevcairiel | 2016-07-18 09:10:10 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+
+Remove pre-MoP compat code from AceGUI widgets
+------------------------------------------------------------------------
+r1146 | nevcairiel | 2016-07-18 09:07:16 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+
+Fix global leak
+------------------------------------------------------------------------
+r1145 | nevcairiel | 2016-07-18 08:32:42 +0000 (Mon, 18 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+
+AceGUI-3.0: Keybinding: Support mousewheel up/down bindings (Ticket #372)
+------------------------------------------------------------------------
+r1144 | nevcairiel | 2016-07-11 09:04:48 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/changelog.txt
+
+Re-format changelog to be consistent with older entries
+------------------------------------------------------------------------
+r1143 | nevcairiel | 2016-07-11 08:52:03 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceConsole-3.0/AceConsole-3.0.lua
+
+AceConsole-3.0: Fix a typo in the LuaDoc function signature
+------------------------------------------------------------------------
+r1142 | nevcairiel | 2016-07-11 08:36:19 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceDB-3.0/AceDB-3.0.lua
+
+AceDB-3.0: Add the "locale" profile key to the LuaDoc (Ticket #344)
+------------------------------------------------------------------------
+r1141 | nevcairiel | 2016-07-11 08:32:23 +0000 (Mon, 11 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+   M /trunk/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+
+AceGUI-3.0: Expose the HighlightText API for EditBox and MultiLineEditBox Widgets (Ticket #378)
+------------------------------------------------------------------------
+r1140 | nevcairiel | 2016-07-03 07:53:29 +0000 (Sun, 03 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceDBOptions-3.0/AceDBOptions-3.0.lua
+
+AceDBOptions-3.0: Update localization from the WoWAce Localization system
+------------------------------------------------------------------------
+r1139 | nevcairiel | 2016-07-03 07:43:51 +0000 (Sun, 03 Jul 2016) | 1 line
+Changed paths:
+   M /trunk/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+   M /trunk/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+
+AceConfig-3.0: Allow specifying images using the numeric fileID (Ticket #389)
+------------------------------------------------------------------------
+r1138 | nevcairiel | 2016-06-01 10:17:04 +0000 (Wed, 01 Jun 2016) | 3 lines
+Changed paths:
+   M /trunk/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+
+AceGUI-3.0: TreeGroup: Refresh the tree in an OnUpdate once after Acquire, not only after creation
+
+The widget creation and acquire can be on different code paths, this ensures the tree height is always known and the tree populated properly.
+------------------------------------------------------------------------
diff --git a/Jamba/Libs/LibBabble-Class-3.0/LibBabble-Class-3.0.lua b/Jamba/Libs/LibBabble-Class-3.0/LibBabble-Class-3.0.lua
index db5985e..8c406f2 100644
--- a/Jamba/Libs/LibBabble-Class-3.0/LibBabble-Class-3.0.lua
+++ b/Jamba/Libs/LibBabble-Class-3.0/LibBabble-Class-3.0.lua
@@ -1,4 +1,4 @@
---[[
+--[[
 Name: LibBabble-Class-3.0
 Revision: $Rev: 50 $
 Author(s): ckknight (ckknight@gmail.com)
diff --git a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test.lua b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test.lua
index 276ddab..338bcf4 100644
--- a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test.lua
+++ b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test.lua
@@ -38,4 +38,4 @@ assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string

 local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
 assert(newLib)
-assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
\ No newline at end of file
+assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
diff --git a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test3.lua b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test3.lua
index 30f7b94..21bda2b 100644
--- a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test3.lua
+++ b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test3.lua
@@ -11,4 +11,4 @@ assert(not success or not ret) -- either error because proxy is not a string or

 assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.

-assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
\ No newline at end of file
+assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
diff --git a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test4.lua b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test4.lua
index 43eb338..4735246 100644
--- a/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test4.lua
+++ b/Jamba/Libs/LibBabble-Inventory-3.0/LibStub/tests/test4.lua
@@ -38,4 +38,4 @@ loadfile("../LibStub.lua")()
 assert(LibStub.IterateLibraries == 123)


-print("OK")
\ No newline at end of file
+print("OK")
diff --git a/Jamba/Libs/LibBabble-Inventory-3.0/lib.xml b/Jamba/Libs/LibBabble-Inventory-3.0/lib.xml
index b9f9904..8b7a32c 100644
--- a/Jamba/Libs/LibBabble-Inventory-3.0/lib.xml
+++ b/Jamba/Libs/LibBabble-Inventory-3.0/lib.xml
@@ -2,4 +2,4 @@
 ..\FrameXML\UI.xsd">
 	<Script file="LibBabble-3.0.lua" />
 	<Script file="LibBabble-Inventory-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml b/Jamba/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
index 493de1c..67b3140 100644
--- a/Jamba/Libs/LibBagUtils-1.0/LibBagUtils-1.0.xml
+++ b/Jamba/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/Jamba/Libs/LibDeformat-3.0/LibDeformat-3.0.lua b/Jamba/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
index 6580517..29f28e2 100644
--- a/Jamba/Libs/LibDeformat-3.0/LibDeformat-3.0.lua
+++ b/Jamba/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/Jamba/Libs/LibDeformat-3.0/lib.xml b/Jamba/Libs/LibDeformat-3.0/lib.xml
index cf6abae..0f66a4d 100644
--- a/Jamba/Libs/LibDeformat-3.0/lib.xml
+++ b/Jamba/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/Jamba/Libs/LibGratuity-3.0/LibGratuity-3.0.toc b/Jamba/Libs/LibGratuity-3.0/LibGratuity-3.0.toc
index 8219037..abd9c15 100644
--- a/Jamba/Libs/LibGratuity-3.0/LibGratuity-3.0.toc
+++ b/Jamba/Libs/LibGratuity-3.0/LibGratuity-3.0.toc
@@ -1,4 +1,4 @@
-## Interface: 50400
+## Interface: 50400
 ## LoadOnDemand: 1
 ## Title: Lib: Gratuity-3.0
 ## Notes: Tooltip scanning library.
diff --git a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test.lua b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test.lua
index 276ddab..338bcf4 100644
--- a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test.lua
+++ b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test.lua
@@ -38,4 +38,4 @@ assert(newOldMinor == 3) -- previous version was 3 (even though it gave a string

 local newLib, newOldMinor = LibStub:NewLibrary("Pants", 5) -- register a new library, using a normal number instead of a string
 assert(newLib)
-assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
\ No newline at end of file
+assert(newOldMinor == 4) -- previous version was 4 (even though it gave a string)
diff --git a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test3.lua b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test3.lua
index 30f7b94..21bda2b 100644
--- a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test3.lua
+++ b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test3.lua
@@ -11,4 +11,4 @@ assert(not success or not ret) -- either error because proxy is not a string or

 assert(not pcall(LibStub.NewLibrary, LibStub, "Something", "No number in here")) -- should error, minor has no string in it.

-assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
\ No newline at end of file
+assert(not LibStub:GetLibrary("Something", true)) -- shouldn't've created it from the above statement
diff --git a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test4.lua b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test4.lua
index 43eb338..4735246 100644
--- a/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test4.lua
+++ b/Jamba/Libs/LibGratuity-3.0/LibStub/tests/test4.lua
@@ -38,4 +38,4 @@ loadfile("../LibStub.lua")()
 assert(LibStub.IterateLibraries == 123)


-print("OK")
\ No newline at end of file
+print("OK")
diff --git a/Jamba/Libs/LibGratuity-3.0/lib.xml b/Jamba/Libs/LibGratuity-3.0/lib.xml
index 9b361c4..2934f6f 100644
--- a/Jamba/Libs/LibGratuity-3.0/lib.xml
+++ b/Jamba/Libs/LibGratuity-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="LibGratuity-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/LibSharedMedia-3.0/lib.xml b/Jamba/Libs/LibSharedMedia-3.0/lib.xml
index 34aa874..7f2fd53 100644
--- a/Jamba/Libs/LibSharedMedia-3.0/lib.xml
+++ b/Jamba/Libs/LibSharedMedia-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="LibSharedMedia-3.0.lua" />
-</Ui>
\ No newline at end of file
+</Ui>
diff --git a/Jamba/Libs/UTF8/UTF8.toc b/Jamba/Libs/UTF8/UTF8.toc
index e971b12..86efe27 100644
--- a/Jamba/Libs/UTF8/UTF8.toc
+++ b/Jamba/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/Jamba/Libs/UTF8/utf8.lua b/Jamba/Libs/UTF8/utf8.lua
index 485582c..159f7ae 100644
--- a/Jamba/Libs/UTF8/utf8.lua
+++ b/Jamba/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/Jamba/Libs/UTF8/utf8data.lua b/Jamba/Libs/UTF8/utf8data.lua
index 655f719..8bcc38f 100644
--- a/Jamba/Libs/UTF8/utf8data.lua
+++ b/Jamba/Libs/UTF8/utf8data.lua
@@ -1,4 +1,4 @@
-utf8_lc_uc = {
+utf8_lc_uc = {
 	["a"] = "A",
 	["b"] = "B",
 	["c"] = "C",
diff --git a/Jamba/Locales/JambaCore-Locale-enUS.lua b/Jamba/Locales/JambaCore-Locale-enUS.lua
index 08210c1..cab5d03 100644
--- a/Jamba/Locales/JambaCore-Locale-enUS.lua
+++ b/Jamba/Locales/JambaCore-Locale-enUS.lua
@@ -6,7 +6,7 @@ License: The MIT License

 local L = LibStub("AceLocale-3.0"):NewLocale( "Jamba-Core", "enUS", true )
 --Change ME when update version
-L["Version"] = "5.0"
+L["Version"] = "5.1"
 --End of Changeme
 L["Slash Commands"] = true
 L["Team"] = true
@@ -93,16 +93,16 @@ L["Full Change Log"] = true
 L["Full ChangeLog"] = true
 L["ChangeLog"] = true
 L["Shows the Full changelog\nOpens a new Frame."] = true
-L["Text1"] = "Welcome to Legion 7.0.3!"
+L["Text1"] = "Welcome to Legion 7.1.0!"
 L["Text2"] = ""
-L["Text3"] = "Jamba Has Had a Lot of changes here is a few important ones to check out"
+L["Text3"] = "Jamba Has Had a few changes for 7.1 to check out"
 L["Text4"] = ""
-L["Text5"] = "Display-team has some nice new changes!."
-L["Text6"] = "Honor/XP/Artifact/Rep are now on the same bar."
-L["Text7"] = ""
-L["Text8"] = "QuestLog changes with a Dropdown-Menu."
-L["Text9"] = "Quest Watcher Been renamed and now Supports Most Objectives."
-L["Text10"] = "Now Easyer To UseCurrency!"
+L["Text5"] = "Jamba-Mount one button to mount all the team."
+L["Text6"] = ""
+L["Text7"] = "Artifact Power is now Auto added to to the item Use bar!"
+L["Text8"] = ""
+L["Text9"] = "You can not use jamba to invite groups with tags."
+L["Text10"] = ""



diff --git a/Jamba/Locales/JambaMessage-Locale-enUS.lua b/Jamba/Locales/JambaMessage-Locale-enUS.lua
index ed282d2..cb55c55 100644
--- a/Jamba/Locales/JambaMessage-Locale-enUS.lua
+++ b/Jamba/Locales/JambaMessage-Locale-enUS.lua
@@ -60,4 +60,4 @@ L["Help1"] = "Core: Message Display Help"
 L["Help2"] = [[Help Here]]
 L["Help3"] = ""
 L["Help4"] = [[More Help Here]]
-L["Sound To Play"] = true
\ No newline at end of file
+L["Sound To Play"] = true
diff --git a/Jamba/Locales/JambaTeam-Locale-enUS.lua b/Jamba/Locales/JambaTeam-Locale-enUS.lua
index 3ce06dd..39131ae 100644
--- a/Jamba/Locales/JambaTeam-Locale-enUS.lua
+++ b/Jamba/Locales/JambaTeam-Locale-enUS.lua
@@ -24,7 +24,9 @@ L["Set the master character."] = true
 L["I Am Master"] = true
 L["Set this character to be the master character."] = true
 L["Invite"] = true
+L["Invites"] = true
 L["Invite team members to a party."] = true
+L["Invite team members to a <tag> party."] = true
 L["Disband"] = true
 L["Disband all team members from their parties."] = true
 L["Push Settings"] = true
@@ -116,4 +118,4 @@ L["Promote Master to party leader."] = true
 L["Set the Master to the Focus."] = true
 L["Focus will set master toon."] = true
 L["The master will be the set from the focus target if a team member \n\nNote: All team members must be setting the focus."] = true
-L["Party Loot Control (Instances)"] = true
\ No newline at end of file
+L["Party Loot Control (Instances)"] = true
diff --git a/Jamba/Locales/Locales.xml b/Jamba/Locales/Locales.xml
index 95b38f9..e645a09 100644
--- a/Jamba/Locales/Locales.xml
+++ b/Jamba/Locales/Locales.xml
@@ -9,4 +9,4 @@ License: The MIT License
 	<Script file="JambaTeam-Locale-enUS.lua" />
 	<Script file="JambaTag-Locale-enUS.lua" />
 	<Script file="JambaMessage-Locale-enUS.lua" />
-</Ui>
\ No newline at end of file
+</Ui>